- 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:
parent
77d49ea5a2
commit
ecfb46adaa
2
CHANGES
2
CHANGES
|
@ -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.
|
||||
|
|
176
build/files.c
176
build/files.c
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue