X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fpkg_vec.c;h=472962c9f88cd5237b909aa75d46545f37afbf7c;hb=7ac69b203f3dadd51fe32cfe503509005fa92803;hp=690b7e6f94c0a8632849b77c5e9715cb9265a5c6;hpb=9e9f4261abe887b1d98dedabd6b52dbc238d82bf;p=oweals%2Fopkg-lede.git diff --git a/libopkg/pkg_vec.c b/libopkg/pkg_vec.c index 690b7e6..472962c 100644 --- a/libopkg/pkg_vec.c +++ b/libopkg/pkg_vec.c @@ -1,7 +1,7 @@ -/* pkg_vec.c - the itsy package management system +/* pkg_vec.c - the opkg package management system Steven M. Ayer - + Copyright (C) 2002 Compaq Computer Corporation This program is free software; you can redistribute it and/or @@ -15,19 +15,16 @@ General Public License for more details. */ -#include +#include #include -#include "xregex.h" -#include "opkg.h" + #include "pkg.h" +#include "opkg_message.h" +#include "libbb/libbb.h" pkg_vec_t * pkg_vec_alloc(void) { - pkg_vec_t * vec = (pkg_vec_t *)malloc(sizeof(pkg_vec_t)); - if (!vec) { - fprintf(stderr, "%s: out of memory\n", __FUNCTION__); - return NULL; - } + pkg_vec_t * vec = xcalloc(1, sizeof(pkg_vec_t)); vec->pkgs = NULL; vec->len = 0; @@ -36,7 +33,12 @@ pkg_vec_t * pkg_vec_alloc(void) void pkg_vec_free(pkg_vec_t *vec) { - free(vec->pkgs); + if (!vec) + return; + + if (vec->pkgs) + free(vec->pkgs); + free(vec); } @@ -46,80 +48,59 @@ void pkg_vec_free(pkg_vec_t *vec) * so identical versions have identical version strings, * implying identical packages; let's marry these */ -pkg_t *pkg_vec_insert_merge(pkg_vec_t *vec, pkg_t *pkg, int set_status,opkg_conf_t *conf) +void pkg_vec_insert_merge(pkg_vec_t *vec, pkg_t *pkg, int set_status) { int i; int found = 0; /* look for a duplicate pkg by name, version, and architecture */ for (i = 0; i < vec->len; i++){ - opkg_message(conf, OPKG_DEBUG2, "Function: %s. Found pkg=%s version=%s arch=%s cmp=%s version=%s arch=%s \n", - __FUNCTION__, pkg->name, pkg->version, pkg->architecture, - vec->pkgs[i]->name, vec->pkgs[i]->version,vec->pkgs[i]->architecture ); - if ((strcmp(pkg->name, vec->pkgs[i]->name) == 0) - && (pkg_compare_versions(pkg, vec->pkgs[i]) == 0) - && (strcmp(pkg->architecture, vec->pkgs[i]->architecture) == 0)) { + opkg_msg(DEBUG2, "%s %s arch=%s vs. %s %s arch=%s.\n", + pkg->name, pkg->version, pkg->architecture, + vec->pkgs[i]->name, vec->pkgs[i]->version, + vec->pkgs[i]->architecture); + /* if the name,ver,arch matches, or the name matches and the + * package is marked deinstall/hold */ + if ((!strcmp(pkg->name, vec->pkgs[i]->name)) + && ((pkg->state_want == SW_DEINSTALL + && (pkg->state_flag & SF_HOLD)) + || ((pkg_compare_versions(pkg, vec->pkgs[i]) == 0) + && (!strcmp(pkg->architecture, vec->pkgs[i]->architecture))))) { found = 1; - opkg_message(conf, OPKG_DEBUG2, "Function: %s. Found duplicate for pkg=%s version=%s arch=%s\n", - __FUNCTION__, pkg->name, pkg->version, pkg->architecture); + opkg_msg(DEBUG2, "Duplicate for pkg=%s version=%s arch=%s.\n", + pkg->name, pkg->version, pkg->architecture); break; } } /* we didn't find one, add it */ - if (!found){ - opkg_message(conf, OPKG_DEBUG2, "Function: %s. Adding new pkg=%s version=%s arch=%s\n", - __FUNCTION__, pkg->name, pkg->version, pkg->architecture); - - vec->pkgs = (pkg_t **)realloc(vec->pkgs, (vec->len + 1) * sizeof(pkg_t *)); - vec->pkgs[vec->len] = pkg; - vec->len++; - return pkg; + if (!found){ + opkg_msg(DEBUG2, "Adding new pkg=%s version=%s arch=%s.\n", + pkg->name, pkg->version, pkg->architecture); + pkg_vec_insert(vec, pkg); + return; } + /* update the one that we have */ - else { - opkg_message(conf, OPKG_DEBUG2, "Function: %s. calling pkg_merge for pkg=%s version=%s arch=%s", - __FUNCTION__, pkg->name, pkg->version, pkg->architecture); - if (set_status) { - /* this is from the status file, so need to merge with existing database */ - opkg_message(conf, OPKG_DEBUG2, " with set_status\n"); - pkg_merge(vec->pkgs[i], pkg, set_status); - /* XXX: CLEANUP: It's not so polite to free something here - that was passed in from above. */ - pkg_deinit(pkg); - free(pkg); - } else { - opkg_message(conf, OPKG_DEBUG2, " WITHOUT set_status\n"); - /* just overwrite the old one */ - pkg_deinit(vec->pkgs[i]); - free(vec->pkgs[i]); - vec->pkgs[i] = pkg; - } - return vec->pkgs[i]; + opkg_msg(DEBUG2, "Merging %s %s arch=%s, set_status=%d.\n", + pkg->name, pkg->version, pkg->architecture, set_status); + if (set_status) { + /* This is from the status file, + * so need to merge with existing database */ + pkg_merge(pkg, vec->pkgs[i]); } + + /* overwrite the old one */ + pkg_deinit(vec->pkgs[i]); + free(vec->pkgs[i]); + vec->pkgs[i] = pkg; } void pkg_vec_insert(pkg_vec_t *vec, const pkg_t *pkg) { - int found = 0; - -#if 0 - /* look for a duplicate pkg by name, version, and architecture */ - for (i = 0; i < vec->len; i++) - if ((strcmp(pkg->name, vec->pkgs[i]->name) == 0) - && (pkg_compare_versions(pkg, vec->pkgs[i]) == 0) - && (strcmp(pkg->architecture, vec->pkgs[i]->name) == 0)) { - found = 1; - break; - } -#endif - - /* we didn't find one, add it */ - if(!found){ - vec->pkgs = (pkg_t **)realloc(vec->pkgs, (vec->len + 1) * sizeof(pkg_t *)); - *(const pkg_t **)&vec->pkgs[vec->len] = pkg; - vec->len++; - } + vec->pkgs = xrealloc(vec->pkgs, (vec->len + 1) * sizeof(pkg_t *)); + vec->pkgs[vec->len] = (pkg_t *)pkg; + vec->len++; } int pkg_vec_contains(pkg_vec_t *vec, pkg_t *apkg) @@ -166,12 +147,8 @@ int pkg_vec_mark_if_matches(pkg_vec_t *vec, const char *pattern) abstract_pkg_vec_t * abstract_pkg_vec_alloc(void) { - abstract_pkg_vec_t * vec ; - vec = (abstract_pkg_vec_t *)malloc(sizeof(abstract_pkg_vec_t)); - if (!vec) { - fprintf(stderr, "%s: out of memory\n", __FUNCTION__); - return NULL; - } + abstract_pkg_vec_t * vec ; + vec = xcalloc(1, sizeof(abstract_pkg_vec_t)); vec->pkgs = NULL; vec->len = 0; @@ -180,6 +157,8 @@ abstract_pkg_vec_t * abstract_pkg_vec_alloc(void) void abstract_pkg_vec_free(abstract_pkg_vec_t *vec) { + if (!vec) + return; free(vec->pkgs); free(vec); } @@ -189,29 +168,14 @@ void abstract_pkg_vec_free(abstract_pkg_vec_t *vec) */ void abstract_pkg_vec_insert(abstract_pkg_vec_t *vec, abstract_pkg_t *pkg) { - -#if 0 - /* look for a duplicate pkg by name */ - for(i = 0; i < vec->len; i++) - if (strcmp(pkg->name, vec->pkgs[i]->name) == 0) - break; - - /* we didn't find one, add it */ - if(i == vec->len){ -#endif - vec->pkgs = - (abstract_pkg_t **) - realloc(vec->pkgs, (vec->len + 1) * sizeof(abstract_pkg_t *)); - vec->pkgs[vec->len] = pkg; - vec->len++; -#if 0 - } -#endif + vec->pkgs = xrealloc(vec->pkgs, (vec->len + 1) * sizeof(abstract_pkg_t *)); + vec->pkgs[vec->len] = pkg; + vec->len++; } abstract_pkg_t * abstract_pkg_vec_get(abstract_pkg_vec_t *vec, int i) { - if (vec->len > i) + if (vec->len > i) return vec->pkgs[i]; else return NULL; @@ -231,3 +195,14 @@ void abstract_pkg_vec_sort(pkg_vec_t *vec, compare_fcn_t compar) qsort(vec->pkgs, vec->len, sizeof(pkg_t *), compar); } +int pkg_compare_names(const void *p1, const void *p2) +{ + const pkg_t *pkg1 = *(const pkg_t **)p1; + const pkg_t *pkg2 = *(const pkg_t **)p2; + if (pkg1->name == NULL) + return 1; + if (pkg2->name == NULL) + return -1; + return(strcmp(pkg1->name, pkg2->name)); +} +