opkg: adding cache support
authorticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:28:44 +0000 (05:28 +0000)
committerticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:28:44 +0000 (05:28 +0000)
   opkg-cl --cache <cache_directory>

   Thank for Werner

git-svn-id: http://opkg.googlecode.com/svn/trunk@154 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/args.c
libopkg/args.h
libopkg/opkg.c
libopkg/opkg_conf.c
libopkg/opkg_conf.h
libopkg/opkg_download.c

index 85d7d7e..df02eef 100644 (file)
@@ -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");
index 08a04df..395e332 100644 (file)
@@ -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;
 
index 4123611..7e67755 100644 (file)
@@ -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);
index 93ef823..b61fa3e 100644 (file)
@@ -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[] = {
index 3c5dfe4..4ca513c 100644 (file)
@@ -70,6 +70,7 @@ struct opkg_conf
      int query_all;
      int verbosity;
      int noaction;
+     char *cache;
 
      /* proxy options */
      char *http_proxy;
index 1875195..5dabeed 100644 (file)
@@ -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;