summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-08-06 16:58:40 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-08-06 16:58:40 -0400
commitc37d5ef05e1ac23cb476b6f08ee60d63e5e5301c (patch)
treee2625bf8c9dcc4b5253224876d744fa286779708 /src
parentc689a92ee0d8de195f4d0b630b44aacded174b55 (diff)
downloadslapi-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.c8
-rw-r--r--src/format.c89
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]);
}