diff options
-rw-r--r-- | libopkg/args.c | 10 | ||||
-rw-r--r-- | libopkg/args.h | 1 | ||||
-rw-r--r-- | libopkg/opkg.c | 6 | ||||
-rw-r--r-- | libopkg/opkg_conf.c | 5 | ||||
-rw-r--r-- | libopkg/opkg_conf.h | 1 | ||||
-rw-r--r-- | libopkg/opkg_download.c | 40 |
6 files changed, 61 insertions, 2 deletions
diff --git a/libopkg/args.c b/libopkg/args.c index 85d7d7e..df02eef 100644 --- a/libopkg/args.c +++ b/libopkg/args.c @@ -42,7 +42,8 @@ enum long_args_opt ARGS_OPT_NODEPS, ARGS_OPT_VERBOSITY, ARGS_OPT_MULTIPLE_PROVIDERS, - ARGS_OPT_AUTOREMOVE + ARGS_OPT_AUTOREMOVE, + ARGS_OPT_CACHE, }; int args_init(args_t *args) @@ -92,6 +93,7 @@ void args_deinit(args_t *args) free (args->dest); free (args->tmp_dir); + free (args->cache); free(args->conf_file); args->conf_file = NULL; } @@ -104,6 +106,7 @@ int args_parse(args_t *args, int argc, char *argv[]) static struct option long_options[] = { {"query-all", 0, 0, 'A'}, {"autoremove", 0, 0, ARGS_OPT_AUTOREMOVE}, + {"cache", 1, 0, ARGS_OPT_CACHE}, {"conf-file", 1, 0, 'f'}, {"conf", 1, 0, 'f'}, {"dest", 1, 0, 'd'}, @@ -180,6 +183,10 @@ int args_parse(args_t *args, int argc, char *argv[]) case ARGS_OPT_AUTOREMOVE: args->autoremove = 1; break; + case ARGS_OPT_CACHE: + free(args->cache); + args->cache = strdup(optarg); + break; case ARGS_OPT_FORCE_DEFAULTS: args->force_defaults = 1; break; @@ -277,6 +284,7 @@ void args_usage(char *complaint) printf("\t 2 informative messages\n"); printf("\t 3 debug output\n"); printf("\t-f <conf_file> Use <conf_file> as the opkg configuration file\n"); + printf("\t--cache <directory> Use a package cache\n"); printf("\t-conf <conf_file> Default configuration file location\n"); printf(" is %s/%s\n", ARGS_DEFAULT_CONF_FILE_DIR, ARGS_DEFAULT_CONF_FILE_NAME); printf("\t-d <dest_name> Use <dest_name> as the the root directory for\n"); diff --git a/libopkg/args.h b/libopkg/args.h index 08a04df..395e332 100644 --- a/libopkg/args.h +++ b/libopkg/args.h @@ -42,6 +42,7 @@ struct args char *offline_root; char *offline_root_pre_script_cmd; char *offline_root_post_script_cmd; + char *cache; }; typedef struct args args_t; diff --git a/libopkg/opkg.c b/libopkg/opkg.c index 4123611..7e67755 100644 --- a/libopkg/opkg.c +++ b/libopkg/opkg.c @@ -273,6 +273,12 @@ opkg_re_read_config_files (opkg_t *opkg) a->offline_root_post_script_cmd = strdup (c->offline_root_post_script_cmd); } + if (c->cache) { + if (a->cache) + free (a->cache); + a->cache = strdup(c->cache); + } + /* throw away old opkg_conf and start again */ opkg_conf_deinit (opkg->conf); opkg_conf_init (opkg->conf, opkg->args); diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c index 93ef823..b61fa3e 100644 --- a/libopkg/opkg_conf.c +++ b/libopkg/opkg_conf.c @@ -49,6 +49,7 @@ static int set_and_load_pkg_dest_list(opkg_conf_t *conf, int opkg_init_options_array(const opkg_conf_t *conf, opkg_option_t **options) { opkg_option_t tmp[] = { + { "cache", OPKG_OPT_TYPE_STRING, &conf->cache}, { "force_defaults", OPKG_OPT_TYPE_BOOL, &conf->force_defaults }, { "force_depends", OPKG_OPT_TYPE_BOOL, &conf->force_depends }, { "force_overwrite", OPKG_OPT_TYPE_BOOL, &conf->force_overwrite }, @@ -270,6 +271,8 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args) opkg_conf_override_string(&conf->offline_root_post_script_cmd, args->offline_root_post_script_cmd); + opkg_conf_override_string(&conf->cache, args->cache); + /* Pigi: added a flag to disable the checking of structures if the command does not need to read anything from there. */ @@ -338,6 +341,8 @@ void opkg_conf_deinit(opkg_conf_t *conf) opkg_conf_free_string(&conf->offline_root_pre_script_cmd); opkg_conf_free_string(&conf->offline_root_post_script_cmd); + opkg_conf_free_string(&conf->cache); + if (conf->verbosity > 1) { int i; hash_table_t *hashes[] = { diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h index 3c5dfe4..4ca513c 100644 --- a/libopkg/opkg_conf.h +++ b/libopkg/opkg_conf.h @@ -70,6 +70,7 @@ struct opkg_conf int query_all; int verbosity; int noaction; + char *cache; /* proxy options */ char *http_proxy; diff --git a/libopkg/opkg_download.c b/libopkg/opkg_download.c index 1875195..5dabeed 100644 --- a/libopkg/opkg_download.c +++ b/libopkg/opkg_download.c @@ -33,7 +33,8 @@ #include "str_util.h" #include "opkg_defines.h" -int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name, curl_progress_func cb, void *data) +static int do_download(opkg_conf_t *conf, const char *src, + const char *dest_file_name, curl_progress_func cb, void *data) { int err = 0; @@ -135,6 +136,43 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name return 0; } +int opkg_download(opkg_conf_t *conf, const char *src, + const char *dest_file_name, curl_progress_func cb, void *data) +{ + char *cache_name = strdup(src); + char *cache_location, *p; + int err = 0; + + if (!conf->cache || str_starts_with(src, "file:")) { + err = do_download(conf, src, dest_file_name, cb, data); + goto out1; + } + + for (p = cache_name; *p; p++) + if (*p == '/') + *p = ','; /* looks nicer than | or # */ + + sprintf_alloc(&cache_location, "%s/%s", conf->cache, cache_name); + if (file_exists(cache_location)) + opkg_message(conf, OPKG_NOTICE, "Copying %s\n", cache_location); + else { + err = do_download(conf, src, cache_location, cb, data); + if (err) { + (void) unlink(cache_location); + goto out2; + } + } + + err = file_copy(cache_location, dest_file_name); + + +out2: + free(cache_location); +out1: + free(cache_name); + return err; +} + int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir) { int err; |