- fix: don't total hard linked file size multiple times (#46286).

- add %dev(type,major,minor) directive to permit non-root dev build.

CVS patchset: 4944
CVS date: 2001/07/16 14:48:07
This commit is contained in:
jbj 2001-07-16 14:48:07 +00:00
parent 77d49ea5a2
commit ecfb46adaa
6 changed files with 188 additions and 17 deletions

View File

@ -169,6 +169,8 @@
- fix: hard fail on locked dbopen if CDB locking not in use.
- fix: dbconfig with mp_mmapsize=16Mb/mp_size=1Mb for
"everything ENOSPC" failure check.
- fix: don't total hard linked file size multiple times (#46286).
- add %dev(type,major,minor) directive to permit non-root dev build.
4.0 -> 4.0.[12]
- add doxygen and lclint annotations most everywhere.

View File

@ -58,7 +58,7 @@ typedef struct FileListRec_s {
#define fl_dev fl_st.st_dev
#define fl_ino fl_st.st_ino
#define fl_mode fl_st.st_mode
#define fl_nlink fl_st.st_nlink /* unused */
#define fl_nlink fl_st.st_nlink
#define fl_uid fl_st.st_uid
#define fl_gid fl_st.st_gid
#define fl_rdev fl_st.st_rdev
@ -103,6 +103,11 @@ typedef struct FileList_s {
int passedSpecialDoc;
int isSpecialDoc;
int noGlob;
unsigned devtype;
unsigned devmajor;
int devminor;
int isDir;
int inFtw;
@ -381,6 +386,102 @@ static int parseForVerify(char * buf, FileList fl)
#define isAttrDefault(_ars) ((_ars)[0] == '-' && (_ars)[1] == '\0')
/**
* Parse %dev from file manifest.
* @param fl package file tree walk data
*/
static int parseForDev(char * buf, FileList fl)
/*@modifies buf, fl->processingFailed,
fl->noGlob, fl->devtype, fl->devmajor, fl->devminor @*/
{
const char * name;
const char * errstr = NULL;
char *p, *pe, *q;
int rc = RPMERR_BADSPEC; /* assume error */
if ((p = strstr(buf, (name = "%dev"))) == NULL)
return 0;
for (pe = p; (pe-p) < strlen(name); pe++)
*pe = ' ';
SKIPSPACE(pe);
if (*pe != '(') {
errstr = "'('";
goto exit;
}
/* Bracket %dev args */
*pe++ = ' ';
for (p = pe; *pe && *pe != ')'; pe++)
{};
if (*pe != ')') {
errstr = "')'";
goto exit;
}
/* Localize. Erase parsed string */
q = alloca((pe-p) + 1);
strncpy(q, p, pe-p);
q[pe-p] = '\0';
while (p <= pe)
*p++ = ' ';
p = q; SKIPWHITE(p);
pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
if (*p == 'b')
fl->devtype = 'b';
else if (*p == 'c')
fl->devtype = 'c';
else {
errstr = "devtype";
goto exit;
}
p = pe; SKIPWHITE(p);
pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
for (pe = p; *pe && xisdigit(*pe); pe++)
{} ;
if (*pe == '\0') {
fl->devmajor = atoi(p);
if (!(fl->devmajor >= 0 && fl->devmajor < 256)) {
errstr = "devmajor";
goto exit;
}
pe++;
} else {
errstr = "devmajor";
goto exit;
}
p = pe; SKIPWHITE(p);
pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
for (pe = p; *pe && xisdigit(*pe); pe++)
{} ;
if (*pe == '\0') {
fl->devminor = atoi(p);
if (!(fl->devminor >= 0 && fl->devminor < 256)) {
errstr = "devminor";
goto exit;
}
pe++;
} else {
errstr = "devminor";
goto exit;
}
fl->noGlob = 1;
rc = 0;
exit:
if (rc) {
rpmError(RPMERR_BADSPEC, _("Missing %s in %s %s\n"), errstr, name, p);
fl->processingFailed = 1;
}
return rc;
}
/**
* Parse %attr and %defattr from file manifest.
* @param fl package file tree walk data
@ -390,8 +491,8 @@ static int parseForAttr(char * buf, FileList fl)
fl->cur_ar, fl->def_ar,
fl->currentSpecdFlags, fl->defSpecdFlags @*/
{
char *p, *pe, *q;
const char *name;
char *p, *pe, *q;
int x;
struct AttrRec_s arbuf;
AttrRec ar = &arbuf, ret_ar;
@ -1275,8 +1376,8 @@ static void genCpioListAndHeader(/*@partial@*/ FileList fl,
fi->fgids[i] = getGidS(flp->gname);
if (fi->fuids[i] == (uid_t)-1) fi->fuids[i] = 0;
if (fi->fgids[i] == (gid_t)-1) fi->fgids[i] = 0;
fi->fmapflags[i] =
CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
fi->fmapflags[i] = CPIO_MAP_PATH |
CPIO_MAP_TYPE | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
if (isSrc)
fi->fmapflags[i] |= CPIO_FOLLOW_SYMLINKS;
if (flp->flags & RPMFILE_MULTILIB_MASK)
@ -1363,7 +1464,21 @@ static int addFile(FileList fl, const char * diskURL, struct stat * statp)
if (statp == NULL) {
statp = &statbuf;
if (Lstat(diskURL, statp)) {
memset(statp, 0, sizeof(*statp));
if (fl->devtype) {
time_t now = time(NULL);
/* XXX hack up a stat structure for a %dev(...) directive. */
statp->st_nlink = 1;
statp->st_rdev =
((fl->devmajor & 0xff) << 8) | (fl->devminor & 0xff);
statp->st_dev = statp->st_rdev;
statp->st_mode = (fl->devtype == 'b' ? S_IFBLK : S_IFCHR);
statp->st_mode |= (fl->cur_ar.ar_fmode & 0777);
statp->st_atime = now;
statp->st_mtime = now;
statp->st_ctime = now;
} else if (Lstat(diskURL, statp)) {
rpmError(RPMERR_BADSPEC, _("File not found: %s\n"), diskURL);
fl->processingFailed = 1;
return RPMERR_BADSPEC;
@ -1430,6 +1545,7 @@ static int addFile(FileList fl, const char * diskURL, struct stat * statp)
}
{ FileListRec flp = &fl->fileList[fl->fileListRecsUsed];
int i;
flp->fl_st = *statp; /* structure assignment */
flp->fl_mode = fileMode;
@ -1442,9 +1558,8 @@ static int addFile(FileList fl, const char * diskURL, struct stat * statp)
flp->gname = fileGname;
if (fl->currentLangs && fl->nLangs > 0) {
char *ncl;
char * ncl;
size_t nl = 0;
int i;
for (i = 0; i < fl->nLangs; i++)
nl += strlen(fl->currentLangs[i]) + 1;
@ -1472,7 +1587,27 @@ static int addFile(FileList fl, const char * diskURL, struct stat * statp)
&& !parseForRegexMultiLib(fileURL))
flp->flags |= multiLib;
fl->totalFileSize += flp->fl_size;
/* Hard links need be counted only once. */
if (S_ISREG(flp->fl_mode) && flp->fl_nlink > 1) {
FileListRec ilp;
for (i = 0; i < fl->fileListRecsUsed; i++) {
ilp = fl->fileList + i;
if (!S_ISREG(ilp->fl_mode))
continue;
if (flp->fl_nlink != ilp->fl_nlink)
continue;
if (flp->fl_ino != ilp->fl_ino)
continue;
if (flp->fl_dev != ilp->fl_dev)
continue;
break;
}
} else
i = fl->fileListRecsUsed;
if (S_ISREG(flp->fl_mode) && i >= fl->fileListRecsUsed)
fl->totalFileSize += flp->fl_size;
}
fl->fileListRecsUsed++;
@ -1522,6 +1657,13 @@ static int processBinaryFile(/*@unused@*/ Package pkg, FileList fl,
int argc = 0;
int i;
if (fl->noGlob) {
rpmError(RPMERR_BADSPEC, _("Glob not permitted: %s\n"),
diskURL);
rc = 1;
goto exit;
}
rc = rpmGlob(diskURL, &argc, &argv);
if (rc == 0 && argc >= 1 && !myGlobPatternP(argv[0])) {
for (i = 0; i < argc; i++) {
@ -1608,6 +1750,7 @@ static int processPackageFiles(Spec spec, Package pkg,
}
/* Init the file list structure */
memset(&fl, 0, sizeof(fl));
/* XXX spec->buildRootURL == NULL, then xstrdup("") is returned */
fl.buildRootURL = rpmGenPath(spec->rootURL, spec->buildRootURL, NULL);
@ -1629,6 +1772,11 @@ static int processPackageFiles(Spec spec, Package pkg,
fl.currentFlags = 0;
fl.currentVerifyFlags = 0;
fl.noGlob = 0;
fl.devtype = 0;
fl.devmajor = 0;
fl.devminor = 0;
nullAttrRec(&fl.cur_ar);
nullAttrRec(&fl.def_ar);
@ -1677,6 +1825,11 @@ static int processPackageFiles(Spec spec, Package pkg,
fl.currentVerifyFlags = fl.defVerifyFlags;
fl.isSpecialDoc = 0;
fl.noGlob = 0;
fl.devtype = 0;
fl.devmajor = 0;
fl.devminor = 0;
/* XXX should reset to %deflang value */
if (fl.currentLangs) {
int i;
@ -1695,6 +1848,8 @@ static int processPackageFiles(Spec spec, Package pkg,
continue;
if (parseForAttr(buf, &fl))
continue;
if (parseForDev(buf, &fl))
continue;
if (parseForConfig(buf, &fl))
continue;
if (parseForLang(buf, &fl))
@ -1731,6 +1886,11 @@ static int processPackageFiles(Spec spec, Package pkg,
fl.currentFlags = 0;
fl.currentVerifyFlags = 0;
fl.noGlob = 0;
fl.devtype = 0;
fl.devmajor = 0;
fl.devminor = 0;
/* XXX should reset to %deflang value */
if (fl.currentLangs) {
int i;

View File

@ -61,11 +61,12 @@ typedef enum cpioMapFlags_e {
CPIO_MAP_MODE = (1 << 1),
CPIO_MAP_UID = (1 << 2),
CPIO_MAP_GID = (1 << 3),
CPIO_FOLLOW_SYMLINKS= (1 << 4), /* only for building. */
CPIO_FOLLOW_SYMLINKS= (1 << 4), /*!< only for building. */
CPIO_MAP_ABSOLUTE = (1 << 5),
CPIO_MAP_ADDDOT = (1 << 6),
CPIO_ALL_HARDLINKS = (1 << 7), /*!< fail if hardlinks are missing. */
CPIO_MULTILIB = (1 << 31) /* internal, only for building. */
CPIO_MAP_TYPE = (1 << 8), /*!< only for building. */
CPIO_MULTILIB = (1 << 31) /*!< internal, only for building. */
} cpioMapFlags;
#define CPIO_NEWC_MAGIC "070701"

View File

@ -631,6 +631,12 @@ int fsmMapAttrs(FSM_t fsm)
if (fsm->mapFlags & CPIO_MAP_MODE)
st->st_mode = (st->st_mode & S_IFMT) | (finalMode & ~S_IFMT);
if (fsm->mapFlags & CPIO_MAP_TYPE) {
st->st_mode = (st->st_mode & ~S_IFMT) | (finalMode & S_IFMT);
if ((S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
&& st->st_nlink == 0)
st->st_nlink = 1;
}
if (fsm->mapFlags & CPIO_MAP_UID)
st->st_uid = finalUid;
if (fsm->mapFlags & CPIO_MAP_GID)

View File

@ -124,15 +124,21 @@ static int countLinks(int_16 * fileRdevList, int_32 * fileInodeList, int nfiles,
int nlink = 0;
/* XXX rpm-3.3.12 has not RPMTAG_FILEINODES */
if (!(fileRdevList && fileInodeList && nfiles > 0))
if (!(fileRdevList[xfile] != 0 && fileRdevList &&
fileInodeList[xfile] != 0 && fileInodeList && nfiles > 0))
return 1;
while (nfiles-- > 0) {
if (fileRdevList[nfiles] == 0)
continue;
if (fileRdevList[nfiles] != fileRdevList[xfile])
continue;
if (fileInodeList[nfiles] == 0)
continue;
if (fileInodeList[nfiles] != fileInodeList[xfile])
continue;
nlink++;
}
if (nlink == 0) nlink = 1;
return nlink;
}

View File

@ -1200,9 +1200,7 @@ int rpmdbCountPackages(rpmdb db, const char * name)
}
if (rc == 0) /* success */
/*@-nullpass@*/
rc = dbiIndexSetCount(matches);
/*@=nullpass@*/
else if (rc > 0) /* error */
rpmError(RPMERR_DBCORRUPT, _("error(%d) counting packages\n"), rc);
else /* not found */
@ -2143,7 +2141,7 @@ fprintf(stderr, "*** RMW %s %p\n", tagName(rpmtag), dbi->dbi_rmw);
rc = rpmdbFindByFile(rpmdb, keyp, &set);
} else {
xx = dbiCopen(dbi, &dbcursor, 0);
/*@-nullpass@*/ /* LCL: kep != NULL here. */
/*@-nullpass@*/ /* LCL: keyp != NULL here. */
rc = dbiSearch(dbi, dbcursor, keyp, keylen, &set);
/*@=nullpass@*/
xx = dbiCclose(dbi, dbcursor, 0);
@ -2192,9 +2190,7 @@ fprintf(stderr, "*** RMW %s %p\n", tagName(rpmtag), dbi->dbi_rmw);
mi->mi_re = NULL;
mi->mi_version = NULL;
mi->mi_release = NULL;
/*@-nullret@*/
return mi;
/*@=nullret@*/
}
/**
@ -2499,7 +2495,7 @@ int rpmdbAdd(rpmdb rpmdb, int iid, Header h)
memcpy(&hdrNum, datap, sizeof(hdrNum));
++hdrNum;
if (rc == 0 && datap) {
/*@-refcounttrans@*/
/*@-refcounttrans@*/ /* FIX: datap aliases h */
memcpy(datap, &hdrNum, sizeof(hdrNum));
/*@=refcounttrans@*/
} else {