From: ticktock35 Date: Mon, 15 Dec 2008 05:09:30 +0000 (+0000) Subject: opkg: implement opkg_set_option() and opkg_get_option() X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=commitdiff_plain;h=64aa995bce735d74bf936aae7ae59a104f992ff2 opkg: implement opkg_set_option() and opkg_get_option() git-svn-id: http://opkg.googlecode.com/svn/trunk@71 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- diff --git a/libopkg/opkg.c b/libopkg/opkg.c index 96ec7d4..de1d9b8 100644 --- a/libopkg/opkg.c +++ b/libopkg/opkg.c @@ -29,6 +29,7 @@ struct _opkg_t { args_t *args; opkg_conf_t *conf; + opkg_option_t *options[]; }; /** Private Functions ***/ @@ -84,6 +85,7 @@ opkg_new () opkg = malloc (sizeof (opkg_t)); args_init (opkg->args); opkg_conf_init (opkg->conf, opkg->args); + opkg_init_options_array (opkg->conf, opkg->options); return opkg; } @@ -97,11 +99,84 @@ opkg_free (opkg_t *opkg) void opkg_get_option (opkg_t *opkg, char *option, void **value) { + int i = 0; + opkg_option_t **options = opkg->options; + + /* can't store a value in a NULL pointer! */ + if (!value) + return; + + /* look up the option + * TODO: this would be much better as a hash table + */ + while (options[i]->name) + { + if (strcmp(options[i]->name, option) != 0) + { + i++; + continue; + } + } + + /* get the option */ + switch (options[i]->type) + { + case OPKG_OPT_TYPE_BOOL: + *((int *) value) = *((int *) options[i]->value); + return; + + case OPKG_OPT_TYPE_INT: + *((int *) value) = *((int *) options[i]->value); + return; + + case OPKG_OPT_TYPE_STRING: + *((char **)value) = strdup (options[i]->value); + return; + } + } void opkg_set_option (opkg_t *opkg, char *option, void *value) { + int i = 0; + opkg_option_t **options = opkg->options; + + /* NULL values are not defined */ + if (!value) + return; + + /* look up the option + * TODO: this would be much better as a hash table + */ + while (options[i]->name) + { + if (strcmp(options[i]->name, option) != 0) + { + i++; + continue; + } + } + + /* set the option */ + switch (options[i]->type) + { + case OPKG_OPT_TYPE_BOOL: + if (*((int *) value) == 0) + *((int *)options[i]->value) = 0; + else + *((int *)options[i]->value) = 1; + return; + + case OPKG_OPT_TYPE_INT: + *((int *) options[i]->value) = *((int *) value); + return; + + case OPKG_OPT_TYPE_STRING: + *((char **)options[i]->value) = strdup(value); + return; + } + } int diff --git a/libopkg/opkg.h b/libopkg/opkg.h index d399948..029b20c 100644 --- a/libopkg/opkg.h +++ b/libopkg/opkg.h @@ -19,6 +19,9 @@ typedef struct _opkg_t opkg_t; opkg_t* opkg_new (); void opkg_free (opkg_t *opkg); +void opkg_get_option (opkg_t *opkg, char *option, void **value); +void opkg_set_option (opkg_t *opkg, char *option, void *value); + int opkg_install_package (opkg_t *opkg, char *package_name); int opkg_remove_package (opkg_t *opkg, char *package_name); int opkg_upgrade_package (opkg_t *opkg, char *package_name); diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c index f5bf319..cfee437 100644 --- a/libopkg/opkg_conf.c +++ b/libopkg/opkg_conf.c @@ -33,7 +33,6 @@ static int opkg_conf_parse_file(opkg_conf_t *conf, const char *filename, pkg_src_list_t *pkg_src_list, nv_pair_list_t *tmp_dest_nv_pair_list, char **tmp_lists_dir); -static int opkg_init_options_array(const opkg_conf_t *conf, opkg_option_t **options); static int opkg_conf_set_option(const opkg_option_t *options, const char *name, const char *value); static int opkg_conf_set_default_dest(opkg_conf_t *conf, diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h index f774b4a..4b971b4 100644 --- a/libopkg/opkg_conf.h +++ b/libopkg/opkg_conf.h @@ -104,4 +104,7 @@ void opkg_conf_deinit(opkg_conf_t *conf); int opkg_conf_write_status_files(opkg_conf_t *conf); char *root_filename_alloc(opkg_conf_t *conf, char *filename); + +int opkg_init_options_array(const opkg_conf_t *conf, opkg_option_t **options); + #endif