diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 905be9fe..6e6c01cd 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,5 +1,8 @@ 2006-01-04 Theodore Ts'o + * profile.c: Eliminate the prf_data_t data structure and fold it + back into prof_file_t. Eschew needless complexity! + * profile.c: Change syntax accepted by the profile parser. The value of profile relations must not contain spaces unless it is quoted; otherwise the parser will throw an error. diff --git a/e2fsck/profile.c b/e2fsck/profile.c index 85061085..e0c4e977 100644 --- a/e2fsck/profile.c +++ b/e2fsck/profile.c @@ -12,7 +12,7 @@ * It has been folded into a single C source file to make it easier to * fold into an application program.) * - * Copyright (C) 2005 by Theodore Ts'o. + * Copyright (C) 2005, 2006 by Theodore Ts'o. * * %Begin-Header% * This file may be redistributed under the terms of the GNU Public @@ -74,8 +74,6 @@ #undef STAT_ONCE_PER_SECOND #undef HAVE_STAT -/* Begin prof_int.h */ - /* * prof_int.h */ @@ -86,32 +84,16 @@ typedef long prf_magic_t; * This is the structure which stores the profile information for a * particular configuration file. */ -struct _prf_data_t { +struct _prf_file_t { prf_magic_t magic; - struct profile_node *root; + char *filespec; #ifdef STAT_ONCE_PER_SECOND time_t last_stat; #endif time_t timestamp; /* time tree was last updated from file */ int flags; /* r/w, dirty */ int upd_serial; /* incremented when data changes */ - char *comment; - - size_t fslen; - - struct _prf_data_t *next; - /* Was: "profile_filespec_t filespec". Now: flexible char - array ... except, we need to work in C89, so an array - length must be specified. */ - const char filespec[sizeof("/etc/krb5.conf")]; -}; - -typedef struct _prf_data_t *prf_data_t; -static prf_data_t profile_make_prf_data(const char *); - -struct _prf_file_t { - prf_magic_t magic; - struct _prf_data_t *data; + struct profile_node *root; struct _prf_file_t *next; }; @@ -164,10 +146,8 @@ struct profile_node { if ((node)->magic != PROF_MAGIC_NODE) \ return PROF_MAGIC_NODE; -/* profile_parse.c */ - static errcode_t profile_parse_file - (FILE *f, prf_data_t data); + (FILE *f, prf_file_t prf); #ifdef DEBUG_PROGRAM static errcode_t profile_write_tree_file @@ -178,8 +158,6 @@ static errcode_t profile_write_tree_to_buffer #endif -/* prof_tree.c */ - static void profile_free_node (struct profile_node *relation); @@ -207,33 +185,20 @@ static errcode_t profile_node_iterator (void **iter_p, struct profile_node **ret_node, char **ret_name, char **ret_value); -/* prof_file.c */ - static errcode_t profile_open_file (const char * file, prf_file_t *ret_prof); -#define profile_update_file(P) profile_update_file_data((P)->data) -static errcode_t profile_update_file_data - (prf_data_t profile); +static errcode_t profile_update_file + (prf_file_t prf); static void profile_free_file (prf_file_t profile); -/* prof_init.c -- included from profile.h */ - -/* prof_get.c */ - static errcode_t profile_get_value(profile_t profile, const char *name, const char *subname, const char *subsubname, const char **ret_value); -/* Others included from profile.h */ - -/* prof_set.c -- included from profile.h */ -/* End prof_int.h */ - -/* Begin prof_init.c */ /* * prof_init.c --- routines that manipulate the user-visible profile_t * object. @@ -302,39 +267,10 @@ profile_release(profile_t profile) } -/* End prof_init.c */ - -/* Begin prof_file.c */ /* * prof_file.c ---- routines that manipulate an individual profile file. */ -static prf_data_t -profile_make_prf_data(const char *filename) -{ - prf_data_t d; - size_t len, flen, slen; - char *fcopy; - - flen = strlen(filename); - slen = offsetof(struct _prf_data_t, filespec); - len = slen + flen + 1; - if (len < sizeof(struct _prf_data_t)) - len = sizeof(struct _prf_data_t); - d = malloc(len); - if (d == NULL) - return NULL; - memset(d, 0, len); - fcopy = (char *) d + slen; - strcpy(fcopy, filename); - d->comment = NULL; - d->magic = PROF_MAGIC_FILE_DATA; - d->root = NULL; - d->next = NULL; - d->fslen = flen; - return d; -} - errcode_t profile_open_file(const char * filespec, prf_file_t *ret_prof) { @@ -342,7 +278,6 @@ errcode_t profile_open_file(const char * filespec, errcode_t retval; char *home_env = 0; unsigned int len; - prf_data_t data; char *expanded_filename; prf = malloc(sizeof(struct _prf_file_t)); @@ -385,14 +320,7 @@ errcode_t profile_open_file(const char * filespec, } else memcpy(expanded_filename, filespec, len); - data = profile_make_prf_data(expanded_filename); - if (data == NULL) { - free(prf); - free(expanded_filename); - return ENOMEM; - } - free(expanded_filename); - prf->data = data; + prf->filespec = expanded_filename; retval = profile_update_file(prf); if (retval) { @@ -404,7 +332,7 @@ errcode_t profile_open_file(const char * filespec, return 0; } -errcode_t profile_update_file_data(prf_data_t data) +errcode_t profile_update_file(prf_file_t prf) { errcode_t retval; #ifdef HAVE_STAT @@ -418,27 +346,23 @@ errcode_t profile_update_file_data(prf_data_t data) #ifdef HAVE_STAT #ifdef STAT_ONCE_PER_SECOND now = time(0); - if (now == data->last_stat && data->root != NULL) { + if (now == prf->last_stat && prf->root != NULL) { return 0; } #endif - if (stat(data->filespec, &st)) { + if (stat(prf->filespec, &st)) { retval = errno; return retval; } #ifdef STAT_ONCE_PER_SECOND - data->last_stat = now; + prf->last_stat = now; #endif - if (st.st_mtime == data->timestamp && data->root != NULL) { + if (st.st_mtime == prf->timestamp && prf->root != NULL) { return 0; } - if (data->root) { - profile_free_node(data->root); - data->root = 0; - } - if (data->comment) { - free(data->comment); - data->comment = 0; + if (prf->root) { + profile_free_node(prf->root); + prf->root = 0; } #else /* @@ -446,46 +370,40 @@ errcode_t profile_update_file_data(prf_data_t data) * memory image is correct. That is, we won't reread the * profile file if it changes. */ - if (data->root) { + if (prf->root) { return 0; } #endif errno = 0; - f = fopen(data->filespec, "r"); + f = fopen(prf->filespec, "r"); if (f == NULL) { retval = errno; if (retval == 0) retval = ENOENT; return retval; } - data->upd_serial++; - retval = profile_parse_file(f, data); + prf->upd_serial++; + retval = profile_parse_file(f, prf); fclose(f); if (retval) { return retval; } #ifdef HAVE_STAT - data->timestamp = st.st_mtime; + prf->timestamp = st.st_mtime; #endif return 0; } void profile_free_file(prf_file_t prf) { - prf_data_t data = prf->data; - - if (data->root) - profile_free_node(data->root); - if (data->comment) - free(data->comment); - data->magic = 0; - free(data); + if (prf->root) + profile_free_node(prf->root); + if (prf->filespec) + free(prf->filespec); free(prf); } -/* End prof_file.c */ - -/* Begin prof_parse.c */ +/* Begin the profile parser */ static profile_syntax_err_cb_t syntax_err_cb; @@ -498,8 +416,6 @@ profile_syntax_err_cb_t profile_set_syntax_err_cb(profile_syntax_err_cb_t hook) return(old); } -#define SECTION_SEP_CHAR '/' - #define STATE_INIT_COMMENT 0 #define STATE_STD_LINE 1 #define STATE_GET_OBRACE 2 @@ -714,7 +630,7 @@ static errcode_t parse_line(char *line, struct parse_state *state) return 0; } -errcode_t profile_parse_file(FILE *f, prf_data_t data) +errcode_t profile_parse_file(FILE *f, prf_file_t file) { char buf[2048]; errcode_t retval; @@ -732,12 +648,12 @@ errcode_t profile_parse_file(FILE *f, prf_data_t data) retval = parse_line(buf, &state); if (retval) { if (syntax_err_cb) - (syntax_err_cb)(data->filespec, retval, + (syntax_err_cb)(file->filespec, retval, state.line_num); return retval; } } - data->root = state.root_section; + file->root = state.root_section; return 0; } @@ -927,10 +843,6 @@ errcode_t profile_write_tree_to_buffer(struct profile_node *root, } #endif -/* End prof_parse.c */ - -/* Begin prof_tree.c */ - /* * prof_tree.c --- these routines maintain the parse tree of the * config file. @@ -1252,13 +1164,11 @@ errcode_t profile_node_iterator(void **iter_p, struct profile_node **ret_node, return PROF_MAGIC_ITERATOR; if (iter->file && iter->file->magic != PROF_MAGIC_FILE) return PROF_MAGIC_FILE; - if (iter->file && iter->file->data->magic != PROF_MAGIC_FILE_DATA) - return PROF_MAGIC_FILE_DATA; /* * 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->data->upd_serial != iter->file_serial)) { + if (iter->node && (iter->file->upd_serial != iter->file_serial)) { iter->flags &= ~PROFILE_ITER_FINAL_SEEN; skip_num = iter->num; iter->node = 0; @@ -1291,12 +1201,12 @@ get_new_file: return retval; } } - iter->file_serial = iter->file->data->upd_serial; + iter->file_serial = iter->file->upd_serial; /* * Find the section to list if we are a LIST_SECTION, * or find the containing section if not. */ - section = iter->file->data->root; + section = iter->file->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) @@ -1360,11 +1270,6 @@ get_new_file: } - -/* End prof_tree.c */ - - -/* Begin prof_get.c */ /* * prof_get.c --- routines that expose the public interfaces for * querying items from the profile. @@ -1569,8 +1474,6 @@ profile_iterator(void **iter_p, char **ret_name, char **ret_value) return 0; } -/* End prof_get.c */ - #ifdef DEBUG_PROGRAM /* @@ -1630,7 +1533,7 @@ static void do_cmd(profile_t profile, char **argv) print_status = PRINT_VALUES; } else if (!strcmp(cmd, "dump")) { retval = profile_write_tree_file - (profile->first_file->data->root, stdout); + (profile->first_file->root, stdout); #if 0 } else if (!strcmp(cmd, "clear")) { retval = profile_clear_relation(profile, names); @@ -1640,7 +1543,7 @@ static void do_cmd(profile_t profile, char **argv) #endif } else if (!strcmp(cmd, "verify")) { retval = profile_verify_node - (profile->first_file->data->root); + (profile->first_file->root); #if 0 } else if (!strcmp(cmd, "rename_section")) { retval = profile_rename_section(profile, names+1, *names);