Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Feb 2019 23:31:32 +0000 (UTC)
From:      Stephen Hurd <shurd@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r492276 - head/ports-mgmt/pkg_cleanup/files
Message-ID:  <201902052331.x15NVWpF018448@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: shurd
Date: Tue Feb  5 23:31:31 2019
New Revision: 492276
URL: https://svnweb.freebsd.org/changeset/ports/492276

Log:
  Remove obsolete features, fixed blacklist
  
  - Removed support for old dialog(3)
  - Removed support for old pkg
  
  pkg support blacklist was broken due to not having the key malloc()ed.

Modified:
  head/ports-mgmt/pkg_cleanup/files/pkg_cleanup.c

Modified: head/ports-mgmt/pkg_cleanup/files/pkg_cleanup.c
==============================================================================
--- head/ports-mgmt/pkg_cleanup/files/pkg_cleanup.c	Tue Feb  5 23:01:11 2019	(r492275)
+++ head/ports-mgmt/pkg_cleanup/files/pkg_cleanup.c	Tue Feb  5 23:31:31 2019	(r492276)
@@ -17,49 +17,17 @@
 #include <sysexits.h>
 #include <unistd.h>
 
-#if __FreeBSD_version < 900030
-#define OLD_DIALOG
-#endif
-
-static glob_t	gl;	/* A cached list of all files in /var/db/pkg */
-static StringList *sl;
-static size_t	pathc;
-static char		**pathv;
-static bool 	uses_pkg;
 static int		menulen=0;
-static int		helpfile=-1;
-static char		helpfname[]="/tmp/pkgcleanup.XXXX";
 
-#ifdef OLD_DIALOG
-typedef dialogMenuItem ListItem;
-#else
 typedef DIALOG_LISTITEM ListItem;
-#endif
 ListItem	*menu;
-#ifdef OLD_DIALOG
-#define ITEM_DATA		data
-#define ITEM_PROMPT		prompt
-#define ITEM_CHECKED	aux
-#else
 #define ITEM_DATA		help
 #define ITEM_PROMPT		name
 #define ITEM_CHECKED	state
-#endif
 
-bool check_pkg(void)
+static void
+free_menu(void)
 {
-	if(WEXITSTATUS(system("TMPDIR=/dev/null "
-						"ASSUME_ALWAYS_YES=1 "
-						"PACKAGESITE=file:///nonexistent "
-						"pkg info -x 'pkg(-devel)?$' "
-						">/dev/null 2>&1")
-				)==0)
-		return true;
-	return false;
-}
-
-void free_menu(void)
-{
 	int		i;
 
 	if(menu) {
@@ -74,186 +42,63 @@ void free_menu(void)
 			}
 		}
 		free(menu);
-		menu=NULL;
-		menulen=0;
 	}
+	menu=NULL;
+	menulen=0;
 }
 
-int blacklist(char *path, int operation)
+static int
+blacklist(char *path, int operation)
 {
 	ENTRY		item;
 
 	item.data=NULL;
-	item.key=path;
+	if (operation == ENTER)
+		item.key=strdup(path);
+	else
+		item.key = path;
+
 	return(hsearch(item, operation)!=NULL);
 }
 
-char *read_desc(char *path)
+static char *
+read_desc(char *path)
 {
-	if(uses_pkg) {
-		char newpath[MAXPATHLEN+1];
-		char *p=NULL;
-		char *np=NULL;
-		FILE *pkg;
-		char chunk[1024];
-		size_t	cs, len=0;
+	char newpath[MAXPATHLEN+1];
+	char *p=NULL;
+	char *np=NULL;
+	FILE *pkg;
+	char chunk[1024];
+	size_t	cs, len=0;
 
-		sprintf(newpath,"/usr/sbin/pkg query %%e \"%s\"", path);
-		fflush(stdout);
-		pkg=popen(newpath, "r");
-		if(!pkg)
-			return NULL;
-		while((cs=fread(chunk, 1, sizeof(chunk), pkg))) {
-			np=(char *)realloc(p, len+cs+1);
-			if(!np) {
-				pclose(pkg);
-				free(p);
-				return NULL;
-			}
-			p=np;
-			memcpy(p+len, chunk, cs);
-			len+=cs;
-			p[len]=0;
-		}
-		pclose(pkg);
-		if(len==0) {
+	sprintf(newpath,"/usr/sbin/pkg query %%e \"%s\"", path);
+	fflush(stdout);
+	pkg=popen(newpath, "r");
+	if(!pkg)
+		return NULL;
+	while((cs=fread(chunk, 1, sizeof(chunk), pkg))) {
+		np=(char *)realloc(p, len+cs+1);
+		if(!np) {
+			pclose(pkg);
 			free(p);
 			return NULL;
 		}
-		return p;
+		p=np;
+		memcpy(p+len, chunk, cs);
+		len+=cs;
+		p[len]=0;
 	}
-	else {
-		char *p;
-		char newpath[MAXPATHLEN+1];
-		FILE *file;
-		struct stat	sb;
-
-		sprintf(newpath,"/var/db/pkg/%s/+DESC",path);
-		file=fopen(newpath, "r");
-		if(file) {
-			if(fstat(fileno(file), &sb)==0) {
-				p=(char *)malloc(sb.st_size+1);
-				if(p) {
-					if(fread(p, sb.st_size, 1, file)==1) {
-						fclose(file);
-						p[sb.st_size]=0;
-						return p;
-					}
-					free(p);
-				}
-			}
-			fclose(file);
-		}
+	pclose(pkg);
+	if(len==0) {
+		free(p);
+		return NULL;
 	}
-	return NULL;
+	return p;
 }
 
-#ifdef OLD_DIALOG
-int fire(struct _dmenu_item *item)
-{
-	if(item->aux)
-		item->aux=0;
-	else
-		item->aux=-1L;
-	return(DITEM_SUCCESS);
-}
-
-void selected(struct _dmenu_item *item, int is_selected)
-{
-	char	path[MAXPATHLEN+1];
-	int		maxx,maxy;
-
-	if(is_selected) {
-		getmaxyx(stdscr, maxy, maxx);
-		draw_box(stdscr, 3, 2, 3, maxx-4, dialog_attr, border_attr);
-		wattrset(stdscr, dialog_attr);
-		mvwaddnstr(stdscr, 4, 4, (char *)item->data, maxx-6);
-		wrefresh(stdscr);
-		if(uses_pkg) {
-			char	*desc=read_desc(item->prompt);
-			lseek(helpfile, 0, SEEK_SET);
-			if(desc) {
-				write(helpfile, desc, strlen(desc));
-				free(desc);
-			}
-			ftruncate(helpfile, lseek(helpfile, 0, SEEK_CUR));
-		}
-		else {
-			sprintf(path,"/var/db/pkg/%s/+DESC",item->prompt);
-			use_helpfile(path);
-		}
-	}
-}
-
-int checked(struct _dmenu_item *item)
-{
-	if(item->aux)
-		return(TRUE);
-	return(FALSE);
-}
-#endif
-
-char *read_comment(char *path)
-{
-	if(uses_pkg) {
-		char newpath[MAXPATHLEN+1];
-		char *p=NULL;
-		char *np=NULL;
-		FILE *pkg;
-		char chunk[1024];
-		size_t	cs, len=0;
-
-		sprintf(newpath,"/usr/sbin/pkg query %%c \"%s\"", path);
-		fflush(stdout);
-		pkg=popen(newpath, "r");
-		if(!pkg)
-			return strdup("");
-		while((cs=fread(chunk, 1, sizeof(chunk), pkg))) {
-			np=(char *)realloc(p, len+cs+1);
-			if(!np) {
-				pclose(pkg);
-				free(p);
-				return strdup("");
-			}
-			p=np;
-			memcpy(p+len, chunk, cs);
-			len+=cs;
-			p[len]=0;
-		}
-		pclose(pkg);
-		if(len==0) {
-			free(p);
-			return strdup("");
-		}
-		return p;
-	}
-	else {
-		char		comment[80];
-		FILE		*file;
-		char		newpath[MAXPATHLEN+1];
-		char		*p;
-
-		/* Read +COMMENT */
-		sprintf(newpath,"%s/+COMMENT",path);
-		file=fopen(newpath,"r");
-		if(file) {
-			fgets(comment, sizeof(comment), file);
-			fclose(file);
-			/* Remove trailing whitespace */
-			for(p=strchr(comment,0)-1; p>=comment; p--) {
-				if(isspace(*p))
-					*p=0;
-				else
-					break;
-			}
-			return strdup(comment);
-		}
-	}
-	return strdup("");
-}
-
 /* Read +COMMENT, add to menu and blacklist */
-int add_item(char *path, char *comment)
+static int
+add_item(char *path, char *comment)
 {
 	char		*p;
 	ListItem	*newmenu;
@@ -275,17 +120,7 @@ int add_item(char *path, char *comment)
 
 	menu[menulen].ITEM_PROMPT=strdup(p);
 	menu[menulen].ITEM_CHECKED=0;
-#ifdef OLD_DIALOG
-	menu[menulen].title="";
-	menu[menulen].checked=checked;
-	menu[menulen].fire=fire;
-	menu[menulen].selected=selected;
-	menu[menulen].lbra='[';
-	menu[menulen].mark='X';
-	menu[menulen].rbra=']';
-#else
 	menu[menulen].text="";
-#endif
 
 	menu[menulen].ITEM_DATA=strdup(comment);
 	menulen++;
@@ -293,18 +128,15 @@ int add_item(char *path, char *comment)
 	return(0);
 }
 
-void do_init_dialog(void)
+static void
+do_init_dialog(void)
 {
-#ifdef OLD_DIALOG
-	init_dialog();
-	use_shadow=FALSE;
-#else
 	init_dialog(stdin, stdout);
 	dialog_state.use_shadow=FALSE;
-#endif
 }
 
-int display_menu(void)
+static int
+display_menu(void)
 {
 	int	ret=0;
 	int	maxx,maxy;
@@ -312,10 +144,6 @@ int display_menu(void)
 
 	do_init_dialog();
 	getmaxyx(stdscr, maxy, maxx);
-#ifdef OLD_DIALOG
-	if(dialog_checklist("Welcome to pkg_cleanup.", "These are the leaf packages installed on your system\nChose the packages to deinstall. F1 will display the package description.\n\n\n", maxy, maxx, maxy-11, 0-menulen, menu, NULL))
-		ret=-1;
-#else
 	dialog_vars.help_button=1;
 	dialog_vars.item_help=1;
 loop:
@@ -339,181 +167,13 @@ loop:
 	}
 	dialog_vars.help_button=0;
 	dialog_vars.item_help=0;
-#endif
 	end_dialog();
 	return(ret);
 }
 
-bool is_leaf_package(char *path)
+static int
+remove_packages(void)
 {
-	char	newpath[MAXPATHLEN+1];
-	struct stat	sb;
-
-	if(uses_pkg) {
-		FILE	*pkg;
-		char	val[32];
-		long	v;
-
-		sprintf(newpath,"/usr/sbin/pkg query \"%%#r%%k\" \"%s\"", path);
-		fflush(stdout);
-		pkg=popen(newpath,"r");
-		if(pkg) {
-			if(fgets(val, sizeof(val), pkg)!=NULL) {
-				if(WEXITSTATUS(pclose(pkg))==0) {
-					if(strtol(val, NULL, 10)==0)
-							return true;
-					return false;
-				}
-				else {
-					blacklist(path,ENTER);
-					return false;
-				}
-			}
-		}
-		blacklist(path,ENTER);
-		pclose(pkg);
-		return false;
-	}
-	else {
-		sprintf(newpath,"%s/+REQUIRED_BY",path);
-		if(stat(newpath,&sb)) {
-			switch(errno) {
-				case ENOENT:
-					/* No +REQUIRED_BY, add to list */
-					return true;
-					break;
-				default:
-					/* All other errors, add to blacklist */
-					blacklist(path,ENTER);
-					break;
-			}
-		}
-		else {
-			if(sb.st_size==0)
-				return true;
-		}
-		return false;
-	}
-}
-
-/* Goes through the glob contents, looking for zero-length +REQUIRED-BY */
-int read_pkglist(int loops)
-{
-	if(uses_pkg) {
-		FILE	*pkg;
-		char	line[1024];
-		char	*p;
-
-		do_init_dialog();
-		dialog_msgbox(NULL, "Searching for leaves", 5, 23, FALSE);
-		fflush(stdout);
-		pkg=popen("/usr/sbin/pkg query -e \"%#r=0 && %k=0\" \"%n-%v\\t%c\"", "r");
-		if(!pkg) {
-			fputs("Error executing pkg.\n", stderr);
-			return -1;
-		}
-		while(fgets(line, sizeof(line), pkg)!=NULL) {
-			for(p=strchr(line, 0)-1; p>line && isspace(*p); p--)
-				*p=0;
-			p=strtok(line, "\t");
-			p=strtok(NULL, "\0");
-			add_item(line, p?p:"");
-		}
-		if(WEXITSTATUS(pclose(pkg)) && menulen==0) {
-			fputs("pkg returned an error.\n", stderr);
-			return -1;
-		}
-#ifdef OLD_DIALOG
-		dialog_clear_norefresh();
-#else
-		dlg_clear();
-#endif
-	}
-	else {
-		int		p;
-		int		maxx,maxy;
-		int		lastgauge=-1;
-		int		gauge;
-		char	*comment;
-#ifndef OLD_DIALOG
-		int		pipepair[2];
-		FILE	*read_pipe;
-		FILE	*write_pipe;
-#endif
-
-		do_init_dialog();
-		getmaxyx(stdscr, maxy, maxx);
-		for(p=0;p<pathc;p++) {
-			gauge=p*100/pathc;
-			if(gauge != lastgauge) {
-#ifdef OLD_DIALOG
-				dialog_gauge(NULL, "Searching for leaves", maxy/2-1, maxx/2-12, 7, 24, gauge);
-#else
-				if(pipe(pipepair)!=0) {
-					fputs("Cannot create pipe pair.\n", stderr);
-					return(-1);
-				}
-				if((read_pipe=fdopen(pipepair[0], "r"))==NULL) {
-					fputs("Cannot open read end of pipe pair.\n", stderr);
-					return(-1);
-				}
-				dialog_state.pipe_input=read_pipe;
-				if((write_pipe=fdopen(pipepair[1], "r"))==NULL) {
-					fputs("Cannot open read end of pipe pair.\n", stderr);
-					return(-1);
-				}
-				fprintf(write_pipe, "%d\n%c", gauge, 4);
-				fclose(write_pipe);
-				dialog_gauge("", "Searching for leaves", maxy/2-1, maxx/2-12, gauge);
-				fclose(read_pipe);
-#endif
-				lastgauge=gauge;
-			}
-			if(is_leaf_package(pathv[p])) {
-				comment = read_comment(pathv[p]);
-				add_item(pathv[p], comment);
-				free(comment);
-			}
-		}
-#ifdef OLD_DIALOG
-		dialog_gauge(NULL, "Searching for leaves", maxy/2-1, maxx/2-12, 7, 24, 100);
-		dialog_clear_norefresh();
-#else
-		if(pipe(pipepair)!=0) {
-			fputs("Cannot create pipe pair.\n", stderr);
-			return(-1);
-		}
-		if((read_pipe=fdopen(pipepair[0], "r"))==NULL) {
-			fputs("Cannot open read end of pipe pair.\n", stderr);
-			return(-1);
-		}
-		dialog_state.pipe_input=read_pipe;
-		if((write_pipe=fdopen(pipepair[1], "r"))==NULL) {
-			fputs("Cannot open read end of pipe pair.\n", stderr);
-			return(-1);
-		}
-		fprintf(write_pipe, "%d\n%c", 100, 4);
-		fclose(write_pipe);
-		dialog_gauge("", "Searching for leaves", maxy/2-1, maxx/2-12, 100);
-		fclose(read_pipe);
-		dlg_clear();
-#endif
-	}
-	if(menulen==0) {
-		if(loops)
-			dialog_msgbox(NULL, "No new leaves found", 5, 23, TRUE);
-		else
-			dialog_msgbox(NULL, "No leaves found", 5, 19, TRUE);
-		end_dialog();
-		return(-1);
-	}
-	end_dialog();
-	return(0);
-}
-
-int remove_ports(void)
-{
-	char	*cmd;
 	char	**args;
 	char	*env[1]={NULL};
 	char	**p;
@@ -531,15 +191,9 @@ int remove_ports(void)
 		return(-1);
 	}
 	p=args;
-	if(uses_pkg) {
-		*(p++)="/usr/sbin/pkg";
-		*(p++)="delete";
-		*(p++)="-y";
-	}
-	else {
-		*(p++)="/usr/sbin/pkg_delete";
-		*(p++)="-G";
-	}
+	*(p++)="/usr/sbin/pkg";
+	*(p++)="delete";
+	*(p++)="-y";
 	for(i=0;i<menulen;i++) {
 		if(menu[i].ITEM_CHECKED) {
 			*(p++)=menu[i].ITEM_PROMPT;
@@ -561,12 +215,6 @@ int remove_ports(void)
 	if(child==0) {
 		execve(args[0], args, env);
 		fprintf(stderr,"ERROR: %d!\n",errno);
-#ifdef OLD_DIALOG
-		if(helpfile != -1) {
-			close(helpfile);
-			unlink(helpfname);
-		}
-#endif
 		_exit(EXIT_FAILURE);
 	}
 	free(args);
@@ -586,122 +234,82 @@ int remove_ports(void)
 	return(0);
 }
 
-int keep_going(void)
+/* Goes through the glob contents, looking for zero-length +REQUIRED-BY */
+static int
+read_pkglist(int loops)
 {
-	int ret;
+	FILE	*pkg;
+	char	line[1024];
+	char	*p;
 
 	do_init_dialog();
-	ret = !dialog_yesno(NULL,"Do you want to process the new leaves packages?",-1,-1);
+	dialog_msgbox(NULL, "Searching for leaves", 5, 23, FALSE);
+	fflush(stdout);
+	pkg=popen("/usr/sbin/pkg query -e \"%#r=0 && %k=0\" \"%n-%v\\t%c\"", "r");
+	if(!pkg) {
+		fputs("Error executing pkg.\n", stderr);
+		return -1;
+	}
+	while(fgets(line, sizeof(line), pkg)!=NULL) {
+		for(p=strchr(line, 0)-1; p>line && isspace(*p); p--)
+			*p=0;
+		p=strtok(line, "\t");
+		p=strtok(NULL, "\0");
+		add_item(line, p?p:"");
+	}
+	if(WEXITSTATUS(pclose(pkg)) && menulen==0) {
+		fputs("pkg returned an error.\n", stderr);
+		return -1;
+	}
+	dlg_clear();
+	if(menulen==0) {
+		if(loops)
+			dialog_msgbox(NULL, "No new leaves found", 5, 23, TRUE);
+		else
+			dialog_msgbox(NULL, "No leaves found", 5, 19, TRUE);
+		end_dialog();
+		return(-1);
+	}
 	end_dialog();
-	return(ret);
+	return(0);
 }
 
-int glob_packages(void)
+static int
+keep_going(void)
 {
-	if(uses_pkg) {
-		FILE	*pkg;
-		char	*line;
-		char	*nline;
-		size_t	len;
-		int		ret;
+	int ret;
 
-		sl = sl_init();
-		fflush(stdout);
-		pkg = popen("/usr/sbin/pkg query \"%n-%v\"", "r");
-		if(!pkg) {
-			fputs("Unable to get list of packages\n",stderr);
-			return EX_OSERR;
-		}
-		while((line = fgetln(pkg, &len))!=NULL) {
-			if(len > 0 && line[len-1]=='\n')
-				len--;
-			nline = strndup(line, len);
-			if(!nline) {
-				fprintf(stderr, "Unable allocate memory for \"%.*s\" to list\n", (int)len, line);
-				return EX_UNAVAILABLE;
-			}
-			if(sl_add(sl, nline)) {
-				fprintf(stderr, "Unable to add package \"%s\" to list\n", nline);
-				return EX_UNAVAILABLE;
-			}
-		}
-		ret = pclose(pkg);
-		if(WEXITSTATUS(ret)) {
-			fprintf(stderr, "pkg exited with error %d\n", WEXITSTATUS(ret));
-			return WEXITSTATUS(ret);
-		}
-
-		pathc = sl->sl_cur;
-		pathv = sl->sl_str;
-	}
-	else {
-		/* glob() package directories */
-		if(glob("/var/db/pkg/*", GLOB_ERR, NULL, &gl)) {
-			fputs("Unable to get list of packages\n",stderr);
-			switch(errno) {
-				case GLOB_NOSPACE:
-					return(EX_UNAVAILABLE);
-				case GLOB_ABORTED:
-					return(EX_NOINPUT);
-				case GLOB_NOMATCH:
-					return(EX_NOINPUT);
-			}
-			return(EXIT_FAILURE);
-		}
-		pathc = gl.gl_pathc;
-		pathv = gl.gl_pathv;
-	}
-	return 0;
+	do_init_dialog();
+	ret = !dialog_yesno(NULL,"Do you want to process the new leaves packages?",-1,-1);
+	end_dialog();
+	return(ret);
 }
 
 /*
- * The hash table is to keep track of leaves which  have already been displayed
+ * The hash table is to keep track of leaves which have already been displayed
  * to the user.
  */
 int main(int argc, char **argv)
 {
 	int			i;
 
-	uses_pkg = check_pkg();
-
-	i = glob_packages();
-	if(i)
-		return i;
-
-	if(pathc==0) {
-		fputs("No packages found.\n",stderr);
-		return(EXIT_FAILURE);
-	}
-
 	/* Initialize space for blacklist hash table */
 	if(hcreate(10000)==0) {
 		fputs("Cannot create hash table.\n",stderr);
 		return(EX_UNAVAILABLE);
 	}
 
-	/* Create temp help file for the description when using pkg on 8.x */
-#ifdef OLD_DIALOG
-	if(uses_pkg)
-		helpfile=mkstemp(helpfname);
-#endif
-
 	i=0;
 	do {
 		if(read_pkglist(i++))
 			break;
 		if(display_menu())
 			break;
-		if(remove_ports())
+		if(remove_packages())
 			break;
 		free_menu();
 	} while(keep_going());
-
-#ifdef OLD_DIALOG
-	if(helpfile != -1) {
-		close(helpfile);
-		unlink(helpfname);
-	}
-#endif
+	hdestroy();
 
 	fputs("\nProgram Terminated Successfully\n",stderr);
 	return(0);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902052331.x15NVWpF018448>