/** * Adds a dependency to a +CONTENTS file */ int pkg_freebsd_contents_add_dependency(struct pkg_freebsd_contents *contents, struct pkg *pkg) { const char *origin; if (contents == NULL || contents->file != NULL || pkg == NULL) return -1; if (pkg_freebsd_contents_add_line(contents, PKG_LINE_PKGDEP, pkg_get_name(pkg)) != 0) { return -1; } origin = pkg_get_origin(pkg); if (origin != NULL) { char *data; asprintf(&data, "ORIGIN:%s", origin); if (pkg_freebsd_contents_add_line(contents, PKG_LINE_COMMENT, data) != 0) { free(data); return -1; } free(data); } if (contents->cnts_file != NULL) { pkgfile_free(contents->cnts_file); contents->cnts_file = NULL; } return -1; }
int pkg_info(struct pkg_info info) { unsigned int cur; int retval; struct pkg **pkgs; retval = 1; pkgs = NULL; /* -e package name */ if (info.check_package != NULL) { struct pkg *pkg; pkg = pkg_db_get_package(info.db, info.check_package); if (pkg != NULL) { pkg_free(pkg); return 0; } return 1; } /* -W <filename> */ if (info.search_file != NULL) { struct stat sb; if (stat(info.search_file, &sb) != 0) { /* XXX */ return 1; } pkgs = pkg_db_get_installed_match_count(info.db, pkg_match_by_file, 1, (const void *)info.search_file); if (info.quiet == 0) printf("The following installed package(s) has %s " "origin:\n", info.origin); printf("%s\n", pkg_get_name(pkgs[0])); return 0; } /* -O <origin> */ if (info.origin != NULL) { unsigned int pos; pkgs = pkg_db_get_installed_match(info.db, pkg_match_by_origin, (const void *)info.origin); if (info.quiet == 0) printf("The following installed package(s) has %s " "origin:\n", info.origin); for (pos = 0; pkgs[pos] != NULL; pos++) { printf("%s\n", pkg_get_name(pkgs[pos])); } return 0; } switch(info.match_type) { case MATCH_ALL: case MATCH_GLOB: case MATCH_NGLOB: case MATCH_REGEX: case MATCH_EREGEX: /* Display all packages installed */ if (info.match_type == MATCH_ALL) pkgs = pkg_db_get_installed(info.db); else if (info.match_type == MATCH_REGEX || info.match_type == MATCH_EREGEX) pkgs = match_regex(info.db, (const char**)info.pkgs, (info.match_type == MATCH_EREGEX)); else if (info.match_type == MATCH_GLOB || info.match_type == MATCH_NGLOB) pkgs = match_glob(info.db, (const char**)info.pkgs, (info.match_type == MATCH_GLOB)); else errx(1, "ERROR: Inconsistancy in pkg_info"); /* Sort the packages and display them */ if (pkgs == NULL) { /* XXX Error message */ return 1; } for (cur = 0; pkgs[cur] != NULL; cur++) continue; qsort(pkgs, cur, sizeof(struct pkg *), pkg_compare); for (cur = 0; pkgs[cur] != NULL; cur++) { show(info.db, pkgs[cur], info.flags, info.quiet, info.seperator, info.use_blocksize); } retval = 0; break; case MATCH_EXACT: /* Only match the exact names given */ retval = 0; for (cur = 0; info.pkgs[cur] != NULL; cur++) { struct pkg *pkg; pkg = pkg_db_get_package(info.db, info.pkgs[cur]); if (pkg != NULL) show(info.db, pkg, info.flags, info.quiet, info.seperator, info.use_blocksize); else { warnx("pkg_info: can't find package '%s' " "installed or in a file!", info.pkgs[cur]); retval = 1; } } break; } if (pkgs != NULL) pkg_list_free(pkgs); return retval; }
int pkg_info(struct pkg_info info) { unsigned int cur; int retval; struct pkg **pkgs; retval = 1; pkgs = NULL; switch(info.match_type) { case MATCH_ALL: /* Display all packages installed */ pkgs = pkg_db_get_installed(info.db); if (pkgs == NULL) { /* XXX Error message */ return 1; } for (cur = 0; pkgs[cur] != NULL; cur++) continue; qsort(pkgs, cur, sizeof(struct pkg *), pkg_compare); for (cur = 0; pkgs[cur] != NULL; cur++) { show(info.db, pkgs[cur], info.flags, info.quiet); } retval = 0; break; case MATCH_REGEX: case MATCH_EREGEX: /* Match all packages that match one of the [e]regex given */ { char *prev; //pkgs = pkg_db_get_installed(info.db); //if (pkgs == NULL) { /* XXX Error message */ // break; //} pkgs = match_regex(info.db, info.pkgs, (info.match_type == MATCH_EREGEX)); /* Display all packages that matches atleast one regex */ prev = NULL; for (cur = 0; pkgs[cur] != NULL; cur++) { /* Only show one instance of each package */ if (prev == NULL || strcmp(prev, pkg_get_name(pkgs[cur])) != 0) { show(info.db, pkgs[cur], info.flags, info.quiet); } prev = pkg_get_name(pkgs[cur]); } } retval = 0; break; case MATCH_GLOB: case MATCH_NGLOB: errx(1, "Unsupported match type (use -x or -X)"); break; case MATCH_EXACT: /* Only match the exact names given */ retval = 0; for (cur = 0; info.pkgs[cur] != NULL; cur++) { struct pkg *pkg; pkg = pkg_db_get_package(info.db, info.pkgs[cur]); if (pkg != NULL) show(info.db, pkg, info.flags, info.quiet); else retval = 1; } break; } if (pkgs != NULL) pkg_list_free(pkgs); return retval; }
void *xpkg_init_search(void){ int count, rv, i, len; const gchar *str; gboolean found_f = FALSE; xpkg_search_flags s_flags; gdouble fraction; unsigned short int first = 1; PkgIdxEntry pie; u_int entries; memset(&s_heap, 0, sizeof(s_heap)); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &rv); pthread_cleanup_push(xpkg_free_search_heap, &s_heap); gdk_threads_enter(); xpkg_set_search_flags(&s_flags); str = xpkg_get_search_dialog_input(); s_heap.pbuf = gdk_pixbuf_new_from_xpm_data((void *)&packages_xpm); gdk_threads_leave(); len = strlen(str); if(!len) pthread_exit(NULL); if(XPKG.cont_t_state == T_AVAILABLE_STATE){ DB_OPEN; entries = pkg_get_cached_entries(XPKG.available_pkgs.dbp); DB_CLOSE; i = 0; DB_OPEN; while((rv = pkg_get_cached_entry(XPKG.available_pkgs.dbp, &pie, &first)) > 0){ if(rv == 1){ i++; /*name search*/ if(s_flags.name_t_f){ if(xpkg_search_string(pie.name, str)){ gdk_threads_enter(); asprintf(&s_heap.ptr, "%s-%s", pie.name, pie.version); assert(s_heap.ptr != NULL); xpkg_append_search_result(NULL, s_heap.ptr); free(s_heap.ptr); s_heap.ptr = NULL; gdk_threads_leave(); found_f = TRUE; } } /*name description*/ if(s_flags.descr_t_f){ if(xpkg_search_string(pie.descr, str)){ gdk_threads_enter(); asprintf(&s_heap.ptr, "%s-%s", pie.name, pie.version); assert(s_heap.ptr != NULL); xpkg_append_search_result(NULL, s_heap.ptr); free(s_heap.ptr); s_heap.ptr = NULL; gdk_threads_leave(); found_f = TRUE; } } gdk_threads_enter(); fraction = (float)i / entries; xpkg_set_search_progress_fraction(fraction); gdk_threads_leave(); } } DB_CLOSE; gdk_threads_enter(); gtk_widget_set_sensitive(XPKG.gui.search_dlg.clear_button, TRUE); xpkg_set_search_progress_fraction(0); gdk_threads_leave(); pthread_exit(NULL); } Pkg *pkgs = XPKG.installed_pkgs.pkgs; for(count = 0; pkgs[count] != NULL; count++); for(i = 0; i != count; i++){ gdk_threads_enter(); fraction = (float)(i + 1) / count; xpkg_set_search_progress_fraction(fraction); gdk_threads_leave(); /*name search*/ if(s_flags.name_t_f){ if(xpkg_search_string((char *)pkg_get_name(pkgs[i]), str)){ gdk_threads_enter(); xpkg_append_search_result(pkgs[i], NULL); gdk_threads_leave(); found_f = TRUE; } } /*comment search*/ if(s_flags.descr_t_f && !found_f){ if(xpkg_search_comment(pkgs[i], str)){ gdk_threads_enter(); xpkg_append_search_result(pkgs[i], NULL); gdk_threads_leave(); found_f = TRUE; } } /*description search*/ if(s_flags.descr_t_f && !found_f){ if(xpkg_search_description(pkgs[i], str)){ gdk_threads_enter(); xpkg_append_search_result(pkgs[i], NULL); gdk_threads_leave(); found_f = TRUE; } } found_f = FALSE; } gdk_threads_enter(); xpkg_set_search_progress_fraction(0); gdk_threads_leave(); pthread_cleanup_pop(0); return NULL; }