diff options
Diffstat (limited to 'usr/src/lib/libsecdb/common/secdb.c')
-rw-r--r-- | usr/src/lib/libsecdb/common/secdb.c | 99 |
1 files changed, 59 insertions, 40 deletions
diff --git a/usr/src/lib/libsecdb/common/secdb.c b/usr/src/lib/libsecdb/common/secdb.c index 0c8f9da2f2..e012d95ce0 100644 --- a/usr/src/lib/libsecdb/common/secdb.c +++ b/usr/src/lib/libsecdb/common/secdb.c @@ -49,7 +49,7 @@ kva_match(kva_t *kva, char *key) kv_t *data; if (kva == NULL || key == NULL) { - return ((char *)NULL); + return (NULL); } data = kva->data; for (i = 0; i < kva->length; i++) { @@ -58,7 +58,7 @@ kva_match(kva_t *kva, char *key) } } - return ((char *)NULL); + return (NULL); } /* @@ -89,6 +89,32 @@ _kva_free(kva_t *kva) } /* + * _kva_free_value(): Free up memory (value) for all the occurrences of + * the given key. + */ +void +_kva_free_value(kva_t *kva, char *key) +{ + int ctr; + kv_t *data; + + if (kva == NULL) { + return; + } + + ctr = kva->length; + data = kva->data; + + while (ctr--) { + if (strcmp(data->key, key) == 0 && data->value != NULL) { + free(data->value); + data->value = NULL; + } + data++; + } +} + +/* * new_kva(): Allocate a key-value array. */ kva_t * @@ -97,11 +123,11 @@ _new_kva(int size) kva_t *new_kva; if ((new_kva = (kva_t *)calloc(1, sizeof (kva_t))) == NULL) { - return ((kva_t *)NULL); + return (NULL); } if ((new_kva->data = (kv_t *)calloc(1, (size*sizeof (kv_t)))) == NULL) { free(new_kva); - return ((kva_t *)NULL); + return (NULL); } return (new_kva); @@ -132,7 +158,7 @@ _str2kva(char *s, char *ass, char *del) *s == '\0' || *s == '\n' || (strlen(s) <= 1)) { - return ((kva_t *)NULL); + return (NULL); } p = s; while ((p = _strpbrk_escape(p, ass)) != NULL) { @@ -147,12 +173,12 @@ _str2kva(char *s, char *ass, char *del) size = m * KV_ADD_KEYS; } if ((nkva = _new_kva(size)) == NULL) { - return ((kva_t *)NULL); + return (NULL); } data = nkva->data; nkva->length = 0; if ((buf = strdup(s)) == NULL) { - return ((kva_t *)NULL); + return (NULL); } pair = _strtok_escape(buf, del, &last_pair); do { @@ -172,43 +198,34 @@ _str2kva(char *s, char *ass, char *del) * (buf). Use delimeter (del) to separate pairs. Use assignment character * (ass) to separate keys and values. * - * Return Values: 0 Success 1 Buffer too small 2 Out of memory + * Return Values: 0 Success 1 Buffer too small */ int _kva2str(kva_t *kva, char *buf, int buflen, char *ass, char *del) { int i; - int length = 0; - char *tmp; + int len; + int off = 0; kv_t *data; if (kva == NULL) { return (0); } + + buf[0] = '\0'; data = kva->data; + for (i = 0; i < kva->length; i++) { if (data[i].value != NULL) { - length += 2 + strlen(data[i].value); - } - } - if (length > buflen) { - return (1); - } - (void) memset(buf, 0, buflen); - if ((tmp = (char *)malloc(buflen)) == NULL) { - return (2); - } - for (i = 0; i < kva->length; i++) { - if (data[i].value != NULL) { - if (snprintf(tmp, buflen, "%s%s%s%s", - data[i].key, ass, data[i].value, del) >= buflen) { - free((void *)tmp); - return (0); + len = snprintf(buf + off, buflen - off, "%s%s%s%s", + data[i].key, ass, data[i].value, del); + if (len < 0 || len + off >= buflen) { + return (1); } - (void) strcat(buf, tmp); + off += len; } } - free((void *)tmp); + return (0); } @@ -240,15 +257,15 @@ _kva_dup(kva_t *old_kva) int size; kv_t *old_data; kv_t *new_data; - kva_t *nkva = (kva_t *)NULL; + kva_t *nkva = NULL; if (old_kva == NULL) { - return ((kva_t *)NULL); + return (NULL); } old_data = old_kva->data; size = old_kva->length; if ((nkva = _new_kva(size)) == NULL) { - return ((kva_t *)NULL); + return (NULL); } new_data = nkva->data; nkva->length = old_kva->length; @@ -309,10 +326,10 @@ _argv_to_csl(char **strings) { int len = 0; int i = 0; - char *newstr = (char *)NULL; + char *newstr = NULL; if (strings == NULL) - return ((char *)NULL); + return (NULL); for (i = 0; strings[i] != NULL; i++) { len += strlen(strings[i]) + 1; } @@ -325,7 +342,7 @@ _argv_to_csl(char **strings) newstr[len-1] = NULL; return (newstr); } else - return ((char *)NULL); + return (NULL); } @@ -335,10 +352,10 @@ _csl_to_argv(char *csl) int len = 0; int ncommas = 0; int i = 0; - char **spc = (char **)NULL; - char *copy = (char *)NULL; + char **spc = NULL; + char *copy = NULL; char *pc; - char *lasts = (char *)NULL; + char *lasts = NULL; len = strlen(csl); for (i = 0; i < len; i++) { @@ -346,7 +363,7 @@ _csl_to_argv(char *csl) ncommas++; } if ((spc = (char **)malloc((ncommas + 2) * sizeof (char *))) == NULL) { - return ((char **)NULL); + return (NULL); } copy = strdup(csl); for (pc = strtok_r(copy, ",", &lasts), i = 0; pc != NULL; @@ -378,12 +395,14 @@ print_kva(kva_t *kva) kv_t *data; if (kva == NULL) { - printf(" (empty)\n"); + (void) printf(" (empty)\n"); return; } data = kva->data; for (i = 0; i < kva->length; i++) { - printf(" %s = %s\n", data[i].key, data[i].value); + (void) printf(" %s = %s\n", + data[i].key != NULL ? data[i].key : "NULL", + data[i].value != NULL ? data[i].value : "NULL"); } } #endif /* DEBUG */ |