/**
 * 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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}