diff options
author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-08-06 16:58:40 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-08-06 16:58:40 -0400 |
commit | c37d5ef05e1ac23cb476b6f08ee60d63e5e5301c (patch) | |
tree | e2625bf8c9dcc4b5253224876d744fa286779708 /src | |
parent | c689a92ee0d8de195f4d0b630b44aacded174b55 (diff) | |
download | slapi-nis-c37d5ef05e1ac23cb476b6f08ee60d63e5e5301c.tar.gz slapi-nis-c37d5ef05e1ac23cb476b6f08ee60d63e5e5301c.tar.xz slapi-nis-c37d5ef05e1ac23cb476b6f08ee60d63e5e5301c.zip |
format.c:
- make %format() expect a specifier as the value to match against, and the
default to use if there are no / too many matches
defs-nis.c:
- compensate
Diffstat (limited to 'src')
-rw-r--r-- | src/defs-nis.c | 8 | ||||
-rw-r--r-- | src/format.c | 89 |
2 files changed, 60 insertions, 37 deletions
diff --git a/src/defs-nis.c b/src/defs-nis.c index 29a18f9..85677de 100644 --- a/src/defs-nis.c +++ b/src/defs-nis.c @@ -51,22 +51,22 @@ static struct configuration { {"passwd.byname", config_exact, FALSE, NULL, "(objectClass=posixAccount)", "%{uid}", NULL, - "%{uid}:%regsub(\"userPassword\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{uidNumber}:%{gidNumber}:%{gecos:-%{cn:-}}:%{homeDirectory:-/}:%{loginShell:-" _PATH_BSHELL "}", NULL, + "%{uid}:%regsub(\"%{userPassword}\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{uidNumber}:%{gidNumber}:%{gecos:-%{cn:-}}:%{homeDirectory:-/}:%{loginShell:-" _PATH_BSHELL "}", NULL, ":"}, {"passwd.byuid", config_exact, FALSE, NULL, "(objectClass=posixAccount)", "%{uidNumber}", NULL, - "%{uid}:%regsub(\"userPassword\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{uidNumber}:%{gidNumber}:%{gecos:-%{cn:-}}:%{homeDirectory:-/}:%{loginShell:-" _PATH_BSHELL "}", NULL, + "%{uid}:%regsub(\"%{userPassword}\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{uidNumber}:%{gidNumber}:%{gecos:-%{cn:-}}:%{homeDirectory:-/}:%{loginShell:-" _PATH_BSHELL "}", NULL, ":"}, {"group.byname", config_exact, FALSE, NULL, "(objectClass=posixGroup)", "%{cn}", NULL, - "%{cn}:%regsub(\"userPassword\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{gidNumber}:%merge(\",\",\"%{memberUid}\",\"%deref(\\\"member\\\",\\\"uid\\\")\",\"%deref(\\\"uniqueMember\\\",\\\"uid\\\")\",\"%referred(\\\"passwd.byname\\\",\\\"memberOf\\\",\\\"uid\\\")\")", NULL, + "%{cn}:%regsub(\"%{userPassword}\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{gidNumber}:%merge(\",\",\"%{memberUid}\",\"%deref(\\\"member\\\",\\\"uid\\\")\",\"%deref(\\\"uniqueMember\\\",\\\"uid\\\")\",\"%referred(\\\"passwd.byname\\\",\\\"memberOf\\\",\\\"uid\\\")\")", NULL, ":,"}, {"group.bygid", config_exact, FALSE, NULL, "(objectClass=posixGroup)", "%{gidNumber}", NULL, - "%{cn}:%regsub(\"userPassword\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{gidNumber}:%merge(\",\",\"%{memberUid}\",\"%deref(\\\"member\\\",\\\"uid\\\")\",\"%deref(\\\"uniqueMember\\\",\\\"uid\\\")\",\"%referred(\\\"passwd.byname\\\",\\\"memberOf\\\",\\\"uid\\\")\")", NULL, + "%{cn}:%regsub(\"%{userPassword}\",\"^\\\\{CRYPT\\\\}(..*)\",\"%1\",\"*\"):%{gidNumber}:%merge(\",\",\"%{memberUid}\",\"%deref(\\\"member\\\",\\\"uid\\\")\",\"%deref(\\\"uniqueMember\\\",\\\"uid\\\")\",\"%referred(\\\"passwd.byname\\\",\\\"memberOf\\\",\\\"uid\\\")\")", NULL, ":,"}, {"netgroup", config_exact, FALSE, NULL, "(objectClass=nisNetgroup)", diff --git a/src/format.c b/src/format.c index 700d320..b9a6399 100644 --- a/src/format.c +++ b/src/format.c @@ -1039,11 +1039,10 @@ format_match_generic(struct plugin_state *state, char * (*match_fn)(const char *pattern, const char *value, char **argv)) { - Slapi_ValueSet *values; - Slapi_Value *value; - char *cvalue, *actual_attr, **argv, **matches, *plugin_id, *defaults[2]; - int i, count, argc, disposition, buffer_flags; - int ret, len; + char *cvalue, **argv, **matches, **values, *plugin_id, *default_value; + struct berval *defaults[2], default_bv; + int i, count, argc, ret, len; + unsigned int *lengths, default_length; plugin_id = state->plugin_desc->spd_id; ret = format_parse_args(state, args, &argc, &argv); @@ -1059,22 +1058,21 @@ format_match_generic(struct plugin_state *state, format_free_parsed_args(argv); return -EINVAL; } - /* Walk the list of values for the attribute. */ + /* Evaluate the expression as a list, then walk it. */ matches = NULL; count = 0; - values = NULL; - /* Find all of the matching values. */ - if (slapi_vattr_values_get(e, argv[0], &values, - &disposition, &actual_attr, - 0, &buffer_flags) == 0) { - matches = malloc(sizeof(char *) * - (slapi_valueset_count(values) + 1)); + lengths = NULL; + values = format_get_data_set(state, e, group, set, + argv[0], disallowed, + ref_attrs, inref_attrs, &lengths); + if (values != NULL) { + for (i = 0; values[i] != NULL; i++) { + continue; + } + matches = malloc(sizeof(char *) * (i + 1)); if (matches != NULL) { - for (i = slapi_valueset_first_value(values, &value); - i != -1; - i = slapi_valueset_next_value(values, i, &value)) { - cvalue = xstrndup(slapi_value_get_string(value), - slapi_value_get_length(value)); + for (i = 0; values[i] != NULL; i++) { + cvalue = xstrndup(values[i], lengths[i]); matches[count] = match_fn(argv[1], cvalue, argv + 2); free(cvalue); @@ -1084,44 +1082,57 @@ format_match_generic(struct plugin_state *state, } matches[count] = NULL; } - slapi_vattr_values_free(&values, &actual_attr, buffer_flags); + format_free_data_set(values, lengths); } /* Make sure matched is either the single match, the default, or NULL * if we had no default. */ switch (count) { case 0: - /* No matches. */ + /* No matches. Try to generate the default value. */ + default_value = NULL; if ((default_arg >= 0) && (argv[default_arg] != NULL)) { - /* Try to store the default. */ + default_value = format_get_data(state, e, group, set, + argv[default_arg], + disallowed, + ref_attrs, inref_attrs, + &default_length); + } + if (default_value != NULL) { + /* Try to store the default value. */ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: no matching values for " "\"%s\", using default value \"%s\"\n", - fnname, argv[1], argv[default_arg]); + fnname, argv[1], default_value); if (outbuf_choices != NULL) { /* Return the default value as a list. */ - defaults[0] = argv[default_arg]; + default_bv.bv_len = default_length; + default_bv.bv_val = default_value; + defaults[0] = &default_bv; defaults[1] = NULL; - format_add_choice_str(outbuf_choices, outbuf, - defaults); + format_add_choice(outbuf_choices, outbuf, + defaults); len = 0; } else { /* Store the default directly in the buffer. */ - len = strlen(argv[default_arg]); + len = default_length; if (len > outbuf_len) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: out of space\n", fnname); + format_free_data(default_value); format_free_parsed_args(argv); free(matches); return -ENOBUFS; } - memcpy(outbuf, argv[default_arg], len); + memcpy(outbuf, default_value, default_length); } + format_free_data(default_value); } else { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: no matching values for " - "\"%s\", and no default value\n", + "\"%s\", and no default value " + "generated by \"%s\"\n", fnname, argv[1]); format_free_parsed_args(argv); free(matches); @@ -1156,19 +1167,29 @@ format_match_generic(struct plugin_state *state, len = 0; } else { /* Too many matches to store. */ + default_value = NULL; if ((default_arg >= 0) && (argv[default_arg] != NULL)) { + default_value = format_get_data(state, e, + group, set, + argv[default_arg], + disallowed, + ref_attrs, + inref_attrs, + &default_length); + } + if (default_value != NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: too many matching values " "for \"%s\", using default " "value \"%s\"\n", - fnname, argv[1], - argv[default_arg]); - len = strlen(argv[default_arg]); + fnname, argv[1], default_value); + len = default_length; if (len > outbuf_len) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: out of space\n", fnname); + format_free_data(default_value); for (i = 0; i < count; i++) { free(matches[i]); } @@ -1176,12 +1197,14 @@ format_match_generic(struct plugin_state *state, format_free_parsed_args(argv); return -ENOBUFS; } - memcpy(outbuf, argv[default_arg], len); + memcpy(outbuf, default_value, default_length); + format_free_data(default_value); } else { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "%s: too many matching values " "for \"%s\", and no default " - "value\n", fnname, argv[1]); + "value provided by \"%s\"\n", + fnname, argv[1]); for (i = 0; i < count; i++) { free(matches[i]); } |