libopkg: clarify messages and errors related to downloads
[oweals/opkg-lede.git] / libopkg / opkg_cmd.c
index 8c0441806bb0bbac59749e45ac49be9d45c8009b..d2adc3102ff9fe57a7d9ff60dcfcf0f6f241ace3 100644 (file)
@@ -47,10 +47,12 @@ static void
 print_pkg(pkg_t *pkg)
 {
        char *version = pkg_version_str_alloc(pkg);
+       printf("%s - %s", pkg->name, version);
+       if (conf->size)
+               printf(" - %lu", pkg->size);
        if (pkg->description)
-               printf("%s - %s - %s\n", pkg->name, version, pkg->description);
-       else
-               printf("%s - %s\n", pkg->name, version);
+               printf(" - %s", pkg->description);
+       printf("\n");
        free(version);
 }
 
@@ -83,6 +85,7 @@ opkg_update_cmd(int argc, char **argv)
      char *tmp;
      int err;
      int failures;
+     int pkglist_dl_error;
      char *lists_dir;
      pkg_src_list_elt_t *iter;
      pkg_src_t *src;
@@ -118,6 +121,9 @@ opkg_update_cmd(int argc, char **argv)
 
          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");
@@ -125,38 +131,19 @@ opkg_update_cmd(int argc, char **argv)
              sprintf_alloc(&url, "%s/%s", src->value, src->gzip ? "Packages.gz" : "Packages");
 
          sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
-         if (src->gzip) {
-             char *tmp_file_name;
-             FILE *in, *out;
-
-             sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name);
-             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");
-                  out = fopen (list_file_name, "w");
-                  if (in && out)
-                       unzip (in, out);
-                  else
-                       err = 1;
-                  if (in)
-                       fclose (in);
-                  if (out)
-                       fclose (out);
-                  unlink (tmp_file_name);
-             }
-             free(tmp_file_name);
-         } else
-             err = opkg_download(url, list_file_name, NULL, NULL, 0);
-         if (err) {
+         pkglist_dl_error = 0;
+         if (opkg_download(url, list_file_name, NULL, NULL, 0)) {
               failures++;
+              pkglist_dl_error = 1;
+              opkg_msg(NOTICE, "*** Failed to download the package list from %s\n\n",
+                           url);
          } else {
-              opkg_msg(NOTICE, "Updated list of available packages in %s.\n",
+              opkg_msg(NOTICE, "Updated list of available packages in %s\n",
                            list_file_name);
          }
          free(url);
-#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
-          if (conf->check_signature) {
+#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
+          if (pkglist_dl_error == 0 && conf->check_signature) {
               /* download detached signitures to verify the package lists */
               /* get the url for the sig file */
               if (src->extra_data)     /* debian style? */
@@ -174,7 +161,7 @@ opkg_update_cmd(int argc, char **argv)
               err = opkg_download(url, tmp_file_name, NULL, NULL, 0);
               if (err) {
                   failures++;
-                  opkg_msg(NOTICE, "Signature check failed.\n");
+                  opkg_msg(NOTICE, "Signature file download failed.\n");
               } else {
                   err = opkg_verify_file (list_file_name, tmp_file_name);
                   if (err == 0)
@@ -182,7 +169,7 @@ opkg_update_cmd(int argc, char **argv)
                   else
                       opkg_msg(NOTICE, "Signature check failed.\n");
               }
-              if (err) {
+              if (err && !conf->force_signature) {
                   /* The signature was wrong so delete it */
                   opkg_msg(NOTICE, "Remove wrong Signature file.\n");
                   unlink (tmp_file_name);
@@ -399,7 +386,7 @@ opkg_configure_packages(char *pkg_name)
      for(i = 0; i < ordered->len; i++) {
          pkg = ordered->pkgs[i];
 
-         if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+         if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
               continue;
 
          if (pkg->state_status == SS_UNPACKED) {
@@ -514,18 +501,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))
@@ -569,7 +544,7 @@ opkg_download_cmd(int argc, char **argv)
 
 
 static int
-opkg_list_cmd(int argc, char **argv)
+opkg_list_find_cmd(int argc, char **argv, int use_desc)
 {
      int i;
      pkg_vec_t *available;
@@ -585,7 +560,8 @@ opkg_list_cmd(int argc, char **argv)
      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))
+         if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase) &&
+             (!use_desc || !pkg->description || fnmatch(pkg_name, pkg->description, conf->nocase)))
               continue;
           print_pkg(pkg);
      }
@@ -594,6 +570,18 @@ opkg_list_cmd(int argc, char **argv)
      return 0;
 }
 
+static int
+opkg_list_cmd(int argc, char **argv)
+{
+       return opkg_list_find_cmd(argc, argv, 0);
+}
+
+static int
+opkg_find_cmd(int argc, char **argv)
+{
+       return opkg_list_find_cmd(argc, argv, 1);
+}
+
 
 static int
 opkg_list_installed_cmd(int argc, char **argv)
@@ -612,7 +600,7 @@ opkg_list_installed_cmd(int argc, char **argv)
      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))
+         if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
               continue;
           print_pkg(pkg);
      }
@@ -641,7 +629,7 @@ opkg_list_changed_conffiles_cmd(int argc, char **argv)
      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))
+         if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
            continue;
          if (nv_pair_list_empty(&pkg->conffiles))
            continue;
@@ -697,7 +685,7 @@ opkg_info_status_cmd(int argc, char **argv, int installed_only)
 
      for (i=0; i < available->len; i++) {
          pkg = available->pkgs[i];
-         if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) {
+         if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) {
               continue;
          }
 
@@ -767,7 +755,7 @@ opkg_remove_cmd(int argc, char **argv)
      for (i=0; i<argc; i++) {
         for (a=0; a<available->len; a++) {
             pkg = available->pkgs[a];
-           if (fnmatch(argv[i], pkg->name, 0)) {
+           if (fnmatch(argv[i], pkg->name, conf->nocase)) {
                continue;
             }
             if (conf->restrict_to_default_dest) {
@@ -901,7 +889,7 @@ opkg_depends_cmd(int argc, char **argv)
                for (j=0; j<available_pkgs->len; j++) {
                        pkg = available_pkgs->pkgs[j];
 
-                       if (fnmatch(argv[i], pkg->name, 0) != 0)
+                       if (fnmatch(argv[i], pkg->name, conf->nocase) != 0)
                                continue;
 
                        depends_count = pkg->depends_count +
@@ -1122,9 +1110,9 @@ opkg_what_provides_replaces_cmd(enum what_field_type what_field_type, int argc,
                              ((what_field_type == WHATPROVIDES)
                               ? pkg->provides[k]
                               : pkg->replaces[k]);
-                        if (fnmatch(target, apkg->name, 0) == 0) {
+                        if (fnmatch(target, apkg->name, conf->nocase) == 0) {
                              opkg_msg(NOTICE, "    %s", pkg->name);
-                             if (strcmp(target, apkg->name) != 0)
+                             if ((conf->nocase ? strcasecmp(target, apkg->name) : strcmp(target, apkg->name)) != 0)
                                   opkg_msg(NOTICE, "\t%s %s\n",
                                                   rel_str, apkg->name);
                              opkg_message(NOTICE, "\n");
@@ -1175,7 +1163,7 @@ opkg_search_cmd(int argc, char **argv)
 
          for (iter = str_list_first(installed_files); iter; iter = str_list_next(installed_files, iter)) {
               installed_file = (char *)iter->data;
-              if (fnmatch(argv[0], installed_file, 0)==0)
+              if (fnmatch(argv[0], installed_file, conf->nocase)==0)
                    print_pkg(pkg);
          }
 
@@ -1221,7 +1209,7 @@ 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},
@@ -1237,6 +1225,7 @@ static opkg_cmd_t cmds[] = {
      {"configure", 0, (opkg_cmd_fun_t)opkg_configure_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"files", 1, (opkg_cmd_fun_t)opkg_files_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"search", 1, (opkg_cmd_fun_t)opkg_search_cmd, PFM_DESCRIPTION|PFM_SOURCE},
+     {"find", 1, (opkg_cmd_fun_t)opkg_find_cmd, PFM_SOURCE},
      {"download", 1, (opkg_cmd_fun_t)opkg_download_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"compare_versions", 1, (opkg_cmd_fun_t)opkg_compare_versions_cmd, PFM_DESCRIPTION|PFM_SOURCE},
      {"compare-versions", 1, (opkg_cmd_fun_t)opkg_compare_versions_cmd, PFM_DESCRIPTION|PFM_SOURCE},