#include <k5-int.h>
#include "kdb5_ldap_list.h"
int list_count_str_array(char **list)
{
int i = 0;
if (list == NULL)
return 0;
for (i = 0; *list != NULL; list++) {
i++;
}
return i;
}
int list_count_int_array(int *list)
{
int i = 0;
if (list == NULL)
return 0;
for (i = 0; *list != END_OF_LIST; list++) {
i++;
}
return i;
}
void krb5_free_list_entries(list)
char **list;
{
if (list == NULL)
return;
for (; *list != NULL; list++) {
free(*list);
*list = NULL;
}
return;
}
krb5_error_code
krb5_parse_list(buffer, delimiter, list)
char *buffer;
char *delimiter;
char **list;
{
char *str = NULL;
char *token = NULL;
char *ptrptr = NULL;
char **plist = list;
krb5_error_code retval = 0;
int count = 0;
if ((buffer == NULL) || (list == NULL) || (delimiter == NULL)) {
return EINVAL;
}
str = strdup(buffer);
if (str == NULL)
return ENOMEM;
token = strtok_r(str, delimiter, &ptrptr);
for (count = 1; ((token != NULL) && (count < MAX_LIST_ENTRIES));
plist++, count++) {
*plist = strdup(token);
if (*plist == NULL) {
retval = ENOMEM;
goto cleanup;
}
token = strtok_r(NULL, delimiter, &ptrptr);
}
*plist = NULL;
cleanup:
if (str) {
free(str);
str = NULL;
}
if (retval)
krb5_free_list_entries(list);
return retval;
}
int compare_int(m1, m2)
const void *m1;
const void *m2;
{
int mi1 = *(const int *)m1;
int mi2 = *(const int *)m2;
return (mi1 - mi2);
}
void list_modify_str_array(destlist, sourcelist, mode)
char ***destlist;
const char **sourcelist;
int mode;
{
char **dlist = NULL, **tmplist = NULL;
const char **slist = NULL;
int dcount = 0, scount = 0, copycount = 0;
int found = 0;
if ((destlist == NULL) || (*destlist == NULL) || (sourcelist == NULL))
return;
if (mode == LIST_MODE_ADD) {
for (dlist = *destlist, dcount = 0; *dlist != NULL;
dlist++, dcount++) {
;
}
for (slist = sourcelist, scount = 0; *slist != NULL;
slist++, scount++) {
;
}
slist = sourcelist;
if ((dcount + scount) < MAX_LIST_ENTRIES)
copycount = scount;
else
copycount = (MAX_LIST_ENTRIES -1) - dcount;
memcpy(dlist, slist, (sizeof(char *) * copycount));
dlist += copycount;
*dlist = NULL;
} else if (mode == LIST_MODE_DELETE) {
for (slist = sourcelist; *slist != NULL; slist++) {
for (dlist = *destlist; *dlist != NULL; dlist++) {
found = 0;
if (strcasecmp(*dlist, *slist) == 0) {
found = 1;
free(*dlist);
for (tmplist = dlist; *tmplist != NULL; tmplist++) {
*tmplist = *(tmplist+1);
}
break;
}
}
}
}
return;
}
int list_modify_int_array(destlist, sourcelist, mode)
int *destlist;
const int *sourcelist;
int mode;
{
int *dlist = NULL, *tmplist = NULL;
const int *slist = NULL;
int dcount = 0, scount = 0, copycount = 0;
int tcount = 0;
if ((destlist == NULL) || (sourcelist == NULL))
return 0;
if (mode == LIST_MODE_ADD) {
for (dlist = destlist, dcount = 0; *dlist != END_OF_LIST;
dlist++, dcount++)
;
for (slist = sourcelist, scount = 0; *slist != END_OF_LIST;
slist++, scount++)
;
slist = sourcelist;
if ((dcount + scount) < MAX_LIST_ENTRIES)
copycount = scount;
else
copycount = (MAX_LIST_ENTRIES -1) - dcount;
memcpy(dlist, slist, (sizeof(int) * copycount));
dlist += copycount;
*dlist = END_OF_LIST;
tcount = dcount + copycount;
} else if (mode == LIST_MODE_DELETE) {
for (slist = sourcelist; *slist != END_OF_LIST; slist++) {
for (dlist = destlist; *dlist != END_OF_LIST; dlist++) {
if (*dlist == *slist) {
for (tmplist = dlist; *tmplist != END_OF_LIST; tmplist++) {
*tmplist = *(tmplist+1);
}
break;
}
}
}
for (dlist = destlist, tcount = 0; *dlist != END_OF_LIST; dlist++) {
tcount++;
}
}
return tcount;
}