atom feed19 messages in org.freebsd.freebsd-auditadding -P option to pkg_delete(1)
FromSent OnAttachments
Akinori MUSHAAug 11, 2001 11:57 pm 
Sheldon HearnAug 12, 2001 9:18 am 
Akinori MUSHAAug 12, 2001 9:55 am 
Mike BarcroftAug 12, 2001 11:07 am 
Akinori MUSHAAug 12, 2001 11:41 am 
Mike BarcroftAug 12, 2001 1:48 pm 
Akinori MUSHAAug 12, 2001 2:11 pm 
Brian F. FeldmanAug 12, 2001 4:10 pm 
Mike BarcroftAug 12, 2001 5:38 pm 
Akinori MUSHAAug 16, 2001 2:19 am 
Maxim SobolevAug 20, 2001 3:32 am 
Akinori MUSHAAug 20, 2001 4:24 am 
Kris KennawayAug 20, 2001 4:29 am 
Maxim SobolevAug 20, 2001 4:39 am 
Akinori MUSHAAug 20, 2001 5:26 am 
Maxim SobolevAug 20, 2001 5:46 am 
Akinori MUSHAAug 20, 2001 7:52 am 
Maxim SobolevAug 20, 2001 8:38 am 
Akinori MUSHAAug 20, 2001 9:28 am 
Subject:adding -P option to pkg_delete(1)
From:Akinori MUSHA (kn@iDaemons.org)
Date:Aug 11, 2001 11:57:05 pm
List:org.freebsd.freebsd-audit

I'm resending this to audit@, since ports@ does not seem to respond.. ;)

Please review the attached patch, which adds a new option "-P" to pkg_delete(1) which preserves shared library files. This is useful when one suspects that s/he still have some binaries that depend on the shared library that's being deleted. Probably pkg_version(1) may want to use the option for the -c feature.

If possible, I'd like to see this in the 4.4-RELEASE because that would allow users to upgrade packages safely, which can only be done by portupgrade(1) currently.

I've already implemented the equivalent in my pkg_deinstall(1) utility bundled in sysutils/portupgrade, but it would be nice if pkg_delete(1) had this feature in the first place.

Regards,

Index: add/perform.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/add/perform.c,v retrieving revision 1.63 diff -u -r1.63 perform.c --- add/perform.c 2001/08/02 13:13:05 1.63 +++ add/perform.c 2001/08/06 05:50:24 @@ -481,7 +481,7 @@ fail: /* Nuke the whole (installed) show, XXX but don't clean directories */ if (!Fake) - delete_package(FALSE, FALSE, &Plist); + delete_package(FALSE, FALSE, FALSE, &Plist);

success: /* delete the packing list contents */ Index: delete/delete.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/delete/delete.h,v retrieving revision 1.6 diff -u -r1.6 delete.h --- delete/delete.h 2001/02/27 09:00:18 1.6 +++ delete/delete.h 2001/08/05 17:39:55 @@ -28,6 +28,7 @@ extern Boolean Interactive; extern Boolean NoDeInstall; extern Boolean Force; +extern Boolean PreserveShlib; extern char *Directory; extern char *PkgName; extern match_t MatchType; Index: delete/main.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/delete/main.c,v retrieving revision 1.22 diff -u -r1.22 main.c --- delete/main.c 2001/08/02 13:13:05 1.22 +++ delete/main.c 2001/08/06 06:22:43 @@ -30,12 +30,13 @@ #include "lib.h" #include "delete.h"

-static char Options[] = "adDfGhinp:vx"; +static char Options[] = "adDfGhinp:Pvx";

char *Prefix = NULL; Boolean CleanDirs = FALSE; Boolean Interactive = FALSE; Boolean NoDeInstall = FALSE; +Boolean PreserveShlib = FALSE; match_t MatchType = MATCH_GLOB;

static void usage __P((void)); @@ -93,6 +94,10 @@ Interactive = TRUE; break;

+ case 'P': + PreserveShlib = TRUE; + break; + case 'h': case '?': default: @@ -148,7 +153,7 @@ usage() { fprintf(stderr, "%s\n%s\n", - "usage: pkg_delete [-dDfGinvx] [-p prefix] pkg-name ...", + "usage: pkg_delete [-dDfGinPvx] [-p prefix] pkg-name ...", " pkg_delete -a [flags]"); exit(1); } Index: delete/perform.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/delete/perform.c,v retrieving revision 1.32 diff -u -r1.32 perform.c --- delete/perform.c 2001/08/02 13:13:05 1.32 +++ delete/perform.c 2001/08/05 17:40:22 @@ -217,7 +217,7 @@ * Some packages aren't packed right, so we need to just ignore * delete_package()'s status. Ugh! :-( */ - if (delete_package(FALSE, CleanDirs, &Plist) == FAIL) + if (delete_package(FALSE, CleanDirs, PreserveShlib, &Plist) == FAIL) warnx( "couldn't entirely delete package (perhaps the packing list is\n" "incorrectly specified?)"); Index: delete/pkg_delete.1 =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/delete/pkg_delete.1,v retrieving revision 1.26 diff -u -r1.26 pkg_delete.1 --- delete/pkg_delete.1 2001/07/15 08:02:37 1.26 +++ delete/pkg_delete.1 2001/08/06 06:20:53 @@ -25,7 +25,7 @@ .Nd a utility for deleting previously installed software package distributions .Sh SYNOPSIS .Nm -.Op Fl dDfGinvx +.Op Fl dDfGinPvx .Op Fl p Ar prefix .Ar pkg-name ... .Nm @@ -91,6 +91,14 @@ which do not explicitly set theirs. For most packages, the prefix will be set automatically to the installed location by .Xr pkg_add 1 . +.It Fl P +Preserve (possible) shared library files that end with the +.Dq .so , +.Dq .so.X , +or +.Dq .so.X.Y +suffix. This is useful when you suspect that you still have some +binaries that depend on the shared library being deleted. .It Fl d Remove empty directories created by file cleanup. By default, only files/directories explicitly listed in a package's contents (either as Index: lib/lib.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/lib.h,v retrieving revision 1.36 diff -u -r1.36 lib.h --- lib/lib.h 2001/08/02 13:13:06 1.36 +++ lib/lib.h 2001/08/05 17:41:50 @@ -174,7 +174,7 @@ void write_plist(Package *, FILE *); void read_plist(Package *, FILE *); int plist_cmd(char *, char **); -int delete_package(Boolean, Boolean, Package *); +int delete_package(Boolean, Boolean, Boolean, Package *); Boolean make_preserve_name(char *, int, char *, char *);

/* For all */ Index: lib/plist.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/plist.c,v retrieving revision 1.34 diff -u -r1.34 plist.c --- lib/plist.c 2001/08/02 12:38:29 1.34 +++ lib/plist.c 2001/08/05 17:53:29 @@ -346,13 +346,48 @@ }

/* + * Check if the given filename looks like a shared library. + */ +static Boolean +is_shlib(char *filename) +{ + char *p, *q; + + /* basename */ + if (NULL != (p = strrchr(filename, '/'))) + p++; + else + p = filename; + + /* empty filename or dotfile? */ + if (*p == '\0' || *p == '.') + return FALSE; + + /* do "strrstr" for .so */ + if (NULL == (q = strstr(p + 1, ".so"))) + return FALSE; + while (NULL != (p = strstr(q += 3, ".so"))) + q = p; + + /* skip version numbers */ + while (*q) { + if (*q != '.' || !isdigit(*++q)) + return FALSE; + while (isdigit(*++q)) + ; + } + + return TRUE; +} + +/* * Delete the results of a package installation. * * This is here rather than in the pkg_delete code because pkg_add needs to * run it too in cases of failure. */ int -delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg) +delete_package(Boolean ign_err, Boolean nukedirs, Boolean preserve_shlib,
Package *pkg) { PackingList p; char *Where = ".", *last_file = ""; @@ -389,7 +424,12 @@

case PLIST_FILE: last_file = p->name; - sprintf(tmp, "%s/%s", Where, p->name); + sprintf(tmp, "%s/%s", Where, last_file); + if (preserve_shlib && is_shlib(last_file)) { + if (Verbose) + printf("Preserve shared library file %s\n", tmp); + continue; + } if (isdir(tmp) && fexists(tmp) && !issymlink(tmp)) { warnx("cannot delete specified file '%s' - it is a directory!\n" "this packing list is incorrect - ignoring delete request", tmp);

-- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp

"Freeze this moment a little bit longer, make each impression a little bit stronger.. Experience slips away -- Time stand still"

To Unsubscribe: send mail to majo@FreeBSD.org with "unsubscribe freebsd-audit" in the body of the message