Checkpoint first step of merge.
authorKen Raeburn <raeburn@mit.edu>
Sat, 7 Dec 2002 03:37:24 +0000 (03:37 +0000)
committerKen Raeburn <raeburn@mit.edu>
Sat, 7 Dec 2002 03:37:24 +0000 (03:37 +0000)
Moved per-file data into a separate object from the profile handle.
Dropped some old MacOS 9 code.

* prof_int.h: Include Mac OS X versions of header files if appropriate.  Only
include prof_err.h if profile.h doesn't define ERROR_TABLE_BASE_prof.
(struct _prf_data_t): Move most of contents of _prf_file_t here.  Add reference
count.
(prf_data_t): New typedef.
(struct _prf_file_t): Include an array of one _prf_data_t structure.
* prof_file.c (profile_open_file): Fill in "data" field.  Drop some old Mac
specific code.
(profile_flush_file_data): Renamed from profile_flush_file, now takes
prf_data_t argument.
(profile_flush_file_data): Likewise.
(profile_free_file): Now calls profile_free_file_data.
(profile_free_file_data): New function, with most of old profile_free_file
code.
* prof_init.c (profile_init_path): Removed old Mac version.
(profile_ser_size, profile_ser_externalize): Get file data from new "data"
field.
* prof_set.c (rw_setup, profile_update_relation, profile_clear_relation,
profile_rename_section, profile_add_relation): Likewise.
* prof_tree.c (profile_node_iterator): Likewise.
* test_profile.c (do_batchmode): Likewise.
* prof_int.h (profile_flush_file): Now a macro.
* prof_err.et (PROF_MAGIC_FILE_DATA): New error code value.

ticket: 1237
status: open

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@15037 dc483132-0cff-0310-8789-dd5450dbe970

src/util/profile/ChangeLog
src/util/profile/prof_err.et
src/util/profile/prof_file.c
src/util/profile/prof_init.c
src/util/profile/prof_int.h
src/util/profile/prof_set.c
src/util/profile/prof_tree.c
src/util/profile/test_profile.c

index 82463e3109c326c5da4ddab10527b78c4e56daa1..cf7c5360f2df33d63b0eea0ca80a35af6af79a0d 100644 (file)
@@ -1,5 +1,32 @@
 2002-12-06  Ken Raeburn  <raeburn@mit.edu>
 
+       * prof_int.h: Include Mac OS X versions of header files if
+       appropriate.  Only include prof_err.h if profile.h doesn't define
+       ERROR_TABLE_BASE_prof.
+       (struct _prf_data_t): Move most of contents of _prf_file_t here.
+       Add reference count.
+       (prf_data_t): New typedef.
+       (struct _prf_file_t): Include an array of one _prf_data_t
+       structure.
+       * prof_file.c (profile_open_file): Fill in "data" field.  Drop
+       some old Mac specific code.
+       (profile_flush_file_data): Renamed from profile_flush_file, now
+       takes prf_data_t argument.
+       (profile_flush_file_data): Likewise.
+       (profile_free_file): Now calls profile_free_file_data.
+       (profile_free_file_data): New function, with most of old
+       profile_free_file code.
+       * prof_init.c (profile_init_path): Removed old Mac version.
+       (profile_ser_size, profile_ser_externalize): Get file data from
+       new "data" field.
+       * prof_set.c (rw_setup, profile_update_relation,
+       profile_clear_relation, profile_rename_section,
+       profile_add_relation): Likewise.
+       * prof_tree.c (profile_node_iterator): Likewise.
+       * test_profile.c (do_batchmode): Likewise.
+       * prof_int.h (profile_flush_file): Now a macro.
+       * prof_err.et (PROF_MAGIC_FILE_DATA): New error code value.
+
        * prof_get.c (conf_yes, conf_no): Entries now point to const.
        (profile_parse_boolean): Updated type of 'p' correspondingly.
 
index dc248f417bfba7534f2d46e10b0c34ec2e3baf51..af7801ee0a804eb3128abd01334f412a6dc453a4 100644 (file)
@@ -60,4 +60,7 @@ error_code    PROF_EXISTS,            "Section already exists"
 error_code     PROF_BAD_BOOLEAN,               "Invalid boolean value"
 error_code     PROF_BAD_INTEGER,               "Invalid integer value"
 
+error_code     PROF_MAGIC_FILE_DATA, "Bad magic value in profile_file_data_t"
+
+
 end
index 52fc5bbf70cae26146376cd41434b5b7624b9675..4ffe7e1384df538dd7ec5e40663f79dd154c8775 100644 (file)
@@ -74,34 +74,33 @@ errcode_t profile_open_file(filespec, ret_prof)
        errcode_t       retval;
        char            *home_env = 0;
        unsigned int    len;
+       prf_data_t      data;
 
        prf = malloc(sizeof(struct _prf_file_t));
        if (!prf)
                return ENOMEM;
        memset(prf, 0, sizeof(struct _prf_file_t));
-               
-#ifndef macintosh
+       data = prf->data;
+
        len = strlen(filespec)+1;
        if (filespec[0] == '~' && filespec[1] == '/') {
                home_env = getenv("HOME");
                if (home_env)
                        len += strlen(home_env);
        }
-       prf->filespec = malloc(len);
-       if (!prf->filespec) {
+       data->filespec = malloc(len);
+       if (!data->filespec) {
                free(prf);
                return ENOMEM;
        }
        if (home_env) {
-               strcpy(prf->filespec, home_env);
-               strcat(prf->filespec, filespec+1);
+               strcpy(data->filespec, home_env);
+               strcat(data->filespec, filespec+1);
        } else
-               strcpy(prf->filespec, filespec);
-       prf->magic = PROF_MAGIC_FILE;
-#else
-       prf->filespec = filespec;
+               strcpy(data->filespec, filespec);
        prf->magic = PROF_MAGIC_FILE;
-#endif
+       data->magic = PROF_MAGIC_FILE_DATA;
+       data->refcount = 1;
 
        retval = profile_update_file(prf);
        if (retval) {
@@ -113,8 +112,7 @@ errcode_t profile_open_file(filespec, ret_prof)
        return 0;
 }
 
-errcode_t profile_update_file(prf)
-       prf_file_t prf;
+errcode_t profile_update_file_data(prf_data_t data)
 {
        errcode_t retval;
 #ifdef HAVE_STAT
@@ -123,17 +121,17 @@ errcode_t profile_update_file(prf)
        FILE *f;
 
 #ifdef HAVE_STAT
-       if (stat(prf->filespec, &st))
+       if (stat(data->filespec, &st))
                return errno;
-       if (st.st_mtime == prf->timestamp)
+       if (st.st_mtime == data->timestamp)
                return 0;
-       if (prf->root) {
-               profile_free_node(prf->root);
-               prf->root = 0;
+       if (data->root) {
+               profile_free_node(data->root);
+               data->root = 0;
        }
-       if (prf->comment) {
-               free(prf->comment);
-               prf->comment = 0;
+       if (data->comment) {
+               free(data->comment);
+               data->comment = 0;
        }
 #else
        /*
@@ -141,14 +139,14 @@ errcode_t profile_update_file(prf)
         * memory image is correct.  That is, we won't reread the
         * profile file if it changes.
         */
-       if (prf->root)
+       if (data->root)
                return 0;
 #endif
        errno = 0;
 #ifdef PROFILE_USES_PATHS
-       f = fopen(prf->filespec, "r");
+       f = fopen(data->filespec, "r");
 #else
-       f = FSp_fopen (&prf->filespec, "r");
+       f = FSp_fopen (&data->filespec, "r");
 #endif
        if (f == NULL) {
                retval = errno;
@@ -156,16 +154,16 @@ errcode_t profile_update_file(prf)
                        retval = ENOENT;
                return retval;
        }
-       prf->upd_serial++;
-       prf->flags = 0;
-       if (rw_access(prf->filespec))
-               prf->flags |= PROFILE_FILE_RW;
-       retval = profile_parse_file(f, &prf->root);
+       data->upd_serial++;
+       data->flags = 0;
+       if (rw_access(data->filespec))
+               data->flags |= PROFILE_FILE_RW;
+       retval = profile_parse_file(f, &data->root);
        fclose(f);
        if (retval)
                return retval;
 #ifdef HAVE_STAT
-       prf->timestamp = st.st_mtime;
+       data->timestamp = st.st_mtime;
 #endif
        return 0;
 }
@@ -188,33 +186,33 @@ OSErr GetMacOSTempFilespec (
 #endif
 
 
-errcode_t profile_flush_file(prf)
-       prf_file_t prf;
+errcode_t profile_flush_file_data(data)
+       prf_data_t data;
 {
        FILE            *f;
        profile_filespec_t new_file;
        profile_filespec_t old_file;
        errcode_t       retval = 0;
        
-       if (!prf || prf->magic != PROF_MAGIC_FILE)
-               return PROF_MAGIC_FILE;
+       if (!data || data->magic != PROF_MAGIC_FILE_DATA)
+               return PROF_MAGIC_FILE_DATA;
        
-       if ((prf->flags & PROFILE_FILE_DIRTY) == 0)
+       if ((data->flags & PROFILE_FILE_DIRTY) == 0)
                return 0;
 
        retval = ENOMEM;
        
 #ifdef PROFILE_USES_PATHS
        new_file = old_file = 0;
-       new_file = malloc(strlen(prf->filespec) + 5);
+       new_file = malloc(strlen(data->filespec) + 5);
        if (!new_file)
                goto errout;
-       old_file = malloc(strlen(prf->filespec) + 5);
+       old_file = malloc(strlen(data->filespec) + 5);
        if (!old_file)
                goto errout;
 
-       sprintf(new_file, "%s.$$$", prf->filespec);
-       sprintf(old_file, "%s.bak", prf->filespec);
+       sprintf(new_file, "%s.$$$", data->filespec);
+       sprintf(old_file, "%s.bak", data->filespec);
 
        errno = 0;
 
@@ -222,7 +220,7 @@ errcode_t profile_flush_file(prf)
 #else
        /* On MacOS, we do this by writing to a new file and then atomically
        swapping the files with a file system call */
-       GetMacOSTempFilespec (&prf->filespec, &new_file);
+       GetMacOSTempFilespec (&data->filespec, &new_file);
        f = FSp_fopen (&new_file, "w");
 #endif
        
@@ -233,7 +231,7 @@ errcode_t profile_flush_file(prf)
                goto errout;
        }
 
-       profile_write_tree_file(prf->root, f);
+       profile_write_tree_file(data->root, f);
        if (fclose(f) != 0) {
                retval = errno;
                goto errout;
@@ -241,18 +239,18 @@ errcode_t profile_flush_file(prf)
 
 #ifdef PROFILE_USES_PATHS
        unlink(old_file);
-       if (rename(prf->filespec, old_file)) {
+       if (rename(data->filespec, old_file)) {
                retval = errno;
                goto errout;
        }
-       if (rename(new_file, prf->filespec)) {
+       if (rename(new_file, data->filespec)) {
                retval = errno;
-               rename(old_file, prf->filespec); /* back out... */
+               rename(old_file, data->filespec); /* back out... */
                goto errout;
        }
 #else
        {
-               OSErr err = FSpExchangeFiles (&prf->filespec, &new_file);
+               OSErr err = FSpExchangeFiles (&data->filespec, &new_file);
                if (err != noErr) {
                        retval = ENFILE;
                        goto errout;
@@ -262,9 +260,9 @@ errcode_t profile_flush_file(prf)
 #endif
 
 
-       prf->flags = 0;
-       if (rw_access(prf->filespec))
-               prf->flags |= PROFILE_FILE_RW;
+       data->flags = 0;
+       if (rw_access(data->filespec))
+               data->flags |= PROFILE_FILE_RW;
        retval = 0;
        
 errout:
@@ -281,18 +279,22 @@ errout:
 void profile_free_file(prf)
        prf_file_t prf;
 {
-#ifdef PROFILE_USES_PATHS
-       if (prf->filespec)
-               free(prf->filespec);
-#endif
-       if (prf->root)
-               profile_free_node(prf->root);
-       if (prf->comment)
-               free(prf->comment);
-       prf->magic = 0;
+       profile_free_file_data(prf->data);
        free(prf);
+}
 
-       return;
+void profile_free_file_data(data)
+       prf_data_t data;
+{
+#ifdef PROFILE_USES_PATHS
+       if (data->filespec)
+               free(data->filespec);
+#endif
+       if (data->root)
+               profile_free_node(data->root);
+       if (data->comment)
+               free(data->comment);
+       data->magic = 0;
 }
 
 errcode_t profile_close_file(prf)
index f94833a7bc203a9a0f2d97f142ba4416b4e8a79b..46ebf2dbd6713b25e66476fb2f7c377bab4f7e09 100644 (file)
@@ -73,10 +73,6 @@ profile_init(files, ret_profile)
         return 0;
 }
 
-#ifndef macintosh
-/* 
- * On MacOS, profile_init_path is the same as profile_init
- */
 errcode_t KRB5_CALLCONV
 profile_init_path(filepath, ret_profile)
        const_profile_filespec_list_t filepath;
@@ -128,15 +124,6 @@ profile_init_path(filepath, ret_profile)
 
        return retval;
 }
-#else
-errcode_t KRB5_CALLCONV
-profile_init_path(filelist, ret_profile)
-       profile_filespec_list_t filelist;
-       profile_t *ret_profile;
-{
-       return profile_init (filelist, ret_profile);
-}
-#endif
 
 errcode_t KRB5_CALLCONV
 profile_flush(profile)
@@ -200,8 +187,8 @@ errcode_t profile_ser_size(unused, profile, sizep)
     for (pfp = profile->first_file; pfp; pfp = pfp->next) {
        required += sizeof(prof_int32);
 #ifdef PROFILE_USES_PATHS
-       if (pfp->filespec)
-           required += strlen(pfp->filespec);
+       if (pfp->data->filespec)
+           required += strlen(pfp->data->filespec);
 #else
        required += sizeof (profile_filespec_t);
 #endif
@@ -251,18 +238,18 @@ errcode_t profile_ser_externalize(unused, profile, bufpp, remainp)
            pack_int32(fcount, &bp, &remain);
            for (pfp = profile->first_file; pfp; pfp = pfp->next) {
 #ifdef PROFILE_USES_PATHS
-               slen = (pfp->filespec) ?
-                   (prof_int32) strlen(pfp->filespec) : 0;
+               slen = (pfp->data->filespec) ?
+                   (prof_int32) strlen(pfp->data->filespec) : 0;
                pack_int32(slen, &bp, &remain);
                if (slen) {
-                   memcpy(bp, pfp->filespec, (size_t) slen);
+                   memcpy(bp, pfp->data->filespec, (size_t) slen);
                    bp += slen;
                    remain -= (size_t) slen;
                }
 #else
                slen = sizeof (FSSpec);
                pack_int32(slen, &bp, &remain);
-               memcpy (bp, &(pfp->filespec), (size_t) slen);
+               memcpy (bp, &(pfp->data->filespec), (size_t) slen);
                bp += slen;
                remain -= (size_t) slen;
 #endif
index 3f120a7fa300c5c6ca18246253da837a810fe8f2..00fd2847b1b3295c5ea007491771fb22ef8a4b43 100644 (file)
@@ -3,9 +3,19 @@
  */
 
 #include <time.h>
+#if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
+#include <TargetConditionals.h>
+#include <Kerberos/com_err.h>
+#include <Kerberos/FullPOSIXPath.h>
+#include <CoreServices/CoreServices.h>
+#else
 #include "com_err.h"
-#include "prof_err.h"
+#endif
+
 #include "profile.h"
+#ifndef ERROR_TABLE_BASE_prof
+#include "prof_err.h"
+#endif
 
 #if defined(_WIN32)
 #define SIZEOF_INT      4
@@ -24,14 +34,23 @@ typedef long prf_magic_t;
  * This is the structure which stores the profile information for a
  * particular configuration file.
  */
-struct _prf_file_t {
+struct _prf_data_t {
        prf_magic_t     magic;
        char            *comment;
        profile_filespec_t filespec;
        struct profile_node *root;
-       time_t          timestamp;
-       int             flags;
-       int             upd_serial;
+       time_t          timestamp; /* time tree was last updated from file */
+       int             flags;  /* r/w, dirty */
+       int             upd_serial; /* incremented when data changes */
+       int             refcount; /* prf_file_t references */
+       struct _prf_data_t *next;
+};
+
+typedef struct _prf_data_t *prf_data_t;
+
+struct _prf_file_t {
+       prf_magic_t     magic;
+       struct _prf_data_t      data[1];
        struct _prf_file_t *next;
 };
 
@@ -162,14 +181,17 @@ errcode_t profile_rename_node
 errcode_t profile_open_file
        (const_profile_filespec_t file, prf_file_t *ret_prof);
 
-errcode_t profile_update_file
-       (prf_file_t profile);
+#define profile_update_file(P) profile_update_file_data((P)->data)
+errcode_t profile_update_file_data
+       (prf_data_t profile);
 
-errcode_t profile_flush_file
-       (prf_file_t profile);
+#define profile_flush_file(P) (((P) && (P)->magic == PROF_MAGIC_FILE) ? profile_flush_file_data((P)->data) : PROF_MAGIC_FILE)
+errcode_t profile_flush_file_data
+       (prf_data_t data);
 
 void profile_free_file
        (prf_file_t profile);
+void profile_free_file_data (prf_data_t data);
 
 errcode_t profile_close_file
        (prf_file_t profile);
index 1f2b16d810cb96fd583b8538eeca126f28c51e42..4c6ccb29d5e48159440a2638965882c1ac9fde75 100644 (file)
@@ -33,11 +33,11 @@ static errcode_t rw_setup(profile)
                return PROF_MAGIC_PROFILE;
 
        file = profile->first_file;
-       if (!(file->flags & PROFILE_FILE_RW))
+       if (!(file->data->flags & PROFILE_FILE_RW))
                return PROF_READ_ONLY;
 
        /* Don't update the file if we've already made modifications */
-       if (file->flags & PROFILE_FILE_DIRTY)
+       if (file->data->flags & PROFILE_FILE_DIRTY)
                return 0;
                        
        retval = profile_update_file(file);
@@ -73,7 +73,7 @@ profile_update_relation(profile, names, old_value, new_value)
        if (!old_value || !*old_value)
                return PROF_EINVAL;
 
-       section = profile->first_file->root;
+       section = profile->first_file->data->root;
        for (cpp = names; cpp[1]; cpp++) {
                state = 0;
                retval = profile_find_node(section, *cpp, 0, 1,
@@ -94,7 +94,7 @@ profile_update_relation(profile, names, old_value, new_value)
        if (retval)
                return retval;
 
-       profile->first_file->flags |= PROFILE_FILE_DIRTY;
+       profile->first_file->data->flags |= PROFILE_FILE_DIRTY;
        
        return 0;
 }
@@ -121,7 +121,7 @@ profile_clear_relation(profile, names)
        if (names == 0 || names[0] == 0 || names[1] == 0)
                return PROF_BAD_NAMESET;
 
-       section = profile->first_file->root;
+       section = profile->first_file->data->root;
        for (cpp = names; cpp[1]; cpp++) {
                state = 0;
                retval = profile_find_node(section, *cpp, 0, 1,
@@ -140,7 +140,7 @@ profile_clear_relation(profile, names)
                        return retval;
        } while (state);
 
-       profile->first_file->flags |= PROFILE_FILE_DIRTY;
+       profile->first_file->data->flags |= PROFILE_FILE_DIRTY;
        
        return 0;
 }
@@ -169,7 +169,7 @@ profile_rename_section(profile, names, new_name)
        if (names == 0 || names[0] == 0 || names[1] == 0)
                return PROF_BAD_NAMESET;
 
-       section = profile->first_file->root;
+       section = profile->first_file->data->root;
        for (cpp = names; cpp[1]; cpp++) {
                state = 0;
                retval = profile_find_node(section, *cpp, 0, 1,
@@ -190,7 +190,7 @@ profile_rename_section(profile, names, new_name)
        if (retval)
                return retval;
 
-       profile->first_file->flags |= PROFILE_FILE_DIRTY;
+       profile->first_file->data->flags |= PROFILE_FILE_DIRTY;
        
        return 0;
 }
@@ -222,7 +222,7 @@ profile_add_relation(profile, names, new_value)
        if (names == 0 || names[0] == 0 || names[1] == 0)
                return PROF_BAD_NAMESET;
 
-       section = profile->first_file->root;
+       section = profile->first_file->data->root;
        for (cpp = names; cpp[1]; cpp++) {
                state = 0;
                retval = profile_find_node(section, *cpp, 0, 1,
@@ -245,7 +245,7 @@ profile_add_relation(profile, names, new_value)
        if (retval)
                return retval;
 
-       profile->first_file->flags |= PROFILE_FILE_DIRTY;
+       profile->first_file->data->flags |= PROFILE_FILE_DIRTY;
        
        return 0;
 }
index be76db32818917f29c73e723b65d08f108212440..41e71ffb8ef4222b3ed2d8800a642269efe66320 100644 (file)
@@ -481,7 +481,7 @@ errcode_t profile_node_iterator(iter_p, ret_node, ret_name, ret_value)
         * If the file has changed, then the node pointer is invalid,
         * so we'll have search the file again looking for it.
         */
-       if (iter->node && (iter->file->upd_serial != iter->file_serial)) {
+       if (iter->node && (iter->file->data->upd_serial != iter->file_serial)) {
                iter->flags &= ~PROFILE_ITER_FINAL_SEEN;
                skip_num = iter->num;
                iter->node = 0;
@@ -510,12 +510,12 @@ get_new_file:
                 return retval;
             }
                }
-               iter->file_serial = iter->file->upd_serial;
+               iter->file_serial = iter->file->data->upd_serial;
                /*
                 * Find the section to list if we are a LIST_SECTION,
                 * or find the containing section if not.
                 */
-               section = iter->file->root;
+               section = iter->file->data->root;
                for (cpp = iter->names; cpp[iter->done_idx]; cpp++) {
                        for (p=section->first_child; p; p = p->next)
                                if (!strcmp(p->name, *cpp) && !p->value)
index df4867d7410ba451121b690652ebb556eac18a21..8a97dd2f7a5b64ffdef67c9b713610d90c1e8000 100644 (file)
@@ -61,7 +61,7 @@ static void do_batchmode(profile)
                        print_status = PRINT_VALUES;
                } else if (!strcmp(cmd, "dump")) {
                        retval = profile_write_tree_file
-                               (profile->first_file->root, stdout);
+                               (profile->first_file->data->root, stdout);
                } else if (!strcmp(cmd, "clear")) {
                        retval = profile_clear_relation(profile, names);
                } else if (!strcmp(cmd, "update")) {
@@ -69,7 +69,7 @@ static void do_batchmode(profile)
                                                         *names, *(names+1));
                } else if (!strcmp(cmd, "verify")) {
                        retval = profile_verify_node
-                               (profile->first_file->root);
+                               (profile->first_file->data->root);
                } else if (!strcmp(cmd, "rename_section")) {
                        retval = profile_rename_section(profile, names+1,
                                                        *names);