diff options
| author | Nalin Dahyabhai <nalin@localhost.localdomain> | 2008-05-13 21:42:40 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin@localhost.localdomain> | 2008-05-13 21:42:40 -0400 |
| commit | 464d0478cca4da015342ff7e2dd87e6c6b489b43 (patch) | |
| tree | 635f93869a0e12ea38e25ba2088cbf732f3b020e /src | |
| parent | dc78fc1572e25007acbf40a6ec7d0d0b0e3182d0 (diff) | |
| download | slapi-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.c | 111 |
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; } |
