cli: enforce argument to upgrade command
[oweals/opkg-lede.git] / libopkg / opkg_cmd.c
index affa0f77e16144acb4244ecbc59caa7fd2c41901..eba833bd7bdce4083f2070907c38c59da0eacf92 100644 (file)
@@ -27,6 +27,7 @@
 #include "opkg_conf.h"
 #include "opkg_cmd.h"
 #include "opkg_message.h"
+#include "release.h"
 #include "pkg.h"
 #include "pkg_dest.h"
 #include "pkg_parse.h"
@@ -113,11 +114,47 @@ opkg_update_cmd(int argc, char **argv)
      }
 
 
+     for (iter = void_list_first(&conf->dist_src_list); iter; iter = void_list_next(&conf->dist_src_list, iter)) {
+         char *url, *list_file_name;
+
+         src = (pkg_src_t *)iter->data;
+
+         sprintf_alloc(&url, "%s/dists/%s/Release", src->value, src->name);
+
+         sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
+         err = opkg_download(url, list_file_name, NULL, NULL, 0);
+         if (!err) {
+              opkg_msg(NOTICE, "Downloaded release files for dist %s.\n",
+                           src->name);
+              release_t *release = release_new(); 
+              err = release_init_from_file(release, list_file_name);
+              if (!err) {
+                   if (!release_comps_supported(release, src->extra_data))
+                        err = -1;
+              }
+              if (!err) {
+                   err = release_download(release, src, lists_dir, tmp);
+              }
+              release_deinit(release); 
+              if (err)
+                   unlink(list_file_name);
+         }
+
+         if (err)
+              failures++;
+
+         free(list_file_name);
+         free(url);
+     }
+
      for (iter = void_list_first(&conf->pkg_src_list); iter; iter = void_list_next(&conf->pkg_src_list, iter)) {
          char *url, *list_file_name;
 
          src = (pkg_src_t *)iter->data;
 
+         if (src->extra_data && strcmp(src->extra_data, "__dummy__ "))
+             continue;
+
          if (src->extra_data)  /* debian style? */
              sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data,
                            src->gzip ? "Packages.gz" : "Packages");
@@ -130,7 +167,7 @@ opkg_update_cmd(int argc, char **argv)
              FILE *in, *out;
 
              sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name);
-             err = opkg_download(url, tmp_file_name, NULL, NULL);
+             err = opkg_download(url, tmp_file_name, NULL, NULL, 0);
              if (err == 0) {
                   opkg_msg(NOTICE, "Inflating %s.\n", url);
                   in = fopen (tmp_file_name, "r");
@@ -147,7 +184,7 @@ opkg_update_cmd(int argc, char **argv)
              }
              free(tmp_file_name);
          } else
-             err = opkg_download(url, list_file_name, NULL, NULL);
+             err = opkg_download(url, list_file_name, NULL, NULL, 0);
          if (err) {
               failures++;
          } else {
@@ -171,7 +208,7 @@ opkg_update_cmd(int argc, char **argv)
               /* Put the signature in the right place */
               sprintf_alloc (&tmp_file_name, "%s/%s.sig", lists_dir, src->name);
 
-              err = opkg_download(url, tmp_file_name, NULL, NULL);
+              err = opkg_download(url, tmp_file_name, NULL, NULL, 0);
               if (err) {
                   failures++;
                   opkg_msg(NOTICE, "Signature check failed.\n");
@@ -182,6 +219,12 @@ opkg_update_cmd(int argc, char **argv)
                   else
                       opkg_msg(NOTICE, "Signature check failed.\n");
               }
+              if (err) {
+                  /* The signature was wrong so delete it */
+                  opkg_msg(NOTICE, "Remove wrong Signature file.\n");
+                  unlink (tmp_file_name);
+                  unlink (list_file_name);
+              }
               /* We shouldn't unlink the signature ! */
               // unlink (tmp_file_name);
               free (tmp_file_name);
@@ -508,18 +551,6 @@ opkg_upgrade_cmd(int argc, char **argv)
                            err = -1;
                }
          }
-     } else {
-         pkg_vec_t *installed = pkg_vec_alloc();
-
-         pkg_info_preinstall_check();
-
-         pkg_hash_fetch_all_installed(installed);
-         for (i = 0; i < installed->len; i++) {
-              pkg = installed->pkgs[i];
-              if (opkg_upgrade_pkg(pkg))
-                      err = -1;
-         }
-         pkg_vec_free(installed);
      }
 
      if (opkg_configure_packages(NULL))
@@ -616,6 +647,39 @@ opkg_list_installed_cmd(int argc, char **argv)
      return 0;
 }
 
+static int
+opkg_list_changed_conffiles_cmd(int argc, char **argv)
+{
+     int i ;
+     pkg_vec_t *available;
+     pkg_t *pkg;
+     char *pkg_name = NULL;
+     conffile_list_elt_t *iter;
+     conffile_t *cf;
+
+     if (argc > 0) {
+         pkg_name = argv[0];
+     }
+     available = pkg_vec_alloc();
+     pkg_hash_fetch_all_installed(available);
+     pkg_vec_sort(available, pkg_compare_names);
+     for (i=0; i < available->len; i++) {
+         pkg = available->pkgs[i];
+         /* if we have package name or pattern and pkg does not match, then skip it */
+         if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+           continue;
+         if (nv_pair_list_empty(&pkg->conffiles))
+           continue;
+         for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
+           cf = (conffile_t *)iter->data;
+           if (cf->name && cf->value && conffile_has_been_modified(cf))
+             printf("%s\n", cf->name);
+         }
+     }
+     pkg_vec_free(available);
+     return 0;
+}
+
 static int
 opkg_list_upgradable_cmd(int argc, char **argv)
 {
@@ -1009,7 +1073,7 @@ opkg_what_depends_conflicts_cmd(enum depend_type what_field_type, int recursive,
                                        if (!pkg_dependence_satisfiable(possibility))
                                                opkg_msg(NOTICE,
                                                        " unsatisfiable");
-                                       opkg_msg(NOTICE, "\n");
+                                       opkg_message(NOTICE, "\n");
                                        goto next_package;
                                }
                        }
@@ -1088,7 +1152,7 @@ opkg_what_provides_replaces_cmd(enum what_field_type what_field_type, int argc,
                              if (strcmp(target, apkg->name) != 0)
                                   opkg_msg(NOTICE, "\t%s %s\n",
                                                   rel_str, apkg->name);
-                             opkg_msg(NOTICE, "\n");
+                             opkg_message(NOTICE, "\n");
                         }
                    }
               }
@@ -1182,12 +1246,14 @@ opkg_print_architecture_cmd(int argc, char **argv)
    array for easier maintenance */
 static opkg_cmd_t cmds[] = {
      {"update", 0, (opkg_cmd_fun_t)opkg_update_cmd, PFM_DESCRIPTION|PFM_SOURCE},
-     {"upgrade", 0, (opkg_cmd_fun_t)opkg_upgrade_cmd, PFM_DESCRIPTION|PFM_SOURCE},
+     {"upgrade", 1, (opkg_cmd_fun_t)opkg_upgrade_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"list", 0, (opkg_cmd_fun_t)opkg_list_cmd, PFM_SOURCE},
      {"list_installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd, PFM_SOURCE},
      {"list-installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd, PFM_SOURCE},
      {"list_upgradable", 0, (opkg_cmd_fun_t)opkg_list_upgradable_cmd, PFM_SOURCE},
      {"list-upgradable", 0, (opkg_cmd_fun_t)opkg_list_upgradable_cmd, PFM_SOURCE},
+     {"list_changed_conffiles", 0, (opkg_cmd_fun_t)opkg_list_changed_conffiles_cmd, PFM_SOURCE},
+     {"list-changed-conffiles", 0, (opkg_cmd_fun_t)opkg_list_changed_conffiles_cmd, PFM_SOURCE},
      {"info", 0, (opkg_cmd_fun_t)opkg_info_cmd, 0},
      {"flag", 1, (opkg_cmd_fun_t)opkg_flag_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"status", 0, (opkg_cmd_fun_t)opkg_status_cmd, PFM_DESCRIPTION|PFM_SOURCE},