summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install/create/pl.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pkg_install/create/pl.c')
-rw-r--r--usr.sbin/pkg_install/create/pl.c280
1 files changed, 0 insertions, 280 deletions
diff --git a/usr.sbin/pkg_install/create/pl.c b/usr.sbin/pkg_install/create/pl.c
deleted file mode 100644
index fe62d42..0000000
--- a/usr.sbin/pkg_install/create/pl.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * FreeBSD install - a package for the installation and maintainance
- * of non-core utilities.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Jordan K. Hubbard
- * 18 July 1993
- *
- * Routines for dealing with the packing list.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <pkg.h>
-#include "create.h"
-#include <errno.h>
-#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 name[FILENAME_MAX];
- char *prefix = NULL;
- PackingList p;
-
- for (p = pkg->head; p != NULL; p = p->next)
- switch (p->type) {
- case PLIST_CWD:
- if (!prefix)
- prefix = p->name;
- where = (p->name == NULL) ? prefix : p->name;
- break;
-
- case PLIST_IGNORE:
- p = p->next;
- break;
-
- case PLIST_SRC:
- there = p->name;
- break;
-
- case PLIST_FILE:
- 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);
-
- add_cksum(pkg, p, name);
- break;
- default:
- break;
- }
-}
-
-static int
-trylink(const char *from, const char *to)
-{
- if (link(from, to) == 0)
- return 0;
- if (errno == ENOENT) {
- /* try making the container directory */
- char *cp = strrchr(to, '/');
- if (cp)
- vsystem("/bin/mkdir -p %.*s", cp - to,
- to);
- return link(from, to);
- }
- return -1;
-}
-
-#define STARTSTRING "/usr/bin/tar cf -"
-#define TOOBIG(str) (int)strlen(str) + 6 + (int)strlen(home) + where_count > maxargs
-#define PUSHOUT() /* push out string */ \
- if (where_count > (int)sizeof(STARTSTRING)-1) { \
- strcat(where_args, "|/usr/bin/tar xpf -"); \
- if (system(where_args)) { \
- cleanup(0); \
- errx(2, "%s: can't invoke tar pipeline", __func__); \
- } \
- memset(where_args, 0, maxargs); \
- last_chdir = NULL; \
- strcpy(where_args, STARTSTRING); \
- where_count = sizeof(STARTSTRING)-1; \
- }
-
-/*
- * Copy unmarked files in packing list to playpen - marked files
- * have already been copied in an earlier pass through the list.
- */
-void
-copy_plist(const char *home, Package *plist)
-{
- PackingList p = plist->head;
- const char *where = home;
- const char *there = NULL, *mythere;
- char *where_args, *prefix = NULL;
- const char *last_chdir, *root = "/";
- int maxargs, where_count = 0, add_count;
- struct stat stb;
- dev_t curdir;
-
- maxargs = sysconf(_SC_ARG_MAX);
- maxargs -= 64; /*
- * Some slop for the tar cmd text,
- * and sh -c
- */
- where_args = malloc(maxargs);
- if (!where_args) {
- cleanup(0);
- errx(2, "%s: can't get argument list space", __func__);
- }
-
- memset(where_args, 0, maxargs);
- strcpy(where_args, STARTSTRING);
- where_count = sizeof(STARTSTRING)-1;
- last_chdir = 0;
-
- if (stat(".", &stb) == 0)
- curdir = stb.st_dev;
- else
- curdir = (dev_t) -1; /*
- * It's ok if this is a valid dev_t;
- * this is just a hint for an
- * optimization.
- */
-
- while (p) {
- if (p->type == PLIST_CWD)
- {
- if (!prefix)
- prefix = p->name;
- where = p->name == NULL ? prefix : p->name;
- }
- else if (p->type == PLIST_SRC)
- there = p->name;
- else if (p->type == PLIST_IGNORE)
- p = p->next;
- else if (p->type == PLIST_FILE && !p->marked) {
- char fn[FILENAME_MAX];
-
-
- /* First, look for it in the "home" dir */
- sprintf(fn, "%s/%s", home, p->name);
- if (fexists(fn)) {
- if (lstat(fn, &stb) == 0 && stb.st_dev == curdir &&
- S_ISREG(stb.st_mode)) {
- /*
- * If we can link it to the playpen, that avoids a copy
- * and saves time.
- */
- if (p->name[0] != '/') {
- /*
- * Don't link abspn stuff--it doesn't come from
- * local dir!
- */
- if (trylink(fn, p->name) == 0) {
- p = p->next;
- continue;
- }
- }
- }
- if (TOOBIG(fn)) {
- PUSHOUT();
- }
- if (p->name[0] == '/') {
- add_count = snprintf(&where_args[where_count],
- maxargs - where_count,
- " %s %s",
- last_chdir == root ? "" : "-C /",
- p->name);
- last_chdir = root;
- } else {
- add_count = snprintf(&where_args[where_count],
- maxargs - where_count,
- " %s%s %s",
- last_chdir == home ? "" : "-C ",
- last_chdir == home ? "" : home,
- p->name);
- last_chdir = home;
- }
- if (add_count < 0 || add_count >= maxargs - where_count) {
- cleanup(0);
- errx(2, "%s: oops, miscounted strings!", __func__);
- }
- where_count += add_count;
- }
- /*
- * Otherwise, try along the actual extraction path..
- */
- else {
- if (p->name[0] == '/')
- mythere = root;
- else mythere = there;
- 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)) {
- /*
- * If we can link it to the playpen, that avoids a copy
- * and saves time.
- */
- if (trylink(fn, p->name) == 0) {
- p = p->next;
- continue;
- }
- }
- if (TOOBIG(p->name)) {
- PUSHOUT();
- }
- if (last_chdir == (mythere ? mythere : where))
- add_count = snprintf(&where_args[where_count],
- maxargs - where_count,
- " %s", p->name);
- else
- add_count = snprintf(&where_args[where_count],
- maxargs - where_count,
- " -C %s %s",
- mythere ? mythere : where,
- p->name);
- if (add_count < 0 || add_count >= maxargs - where_count) {
- cleanup(0);
- errx(2, "%s: oops, miscounted strings!", __func__);
- }
- where_count += add_count;
- last_chdir = (mythere ? mythere : where);
- }
- }
- p = p->next;
- }
- PUSHOUT();
- free(where_args);
-}
OpenPOWER on IntegriCloud