From owner-p4-projects@FreeBSD.ORG Mon Aug 2 19:31:27 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E9B74106567C; Mon, 2 Aug 2010 19:31:26 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 982571065675 for ; Mon, 2 Aug 2010 19:31:26 +0000 (UTC) (envelope-from jlaffaye@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6ADBA8FC1B for ; Mon, 2 Aug 2010 19:31:26 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.4/8.14.4) with ESMTP id o72JVQUo035787 for ; Mon, 2 Aug 2010 19:31:26 GMT (envelope-from jlaffaye@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.4/8.14.4/Submit) id o72JVQGD035785 for perforce@freebsd.org; Mon, 2 Aug 2010 19:31:26 GMT (envelope-from jlaffaye@FreeBSD.org) Date: Mon, 2 Aug 2010 19:31:26 GMT Message-Id: <201008021931.o72JVQGD035785@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jlaffaye@FreeBSD.org using -f From: Julien Laffaye To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 181741 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Aug 2010 19:31:27 -0000 http://p4web.freebsd.org/@@181741?ac=10 Change 181741 by jlaffaye@jlaffaye-chulak on 2010/08/02 19:31:01 Replace the make_hierarchy() function by mkdirs(). The code was inspired by the mkdir(1) utility in our tree. Remove apply_perms() and its silly globals. Affected files ... .. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/add.h#6 edit .. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/extract.c#13 edit .. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/futil.c#3 edit Differences ... ==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/add.h#6 (text+ko) ==== @@ -40,16 +40,9 @@ extern Boolean FailOnAlreadyInstalled; extern Boolean KeepPackage; extern Boolean IgnoreDeps; -extern char *Mode; -extern char *Owner; -extern char *Group; -extern char *Directory; -extern char *PkgName; -extern char *PkgAddCmd; extern add_mode_t AddMode; -int make_hierarchy(char *); -void apply_perms(const char *, const char *); +int mkdirs(char *path); int extract_package(struct archive *, Package *, const char *); int extract_plist(struct archive *, struct archive_entry *, Package *); int pkg_do(const char *); ==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/extract.c#13 (text+ko) ==== @@ -301,7 +301,7 @@ */ snprintf(db_dir_tmp, sizeof(db_dir_tmp), "%s/.%s", LOG_DIR, pkg->name); snprintf(db_dir, sizeof(db_dir), "%s/%s", LOG_DIR, pkg->name); - if (make_hierarchy(db_dir_tmp) == -1) { + if (mkdirs(db_dir_tmp) == -1) { warnx("Can not create '%s' directory - aborting", db_dir_tmp); return (1); } @@ -413,7 +413,7 @@ p->name = strdup(prefix); if (Verbose) printf("extract: CWD to %s\n", p->name); - if (!Fake && make_hierarchy(p->name) == -1) { + if (!Fake && mkdirs(p->name) == -1) { warnx("Can not create '%s' directory.", p->name); return (1); } ==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/futil.c#3 (text+ko) ==== @@ -21,76 +21,37 @@ #include __FBSDID("$FreeBSD: src/usr.sbin/pkg_install/add/futil.c,v 1.16 2010/04/23 11:07:43 flz Exp $"); -#include +#include #include + #include "add.h" /* - * Assuming dir is a desired directory name, make it and all intervening - * directories necessary. + * Does the same job as mkdir(1) with the -p flag. + * Returns 0 on success, -1 otherwise. */ - int -make_hierarchy(char *dir) +mkdirs(char *path) { - char *cp1, *cp2; + int last; + char *p; - if (dir[0] == '/') - cp1 = cp2 = dir + 1; - else - cp1 = cp2 = dir; - while (cp2) { - if ((cp2 = strchr(cp1, '/')) !=NULL ) - *cp2 = '\0'; - if (fexists(dir)) { - if (!isdir(dir)) { - if (cp2) - *cp2 = '/'; - return -1; - } + p = path; + if (p[0] == '/') + ++p; + for (last = 0; !last ; ++p) { + if (p[0] == '\0') + last = 1; + else if (p[0] != '/') + continue; + *p = '\0'; + if (!last && p[1] == '\0') + last = 1; + if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) < 0) + if (errno != EEXIST && errno != EISDIR) + return (-1); + if (!last) + *p = '/'; } - else { - if (mkdir(dir, 0777) < 0) { - if (cp2) - *cp2 = '/'; - return -1; - } - apply_perms(NULL, dir); - } - /* Put it back */ - if (cp2) { - *cp2 = '/'; - cp1 = cp2 + 1; - } - } - return 0; -} - -/* Using permission defaults, apply them as necessary */ -void -apply_perms(const char *dir, const char *arg) -{ - const char *cd_to; - - if (!dir || *arg == '/') /* absolute path? */ - cd_to = "/"; - else - cd_to = dir; - - if (Mode) - if (vsystem("cd %s && /bin/chmod -R %s %s", cd_to, Mode, arg)) - warnx("couldn't change modes of '%s' to '%s'", arg, Mode); - if (Owner && Group) { - if (vsystem("cd %s && /usr/sbin/chown -R %s:%s %s", cd_to, Owner, Group, arg)) - warnx("couldn't change owner/group of '%s' to '%s:%s'", - arg, Owner, Group); - return; - } - if (Owner) { - if (vsystem("cd %s && /usr/sbin/chown -R %s %s", cd_to, Owner, arg)) - warnx("couldn't change owner of '%s' to '%s'", arg, Owner); - return; - } else if (Group) - if (vsystem("cd %s && /usr/bin/chgrp -R %s %s", cd_to, Group, arg)) - warnx("couldn't change group of '%s' to '%s'", arg, Group); + return (0); }