pkg_t * pkg_hash_fetch_by_name_version(hash_table_t *hash, const char *pkg_name, const char * version) { pkg_vec_t * vec; register int i; char *version_str = NULL; if(!(vec = pkg_vec_fetch_by_name(hash, pkg_name))) return NULL; for(i = 0; i < vec->len; i++) { version_str = pkg_version_str_alloc(vec->pkgs[i]); if(!strcmp(version_str, version)) { free(version_str); break; } free(version_str); } if(i == vec->len) return NULL; return vec->pkgs[i]; }
int pkg_hash_add_from_file(ipkg_conf_t *conf, const char *file_name, pkg_src_t *src, pkg_dest_t *dest, int is_status_file) { hash_table_t *hash = &conf->pkg_hash; char **raw; char **raw_start; pkg_t *pkg; raw = raw_start = read_raw_pkgs_from_file(file_name); if (!raw) return -ENOMEM; while(*raw){ /* don't worry, we'll increment raw in the parsing function */ pkg = pkg_new(); if (!pkg) return -ENOMEM; if (pkg_parse_raw(pkg, &raw, src, dest) == 0) { if (!pkg->architecture) { char *version_str = pkg_version_str_alloc(pkg); pkg->architecture = pkg_get_default_arch(conf); ipkg_message(conf, IPKG_ERROR, "Package %s version %s has no architecture specified, defaulting to %s.\n", pkg->name, version_str, pkg->architecture); free(version_str); } hash_insert_pkg(hash, pkg, is_status_file,conf); } else { free(pkg); } } /* XXX: CLEANUP: I'd like a cleaner interface for cleaning up memory after read_raw_pkgs_from_file */ raw = raw_start; while (*raw) { free(*raw++); } free(raw_start); return 0; }
void print_package (pkg_t *pkg) { char *v = pkg_version_str_alloc(pkg); printf ( "Name: %s\n" "Version: %s\n" "Repository: %s\n" "Architecture: %s\n" "Description: %s\n" "Tags: %s\n" "Size: %ld\n" "Status: %d\n", pkg->name, v, pkg->src->name, pkg->architecture, pkg->description, pkg->tags? pkg->tags : "", pkg->size, pkg->state_status); free(v); }
static void list_pkg(pkg_t *pkg) { char *v = pkg_version_str_alloc(pkg); printf ("%s - %s\n", pkg->name, v); free(v); }