diff options
| author | Jordan K. Hubbard <jkh@FreeBSD.org> | 1997-07-01 06:13:51 +0000 |
|---|---|---|
| committer | Jordan K. Hubbard <jkh@FreeBSD.org> | 1997-07-01 06:13:51 +0000 |
| commit | 55f4e300b4732b159aa3ba66cd55da83007037d8 (patch) | |
| tree | 0cc0e0f80093897aed879fe8fe7163dd0e91818c /usr.sbin/pkg_install/lib | |
| parent | 66e39adc7cfc0f5a6e71b84a44956dddc3cb1e5a (diff) | |
Notes
Diffstat (limited to 'usr.sbin/pkg_install/lib')
| -rw-r--r-- | usr.sbin/pkg_install/lib/file.c | 44 | ||||
| -rw-r--r-- | usr.sbin/pkg_install/lib/plist.c | 11 |
2 files changed, 43 insertions, 12 deletions
diff --git a/usr.sbin/pkg_install/lib/file.c b/usr.sbin/pkg_install/lib/file.c index 6a2e74610673..2748235a6d85 100644 --- a/usr.sbin/pkg_install/lib/file.c +++ b/usr.sbin/pkg_install/lib/file.c @@ -1,5 +1,5 @@ #ifndef lint -static const char *rcsid = "$Id$"; +static const char *rcsid = "$Id: file.c,v 1.27 1997/02/22 16:09:47 peter Exp $"; #endif /* @@ -338,6 +338,40 @@ fileGetContents(char *fname) return contents; } +/* Takes a filename and package name, returning (in "try") the canonical "preserve" + * name for it. + */ +Boolean +make_preserve_name(char *try, int max, char *name, char *file) +{ + int len, i; + + if ((len = strlen(file)) == 0) + return FALSE; + else + i = len - 1; + strncpy(try, file, max); + if (try[i] == '/') /* Catch trailing slash early and save checking in the loop */ + --i; + for (; i; i--) { + if (try[i] == '/') { + try[i + 1]= '.'; + strncpy(&try[i + 2], &file[i + 1], max - i - 2); + break; + } + } + if (!i) { + try[0] = '.'; + strncpy(try + 1, file, max - 1); + } + /* I should probably be called rude names for these inline assignments */ + strncat(try, ".", max -= strlen(try)); + strncat(try, name, max -= strlen(name)); + strncat(try, ".", max--); + strncat(try, "backup", max -= 6); + return TRUE; +} + /* Write the contents of "str" to a file */ void write_file(char *name, char *str) @@ -347,7 +381,7 @@ write_file(char *name, char *str) fp = fopen(name, "w"); if (!fp) - barf("Can't fopen '%s' for writing.", name); + barf("Cannot fopen '%s' for writing.", name); len = strlen(str); if (fwrite(str, 1, len, fp) != len) barf("Short fwrite on '%s', tried to write %d bytes.", name, len); @@ -365,7 +399,7 @@ copy_file(char *dir, char *fname, char *to) else snprintf(cmd, FILENAME_MAX, "cp -p -r %s/%s %s", dir, fname, to); if (vsystem(cmd)) - barf("Couldn't perform '%s'", cmd); + barf("Could not perform '%s'", cmd); } void @@ -378,7 +412,7 @@ move_file(char *dir, char *fname, char *to) else snprintf(cmd, FILENAME_MAX, "mv %s/%s %s", dir, fname, to); if (vsystem(cmd)) - barf("Couldn't perform '%s'", cmd); + barf("Could not perform '%s'", cmd); } /* @@ -408,7 +442,7 @@ copy_hierarchy(char *dir, char *fname, Boolean to) printf("Using '%s' to copy trees.\n", cmd); #endif if (system(cmd)) - barf("copy_file: Couldn't perform '%s'", cmd); + barf("copy_file: Could not perform '%s'", cmd); } /* Unpack a tar file */ diff --git a/usr.sbin/pkg_install/lib/plist.c b/usr.sbin/pkg_install/lib/plist.c index 8440e3cdb4de..58907b33f0a0 100644 --- a/usr.sbin/pkg_install/lib/plist.c +++ b/usr.sbin/pkg_install/lib/plist.c @@ -1,5 +1,5 @@ #ifndef lint -static const char *rcsid = "$Id: plist.c,v 1.20 1997/06/29 10:41:49 jkh Exp $"; +static const char *rcsid = "$Id: plist.c,v 1.21 1997/06/30 03:15:40 jkh Exp $"; #endif /* @@ -414,13 +414,10 @@ delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg) whinge("Unable to completely remove file '%s'", tmp); fail = FAIL; } - if (preserve) { - if (!name) - whinge("preserve set but no package name supplied!"); - else { - char tmp2[FILENAME_MAX]; + if (preserve && name) { + char tmp2[FILENAME_MAX]; - snprintf(tmp2, FILENAME_MAX, "%s.%s", tmp, name); + if (make_preserve_name(tmp2, FILENAME_MAX, name, tmp)) { if (fexists(tmp2)) { if (rename(tmp2, tmp)) whinge("preserve: Unable to restore %s as %s, errno = %d", tmp2, tmp, errno); |
