summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@localhost.localdomain>2008-05-13 21:42:40 -0400
committerNalin Dahyabhai <nalin@localhost.localdomain>2008-05-13 21:42:40 -0400
commit464d0478cca4da015342ff7e2dd87e6c6b489b43 (patch)
tree635f93869a0e12ea38e25ba2088cbf732f3b020e /src
parentdc78fc1572e25007acbf40a6ec7d0d0b0e3182d0 (diff)
downloadslapi-nis-464d0478cca4da015342ff7e2dd87e6c6b489b43.tar.gz
slapi-nis-464d0478cca4da015342ff7e2dd87e6c6b489b43.tar.xz
slapi-nis-464d0478cca4da015342ff7e2dd87e6c6b489b43.zip
- parse argument lists for "function"s
Diffstat (limited to 'src')
-rw-r--r--src/format.c111
1 files changed, 80 insertions, 31 deletions
diff --git a/src/format.c b/src/format.c
index 74f8d41..1109c83 100644
--- a/src/format.c
+++ b/src/format.c
@@ -21,18 +21,89 @@ format_free_ndn_list(char **ndn_list)
}
}
+/* Parse an argument list. */
+static void
+format_free_parsed_args(char **argv)
+{
+ free(argv);
+}
+static int
+format_parse_args(struct plugin_state *state, const char *args,
+ int *pargc, char ***pargv)
+{
+ int i, dq, argc;
+ char *out, **argv;
+ *pargc = 0;
+ *pargv = NULL;
+ argv = malloc((sizeof(char *) + 1) * (strlen(args) + 1));
+ if (argv == NULL) {
+ return -1;
+ }
+ memset(argv, 0, (sizeof(char *) + 1) * (strlen(args) + 1));
+ out = (char *) argv;
+ out += sizeof(char *) * (strlen(args) + 1);
+ argc = 0;
+ i = 0;
+ dq = 0;
+ while (args[i] != '\0') {
+ switch (args[i]) {
+ case '"':
+ dq = !dq;
+ if (dq) {
+ argv[argc++] = out;
+ } else {
+ *out++ = '\0';
+ }
+ i++;
+ break;
+ case '\\':
+ i++;
+ /* fall through */
+ default:
+ *out++ = args[i++];
+ break;
+ }
+ }
+ argv[argc] = NULL;
+ *out = '\0';
+ out = malloc(argc * 3 + strlen(args));
+ if (out != NULL) {
+ *out = '\0';
+ for (i = 0; i < argc; i++) {
+ if (i > 0) {
+ strcat(out, ",");
+ }
+ strcat(out, "'");
+ strcat(out, argv[i]);
+ strcat(out, "'");
+ }
+ free(out);
+ }
+ *pargc = argc;
+ *pargv = argv;
+ return 0;
+}
+
/* Echo the parameter text. */
static int
format_echo(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
const char *args, char *outbuf, int outbuf_len,
char ***visited_ndns)
{
- int i;
- i = strlen(args);
- if (i <= outbuf_len) {
- memcpy(outbuf, args, i);
+ int ret, i, argc;
+ char **argv;
+ ret = format_parse_args(state, args, &argc, &argv);
+ if (ret != 0) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ "echo: error parsing arguments\n");
+ return -1;
}
- return i;
+ for (i = 0, ret = 0; i < argc; i++) {
+ memcpy(outbuf + ret, argv[i], strlen(argv[i]));
+ ret += strlen(argv[i]);
+ }
+ format_free_parsed_args(argv);
+ return ret;
}
/* Choose a formatting function by name. */
@@ -121,12 +192,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
Slapi_PBlock *pb, Slapi_Entry *e, const char *args,
char *outbuf, int outbuf_len, char ***visited_ndns);
- spd_id = state->plugin_desc->spd_id;
- slapi_log_error(SLAPI_LOG_PLUGIN, spd_id,
- "expanding %s\"%s\"%s\n",
- literal ? "" : "%{", fmt, literal ? "" : "}");
-
/* First, expand any subexpressions and call any "functions". */
+ spd_id = state->plugin_desc->spd_id;
level = 0;
i = 0;
j = 0;
@@ -260,9 +327,7 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
free(tmp);
return -1;
}
- slapi_log_error(SLAPI_LOG_PLUGIN, spd_id,
- "calling \"%s\"(\"%s\")\n",
- fnname, tmp);
+ /* Call the "function". */
exp_len = (*formatfn)(state, pb, e, tmp,
exp + j, sizeof(exp) - j,
visited_ndns);
@@ -300,14 +365,10 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
if (i <= outbuf_len) {
memcpy(outbuf, exp, i);
}
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "expanded to \"%s\"\n", exp);
return i;
} else {
- /* It's an expression, so evaluate it. */
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "looking up simple expression \%\{\"%s\"}\n", exp);
- /* Check if it uses a default/alternate value. */
+ /* It's an expression, so evaluate it. Check if it uses a
+ * default/alternate value. */
spn = strcspn(exp, ":");
if (spn == strlen(exp)) {
/* Simple expression: expect it to be a single-valued
@@ -320,16 +381,12 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
if (i <= outbuf_len) {
memcpy(outbuf, tmp, i);
}
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "expanded to \"%s\"\n", tmp);
free(tmp);
/* Return the length of the expanded
* expression. */
return i;
} else {
/* No value found? FAIL. */
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "no value for \"%s\"\n", exp);
return -1;
}
} else {
@@ -363,13 +420,9 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
memcpy(outbuf, default_value,
i);
}
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "expanded to \"%s\"\n", default_value);
return i;
} else {
/* No value, and no default: FAIL. */
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "failed to expand: no valid value, no default\n");
return -1;
}
} else {
@@ -382,8 +435,6 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
memcpy(outbuf, alternate_value,
i);
}
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "expanded to \"%s\"\n", alternate_value);
free(tmp);
return i;
} else {
@@ -392,8 +443,6 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
if (i <= outbuf_len) {
memcpy(outbuf, tmp, i);
}
- slapi_log_error(SLAPI_LOG_PLUGIN, "nis-plugin",
- "expanded to \"%s\"\n", tmp);
free(tmp);
return i;
}