diff options
author | jkh <jkh@FreeBSD.org> | 1995-10-25 15:38:37 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1995-10-25 15:38:37 +0000 |
commit | d4d9564530f574c891a76bc0ca7af4c9275e9442 (patch) | |
tree | 38f96dd54eeecc8a263b88c6c73dd075dcbadb38 /usr.sbin/pkg_install/lib/pen.c | |
parent | a31022b303ea5ec7c096c6165e363e3fd1058fee (diff) | |
download | FreeBSD-src-d4d9564530f574c891a76bc0ca7af4c9275e9442.zip FreeBSD-src-d4d9564530f574c891a76bc0ca7af4c9275e9442.tar.gz |
Bring forward my changes from 2.1
Diffstat (limited to 'usr.sbin/pkg_install/lib/pen.c')
-rw-r--r-- | usr.sbin/pkg_install/lib/pen.c | 124 |
1 files changed, 67 insertions, 57 deletions
diff --git a/usr.sbin/pkg_install/lib/pen.c b/usr.sbin/pkg_install/lib/pen.c index d242ddd..5d07e6e 100644 --- a/usr.sbin/pkg_install/lib/pen.c +++ b/usr.sbin/pkg_install/lib/pen.c @@ -1,5 +1,5 @@ #ifndef lint -static const char *rcsid = "$Id: pen.c,v 1.17 1995/08/26 18:36:27 jkh Exp $"; +static const char *rcsid = "$Id: pen.c,v 1.13.4.6 1995/10/23 12:33:43 jkh Exp $"; #endif /* @@ -28,29 +28,41 @@ static const char *rcsid = "$Id: pen.c,v 1.17 1995/08/26 18:36:27 jkh Exp $"; #include <sys/mount.h> /* For keeping track of where we are */ -static char Cwd[FILENAME_MAX]; -static char Pen[FILENAME_MAX]; -extern char *PlayPen; +static char Current[FILENAME_MAX]; +static char Previous[FILENAME_MAX]; + +char * +where_playpen(void) +{ + return Current; +} /* Find a good place to play. */ static char * -find_play_pen(size_t sz) +find_play_pen(char *pen, size_t sz) { char *cp; struct stat sb; - if ((cp = getenv("PKG_TMPDIR")) != NULL && stat(cp, &sb) != FAIL && (min_free(cp) >= sz)) - sprintf(Pen, "%s/instmp.XXXXXX", cp); + if (pen[0] && stat(pen, &sb) != FAIL && (min_free(pen) >= sz)) + return pen; + else if ((cp = getenv("PKG_TMPDIR")) != NULL && stat(cp, &sb) != FAIL && (min_free(cp) >= sz)) + sprintf(pen, "%s/instmp.XXXXXX", cp); else if ((cp = getenv("TMPDIR")) != NULL && stat(cp, &sb) != FAIL && (min_free(cp) >= sz)) - sprintf(Pen, "%s/instmp.XXXXXX", cp); + sprintf(pen, "%s/instmp.XXXXXX", cp); else if (stat("/var/tmp", &sb) != FAIL && min_free("/var/tmp") >= sz) - strcpy(Pen, "/var/tmp/instmp.XXXXXX"); + strcpy(pen, "/var/tmp/instmp.XXXXXX"); else if (stat("/tmp", &sb) != FAIL && min_free("/tmp") >= sz) - strcpy(Pen, "/tmp/instmp.XXXXXX"); - else if ((stat("/usr/tmp", &sb) == SUCCESS | mkdir("/usr/tmp", 01777) == SUCCESS) && min_free("/usr/tmp") >= sz) - strcpy(Pen, "/usr/tmp/instmp.XXXXXX"); - else barf("Can't find enough temporary space to extract the files, please set\nyour PKG_TMPDIR environment variable to a location with at least %d bytes\nfree.", sz); - return Pen; + strcpy(pen, "/tmp/instmp.XXXXXX"); + else if ((stat("/usr/tmp", &sb) == SUCCESS || mkdir("/usr/tmp", 01777) == SUCCESS) && min_free("/usr/tmp") >= sz) + strcpy(pen, "/usr/tmp/instmp.XXXXXX"); + else { + barf("Can't find enough temporary space to extract the files, please set\n" + "your PKG_TMPDIR environment variable to a location with at least %d bytes\n" + "free.", sz); + return NULL; + } + return pen; } /* @@ -60,62 +72,62 @@ find_play_pen(size_t sz) char * make_playpen(char *pen, size_t sz) { - if (!pen) - PlayPen = find_play_pen(sz); - else { - strcpy(Pen, pen); - PlayPen = Pen; + char *tmp; + + if (!find_play_pen(pen, sz)) + return NULL; + + if (!mktemp(pen)) { + barf("Can't mktemp '%s'.", pen); + return NULL; } - if (!getcwd(Cwd, FILENAME_MAX)) - upchuck("getcwd"); - if (!mktemp(Pen)) - barf("Can't mktemp '%s'.", Pen); - if (mkdir(Pen, 0755) == FAIL) - barf("Can't mkdir '%s'.", Pen); - if (Verbose) - { + if (mkdir(pen, 0755) == FAIL) { + barf("Can't mkdir '%s'.", pen); + return NULL; + } + if (Verbose) { if (sz) - fprintf(stderr, "Projected package size: %d bytes, -free temp space: %d bytes in %s\n", (int)sz, min_free(Pen), Pen); + fprintf(stderr, "Requested space: %d bytes, free space: %d bytes in %s\n", (int)sz, min_free(pen), pen); } - if (min_free(Pen) < sz) { - rmdir(Pen); - barf("Not enough free space to create `%s'.\nPlease set your PKG_TMPDIR -environment variable to a location with more space and\ntry the command -again.", Pen); - PlayPen = NULL; + if (min_free(pen) < sz) { + rmdir(pen); + barf("Not enough free space to create: `%s'\n" + "Please set your PKG_TMPDIR environment variable to a location\n" + "with more space and\ntry the command again.", pen); + return NULL; } - if (chdir(Pen) == FAIL) - barf("Can't chdir to '%s'.", Pen); - return Cwd; + if (Current[0]) + strcpy(Previous, Current); + else if (!getcwd(Previous, FILENAME_MAX)) { + upchuck("getcwd"); + return NULL; + } + if (chdir(pen) == FAIL) + barf("Can't chdir to '%s'.", pen); + strcpy(Current, pen); + return Previous; } /* Convenience routine for getting out of playpen */ void -leave_playpen(void) +leave_playpen(char *save) { void (*oldsig)(int); /* Don't interrupt while we're cleaning up */ oldsig = signal(SIGINT, SIG_IGN); - if (Cwd[0]) { - if (chdir(Cwd) == FAIL) - barf("Can't chdir back to '%s'.", Cwd); - if (vsystem("rm -rf %s", Pen)) - fprintf(stderr, "Couldn't remove temporary dir '%s'\n", Pen); - Cwd[0] = '\0'; + if (Previous[0] && chdir(Previous) == FAIL) + barf("Can't chdir back to '%s'.", Previous); + else if (Current[0]) { + if (vsystem("rm -rf %s", Current)) + whinge("Couldn't remove temporary dir '%s'", Current); + strcpy(Current, Previous); } - signal(SIGINT, oldsig); -} - -/* Accessor function for telling us where the pen is */ -char * -where_playpen(void) -{ - if (Cwd[0]) - return Pen; + if (save) + strcpy(Previous, save); else - return NULL; + Previous[0] = '\0'; + signal(SIGINT, oldsig); } size_t @@ -123,8 +135,6 @@ min_free(char *tmpdir) { struct statfs buf; - if (!tmpdir) - tmpdir = Pen; if (statfs(tmpdir, &buf) != 0) { perror("Error in statfs"); return -1; |