Ah, I forgot, I still have this in my workspace. it simplifies
ldap_parse_attributes() a bit. can you add it to your testing? :)
thanks!
diff 020c2633322f5ac881ca10a922493f81b7516542
53029173a8d77cba5fb3a66a29d1d83212948e3c
commit - 020c2633322f5ac881ca10a922493f81b7516542
commit + 53029173a8d77cba5fb3a66a29d1d83212948e3c
blob - fcef111d623f5f5336a0da99de60c029ebbed1bc
blob + fc78db40faf62fba8f33817bb81381fcbd88480a
--- table_ldap.c
+++ table_ldap.c
@@ -358,42 +358,42 @@ read_value(char **store, const char *key, const char *
}
static int
-ldap_parse_attributes(struct query *query, const char *key, const char *line,
- size_t expect)
+ldap_parse_attributes(struct query *query, const char *key, char *line,
+ size_t expected)
{
- char buffer[1024];
- char *p;
- size_t m, n;
+ char *item;
+ size_t i;
- log_debug("debug: parsing attribute \"%s\" (%zu) -> \"%s\"", key,
- expect, line);
-
- if (strlcpy(buffer, line, sizeof buffer) >= sizeof buffer)
+ if (query->attrn != 0) {
+ log_warnx("%s already set", key);
return 0;
-
- m = 1;
- for (p = buffer; *p; ++p) {
- if (*p == ',') {
- *p = 0;
- m++;
- }
}
- if (expect != m)
- return 0;
- p = buffer;
- for (n = 0; n < expect; ++n)
- query->attrs[n] = NULL;
- for (n = 0; n < m; ++n) {
- query->attrs[n] = strdup(p);
- if (query->attrs[n] == NULL) {
+ for (i = 0; i < expected; ++i)
+ query->attrs[i] = NULL;
+
+ for (i = 0; (item = strsep(&line, ",")) != NULL; i++) {
+ if (i >= expected)
+ break;
+
+ item = strip(item);
+ if ((query->attrs[i] = strdup(item)) == NULL) {
log_warnx("warn: strdup");
- return 0; /* XXX cleanup */
+ break;
}
- p += strlen(p) + 1;
query->attrn++;
}
- return 1;
+
+ if (item == NULL && query->attrn == expected)
+ return 1;
+
+ log_warnx("warn: wrong number of parameter for %s, expected %zu", key,
+ expected);
+
+ for (i = 0; i < query->attrn; ++i)
+ free(query->attrs[i]);
+ query->attrn = 0;
+ return 0;
}
static int