summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install
diff options
context:
space:
mode:
authoreik <eik@FreeBSD.org>2004-06-29 18:56:59 +0000
committereik <eik@FreeBSD.org>2004-06-29 18:56:59 +0000
commit9dccb05c7368df1546e8536b40b07b539b07d6a1 (patch)
tree8925f97cf1de2353ce117265cb7f539217c0e6be /usr.sbin/pkg_install
parent116b6466b47530905ebe37337efeef92c92bdd20 (diff)
downloadFreeBSD-src-9dccb05c7368df1546e8536b40b07b539b07d6a1.zip
FreeBSD-src-9dccb05c7368df1546e8536b40b07b539b07d6a1.tar.gz
- pkg_create: new flag -S (clean room installation)
- pkg_create: checksum meta files too PR: 66032
Diffstat (limited to 'usr.sbin/pkg_install')
-rw-r--r--usr.sbin/pkg_install/create/create.h2
-rw-r--r--usr.sbin/pkg_install/create/main.c14
-rw-r--r--usr.sbin/pkg_install/create/perform.c11
-rw-r--r--usr.sbin/pkg_install/create/pkg_create.112
-rw-r--r--usr.sbin/pkg_install/create/pl.c68
5 files changed, 74 insertions, 33 deletions
diff --git a/usr.sbin/pkg_install/create/create.h b/usr.sbin/pkg_install/create/create.h
index 0e806fb..e6c3be2 100644
--- a/usr.sbin/pkg_install/create/create.h
+++ b/usr.sbin/pkg_install/create/create.h
@@ -34,6 +34,7 @@ extern char *PostDeInstall;
extern char *Contents;
extern char *Require;
extern char *SrcDir;
+extern char *BaseDir;
extern char *ExcludeFrom;
extern char *Mtree;
extern char *Pkgdeps;
@@ -47,6 +48,7 @@ extern int PlistOnly;
enum zipper {NONE, GZIP, BZIP, BZIP2 };
extern enum zipper Zipper;
+void add_cksum(Package *, PackingList, const char *);
void check_list(const char *, Package *);
int pkg_perform(char **);
void copy_plist(const char *, Package *);
diff --git a/usr.sbin/pkg_install/create/main.c b/usr.sbin/pkg_install/create/main.c
index 82da981..b0a9415 100644
--- a/usr.sbin/pkg_install/create/main.c
+++ b/usr.sbin/pkg_install/create/main.c
@@ -16,12 +16,13 @@ __FBSDID("$FreeBSD$");
#include "lib.h"
#include "create.h"
-static char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:o:b:";
+static char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
char *Prefix = NULL;
char *Comment = NULL;
char *Desc = NULL;
char *SrcDir = NULL;
+char *BaseDir = NULL;
char *Display = NULL;
char *Install = NULL;
char *PostInstall = NULL;
@@ -75,6 +76,10 @@ main(int argc, char **argv)
SrcDir = optarg;
break;
+ case 'S':
+ BaseDir = optarg;
+ break;
+
case 'f':
Contents = optarg;
break;
@@ -199,12 +204,13 @@ main(int argc, char **argv)
static void
usage()
{
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
-"usage: pkg_create [-YNOhvy] [-P pkgs] [-C conflicts] [-p prefix] [-f contents] ",
+ fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
+"usage: pkg_create [-YNOhvyz] [-P pkgs] [-C conflicts] [-p prefix] ",
" [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ",
" [-r rscript] [-t template] [-X excludefile] ",
" [-D displayfile] [-m mtreefile] [-o origin] ",
+" [-s srcdir] [-S basedir] ",
" -c comment -d description -f packlist pkg-filename",
-" pkg_create [-YNhvy] -b pkg-name [pkg-filename]");
+" pkg_create [-YNhvyz] -b pkg-name [pkg-filename]");
exit(1);
}
diff --git a/usr.sbin/pkg_install/create/perform.c b/usr.sbin/pkg_install/create/perform.c
index db6847f..119d54e 100644
--- a/usr.sbin/pkg_install/create/perform.c
+++ b/usr.sbin/pkg_install/create/perform.c
@@ -222,45 +222,54 @@ pkg_perform(char **pkgs)
write_file(COMMENT_FNAME, Comment);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, COMMENT_FNAME);
+ add_cksum(&plist, plist.tail, COMMENT_FNAME);
write_file(DESC_FNAME, Desc);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, DESC_FNAME);
+ add_cksum(&plist, plist.tail, DESC_FNAME);
if (Install) {
copy_file(home, Install, INSTALL_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, INSTALL_FNAME);
+ add_cksum(&plist, plist.tail, INSTALL_FNAME);
}
if (PostInstall) {
copy_file(home, PostInstall, POST_INSTALL_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, POST_INSTALL_FNAME);
+ add_cksum(&plist, plist.tail, POST_INSTALL_FNAME);
}
if (DeInstall) {
copy_file(home, DeInstall, DEINSTALL_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, DEINSTALL_FNAME);
+ add_cksum(&plist, plist.tail, DEINSTALL_FNAME);
}
if (PostDeInstall) {
copy_file(home, PostDeInstall, POST_DEINSTALL_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, POST_DEINSTALL_FNAME);
+ add_cksum(&plist, plist.tail, POST_DEINSTALL_FNAME);
}
if (Require) {
copy_file(home, Require, REQUIRE_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, REQUIRE_FNAME);
+ add_cksum(&plist, plist.tail, REQUIRE_FNAME);
}
if (Display) {
copy_file(home, Display, DISPLAY_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, DISPLAY_FNAME);
+ add_cksum(&plist, plist.tail, DISPLAY_FNAME);
add_plist(&plist, PLIST_DISPLAY, DISPLAY_FNAME);
}
if (Mtree) {
copy_file(home, Mtree, MTREE_FNAME);
add_plist(&plist, PLIST_IGNORE, NULL);
add_plist(&plist, PLIST_FILE, MTREE_FNAME);
+ add_cksum(&plist, plist.tail, MTREE_FNAME);
add_plist(&plist, PLIST_MTREE, MTREE_FNAME);
}
@@ -384,6 +393,8 @@ make_dist(const char *homedir, const char *pkg, const char *suff, Package *plist
for (p = plist->head; p; p = p->next) {
if (p->type == PLIST_FILE)
fprintf(totar, "%s\n", p->name);
+ else if (p->type == PLIST_CWD && BaseDir && p->name && p->name[0] == '/')
+ fprintf(totar, "-C\n%s%s\n", BaseDir, p->name);
else if (p->type == PLIST_CWD || p->type == PLIST_SRC)
fprintf(totar, "-C\n%s\n", p->name);
else if (p->type == PLIST_IGNORE)
diff --git a/usr.sbin/pkg_install/create/pkg_create.1 b/usr.sbin/pkg_install/create/pkg_create.1
index a71abd8..91d7d71 100644
--- a/usr.sbin/pkg_install/create/pkg_create.1
+++ b/usr.sbin/pkg_install/create/pkg_create.1
@@ -23,7 +23,7 @@
.\" [jkh] Took John's changes back and made some additional extensions for
.\" better integration with FreeBSD's new ports collection.
.\"
-.Dd April 21, 1995
+.Dd June 29, 2004
.Dt PKG_CREATE 1
.Os
.Sh NAME
@@ -35,13 +35,13 @@
.Op Fl C Ar conflicts
.Op Fl P Ar pkgs
.Op Fl p Ar prefix
-.Op Fl f Ar contents
.Op Fl i Ar iscript
.Op Fl I Ar piscript
.Op Fl k Ar dscript
.Op Fl K Ar pdscript
.Op Fl r Ar rscript
.Op Fl s Ar srcdir
+.Op Fl S Ar basedir
.Op Fl t Ar template
.Op Fl X Ar excludefile
.Op Fl D Ar displayfile
@@ -224,6 +224,11 @@ are passed respectively, along with the package's name.
will override the value of
.Cm @cwd
during package creation.
+.It Fl S Ar basedir
+.Ar basedir
+will be prefixed to all
+.Cm @cwd
+during package creation.
.It Fl t Ar template
Use
.Ar template
@@ -544,7 +549,8 @@ command first appeared in
.Sh AUTHORS
.An Jordan Hubbard
.Sh CONTRIBUTORS
-.An John Kohl Aq jtk@rational.com
+.An John Kohl Aq jtk@rational.com ,
+.An Oliver Eikemeier Aq eik@FreeBSD.org
.Sh BUGS
Hard links between files in a distribution must be bracketed by
.Cm @cwd
diff --git a/usr.sbin/pkg_install/create/pl.c b/usr.sbin/pkg_install/create/pl.c
index 55c721c..bdbd8a1 100644
--- a/usr.sbin/pkg_install/create/pl.c
+++ b/usr.sbin/pkg_install/create/pl.c
@@ -27,13 +27,43 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <md5.h>
+/* Add an MD5 checksum entry for a file or link */
+void
+add_cksum(Package *pkg, PackingList p, const char *fname)
+{
+ char *cp = NULL, buf[33];
+
+ if (issymlink(fname)) {
+ int len;
+ char lnk[FILENAME_MAX];
+
+ if ((len = readlink(fname, lnk, FILENAME_MAX)) > 0)
+ cp = MD5Data((unsigned char *)lnk, len, buf);
+ } else if (isfile(fname)) {
+ /* Don't record MD5 checksum for device nodes and such */
+ cp = MD5File(fname, buf);
+ }
+
+ if (cp != NULL) {
+ PackingList tmp = new_plist_entry();
+
+ tmp->name = copy_string(strconcat("MD5:", cp));
+ tmp->type = PLIST_COMMENT;
+ tmp->next = p->next;
+ tmp->prev = p;
+ p->next = tmp;
+ if (pkg->tail == p)
+ pkg->tail = tmp;
+ }
+}
+
/* Check a list for files that require preconversion */
void
check_list(const char *home, Package *pkg)
{
const char *where = home;
const char *there = NULL;
- char *cp, name[FILENAME_MAX], buf[33];
+ char name[FILENAME_MAX];
PackingList p;
for (p = pkg->head; p != NULL; p = p->next)
@@ -51,31 +81,13 @@ check_list(const char *home, Package *pkg)
break;
case PLIST_FILE:
- cp = NULL;
- sprintf(name, "%s/%s", there ? there : where, p->name);
- if (issymlink(name)) {
- int len;
- char lnk[FILENAME_MAX];
-
- if ((len = readlink(name, lnk, FILENAME_MAX)) > 0)
- cp = MD5Data((unsigned char *)lnk, len, buf);
- } else if (isfile(name)) {
- /* Don't record MD5 checksum for device nodes and such */
- cp = MD5File(name, buf);
- }
+ if (there)
+ snprintf(name, sizeof(name), "%s/%s", there, p->name);
+ else
+ snprintf(name, sizeof(name), "%s%s/%s",
+ BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
- if (cp != NULL) {
- PackingList tmp = new_plist_entry();
-
- tmp->name = copy_string(strconcat("MD5:", cp));
- tmp->type = PLIST_COMMENT;
- tmp->next = p->next;
- tmp->prev = p;
- p->next = tmp;
- if (pkg->tail == p)
- pkg->tail = tmp;
- p = tmp;
- }
+ add_cksum(pkg, p, name);
break;
default:
break;
@@ -217,7 +229,11 @@ copy_plist(const char *home, Package *plist)
if (p->name[0] == '/')
mythere = root;
else mythere = there;
- sprintf(fn, "%s/%s", mythere ? mythere : where, p->name);
+ if (mythere)
+ snprintf(fn, sizeof(fn), "%s/%s", mythere, p->name);
+ else
+ snprintf(fn, sizeof(fn), "%s%s/%s",
+ BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
if (lstat(fn, &stb) == 0 && stb.st_dev == curdir &&
S_ISREG(stb.st_mode)) {
/*
OpenPOWER on IntegriCloud