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>