Changeset 4458


Ignore:
Timestamp:
05/29/08 13:42:33 (5 years ago)
Author:
thomas
Message:

opkg: improve opkg_install error reporting and include a check to verify repository signature during install

Location:
trunk/src/target/opkg
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/opkg/libopkg/opkg.c

    r4451 r4458  
    408408    /* XXX: Error: Could not satisfy dependencies */ 
    409409    pkg_vec_free (deps); 
    410     return OPKG_DEPENDANCIES_FAILED; 
     410    return OPKG_DEPENDENCIES_FAILED; 
    411411  } 
    412412 
     
    488488  { 
    489489    opkg_package_free (pdata.package); 
    490     return OPKG_UNKNOWN_ERROR; 
     490    switch (err) 
     491    { 
     492      case PKG_INSTALL_ERR_NOT_TRUSTED: return OPKG_GPG_ERROR; 
     493      case PKG_INSTALL_ERR_DOWNLOAD: return OPKG_DOWNLOAD_FAILED; 
     494      case PKG_INSTALL_ERR_DEPENDENCIES: 
     495      case PKG_INSTALL_ERR_CONFLICTS: return OPKG_DEPENDENCIES_FAILED; 
     496      case PKG_INSTALL_ERR_ALREADY_INSTALLED: return OPKG_PACKAGE_ALREADY_INSTALLED; 
     497      case PKG_INSTALL_ERR_SIGNATURE: return OPKG_GPG_ERROR; 
     498      case PKG_INSTALL_ERR_MD5: return OPKG_MD5_ERROR; 
     499      default: return OPKG_UNKNOWN_ERROR; 
     500    } 
    491501  } 
    492502 
     
    676686  int sources_list_count, sources_done; 
    677687  opkg_progress_data_t pdata; 
    678   char *tmp_file_name = NULL; 
    679688 
    680689  opkg_assert (opkg != NULL); 
     
    717726  } 
    718727 
    719   /* cout the number of sources so we can give some progress updates */ 
     728  /* count the number of sources so we can give some progress updates */ 
    720729  sources_list_count = 0; 
    721730  sources_done = 0; 
     
    729738  for (iter = opkg->conf->pkg_src_list.head; iter; iter = iter->next) 
    730739  { 
    731     char *url, *list_file_name; 
     740    char *url, *list_file_name = NULL, *sig_file_name = NULL; 
    732741 
    733742    src = iter->data; 
     
    744753      FILE *in, *out; 
    745754      struct _curl_cb_data cb_data; 
     755      char *tmp_file_name = NULL; 
    746756 
    747757      sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name); 
     
    773783        unlink (tmp_file_name); 
    774784      } 
     785      free (tmp_file_name); 
    775786    } 
    776787    else 
    777788      err = opkg_download (opkg->conf, url, list_file_name, NULL, NULL); 
    778     free (tmp_file_name); 
    779789 
    780790    if (err) 
     
    794804      sprintf_alloc (&url, "%s/%s", src->value, "Packages.sig"); 
    795805 
    796     /* create temporary file for it */ 
    797     sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); 
    798  
    799     err = opkg_download (opkg->conf, url, tmp_file_name, NULL, NULL); 
     806    /* create filename for signature */ 
     807    sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, src->name); 
     808 
     809    /* make sure there is no existing signature file */ 
     810    unlink (sig_file_name); 
     811 
     812    err = opkg_download (opkg->conf, url, sig_file_name, NULL, NULL); 
    800813    if (err) 
    801814    { 
     
    805818    { 
    806819      int err; 
    807       err = opkg_verify_file (opkg->conf, list_file_name, tmp_file_name); 
     820      err = opkg_verify_file (opkg->conf, list_file_name, sig_file_name); 
    808821      if (err == 0) 
    809822      { 
     
    815828      } 
    816829    } 
    817     unlink (tmp_file_name); 
    818     free (tmp_file_name); 
     830    free (sig_file_name); 
     831    free (list_file_name); 
    819832    free (url); 
    820833#else 
     
    823836     */ 
    824837#endif 
    825     free (list_file_name); 
    826838 
    827839    sources_done++; 
  • trunk/src/target/opkg/libopkg/opkg.h

    r4434 r4458  
    3838  OPKG_UNKNOWN_ERROR, 
    3939  OPKG_DOWNLOAD_FAILED, 
    40   OPKG_DEPENDANCIES_FAILED, 
     40  OPKG_DEPENDENCIES_FAILED, 
    4141  OPKG_PACKAGE_ALREADY_INSTALLED, 
    4242  OPKG_PACKAGE_NOT_AVAILABLE, 
    4343  OPKG_PACKAGE_NOT_FOUND, 
    44   OPKG_PACKAGE_NOT_INSTALLED 
     44  OPKG_PACKAGE_NOT_INSTALLED, 
     45  OPKG_GPG_ERROR, 
     46  OPKG_MD5_ERROR 
    4547}; 
    4648 
  • trunk/src/target/opkg/libopkg/opkg_install.c

    r4443 r4458  
    756756     char* file_md5; 
    757757     char *pkgid; 
    758  
    759758     
    760759     if ( from_upgrade )  
     
    764763          opkg_message(conf, OPKG_ERROR, 
    765764                       "INTERNAL ERROR: null pkg passed to opkg_install_pkg\n"); 
    766           return -EINVAL; 
     765          return PKG_INSTALL_ERR_INTERNAL; 
    767766     } 
    768767 
     
    772771          opkg_message(conf, OPKG_ERROR, "INTERNAL ERROR: architecture %s for pkg %s is unsupported.\n", 
    773772                       pkg->architecture, pkg->name); 
    774           return -EINVAL; 
     773          return PKG_INSTALL_ERR_INTERNAL; 
    775774     } 
    776775     if (pkg->state_status == SS_INSTALLED && conf->force_reinstall == 0 && conf->nodeps == 0) { 
    777776          err = satisfy_dependencies_for(conf, pkg); 
    778           if (err) { return err; } 
     777          if (err) { return PKG_INSTALL_ERR_DEPENDENCIES; } 
    779778 
    780779          opkg_message(conf, OPKG_NOTICE, 
     
    791790 
    792791     err = opkg_install_check_downgrade(conf, pkg, old_pkg, message); 
    793      if (err) { return err; } 
     792     if (err) { return PKG_INSTALL_ERR_NO_DOWNGRADE; } 
    794793 
    795794     pkg->state_want = SW_INSTALL; 
     
    801800     /* Abhaya: conflicts check */ 
    802801     err = check_conflicts_for(conf, pkg); 
    803      if (err) { return err; } 
     802     if (err) { return PKG_INSTALL_ERR_CONFLICTS; } 
    804803     
    805804     /* this setup is to remove the upgrade scenario in the end when 
     
    811810     
    812811     err = verify_pkg_installable(conf, pkg); 
    813      if (err) { return err; } 
     812     if (err) { return PKG_INSTALL_ERR_NO_SPACE; } 
    814813 
    815814     if (pkg->local_filename == NULL) { 
     
    819818                            "Failed to download %s. Perhaps you need to run 'opkg update'?\n", 
    820819                            pkg->name); 
    821                return err; 
    822           } 
    823      } 
    824  
    825 /* Check for md5 values */ 
     820               return PKG_INSTALL_ERR_DOWNLOAD; 
     821          } 
     822     } 
     823 
     824     /* check that the repository is valid */ 
     825     #if HAVE_GPGME 
     826     char *list_file_name, *sig_file_name, *lists_dir; 
     827 
     828     sprintf_alloc (&lists_dir, "%s", 
     829                   (conf->restrict_to_default_dest) 
     830                    ? conf->default_dest->lists_dir 
     831                    : conf->lists_dir); 
     832     sprintf_alloc (&list_file_name, "%s/%s", lists_dir, pkg->src->name); 
     833     sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, pkg->src->name); 
     834 
     835     if (file_exists (sig_file_name)) 
     836     { 
     837       if (opkg_verify_file (conf, list_file_name, sig_file_name)) 
     838         return PKG_INSTALL_ERR_SIGNATURE; 
     839     } 
     840 
     841     free (lists_dir); 
     842     free (list_file_name); 
     843     free (sig_file_name); 
     844     #endif 
     845 
     846     /* Check for md5 values */ 
    826847     if (pkg->md5sum) 
    827848     { 
     
    833854                           pkg->name); 
    834855              free(file_md5); 
    835               return err; 
     856              return PKG_INSTALL_ERR_MD5; 
    836857         } 
    837858         free(file_md5); 
     
    846867/* That's rather strange that files don't change owner. Investigate !!!!!!*/ 
    847868     err = update_file_ownership(conf, pkg, old_pkg); 
    848      if (err) { return err; } 
     869     if (err) { return PKG_INSTALL_ERR_UNKNOWN; } 
    849870 
    850871     if (conf->nodeps == 0) { 
    851872          err = satisfy_dependencies_for(conf, pkg); 
    852           if (err) { return err; } 
     873          if (err) { return PKG_INSTALL_ERR_DEPENDENCIES; } 
    853874     } 
    854875 
     
    9991020 
    10001021          pkg_vec_free (replacees); 
    1001           return err; 
     1022          return PKG_INSTALL_ERR_UNKNOWN; 
    10021023     } 
    10031024     opkg_set_current_state (conf, OPKG_STATE_NONE, NULL); 
  • trunk/src/target/opkg/libopkg/opkg_install.h

    r4357 r4458  
    2323#include "opkg_error.h" 
    2424 
     25enum { 
     26  PKG_INSTALL_ERR_NONE, 
     27  PKG_INSTALL_ERR_NOT_TRUSTED, 
     28  PKG_INSTALL_ERR_DOWNLOAD, 
     29  PKG_INSTALL_ERR_CONFLICTS, 
     30  PKG_INSTALL_ERR_ALREADY_INSTALLED, 
     31  PKG_INSTALL_ERR_DEPENDENCIES, 
     32  PKG_INSTALL_ERR_NO_DOWNGRADE, 
     33  PKG_INSTALL_ERR_NO_SPACE, 
     34  PKG_INSTALL_ERR_SIGNATURE, 
     35  PKG_INSTALL_ERR_MD5, 
     36  PKG_INSTALL_ERR_INTERNAL, 
     37  PKG_INSTALL_ERR_UNKNOWN 
     38}; 
     39 
    2540opkg_error_t opkg_install_by_name(opkg_conf_t *conf, const char *pkg_name); 
    2641opkg_error_t opkg_install_multi_by_name(opkg_conf_t *conf, const char *pkg_name); 
  • trunk/src/target/opkg/tests/libopkg_test.c

    r4452 r4458  
    55opkg_package_t *find_pkg = NULL; 
    66 
    7 char *errors[8] = { 
     7char *errors[10] = { 
    88  "No Error", 
    99  "Unknown Eror", 
     
    1313  "Package not available", 
    1414  "Package not found", 
    15   "Package not installed" 
     15  "Package not installed", 
     16  "Signature check failed", 
     17  "MD5 sum failed" 
    1618}; 
     19 
     20 
     21#define TEST_PACKAGE "aspell" 
    1722 
    1823void 
     
    113118    printf ("No package available to test find_package.\n"); 
    114119 
    115   err = opkg_install_package (opkg, "aspell", progress_callback, "Installing..."); 
     120  err = opkg_install_package (opkg, TEST_PACKAGE, progress_callback, "Installing..."); 
    116121  printf ("\nopkg_install_package returned %d (%s)\n", err, errors[err]); 
    117122 
    118   err = opkg_upgrade_package (opkg, "aspell", progress_callback, "Upgrading..."); 
     123  err = opkg_upgrade_package (opkg, TEST_PACKAGE, progress_callback, "Upgrading..."); 
    119124  printf ("\nopkg_upgrade_package returned %d (%s)\n", err, errors[err]); 
    120125 
    121   err = opkg_remove_package (opkg, "aspell", progress_callback, "Removing..."); 
     126  err = opkg_remove_package (opkg, TEST_PACKAGE, progress_callback, "Removing..."); 
    122127  printf ("\nopkg_remove_package returned %d (%s)\n", err, errors[err]); 
    123128 
Note: See TracChangeset for help on using the changeset viewer.