From cc06d00b215b4aebfdd05ad205c088e3dc1ba666 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Sun, 25 Sep 2011 21:30:02 +0100 Subject: [PATCH] Move configuration parsing into libcmd Rework the API for directly parsing configuration files and move it out of util/ and into libcmd, where we can actually make use of it. This is a raw API - it provides direct access to the parser. The eventual intent is that this will predominantly be contained within libcmd itself, which will then wrap this with the more general purpose Option functions Change-Id: I9f4a9c373c4123023120f69e595068ead6160507 Reviewed-on: http://gerrit.openafs.org/7132 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/cmd/Makefile.in | 5 ++- src/cmd/cmd.p.h | 27 ++++++++++++ src/{util => cmd}/krb5_locl.h | 78 +++++++++++++++++++---------------- src/util/Makefile.in | 10 +---- src/util/afsutil_prototypes.h | 9 ---- 5 files changed, 75 insertions(+), 54 deletions(-) rename src/{util => cmd}/krb5_locl.h (65%) diff --git a/src/cmd/Makefile.in b/src/cmd/Makefile.in index 9af3ce8a2..ef44d5b7c 100644 --- a/src/cmd/Makefile.in +++ b/src/cmd/Makefile.in @@ -10,7 +10,7 @@ include @TOP_OBJDIR@/src/config/Makefile.config include @TOP_OBJDIR@/src/config/Makefile.lwp -LIBOBJS=cmd_errors.o cmd.o +LIBOBJS=cmd_errors.o cmd.o config_file.o LIBPICOBJS=cmd_errors_pic.o cmd_pic.o LIB64OBJS=cmd_errors64.o cmd64.o @@ -42,6 +42,9 @@ cmd_errors.o: cmd_errors.c cmd.o: cmd.c cmd.h +config_file.o: $(TOP_SRCDIR)/external/heimdal/krb5/config_file.c krb5_locl.h + $(AFS_CCRULE) -c $(TOP_SRCDIR)/external/heimdal/krb5/config_file.c + cmd_errors64.o: cmd_errors.c ${CC} $(COMMON_CFLAGS) $(CPPFLAGS) ${XCFLAGS64} \ -c -o cmd_errors64.o cmd_errors.c diff --git a/src/cmd/cmd.p.h b/src/cmd/cmd.p.h index d7c58fe17..69b5feaa3 100644 --- a/src/cmd/cmd.p.h +++ b/src/cmd/cmd.p.h @@ -97,4 +97,31 @@ extern int cmd_OptionAsList(struct cmd_syndesc *syn, int pos, struct cmd_item ** extern int cmd_OptionAsFlag(struct cmd_syndesc *syn, int pos, int *value); extern int cmd_OptionPresent(struct cmd_syndesc *syn, int pos); +/* Config files */ + +struct cmd_config_binding { + enum { cmd_config_string, cmd_config_list } type; + char *name; + struct cmd_config_binding *next; + union { + char *string; + struct cmd_config_binding *list; + void *generic; + } u; +}; + +/* Raw config file access */ +typedef struct cmd_config_binding cmd_config_binding; +typedef struct cmd_config_binding cmd_config_section; + +extern int cmd_RawConfigParseFileMulti(const char *, cmd_config_section **); +extern int cmd_RawConfigParseFile(const char *, cmd_config_section **); +extern int cmd_RawConfigFileFree(cmd_config_section *s); +extern const char* cmd_RawConfigGetString(const cmd_config_section *, + const char *, ...); +extern int cmd_RawConfigGetBool(const cmd_config_section *, int, ...); +extern int cmd_RawConfigGetInt(const cmd_config_section *, int, ...); +extern const cmd_config_binding *cmd_RawConfigGetList + (const cmd_config_section *, ...); + #endif /* __CMD_INCL__ */ diff --git a/src/util/krb5_locl.h b/src/cmd/krb5_locl.h similarity index 65% rename from src/util/krb5_locl.h rename to src/cmd/krb5_locl.h index 086eac7a7..9b5b095bb 100644 --- a/src/util/krb5_locl.h +++ b/src/cmd/krb5_locl.h @@ -19,6 +19,10 @@ #include #include +#include + +#include "cmd.h" + #ifndef TRUE # define TRUE 1 #endif @@ -38,21 +42,11 @@ #define N_(X,Y) X -struct krb5_config_binding { - enum { krb5_config_string, krb5_config_list } type; - char *name; - struct krb5_config_binding *next; - union { - char *string; - struct krb5_config_binding *list; - void *generic; - } u; -}; - -typedef struct krb5_config_binding krb5_config_binding; +typedef struct cmd_config_binding krb5_config_binding; +typedef struct cmd_config_binding krb5_config_section; -typedef krb5_config_binding krb5_config_section; -typedef krb5_config_section afs_config_section; +#define krb5_config_list cmd_config_list +#define krb5_config_string cmd_config_string struct krb5_context_data { krb5_config_section *cf; @@ -73,6 +67,10 @@ static const void *_krb5_config_vget_next(krb5_context, static const char *krb5_config_vget_string(krb5_context, const krb5_config_section *, va_list); +static const char *krb5_config_vget_string_default(krb5_context, + const krb5_config_section *, + const char *, + va_list); static const krb5_config_binding * krb5_config_vget_list (krb5_context, const krb5_config_section *, va_list); static krb5_error_code krb5_config_parse_file_multi @@ -81,10 +79,10 @@ static krb5_error_code krb5_config_parse_file (krb5_context, const char *, krb5_config_section **); static krb5_error_code krb5_config_file_free (krb5_context, krb5_config_section *); -static krb5_boolean krb5_config_vget_bool - (krb5_context, const krb5_config_section *,va_list); -static int krb5_config_vget_int - (krb5_context, const krb5_config_section *, va_list); +static krb5_boolean krb5_config_vget_bool_default + (krb5_context, const krb5_config_section *, int, va_list); +static int krb5_config_vget_int_default + (krb5_context, const krb5_config_section *, int, va_list); static krb5_error_code krb5_string_to_deltat(const char *str, krb5_deltat *t) { @@ -100,11 +98,6 @@ static void krb5_set_error_message(krb5_context context, krb5_error_code ret, return; } -/* Play it safe, by saying we're always suid. */ -static int issuid(void) { - return 1; -} - static int _krb5_homedir_access(krb5_context context) { return 0; } @@ -124,59 +117,74 @@ krb5_abortx(krb5_context context, const char *fmt, ...) /* Wrappers */ int -afs_config_parse_file_multi(const char *fname, afs_config_section **res) { +cmd_RawConfigParseFileMulti(const char *fname, cmd_config_section **res) { return krb5_config_parse_file_multi(NULL, fname, res); } int -afs_config_parse_file(const char *fname, afs_config_section **res) { +cmd_RawConfigParseFile(const char *fname, cmd_config_section **res) { return krb5_config_parse_file(NULL, fname, res); } int -afs_config_file_free(afs_config_section *s) { +cmd_RawConfigFileFree(cmd_config_section *s) { return krb5_config_file_free(NULL, s); } const char* -afs_config_get_string(const afs_config_section *c, ...) +cmd_RawConfigGetString(const cmd_config_section *c, + const char *defval, ...) { const char *ret; va_list args; assert(c != NULL); - va_start(args, c); - ret = krb5_config_vget_string (NULL, c, args); + va_start(args, defval); + ret = krb5_config_vget_string_default (NULL, c, defval, args); va_end(args); return ret; } int -afs_config_get_bool(const afs_config_section *c, ...) +cmd_RawConfigGetBool(const cmd_config_section *c, int defval, ...) { va_list ap; krb5_boolean ret; assert(c != NULL); - va_start(ap, c); - ret = krb5_config_vget_bool (NULL, c, ap); + va_start(ap, defval); + ret = krb5_config_vget_bool_default (NULL, c, defval, ap); va_end(ap); return ret; } int -afs_config_get_int(const krb5_config_section *c, ...) +cmd_RawConfigGetInt(const cmd_config_section *c, int defval, ...) { va_list ap; int ret; assert(c != NULL); - va_start(ap, c); - ret = krb5_config_vget_int (NULL, c, ap); + va_start(ap, defval); + ret = krb5_config_vget_int_default (NULL, c, defval, ap); va_end(ap); return ret; } +const cmd_config_binding * +cmd_RawConfigGetList(const cmd_config_section *c, ...) +{ + va_list ap; + const cmd_config_binding *ret; + + assert(c != NULL); + + va_start(ap, c); + ret = krb5_config_vget_list (NULL, c, ap); + va_end(ap); + + return ret; +} diff --git a/src/util/Makefile.in b/src/util/Makefile.in index 220cc7fbd..6de1ba183 100644 --- a/src/util/Makefile.in +++ b/src/util/Makefile.in @@ -12,8 +12,7 @@ include @TOP_OBJDIR@/src/config/Makefile.lwp HELPER_SPLINT=@HELPER_SPLINT@ -objects =base64.o config_file.o ktime.o volparse.o \ - hostparse.o exec.o \ +objects =base64.o ktime.o volparse.o hostparse.o exec.o \ hputil.o kreltime.o get_krbrlm.o uuid.o serverLog.o \ dirpath.o fileutil.o netutils.o flipbase64.o fstab.o \ afs_atomlist.o afs_lhash.o pthread_glock.o tabular_output.o \ @@ -21,7 +20,6 @@ objects =base64.o config_file.o ktime.o volparse.o \ objects_pic = \ base64_pic.o \ - config_file_pic.o \ ktime_pic.o \ volparse_pic.o \ hostparse_pic.o \ @@ -178,9 +176,6 @@ ${objects}: ${includes} AFS_component_version_number_pic.o: AFS_component_version_number.c $(SHD_CCRULE) AFS_component_version_number.c -config_file.o: ${TOP_SRCDIR}/external/heimdal/krb5/config_file.c krb5_locl.h - $(AFS_CCRULE) -c ${TOP_SRCDIR}/external/heimdal/krb5/config_file.c - sys.o: sys.c AFS_component_version_number.c ${includes} sys: sys.o @@ -190,9 +185,6 @@ sys: sys.o base64_pic.o: ${srcdir}/base64.c ${includes} $(SHD_CCRULE) ${srcdir}/base64.c -config_file_pic.o: ${TOP_SRCDIR}/external/heimdal/krb5/config_file.c krb5_locl.h - $(SHD_CCRULE) ${TOP_SRCDIR}/external/heimdal/krb5/config_file.c - ktime_pic.o: ${srcdir}/ktime.c ${includes} $(SHD_CCRULE) ${srcdir}/ktime.c diff --git a/src/util/afsutil_prototypes.h b/src/util/afsutil_prototypes.h index c1f425a81..592ac65fa 100644 --- a/src/util/afsutil_prototypes.h +++ b/src/util/afsutil_prototypes.h @@ -27,15 +27,6 @@ extern int base32_to_int(char *s); extern char *int_to_base64(b64_string_t s, int a); extern int base64_to_int(char *s); -/* config_file.c && krb5_locl.h */ -typedef struct afs_config_section_struct afs_config_section; -extern int afs_config_parse_file_multi(const char *, afs_config_section **); -extern int afs_config_parse_file(const char *, afs_config_section **); -extern int afs_config_file_free(afs_config_section *s); -extern const char* fs_config_get_string(const afs_config_section *, ...); -extern int afs_config_get_bool(const afs_config_section *, ...); -extern int afs_config_get_int(const afs_config_section *c, ...); - /* dirpath.c */ extern unsigned int initAFSDirPath(void); extern const char *getDirPath(afsdir_id_t string_id); -- 2.39.5