Import of code from heimdal
[openafs.git] / src / external / heimdal / krb5 / config_file.c
index 8728076..c1f80e2 100644 (file)
@@ -33,8 +33,6 @@
  * SUCH DAMAGE.
  */
 
-#define KRB5_DEPRECATED
-
 #include "krb5_locl.h"
 
 #ifdef __APPLE__
@@ -63,7 +61,7 @@ config_fgets(char *str, size_t len, struct fileptr *ptr)
        p = ptr->s + strcspn(ptr->s, "\n");
        if(*p == '\n')
            p++;
-       l = min(len, p - ptr->s);
+       l = min(len, (size_t)(p - ptr->s));
        if(len > 0) {
            memcpy(str, ptr->s, l);
            str[l] = '\0';
@@ -84,14 +82,14 @@ static krb5_error_code parse_list(struct fileptr *f, unsigned *lineno,
                                  krb5_config_binding **parent,
                                  const char **err_message);
 
-static krb5_config_section *
-get_entry(krb5_config_section **parent, const char *name, int type)
+KRB5_LIB_FUNCTION krb5_config_section * KRB5_LIB_CALL
+_krb5_config_get_entry(krb5_config_section **parent, const char *name, int type)
 {
     krb5_config_section **q;
 
     for(q = parent; *q != NULL; q = &(*q)->next)
        if(type == krb5_config_list &&
-          type == (*q)->type &&
+          (unsigned)type == (*q)->type &&
           strcmp(name, (*q)->name) == 0)
            return *q;
     *q = calloc(1, sizeof(**q));
@@ -135,7 +133,7 @@ parse_section(char *p, krb5_config_section **s, krb5_config_section **parent,
        return KRB5_CONFIG_BADFORMAT;
     }
     *p1 = '\0';
-    tmp = get_entry(parent, p + 1, krb5_config_list);
+    tmp = _krb5_config_get_entry(parent, p + 1, krb5_config_list);
     if(tmp == NULL) {
        *err_message = "out of memory";
        return KRB5_CONFIG_BADFORMAT;
@@ -154,7 +152,7 @@ static krb5_error_code
 parse_list(struct fileptr *f, unsigned *lineno, krb5_config_binding **parent,
           const char **err_message)
 {
-    char buf[BUFSIZ];
+    char buf[KRB5_BUFSIZ];
     krb5_error_code ret;
     krb5_config_binding *b = NULL;
     unsigned beg_lineno = *lineno;
@@ -216,14 +214,14 @@ parse_binding(struct fileptr *f, unsigned *lineno, char *p,
        ++p;
     *p2 = '\0';
     if (*p == '{') {
-       tmp = get_entry(parent, p1, krb5_config_list);
+       tmp = _krb5_config_get_entry(parent, p1, krb5_config_list);
        if (tmp == NULL) {
            *err_message = "out of memory";
            return KRB5_CONFIG_BADFORMAT;
        }
        ret = parse_list (f, lineno, &tmp->u.list, err_message);
     } else {
-       tmp = get_entry(parent, p1, krb5_config_string);
+       tmp = _krb5_config_get_entry(parent, p1, krb5_config_string);
        if (tmp == NULL) {
            *err_message = "out of memory";
            return KRB5_CONFIG_BADFORMAT;
@@ -250,7 +248,7 @@ cfstring2cstring(CFStringRef string)
 {
     CFIndex len;
     char *str;
-    
+
     str = (char *) CFStringGetCStringPtr(string, kCFStringEncodingUTF8);
     if (str)
        return strdup(str);
@@ -260,7 +258,7 @@ cfstring2cstring(CFStringRef string)
     str = malloc(len);
     if (str == NULL)
        return NULL;
-       
+
     if (!CFStringGetCString (string, str, len, kCFStringEncodingUTF8)) {
        free (str);
        return NULL;
@@ -282,10 +280,10 @@ convert_content(const void *key, const void *value, void *context)
        return;
 
     if (CFGetTypeID(value) == CFStringGetTypeID()) {
-       tmp = get_entry(parent, k, krb5_config_string);
+       tmp = _krb5_config_get_entry(parent, k, krb5_config_string);
        tmp->u.string = cfstring2cstring(value);
     } else if (CFGetTypeID(value) == CFDictionaryGetTypeID()) {
-       tmp = get_entry(parent, k, krb5_config_list);
+       tmp = _krb5_config_get_entry(parent, k, krb5_config_list);
        CFDictionaryApplyFunction(value, convert_content, &tmp->u.list);
     } else {
        /* log */
@@ -299,7 +297,7 @@ parse_plist_config(krb5_context context, const char *path, krb5_config_section *
     CFReadStreamRef s;
     CFDictionaryRef d;
     CFURLRef url;
-    
+
     url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)path, strlen(path), FALSE);
     if (url == NULL) {
        krb5_clear_error_message(context);
@@ -352,7 +350,7 @@ krb5_config_parse_debug (struct fileptr *f,
 {
     krb5_config_section *s = NULL;
     krb5_config_binding *b = NULL;
-    char buf[BUFSIZ];
+    char buf[KRB5_BUFSIZ];
     krb5_error_code ret;
 
     while (config_fgets(buf, sizeof(buf), f) != NULL) {
@@ -441,27 +439,22 @@ krb5_config_parse_file_multi (krb5_context context,
            home = getenv("HOME");
 
        if (home == NULL) {
-           struct passwd *pw = getpwuid(getuid());     
+           struct passwd *pw = getpwuid(getuid());
            if(pw != NULL)
                home = pw->pw_dir;
        }
        if (home) {
-           asprintf(&newfname, "%s%s", home, &fname[1]);
-           if (newfname == NULL) {
-               krb5_set_error_message(context, ENOMEM,
-                                      N_("malloc: out of memory", ""));
-               return ENOMEM;
-           }
+           int aret;
+
+           aret = asprintf(&newfname, "%s%s", home, &fname[1]);
+           if (aret == -1 || newfname == NULL)
+               return krb5_enomem(context);
            fname = newfname;
        }
 #else  /* KRB5_USE_PATH_TOKENS */
        if (asprintf(&newfname, "%%{USERCONFIG}%s", &fname[1]) < 0 ||
            newfname == NULL)
-       {
-           krb5_set_error_message(context, ENOMEM,
-                                  N_("malloc: out of memory", ""));
-           return ENOMEM;
-       }
+           return krb5_enomem(context);
        fname = newfname;
 #endif
     }
@@ -477,7 +470,7 @@ krb5_config_parse_file_multi (krb5_context context,
            return ret;
        }
 #else
-       krb5_set_error_message(context, ENOENT, 
+       krb5_set_error_message(context, ENOENT,
                               "no support for plist configuration files");
        return ENOENT;
 #endif
@@ -491,7 +484,7 @@ krb5_config_parse_file_multi (krb5_context context,
                free(newfname);
            return ret;
        }
-       
+
        if (newfname)
            free(newfname);
        fname = newfname = exp_fname;
@@ -507,7 +500,7 @@ krb5_config_parse_file_multi (krb5_context context,
                free(newfname);
            return ret;
        }
-       
+
        ret = krb5_config_parse_debug (&f, res, &lineno, &str);
        fclose(f.f);
        if (ret) {
@@ -635,7 +628,7 @@ vget_next(krb5_context context,
     const char *p = va_arg(args, const char *);
     while(b != NULL) {
        if(strcmp(b->name, name) == 0) {
-           if(b->type == type && p == NULL) {
+           if(b->type == (unsigned)type && p == NULL) {
                *pointer = b;
                return b->u.generic;
            } else if(b->type == krb5_config_list && p != NULL) {
@@ -675,7 +668,7 @@ _krb5_config_vget_next (krb5_context context,
     /* we were called again, so just look for more entries with the
        same name and type */
     for (b = (*pointer)->next; b != NULL; b = b->next) {
-       if(strcmp(b->name, (*pointer)->name) == 0 && b->type == type) {
+       if(strcmp(b->name, (*pointer)->name) == 0 && b->type == (unsigned)type) {
            *pointer = b;
            return b->u.generic;
        }
@@ -699,7 +692,7 @@ _krb5_config_get (krb5_context context,
 }
 
 
-const void *
+KRB5_LIB_FUNCTION const void * KRB5_LIB_CALL
 _krb5_config_vget (krb5_context context,
                   const krb5_config_section *c,
                   int type,
@@ -770,7 +763,7 @@ krb5_config_vget_list (krb5_context context,
  *
  * @ingroup krb5_support
  */
+
 KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL
 krb5_config_get_string (krb5_context context,
                        const krb5_config_section *c,
@@ -864,6 +857,50 @@ krb5_config_get_string_default (krb5_context context,
     return ret;
 }
 
+static char *
+next_component_string(char * begin, const char * delims, char **state)
+{
+    char * end;
+
+    if (begin == NULL)
+        begin = *state;
+
+    if (*begin == '\0')
+        return NULL;
+
+    end = begin;
+    while (*end == '"') {
+        char * t = strchr(end + 1, '"');
+
+        if (t)
+            end = ++t;
+        else
+            end += strlen(end);
+    }
+
+    if (*end != '\0') {
+        size_t pos;
+
+        pos = strcspn(end, delims);
+        end = end + pos;
+    }
+
+    if (*end != '\0') {
+        *end = '\0';
+        *state = end + 1;
+        if (*begin == '"' && *(end - 1) == '"' && begin + 1 < end) {
+            begin++; *(end - 1) = '\0';
+        }
+        return begin;
+    }
+
+    *state = end;
+    if (*begin == '"' && *(end - 1) == '"' && begin + 1 < end) {
+        begin++; *(end - 1) = '\0';
+    }
+    return begin;
+}
+
 /**
  * Get a list of configuration strings, free the result with
  * krb5_config_free_strings().
@@ -894,7 +931,7 @@ krb5_config_vget_strings(krb5_context context,
        char *s;
        if(tmp == NULL)
            goto cleanup;
-       s = strtok_r(tmp, " \t", &pos);
+       s = next_component_string(tmp, " \t", &pos);
        while(s){
            char **tmp2 = realloc(strings, (nstr + 1) * sizeof(*strings));
            if(tmp2 == NULL)
@@ -904,7 +941,7 @@ krb5_config_vget_strings(krb5_context context,
            nstr++;
            if(strings[nstr-1] == NULL)
                goto cleanup;
-           s = strtok_r(NULL, " \t", &pos);
+           s = next_component_string(NULL, " \t", &pos);
        }
        free(tmp);
     }
@@ -1258,11 +1295,11 @@ krb5_config_get_int (krb5_context context,
  * @ingroup krb5_deprecated
  */
 
-KRB5_DEPRECATED
-krb5_error_code KRB5_LIB_FUNCTION
+KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
 krb5_config_parse_string_multi(krb5_context context,
                               const char *string,
                               krb5_config_section **res)
+    KRB5_DEPRECATED_FUNCTION("Use X instead")
 {
     const char *str;
     unsigned lineno = 0;