From 9e85c59c8df6dd151fce6238811844d8d66ea1c0 Mon Sep 17 00:00:00 2001 From: ticktock35 Date: Mon, 15 Dec 2008 00:22:06 -0500 Subject: opkg: Consolidate error reporting from opkg_conf_init and ensure return value is checked in the appropriate places. opkg: Add a locking mechanism to prevent two instances of opkg being run at the same time. git-svn-id: http://opkg.googlecode.com/svn/trunk@130 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- (limited to 'libopkg') diff --git a/libopkg/libopkg.c b/libopkg/libopkg.c index dba1983..68da96d 100644 --- a/libopkg/libopkg.c +++ b/libopkg/libopkg.c @@ -271,6 +271,7 @@ opkg_packages_download (args_t * args, const char *name) err = opkg_conf_init (&opkg_conf, args); if (err) { + opkg_print_error_list (&opkg_conf); return err; } @@ -485,6 +486,7 @@ opkg_op (int argc, char *argv[]) err = opkg_conf_init (&opkg_conf, &args); if (err) { + opkg_print_error_list (&opkg_conf); return err; } diff --git a/libopkg/opkg.c b/libopkg/opkg.c index 038469e..9f081cf 100644 --- a/libopkg/opkg.c +++ b/libopkg/opkg.c @@ -185,13 +185,28 @@ opkg_t * opkg_new () { opkg_t *opkg; + int err; + opkg = malloc (sizeof (opkg_t)); opkg->args = malloc (sizeof (args_t)); - args_init (opkg->args); + err = args_init (opkg->args); + if (err) + { + free (opkg->args); + free (opkg); + return NULL; + } opkg->conf = malloc (sizeof (opkg_conf_t)); - opkg_conf_init (opkg->conf, opkg->args); + err = opkg_conf_init (opkg->conf, opkg->args); + if (err) + { + free (opkg->conf); + free (opkg->args); + free (opkg); + return NULL; + } opkg_init_options_array (opkg->conf, &opkg->options); return opkg; diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index 94cfb99..e91a24c 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -138,6 +138,23 @@ opkg_cmd_t *opkg_cmd_find(const char *name) return NULL; } +void opkg_print_error_list (opkg_conf_t *conf) +{ + if ( error_list ) { + reverse_error_list(&error_list); + + printf ("Collected errors:\n"); + /* Here we print the errors collected and free the list */ + while (error_list != NULL) { + printf (" * %s", error_list->errmsg); + error_list = error_list->next; + + } + free_error_list(&error_list); + } + +} + int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **argv, void *userdata) { int result; @@ -150,20 +167,8 @@ int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **arg opkg_message(conf, OPKG_NOTICE, "An error ocurred, return value: %d.\n", result); } - if ( error_list ) { - reverse_error_list(&error_list); - - opkg_message(conf, OPKG_NOTICE, "Collected errors:\n"); - /* Here we print the errors collected and free the list */ - while (error_list != NULL) { - opkg_message(conf, OPKG_NOTICE, " * %s", error_list->errmsg); - error_list = error_list->next; + opkg_print_error_list (conf); - } - free_error_list(&error_list); - - } - p_userdata = NULL; return result; } diff --git a/libopkg/opkg_cmd.h b/libopkg/opkg_cmd.h index b6496c8..43fc428 100644 --- a/libopkg/opkg_cmd.h +++ b/libopkg/opkg_cmd.h @@ -38,5 +38,6 @@ int opkg_install_wanted_packages(opkg_conf_t *conf); int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name); int pkg_mark_provides(pkg_t *pkg); +void opkg_print_error_list (opkg_conf_t *conf); #endif diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c index ba0daf5..965618f 100644 --- a/libopkg/opkg_conf.c +++ b/libopkg/opkg_conf.c @@ -17,6 +17,7 @@ #include "includes.h" #include "opkg_conf.h" +#include "opkg_error.h" #include "xregex.h" #include "sprintf_alloc.h" @@ -28,6 +29,9 @@ #include #include "opkg_defines.h" +#include +#include +#include static int opkg_conf_parse_file(opkg_conf_t *conf, const char *filename, pkg_src_list_t *pkg_src_list, @@ -100,10 +104,10 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) int err; char *tmp_dir_base; nv_pair_list_t tmp_dest_nv_pair_list; - char * lists_dir =NULL; + char *lists_dir = NULL, *lock_file = NULL; glob_t globbuf; char *etc_opkg_conf_pattern = "/etc/opkg/*.conf"; - char *pending_dir =NULL; + char *pending_dir = NULL; memset(conf, 0, sizeof(opkg_conf_t)); @@ -117,6 +121,23 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) conf->restrict_to_default_dest = 0; conf->default_dest = NULL; + /* check for lock file */ + if (args->offline_root) + sprintf_alloc (&lock_file, "%s/%s/lock", args->offline_root, OPKG_STATE_DIR_PREFIX); + else + sprintf_alloc (&lock_file, "%s/lock", OPKG_STATE_DIR_PREFIX); + + conf->lock_fd = creat (lock_file, S_IRUSR | S_IWUSR | S_IRGRP); + err = lockf (conf->lock_fd, F_TLOCK, 0); + + free (lock_file); + + if (err) + { + opkg_message (conf, OPKG_ERROR, "Could not obtain administrative lock\n"); + return OPKG_CONF_ERR_LOCK; + } + if (args->tmp_dir) tmp_dir_base = args->tmp_dir; @@ -129,7 +150,7 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) if (conf->tmp_dir == NULL) { fprintf(stderr, "%s: Failed to create temporary directory `%s': %s\n", __FUNCTION__, conf->tmp_dir, strerror(errno)); - return errno; + return OPKG_CONF_ERR_TMP_DIR; } conf->force_depends = 0; @@ -165,19 +186,17 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) if (opkg_conf_parse_file(conf, args->conf_file, &conf->pkg_src_list, &tmp_dest_nv_pair_list,&lists_dir)<0) { /* Memory leakage from opkg_conf_parse-file */ - return -1; + return OPKG_CONF_ERR_PARSE; } - } - /* if (!lists_dir ){*/ if (strlen(lists_dir)<=1 ){ lists_dir = realloc(lists_dir,strlen(OPKG_CONF_LISTS_DIR)+2); sprintf (lists_dir,"%s",OPKG_CONF_LISTS_DIR); } if (args->offline_root) { - char *tmp;// = malloc(strlen(lists_dir) + strlen(args->offline_root) + 1); + char *tmp; sprintf_alloc(&tmp, "%s/%s",args->offline_root,lists_dir); free(lists_dir); lists_dir = tmp; @@ -202,7 +221,7 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) if ( opkg_conf_parse_file(conf, globbuf.gl_pathv[i], &conf->pkg_src_list, &tmp_dest_nv_pair_list,&lists_dir)<0) { /* Memory leakage from opkg_conf_parse-file */ - return -1; + return OPKG_CONF_ERR_PARSE; } } } @@ -289,7 +308,7 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) if (args->dest) { err = opkg_conf_set_default_dest(conf, args->dest); if (err) { - return err; + return OPKG_CONF_ERR_DEFAULT_DEST; } } } diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h index 6e202d4..3c5dfe4 100644 --- a/libopkg/opkg_conf.h +++ b/libopkg/opkg_conf.h @@ -41,6 +41,7 @@ typedef struct opkg_conf opkg_conf_t; struct opkg_conf { + int lock_fd; /* file descriptor for the lock file */ pkg_src_list_t pkg_src_list; pkg_dest_list_t pkg_dest_list; nv_pair_list_t arch_list; diff --git a/libopkg/opkg_error.h b/libopkg/opkg_error.h index b04bd0b..94dbdea 100644 --- a/libopkg/opkg_error.h +++ b/libopkg/opkg_error.h @@ -20,6 +20,11 @@ enum opkg_error { OPKG_ERR_UNKNOWN = -1, OPKG_ERR_NONE = 0, + OPKG_CONF_ERR_DEFAULT_DEST, /* could not set default dest */ + OPKG_CONF_ERR_PARSE, /* error parsing config file */ + OPKG_CONF_ERR_TMP_DIR, /* could not create temporary directory */ + OPKG_CONF_ERR_LOCK, /* could not get opkg lock */ + OPKG_PKG_DEPS_UNSATISFIED, OPKG_PKG_IS_ESSENTIAL, OPKG_PKG_HAS_DEPENDENTS, -- cgit v0.9.1