X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fopkg_cmd.c;h=9c1612b6f7b04fd095a2b306cf2e03bbdf86a0ac;hp=fae308527d18f927a2811feefb2d60f987ec4b7e;hb=f0c41b4e0e096698a7e2eae1ab99d9af1a74d5bd;hpb=2cec79cb14f343d822bb8098b022fe4344261c7f diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index fae3085..9c1612b 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -45,7 +45,6 @@ #include "opkg_message.h" #include "libopkg.h" -static void *p_userdata = NULL; static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_upgrade_cmd(opkg_conf_t *conf, int argc, char **argv); @@ -110,6 +109,16 @@ static opkg_cmd_t cmds[] = { {"whatconflicts", 1, (opkg_cmd_fun_t)opkg_whatconflicts_cmd}, }; +static void print_pkg(pkg_t *pkg) +{ + char *version = pkg_version_str_alloc(pkg); + if (pkg->description) + printf("%s - %s - %s\n", pkg->name, version, pkg->description); + else + printf("%s - %s\n", pkg->name, version); + free(version); +} + int opkg_state_changed; static void write_status_files_if_changed(opkg_conf_t *conf) { @@ -141,38 +150,15 @@ opkg_cmd_t *opkg_cmd_find(const char *name) return NULL; } -void opkg_print_error_list (opkg_conf_t *conf) -{ - if ( error_list ) { - reverse_error_list(&error_list); - - printf ("Collected errors:\n"); - /* Here we print the errors collected and free the list */ - while (error_list != NULL) { - printf (" * %s", error_list->errmsg); - error_list = error_list->next; - - } - free_error_list(); - } - -} - int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **argv, void *userdata) { int result; - p_userdata = userdata; - result = (cmd->fun)(conf, argc, argv); - if ( result != 0 && !error_list) { - opkg_message(conf, OPKG_NOTICE, "An error ocurred, return value: %d.\n", result); - } + print_error_list(); + free_error_list(); - opkg_print_error_list (conf); - - p_userdata = NULL; return result; } @@ -209,7 +195,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) failures = 0; - tmp = strdup ("/tmp/opkg.XXXXXX"); + tmp = xstrdup("/tmp/opkg.XXXXXX"); if (mkdtemp (tmp) == NULL) { perror ("mkdtemp"); @@ -217,10 +203,10 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) } - for (iter = conf->pkg_src_list.head; iter; iter = iter->next) { + 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 = iter->data; + src = (pkg_src_t *)iter->data; if (src->extra_data) /* debian style? */ sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, @@ -249,6 +235,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) fclose (out); unlink (tmp_file_name); } + free(tmp_file_name); } else err = opkg_download(conf, url, list_file_name, NULL, NULL); if (err) { @@ -259,39 +246,41 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) list_file_name); } free(url); - -#ifdef HAVE_GPGME - /* download detached signitures to verify the package lists */ - /* get the url for the sig file */ - if (src->extra_data) /* debian style? */ - sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, - "Packages.sig"); - else - sprintf_alloc(&url, "%s/%s", src->value, "Packages.sig"); - - /* create temporary file for it */ - char *tmp_file_name; - - sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); - - err = opkg_download(conf, url, tmp_file_name, NULL, NULL); - if (err) { - failures++; - opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); - } else { - int err; - err = opkg_verify_file (conf, list_file_name, tmp_file_name); - if (err == 0) - opkg_message (conf, OPKG_NOTICE, "Signature check passed\n"); - else - opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); - } - unlink (tmp_file_name); - free (tmp_file_name); - free (url); +#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) + if (conf->check_signature) { + /* download detached signitures to verify the package lists */ + /* get the url for the sig file */ + if (src->extra_data) /* debian style? */ + sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, + "Packages.sig"); + else + sprintf_alloc(&url, "%s/%s", src->value, "Packages.sig"); + + /* create temporary file for it */ + char *tmp_file_name; + + /* Put the signature in the right place */ + sprintf_alloc (&tmp_file_name, "%s/%s.sig", lists_dir, src->name); + + err = opkg_download(conf, url, tmp_file_name, NULL, NULL); + if (err) { + failures++; + opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); + } else { + int err; + err = opkg_verify_file (conf, list_file_name, tmp_file_name); + if (err == 0) + opkg_message (conf, OPKG_NOTICE, "Signature check passed\n"); + else + opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); + } + /* We shouldn't unlink the signature ! */ + // unlink (tmp_file_name); + free (tmp_file_name); + free (url); + } #else - opkg_message (conf, OPKG_NOTICE, "Signature check for %s skipped " - "because GPG support was not enabled in this build\n", src->name); + // Do nothing #endif free(list_file_name); } @@ -314,18 +303,11 @@ typedef struct opkg_intercept *opkg_intercept_t; static opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) { opkg_intercept_t ctx; - char *oldpath; char *newpath; int gen; ctx = calloc (1, sizeof (*ctx)); - oldpath = getenv ("PATH"); - if (oldpath) { - ctx->oldpath = strdup (oldpath); - } else { - ctx->oldpath = 0; - } - + ctx->oldpath = xstrdup(getenv("PATH")); sprintf_alloc (&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath); setenv ("PATH", newpath, 1); @@ -356,8 +338,6 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx) if (ctx->oldpath) { setenv ("PATH", ctx->oldpath, 1); free (ctx->oldpath); - } else { - unsetenv("PATH"); } dir = opendir (ctx->statedir); @@ -378,6 +358,7 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx) } free (path); } + closedir(dir); } else perror (ctx->statedir); @@ -448,7 +429,7 @@ static int opkg_recurse_pkgs_in_order(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t * dependents = abpkg->provided_by->pkgs; l = 0; if (dependents != NULL) - while (dependents [l] != NULL && l < abpkg->provided_by->len) { + while (l < abpkg->provided_by->len && dependents[l] != NULL) { opkg_message(conf, OPKG_INFO, " Descending on pkg: %s\n", dependents [l]->name); @@ -698,13 +679,10 @@ static int opkg_download_cmd(opkg_conf_t *conf, int argc, char **argv) static int opkg_list_cmd(opkg_conf_t *conf, int argc, char **argv) { - int i ; + int i; pkg_vec_t *available; pkg_t *pkg; - char desc_short[OPKG_LIST_DESCRIPTION_LENGTH]; - char *newline; char *pkg_name = NULL; - char *version_str; if (argc > 0) { pkg_name = argv[0]; @@ -717,24 +695,7 @@ static int opkg_list_cmd(opkg_conf_t *conf, int argc, char **argv) /* 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 (pkg->description) { - strncpy(desc_short, pkg->description, OPKG_LIST_DESCRIPTION_LENGTH); - } else { - desc_short[0] = '\0'; - } - desc_short[OPKG_LIST_DESCRIPTION_LENGTH - 1] = '\0'; - newline = strchr(desc_short, '\n'); - if (newline) { - *newline = '\0'; - } - if (opkg_cb_list) { - version_str = pkg_version_str_alloc(pkg); - opkg_cb_list(pkg->name,desc_short, - version_str, - pkg->state_status, - p_userdata); - free(version_str); - } + print_pkg(pkg); } pkg_vec_free(available); @@ -747,10 +708,7 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv) int i ; pkg_vec_t *available; pkg_t *pkg; - char desc_short[OPKG_LIST_DESCRIPTION_LENGTH]; - char *newline; char *pkg_name = NULL; - char *version_str; if (argc > 0) { pkg_name = argv[0]; @@ -763,26 +721,11 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv) /* 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 (pkg->description) { - strncpy(desc_short, pkg->description, OPKG_LIST_DESCRIPTION_LENGTH); - } else { - desc_short[0] = '\0'; - } - desc_short[OPKG_LIST_DESCRIPTION_LENGTH - 1] = '\0'; - newline = strchr(desc_short, '\n'); - if (newline) { - *newline = '\0'; - } - if (opkg_cb_list) { - version_str = pkg_version_str_alloc(pkg); - opkg_cb_list(pkg->name,desc_short, - version_str, - pkg->state_status, - p_userdata); - free(version_str); - } + print_pkg(pkg); } + pkg_vec_free(available); + return 0; } @@ -797,8 +740,7 @@ static int opkg_list_upgradable_cmd(opkg_conf_t *conf, int argc, char **argv) _new_pkg = pkg_hash_fetch_best_installation_candidate_by_name(conf, _old_pkg->name, NULL); old_v = pkg_version_str_alloc(_old_pkg); new_v = pkg_version_str_alloc(_new_pkg); - if (opkg_cb_list) - opkg_cb_list(_old_pkg->name, new_v, old_v, _old_pkg->state_status, p_userdata); + printf("%s - %s - %s\n", _old_pkg->name, old_v, new_v); free(old_v); free(new_v); } @@ -812,47 +754,33 @@ static int opkg_info_status_cmd(opkg_conf_t *conf, int argc, char **argv, int in pkg_vec_t *available; pkg_t *pkg; char *pkg_name = NULL; - char **pkg_fields = NULL; - int n_fields = 0; - char *buff ; if (argc > 0) { pkg_name = argv[0]; } - if (argc > 1) { - pkg_fields = &argv[1]; - n_fields = argc - 1; - } available = pkg_vec_alloc(); if (installed_only) pkg_hash_fetch_all_installed(&conf->pkg_hash, available); else pkg_hash_fetch_available(&conf->pkg_hash, available); + for (i=0; i < available->len; i++) { pkg = available->pkgs[i]; if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) { continue; } - buff = pkg_formatted_info(pkg); - if ( buff ) { - if (opkg_cb_status) opkg_cb_status(pkg->name, - pkg->state_status, - buff, - p_userdata); -/* - We should not forget that actually the pointer is allocated. - We need to free it :) ( Thanks florian for seeing the error ) -*/ - free(buff); - } + pkg_formatted_info(stdout, pkg); + if (conf->verbosity > 1) { conffile_list_elt_t *iter; - for (iter = pkg->conffiles.head; iter; iter = iter->next) { - conffile_t *cf = iter->data; + for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) { + conffile_t *cf = (conffile_t *)iter->data; int modified = conffile_has_been_modified(conf, cf); - opkg_message(conf, OPKG_NOTICE, "conffile=%s md5sum=%s modified=%d\n", + if (cf->value) + opkg_message(conf, OPKG_NOTICE, + "conffile=%s md5sum=%s modified=%d\n", cf->name, cf->value, modified); } } @@ -964,7 +892,7 @@ static int opkg_remove_cmd(opkg_conf_t *conf, int argc, char **argv) pkg_to_remove = pkg_hash_fetch_installed_by_name(&conf->pkg_hash, pkg->name ); } - if (pkg == NULL) { + if (pkg_to_remove == NULL) { opkg_message(conf, OPKG_ERROR, "Package %s is not installed.\n", pkg->name); continue; } @@ -1103,19 +1031,10 @@ static int opkg_flag_cmd(opkg_conf_t *conf, int argc, char **argv) static int opkg_files_cmd(opkg_conf_t *conf, int argc, char **argv) { pkg_t *pkg; - str_list_t *installed_files; + str_list_t *files; str_list_elt_t *iter; char *pkg_version; - size_t buff_len = 8192; - size_t used_len; - char *buff ; - - buff = (char *)calloc(1, buff_len); - if ( buff == NULL ) { - fprintf( stderr,"%s: Unable to allocate memory \n",__FUNCTION__); - return ENOMEM; - } - + if (argc < 1) { return EINVAL; } @@ -1128,34 +1047,14 @@ static int opkg_files_cmd(opkg_conf_t *conf, int argc, char **argv) return 0; } - installed_files = pkg_get_installed_files(pkg); + files = pkg_get_installed_files(pkg); pkg_version = pkg_version_str_alloc(pkg); - if (buff) { - try_again: - used_len = snprintf(buff, buff_len, "Package %s (%s) is installed on %s and has the following files:\n", - pkg->name, pkg_version, pkg->dest->name) + 1; - if (used_len > buff_len) { - buff_len *= 2; - buff = realloc (buff, buff_len); - goto try_again; - } - for (iter = installed_files->head; iter; iter = iter->next) { - used_len += strlen (iter->data) + 1; - while (buff_len <= used_len) { - buff_len *= 2; - buff = realloc (buff, buff_len); - } - strncat(buff, iter->data, buff_len); - strncat(buff, "\n", buff_len); - } - if (opkg_cb_list) opkg_cb_list(pkg->name, - buff, - pkg_version_str_alloc(pkg), - pkg->state_status, - p_userdata); - free(buff); - } + printf("Package %s (%s) is installed on %s and has the following files:\n", + pkg->name, pkg_version, pkg->dest->name); + + for (iter=str_list_first(files); iter; iter=str_list_next(files, iter)) + printf("%s\n", (char *)iter->data); free(pkg_version); pkg_free_installed_files(pkg); @@ -1447,14 +1346,10 @@ static int opkg_search_cmd(opkg_conf_t *conf, int argc, char **argv) installed_files = pkg_get_installed_files(pkg); - for (iter = installed_files->head; iter; iter = iter->next) { - installed_file = iter->data; - if (fnmatch(argv[0], installed_file, 0)==0) { - if (opkg_cb_list) opkg_cb_list(pkg->name, - installed_file, - pkg_version_str_alloc(pkg), - pkg->state_status, p_userdata); - } + 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) + print_pkg(pkg); } pkg_free_installed_files(pkg); @@ -1481,23 +1376,13 @@ static int opkg_compare_versions_cmd(opkg_conf_t *conf, int argc, char **argv) } } -#ifndef HOST_CPU_STR -#define HOST_CPU_STR__(X) #X -#define HOST_CPU_STR_(X) HOST_CPU_STR__(X) -#define HOST_CPU_STR HOST_CPU_STR_(HOST_CPU_FOO) -#endif - static int opkg_print_architecture_cmd(opkg_conf_t *conf, int argc, char **argv) { nv_pair_list_elt_t *l; - l = conf->arch_list.head; - while (l) { - nv_pair_t *nv = l->data; + list_for_each_entry(l, &conf->arch_list.head, node) { + nv_pair_t *nv = (nv_pair_t *)l->data; printf("arch %s %s\n", nv->name, nv->value); - l = l->next; } return 0; } - -