From owner-p4-projects@FreeBSD.ORG Sun Jul 15 06:03:02 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 50EB416A405; Sun, 15 Jul 2007 06:03:02 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D832D16A400 for ; Sun, 15 Jul 2007 06:03:01 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id C70F313C478 for ; Sun, 15 Jul 2007 06:03:01 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6F631RZ023828 for ; Sun, 15 Jul 2007 06:03:01 GMT (envelope-from gcooper@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6F631Rj023709 for perforce@freebsd.org; Sun, 15 Jul 2007 06:03:01 GMT (envelope-from gcooper@FreeBSD.org) Date: Sun, 15 Jul 2007 06:03:01 GMT Message-Id: <200707150603.l6F631Rj023709@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gcooper@FreeBSD.org using -f From: Garrett Cooper To: Perforce Change Reviews Cc: Subject: PERFORCE change 123519 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Jul 2007 06:03:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=123519 Change 123519 by gcooper@optimus-revised_pkgtools on 2007/07/15 06:02:26 2 big changes: -Moved file read-in algoritm from add_plist(..) to lib/file.c (seems that there was already a subroutine that did what I was trying to accomplish sooner after I looked a bit closer.. heh). -Took the rest of kientzle's suggestion for converting if(str[0] == '{char}' methodology and stuffed it into switch/case statements. It does look nicer and the logic works. Added a nice comment to the head of the long statement block discussing choice-making in creating block and for ordering in block. Affected files ... .. //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/plist.c#8 edit Differences ... ==== //depot/projects/soc2007/revised_fbsd_pkgtools/usr/src/usr.sbin/pkg_install/lib/plist.c#8 (text+ko) ==== @@ -28,8 +28,6 @@ #include #include -#define BUFFER_TRY 1 - int run_generic_plist_prof(char *fn_name, ...) { @@ -109,7 +107,7 @@ time_diff.tv_sec = after.tv_sec - before.tv_sec; - printf( "(%s) Difference: %3.20lf secs\n", fn_name, (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 ) ); + fprintf(stderr, "(%s) Difference: %3.20lf secs\n", fn_name, (double) ( time_diff.tv_sec + time_diff.tv_nsec/1e9 ) ); return ret_code; @@ -300,6 +298,7 @@ str_lowercase(cmd); cp = cmd; sp = s; + while (*cp) { if (isspace(*cp)) { *cp = '\0'; @@ -309,98 +308,136 @@ } ++cp, ++sp; } - printf("COMMAND STRING: %s\nCMD"/*: %s\nCP: %s\nSP: %s\n"*/, s/*, cmd, cp, sp*/); - if(!*(cmd+1)) + /** All commands should be greater than 1 char long **/ + if(*cmd == '\0' || *(cmd+1) == '\0') return FAIL; if (arg) *arg = (char *)sp; - if(*cmd == 'c') { + /** + * In order to avoid the a large sheer number of + * loops produced by plist_cmd running strcmp, + * let's prod the first char with a switch statement + * to reduce the search radices later on down the line. + * + * This is justified because this command is called + * somewhere in the thousands range for iterations while + * installing some packages. + * + * First characters and subsequent command directives + * are arranged in descending order of likelihood for + * being present in +CONTENTS and related files. + */ + switch(*cmd) { + case 'c': + /** COMMENT .. **/ + if(!strcmp(cmd, "comment")) { + /** .. with origin info. **/ + if (!strncmp(*arg, "ORIGIN:", 7)) { + *arg += 7; + return PLIST_ORIGIN; + } + /** .. with deporigin info. **/ + else if (!strncmp(*arg, "DEPORIGIN:", 10)) { + *arg += 10; + return PLIST_DEPORIGIN; + } + /** Standard comment :) **/ + return PLIST_COMMENT; - if(!strcmp(cmd+1, "wd") || *(cmd+1) == 'd') { - printf("CWD IS: %s\n", sp); + } + /** CWD / CD **/ + else if(!strcmp(cmd, "cwd") || !strcmp(cmd, "cd")) { return PLIST_CWD; } + /** CONFLICTS **/ + else if(!strcmp(cmd, "conflicts")) + return PLIST_CONFLICTS; - else if(*(cmd+1) == 'o') { + /** FALL-THROUGH **/ - if(!strcmp(cmd+2, "mment")) { - if (!strncmp(*arg, "ORIGIN:", 7)) { - *arg += 7; - return PLIST_ORIGIN; - } else if (!strncmp(*arg, "DEPORIGIN:", 10)) { - *arg += 10; - return PLIST_DEPORIGIN; - } - return PLIST_COMMENT; + case 'e': + /** EXEC **/ + if (!strcmp(cmd, "exec")) + return PLIST_CMD; + /** FALL-THROUGH **/ - } else if(!strcmp(cmd+2, "nflicts")) { - return PLIST_CONFLICTS; - } + case 'u': + /** UN(DO)EXEC **/ + if (!strcmp(cmd, "unexec")) + return PLIST_UNEXEC; + /** FALL-THROUGH **/ - } - - } - - else if (!strcmp(cmd, "exec")) - return PLIST_CMD; - else if (!strcmp(cmd, "unexec")) - return PLIST_UNEXEC; - else if(*cmd == 'i') { - - if (!strcmp(cmd+1, "gnore")) + case 'i': + /** IGNORE **/ + if (!strcmp(cmd, "ignore")) return PLIST_IGNORE; - else if(!strcmp(cmd+1, "gnore_inst")) + /** IGNORE_INST **/ + else if(!strcmp(cmd, "ignore_inst")) return PLIST_IGNORE_INST; + /** FALL-THROUGH **/ - } - - else if (*cmd == 'd') { - - if (!strcmp(cmd+1, "irrm")) + case 'd': + /** DIRRM **/ + if (!strcmp(cmd, "dirrm")) return PLIST_DIR_RM; - else if(!strcmp(cmd+1, "isplay")) + /** DISPLAY **/ + else if(!strcmp(cmd, "display")) return PLIST_DISPLAY; + /** FALL-THROUGH **/ - } - - else if (*cmd == 'n') { - - if (!strcmp(cmd+1, "oinst")) + case 'n': + /** NAME **/ + if(!strcmp(cmd, "name")) + return PLIST_NAME; + /** NOINST **/ + else if (!strcmp(cmd, "noinst")) return PLIST_NOINST; - else if(!strcmp(cmd+1, "ame")) - return PLIST_NAME; + /** FALL-THROUGH **/ - } - - else if (*cmd == 'm') { - - if(!strcmp(cmd+1, "ode")) + case 'm': + /** MODE **/ + if(!strcmp(cmd, "mode")) return PLIST_CHMOD; - else if(!strcmp(cmd+1, "tree")) + /** MTREE **/ + else if(!strcmp(cmd, "mtree")) return PLIST_MTREE; + /** FALL-THROUGH **/ - } + case 'o': + /** OWNER **/ + if(!strcmp(cmd, "owner")) + return PLIST_CHOWN; + /** OPTION **/ + else if (!strcmp(cmd, "option")) + return PLIST_OPTION; + /** FALL-THROUGH **/ - else if (*cmd == 'o') { + case 's': + /** SRCDIR **/ + if(!strcmp(cmd, "srcdir")) + return PLIST_SRC; + /** FALL-THROUGH **/ - if(!strcmp(cmd+1, "wner")) - return PLIST_CHOWN; - else if (!strcmp(cmd+1, "ption")) - return PLIST_OPTION; + case 'g': + /** GROUP **/ + if (!strcmp(cmd, "group")) + return PLIST_CHGRP; + /** FALL-THROUGH **/ - } + case 'p': + /** PKGDEP **/ + if (!strcmp(cmd, "pkgdep")) + return PLIST_PKGDEP; + /** FALL-THROUGH **/ - else if (!strcmp(cmd, "srcdir")) - return PLIST_SRC; - else if (!strcmp(cmd, "group")) - return PLIST_CHGRP; - else if (!strcmp(cmd, "pkgdep")) - return PLIST_PKGDEP; + /** Apparently the command didn't match .. oops **/ + default: + return FAIL; - return FAIL; + } } @@ -414,8 +451,6 @@ read_plist_np(Package *pkg, FILE *fp) { - struct stat contents_stat; - char *plines; char *pline; char *cp; @@ -426,19 +461,8 @@ pkg->fmtver_mnr = 2; pkg->origin = NULL; - if(fstat( fileno(fp), &contents_stat )) - err(-1, "Could not fstat +CONTENTS file"); - - /* Empty file -- don't attempt to process */ - assert(contents_stat.st_size != 0); - - plines = (char*) malloc(contents_stat.st_size+1); + plines = fileGetContentsByDescriptor(fp, "+CONTENTS"); - assert(contents_stat.st_size == read(fileno(fp), plines, contents_stat.st_size+1)); - - /* Just in case file doesn't have EOF */ - *(plines+contents_stat.st_size) = '\0'; - pline = strtok(plines, "\n"); if(0 == trim_end_whitespace(pline)) @@ -714,15 +738,20 @@ if (cp != NULL) { /* Mismatch? */ if (strcmp(cp, p->next->name + 4)) { + warnx("'%s' fails original MD5 checksum - %s", tmp, Force ? "deleted anyway." : "not deleted."); if (!Force) { fail = FAIL; continue; } + } + } + } + if (Verbose) printf("Delete file %s\n", tmp); if (!Fake) { @@ -732,15 +761,23 @@ char tmp2[FILENAME_MAX]; if (make_preserve_name(tmp2, FILENAME_MAX, name, tmp)) { + if (fexists(tmp2)) { + if (rename(tmp2, tmp)) warn("preserve: unable to restore %s as %s", tmp2, tmp); + } + } + } + } + } + break; case PLIST_DIR_RM: @@ -822,9 +859,9 @@ return 1; } /* back up the pathname one component */ - if (cp2) { + if (cp2) cp1 = strdup(dir); - } + } return 0; }