diff options
author | ok199659 <none@none> | 2009-07-24 11:43:35 -0700 |
---|---|---|
committer | ok199659 <none@none> | 2009-07-24 11:43:35 -0700 |
commit | b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9 (patch) | |
tree | 99b6f2f41fa02d4c903a9c4297eac73c2aeb9196 /usr | |
parent | 349b53dd4e695e3d833b5380540385145b2d3ae8 (diff) | |
download | illumos-joyent-b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9.tar.gz |
backout 5074117: needs more work
Diffstat (limited to 'usr')
-rw-r--r-- | usr/src/cmd/svr4pkg/libinst/pkgdbmerg.c | 97 | ||||
-rw-r--r-- | usr/src/lib/libpkg/common/isdir.c | 84 | ||||
-rw-r--r-- | usr/src/lib/libpkg/common/mapfile-vers | 1 | ||||
-rw-r--r-- | usr/src/lib/libpkg/common/pkglib.h | 4 | ||||
-rw-r--r-- | usr/src/lib/libpkg/common/verify.c | 72 |
5 files changed, 90 insertions, 168 deletions
diff --git a/usr/src/cmd/svr4pkg/libinst/pkgdbmerg.c b/usr/src/cmd/svr4pkg/libinst/pkgdbmerg.c index 5f9795d147..4c0af8810d 100644 --- a/usr/src/cmd/svr4pkg/libinst/pkgdbmerg.c +++ b/usr/src/cmd/svr4pkg/libinst/pkgdbmerg.c @@ -99,7 +99,7 @@ static int merg(struct cfextra *el_ent, struct cfent *cf_ent); static int do_like_ent(VFP_T *vfpo, struct cfextra *el_ent, struct cfent *cf_ent, int ctrl); static int do_new_ent(VFP_T *vfpo, struct cfextra *el_ent, int ctrl); -static int typechg(struct cfent *el_ent, char *curftype, +static int typechg(struct cfent *el_ent, struct cfent *cf_ent, struct mergstat *mstat); static void set_change(struct cfextra *el_ent); @@ -549,40 +549,6 @@ do_new_ent(VFP_T *vfpo, struct cfextra *el_ent, int ctrl) * about this later. Note that noconflict means NO conflict * at the file level. Even rogue files count. */ - char myftype = '?'; - int n = 0; - - /* Get the existing file type on disk */ - eval_ftype(el_ent->server_path, el_ent->cf_ent.ftype, &myftype); - - /* Do the right thing if types are different */ - n = typechg(&(el_ent->cf_ent), &myftype, &(el_ent->mstat)); - switch (n) { - case TYPE_OK: - break; - - /* This is an allowable change. */ - case TYPE_WARNING: - el_ent->mstat.contchg = 1; - break; - - /* Not allowed, but leaving it as is is OK. */ - case TYPE_IGNORED: - break; - - /* Future analysis will reveal if this is OK. */ - case TYPE_REPLACE: - el_ent->mstat.replace = 1; - break; - - /* Kill it before it does any damage. */ - case TYPE_FATAL: - logerr(gettext(MSG_TYPE_ERR)); - quit(99); - - default: - break; - } el_ent->mstat.shared = 1; el_ent->mstat.rogue = 1; set_change(el_ent); @@ -759,20 +725,20 @@ char *types[] = { * TYPE_FATAL something awful happened */ static int -typechg(struct cfent *el_ent, char *curftype, struct mergstat *mstat) +typechg(struct cfent *el_ent, struct cfent *cf_ent, struct mergstat *mstat) { int i, etype, itype, retcode; /* If they are identical, return OK */ - if (*curftype == el_ent->ftype) + if (cf_ent->ftype == el_ent->ftype) return (TYPE_OK); /* * If package database entry is ambiguous, set it to the new entity's * ftype */ - if (*curftype == BADFTYPE) { - *curftype = el_ent->ftype; + if (cf_ent->ftype == BADFTYPE) { + cf_ent->ftype = el_ent->ftype; return (TYPE_OK); /* do nothing; not really different */ } @@ -785,7 +751,7 @@ typechg(struct cfent *el_ent, char *curftype, struct mergstat *mstat) * exclusive directory, this is very dangerous. We will continue, but * we will deny the conversion. */ - if (el_ent->ftype == 'x' && *curftype == 'd') { + if (el_ent->ftype == 'x' && cf_ent->ftype == 'd') { logerr(gettext(WRN_TOEXCL), el_ent->path); return (TYPE_IGNORED); } @@ -802,7 +768,7 @@ typechg(struct cfent *el_ent, char *curftype, struct mergstat *mstat) /* Set itype to that in the package database. */ for (i = 0; types[i]; ++i) { - if (strchr(types[i], *curftype)) { + if (strchr(types[i], cf_ent->ftype)) { itype = i+1; break; } @@ -826,36 +792,36 @@ typechg(struct cfent *el_ent, char *curftype, struct mergstat *mstat) /* allow change, but warn user of possible problems */ switch (itype) { - case 1: - logerr(gettext(WRN_NOTFILE), el_ent->path); - break; + case 1: + logerr(gettext(WRN_NOTFILE), el_ent->path); + break; - case 2: - logerr(gettext(WRN_NOTSYMLN), el_ent->path); - break; + case 2: + logerr(gettext(WRN_NOTSYMLN), el_ent->path); + break; - case 3: - logerr(gettext(WRN_NOTLINK), el_ent->path); - break; + case 3: + logerr(gettext(WRN_NOTLINK), el_ent->path); + break; - case 4: - logerr(gettext(WRN_NOTDIR), el_ent->path); - break; + case 4: + logerr(gettext(WRN_NOTDIR), el_ent->path); + break; - case 5: - logerr(gettext(WRN_NOTCHAR), el_ent->path); - break; + case 5: + logerr(gettext(WRN_NOTCHAR), el_ent->path); + break; - case 6: - logerr(gettext(WRN_NOTBLOCK), el_ent->path); - break; + case 6: + logerr(gettext(WRN_NOTBLOCK), el_ent->path); + break; - case 7: - logerr(gettext(WRN_NOTPIPE), el_ent->path); - break; + case 7: + logerr(gettext(WRN_NOTPIPE), el_ent->path); + break; - default: - break; + default: + break; } return (retcode); } @@ -901,8 +867,7 @@ merg(struct cfextra *el_ent, struct cfent *cf_ent) * can't figure it 'til later (d -> s) or fatal (a hook for later). */ if (cf_ent->ftype != el_ent->cf_ent.ftype) { - n = typechg(&(el_ent->cf_ent), &(cf_ent->ftype), - &(el_ent->mstat)); + n = typechg(&(el_ent->cf_ent), cf_ent, &(el_ent->mstat)); switch (n) { case TYPE_OK: diff --git a/usr/src/lib/libpkg/common/isdir.c b/usr/src/lib/libpkg/common/isdir.c index 9ae2751fc6..55b59d5e67 100644 --- a/usr/src/lib/libpkg/common/isdir.c +++ b/usr/src/lib/libpkg/common/isdir.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -40,7 +40,6 @@ #include <string.h> #include "pkglocale.h" #include "pkglibmsgs.h" -#include "pkglib.h" /* * Defines for cpio/compression checks. @@ -78,7 +77,6 @@ int isFstypeRemote(char *a_fstype); int isdir(char *path); int isfile(char *dir, char *file); int iscpio(char *path, int *iscomp); -int eval_ftype(char *path, char ftype, char *myftype); /* * Name: isdir @@ -391,83 +389,3 @@ _InitRemoteFstypes(void) (void) fclose(fp); } - -/* - * Name: eval_ftype - * Description: Evaluate the target's file type - * Arguments: path - Path on filesystem - * ftype - Type to be changed to - * myftype - Address into which current - * type of target will be stored - * Returns: int - * 0 - Success - * VE_EXIST - Path does not exist - * VE_FTYPE - Path file type is not recognized, - * is not supported, - * or is not what is expected - */ -int -eval_ftype(char *path, char ftype, char *myftype) -{ - struct stat status; - int retcode = 0; - int statError = 0; - - /* If we are to process symlinks the old way then we follow the link */ - if (nonABI_symlinks()) { - if ((ftype == 's') ? lstat(path, &status) : - stat(path, &status)) { - (void) reperr(pkg_gt(ERR_EXIST)); - retcode = VE_EXIST; - *myftype = '?'; - statError++; - } - /* If not then we inspect the target of the link */ - } else { - if (lstat(path, &status) == -1) { - reperr(pkg_gt(ERR_EXIST)); - retcode = VE_EXIST; - *myftype = '?'; - statError++; - } - } - if (!statError) { - /* determining actual type of existing object */ - switch (status.st_mode & S_IFMT) { - case S_IFLNK: - *myftype = 's'; - break; - - case S_IFIFO: - *myftype = 'p'; - break; - - case S_IFCHR: - *myftype = 'c'; - break; - - case S_IFDIR: - *myftype = 'd'; - break; - - case S_IFBLK: - *myftype = 'b'; - break; - - case S_IFREG: - case 0: - *myftype = 'f'; - break; - - case S_IFDOOR: - *myftype = 'D'; - break; - - default: - *myftype = '?'; - return (VE_FTYPE); - } - retcode = 0; - } - return (retcode); -} diff --git a/usr/src/lib/libpkg/common/mapfile-vers b/usr/src/lib/libpkg/common/mapfile-vers index 81934e31ae..f1fd2a8001 100644 --- a/usr/src/lib/libpkg/common/mapfile-vers +++ b/usr/src/lib/libpkg/common/mapfile-vers @@ -89,7 +89,6 @@ SUNWprivate { epclose; epopen; esystem; - eval_ftype; find_ca_certs; find_cl_certs; find_key_cert_pair; diff --git a/usr/src/lib/libpkg/common/pkglib.h b/usr/src/lib/libpkg/common/pkglib.h index feb80d1d0f..04b17730ca 100644 --- a/usr/src/lib/libpkg/common/pkglib.h +++ b/usr/src/lib/libpkg/common/pkglib.h @@ -499,12 +499,10 @@ extern void ds_order(char *list[]); extern void ds_putinfo(char *buf); extern void ds_skiptoend(char *device); extern void ecleanup(void); -extern int eval_ftype(char *path, char ftype, char *myftype); /*PRINTFLIKE1*/ extern void logerr(char *fmt, ...); extern int mappath(int flag, char *path); extern int mapvar(int flag, char *varname); -extern void reperr(char *fmt, ...); /*PRINTFLIKE1*/ extern void progerr(char *fmt, ...); extern void pkgerr(PKG_ERR *); @@ -628,7 +626,6 @@ extern int isFstypeRemote(); extern int isPathRemote(); extern int iscpio(); extern int isdir(); -extern int eval_ftype(); extern int isfile(); extern int pkgexecl(); extern int pkgexecv(); @@ -656,7 +653,6 @@ extern void ds_putinfo(); extern void ds_skiptoend(); extern void ecleanup(); extern void logerr(); -extern void reperr(); extern int mappath(); extern int mapvar(); extern void progerr(); diff --git a/usr/src/lib/libpkg/common/verify.c b/usr/src/lib/libpkg/common/verify.c index 1af2d2778c..c48c5b8c77 100644 --- a/usr/src/lib/libpkg/common/verify.c +++ b/usr/src/lib/libpkg/common/verify.c @@ -85,7 +85,7 @@ typedef union hilo { } CHECKSUM_T; /*PRINTFLIKE1*/ -void +static void reperr(char *fmt, ...) { char *pt; @@ -392,6 +392,7 @@ averify(int fix, char *ftype, char *path, struct ainfo *ainfo) int uid, gid; int dochown; int retcode; + int statError = 0; int targ_is_dir = 0; /* replacing a directory */ char myftype; char buf[PATH_MAX]; @@ -490,19 +491,62 @@ averify(int fix, char *ftype, char *path, struct ainfo *ainfo) retcode = 0; - /* Evaluate the file type of existing object */ - retcode = eval_ftype(path, *ftype, &myftype); - - /* - * If path file type is not recognized, is not supported or - * is not what is expected, return - */ - if (retcode == VE_FTYPE) - return (retcode); - - /* If existing type is Directory, then set flag */ - if (myftype == 'd') - targ_is_dir = 1; + /* If we are to process symlinks the old way then we follow the link */ + if (nonABI_symlinks()) { + if ((*ftype == 's') ? lstat(path, &status) : + stat(path, &status)) { + reperr(pkg_gt(ERR_EXIST)); + retcode = VE_EXIST; + myftype = '?'; + statError++; + } + /* If not then we inspect the target of the link */ + } else { + if ((n = lstat(path, &status)) == -1) { + reperr(pkg_gt(ERR_EXIST)); + retcode = VE_EXIST; + myftype = '?'; + statError++; + } + } + if (!statError) { + /* determining actual type of existing object */ + switch (status.st_mode & S_IFMT) { + case S_IFLNK: + myftype = 's'; + break; + + case S_IFIFO: + myftype = 'p'; + break; + + case S_IFCHR: + myftype = 'c'; + break; + + case S_IFDIR: + myftype = 'd'; + targ_is_dir = 1; + break; + + case S_IFBLK: + myftype = 'b'; + break; + + case S_IFREG: + case 0: + myftype = 'f'; + break; + + case S_IFDOOR: + myftype = 'D'; + break; + + default: + reperr(pkg_gt(ERR_UNKNOWN)); + return (VE_FTYPE); + } + } if (setval) { /* |