From owner-p4-projects@FreeBSD.ORG Sun Jun 20 01:02:12 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DD29F106566B; Sun, 20 Jun 2010 01:02:11 +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 A1AEB1065676 for ; Sun, 20 Jun 2010 01:02:11 +0000 (UTC) (envelope-from ivoras@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8E2C48FC13 for ; Sun, 20 Jun 2010 01:02:11 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o5K12BgE023260 for ; Sun, 20 Jun 2010 01:02:11 GMT (envelope-from ivoras@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o5K12B9L023258 for perforce@freebsd.org; Sun, 20 Jun 2010 01:02:11 GMT (envelope-from ivoras@FreeBSD.org) Date: Sun, 20 Jun 2010 01:02:11 GMT Message-Id: <201006200102.o5K12B9L023258@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ivoras@FreeBSD.org using -f From: Ivan Voras To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 179932 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: Sun, 20 Jun 2010 01:02:12 -0000 http://p4web.freebsd.org/@@179932?ac=10 Change 179932 by ivoras@betelgeuse on 2010/06/20 01:01:40 Start parsing +CONTENTS Affected files ... .. //depot/projects/soc2010/pkg_patch/src/patch/Makefile#14 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#4 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#4 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#13 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#13 edit .. //depot/projects/soc2010/pkg_patch/src/patch/main.c#14 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#12 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#12 edit .. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#12 edit .. //depot/projects/soc2010/pkg_patch/src/patch/support.c#11 edit Differences ... ==== //depot/projects/soc2010/pkg_patch/src/patch/Makefile#14 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#4 (text+ko) ==== @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -38,11 +39,11 @@ enum PPMETHOD { PPMETHOD_UNKNOWN, PPMETHOD_CP, PPMETHOD_BSDIFF }; -SLIST_HEAD(pplist_head, pplist); +STAILQ_HEAD(pplist_head, pplist); struct pplist { char filename[PATH_MAX]; enum PPMETHOD method; - SLIST_ENTRY(pplist) linkage; + STAILQ_ENTRY(pplist) linkage; }; @@ -70,10 +71,10 @@ if (fp == NULL) err(1, "Cannot open file: %s", filename); memset(pp, 0, sizeof(*pp)); - SLIST_INIT(&pp->pp_add); - SLIST_INIT(&pp->pp_remove); - SLIST_INIT(&pp->pp_rmdir); - SLIST_INIT(&pp->pp_patch); + STAILQ_INIT(&pp->pp_add); + STAILQ_INIT(&pp->pp_remove); + STAILQ_INIT(&pp->pp_rmdir); + STAILQ_INIT(&pp->pp_patch); while (fgets(line, PATH_MAX, fp) != NULL) { llen = strlen(line); @@ -106,15 +107,15 @@ } else if (strcmp(cmd, "@add") == 0) { pl = calloc(1, sizeof(*pl)); strlcpy(pl->filename, p, PATH_MAX); - SLIST_INSERT_HEAD(&pp->pp_add, pl, linkage); + STAILQ_INSERT_TAIL(&pp->pp_add, pl, linkage); } else if (strcmp(cmd, "@remove") == 0) { pl = calloc(1, sizeof(*pl)); strlcpy(pl->filename, p, PATH_MAX); - SLIST_INSERT_HEAD(&pp->pp_remove, pl, linkage); + STAILQ_INSERT_TAIL(&pp->pp_remove, pl, linkage); } else if (strcmp(cmd, "@rmdir") == 0) { pl = calloc(1, sizeof(*pl)); strlcpy(pl->filename, p, PATH_MAX); - SLIST_INSERT_HEAD(&pp->pp_rmdir, pl, linkage); + STAILQ_INSERT_TAIL(&pp->pp_rmdir, pl, linkage); } else if (strcmp(cmd, "@patch") == 0) { pl = calloc(1, sizeof(*pl)); p2 = strchr(p, '['); @@ -125,6 +126,7 @@ */ char m[100], *pm, *p4, *p5; + pm = m; p3 = strchr(p2, ']'); assert(p3-p2 < (int)sizeof(m)); strlcpy(m, p2 + 1, p3 - p2); @@ -132,7 +134,6 @@ while (*p3 == ' ') p3++; strlcpy(pl->filename, p3, PATH_MAX); - pm = m; while ((p4 = strsep(&pm, ",")) != NULL) { p5 = strchr(p4, '='); if (p5 != NULL) @@ -151,7 +152,7 @@ strlcpy(pl->filename, p, PATH_MAX); pl->method = PPMETHOD_CP; } - SLIST_INSERT_HEAD(&pp->pp_patch, pl, linkage); + STAILQ_INSERT_TAIL(&pp->pp_patch, pl, linkage); } else errx(1, "Unknown command: %s", cmd); @@ -186,6 +187,8 @@ dpatch); snprintf(tmp, PATH_MAX, "%s/%s", dpatch, PKGPATCH_FNAME); + + /* Step 1 - read the patch metadata */ read_pkgpatch_file(tmp, &pp); if (pp.version_major != PKGPATCH_VERSION_MAJOR) errx(1, "Invalid patch data format major version number: %d\n", @@ -197,4 +200,6 @@ printf("Read patch data, version %d.%d for '%s' to '%s'\n", pp.version_major, pp.version_minor, pp.source, pp.target); + /* Step 2 - read the existing (live system) package data */ + } ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#4 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#13 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#13 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/main.c#14 (text+ko) ==== @@ -60,7 +60,7 @@ proc_args() { int ch; - while ((ch = getopt(argc, argv, "abchv")) != -1) { + while ((ch = getopt(argc, argv, "abcfhv")) != -1) { switch (ch) { case 'a': patch_op = PP_APPLY; @@ -71,6 +71,9 @@ case 'c': patch_op = PP_MKPATCH; break; + case 'f': + Force++; + break; case 'h': usage_short(); exit(0); ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#12 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#12 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#12 (text+ko) ==== @@ -21,10 +21,10 @@ #define _PKG_PATCH_H_ #ifndef _PATH_TAR -#define _PATH_TAR "/usr/bin/tar" +#define _PATH_TAR "/usr/bin/tar" #endif #ifndef _PATH_BSDIFF -#define _PATH_BSDIFF "/usr/bin/bsdiff" +#define _PATH_BSDIFF "/usr/bin/bsdiff" #endif #define PKGPATCH_FNAME "+PKGPATCH" @@ -32,6 +32,11 @@ #define PKGPATCH_VERSION_MINOR 0 #define PKGPATCH_VERSION "1.0" +#ifndef PKG_DBDIR +/* So much cruft... */ +#define PKG_DBDIR LOG_DIR +#endif + enum PP_OP { PP_NONE, PP_MKPATCH, PP_APPLY }; struct pkgxjob { @@ -46,6 +51,22 @@ SLIST_ENTRY(filelist) linkage; }; +STAILQ_HEAD(pkg_plist_head, pkg_plist); +struct pkg_plist { + char name[PATH_MAX]; + plist_t type; + STAILQ_ENTRY(pkg_plist) linkage; +}; + +struct pkg_metadata { + char name[PATH_MAX]; + char origin[PATH_MAX]; + char pkg_format_revision[16]; + char prefix[PATH_MAX]; + struct pkg_plist_head plist; +}; + + #ifndef PKG_PATCH_MAIN extern int argc; @@ -70,5 +91,6 @@ int copy_file_absolute(char *from, char *to); int copy_file_attrs(char *from, struct stat *st_from, char *to); int replicate_dirtree(char *from, char *to); +int read_package(char *name, struct pkg_metadata *pkg); #endif ==== //depot/projects/soc2010/pkg_patch/src/patch/support.c#11 (text+ko) ==== @@ -217,23 +217,23 @@ assert(from != NULL); if (lstat(from, &st2) < 0) { warn("copy_file_attrs: lstat(%s) failed", from); - return (errno); + return (-errno); } st = &st2; } if (chown(to, st->st_uid, st->st_gid) < 0) { warn("copy_file_attrs: chown() failed"); - return (errno); + return (-errno); } tv[0].tv_usec = tv[1].tv_usec = 0; tv[0].tv_sec = tv[1].tv_sec = st->st_mtime; if (lutimes(to, tv) < 0) { warn("copy_file_attrs: lutimes(%s,%d) failed", to, st->st_mtime); - return (errno); + return (-errno); } if (lchmod(to, st->st_mode) < 0) { warn("copy_file_attrs: lchmod(%o) failed", st->st_mode); - return (errno); + return (-errno); } return (0); } @@ -322,12 +322,12 @@ if (access(new_dir, F_OK) == 0) continue; if (mkdir(new_dir, 0700) < 0) { - rval = errno; + rval = -errno; goto end; } if (copy_file_attrs(fe->fts_path, fe->fts_statp, new_dir) != 0) { - rval = errno; + rval = -errno; goto end; } } @@ -337,3 +337,64 @@ return (-1); return (rval); } + + +/* + * Reads the package metadata for the given package name in the package database + * structure. The name is a full package name, e.g. "sqlite3-3.6.19". + * Hopefully, one day, someone will make a canonical way to do this instead + * of reinwenting the wheel. The actual format of +CONTENTS is very lame. + */ +int +read_package(char *name, struct pkg_metadata *pkg) +{ + char pfilename[PATH_MAX], line[PATH_MAX]; + FILE *fp; + struct pkg_plist *pl; + int llen, rval; + + snprintf(pfilename, PATH_MAX, "%s/%s/%s", PKG_DBDIR, name, + CONTENTS_FNAME); + if (access(pfilename, R_OK) != 0) { + warn("Cannot access %s for reading.", pfilename); + return (-errno); + } + fp = fopen(pfilename, "r"); + if (fp == NULL) + return (-errno); + + rval = 0; + while (fgets(line, PATH_MAX, fp) != NULL) { + char *p, *cmd; + + llen = strlen(line); + if (line[llen-1] == '\n') { + line[llen-1] = '\0'; /* strip newline */ + llen--; + } + if (line[0] == '\0') + continue; + if (line[0] == CMD_CHAR) { + cmd = line + 1; + p = strchr(line, ' '); + if (p == NULL) { + rval = -1; + goto error; + } + *p++ = '\0'; + if (strcmp(cmd, "comment") == 0) { + } + } else { + pl = calloc(1, sizeof(*pl)); + pl->type = PLIST_FILE; + STAILQ_INSERT_TAIL(&pkg->plist, pl, linkage); + } + } + + return (0); +error: + if (fp != NULL) + fclose(fp); + return (rval); +} +