9 #define MYALLPERMS 07777
11 #if defined(WITH_PCRE) && defined(WITH_PCRE_POSIX)
12 #include <pcreposix.h>
17 #define _RPMIOB_INTERNAL
22 #define _RPMSX_INTERNAL
28 #define _RPMTAG_INTERNAL
29 #define _RPMFI_INTERNAL
32 #define _RPMTE_INTERNAL
47 #define SKIPWHITE(_x) {while(*(_x) && (xisspace(*_x) || *(_x) == ',')) (_x)++;}
48 #define SKIPNONWHITE(_x){while(*(_x) &&!(xisspace(*_x) || *(_x) == ',')) (_x)++;}
50 #define MAXDOCDIR 1024
72 #define fl_dev fl_st.st_dev
73 #define fl_ino fl_st.st_ino
74 #define fl_mode fl_st.st_mode
75 #define fl_nlink fl_st.st_nlink
76 #define fl_uid fl_st.st_uid
77 #define fl_gid fl_st.st_gid
78 #define fl_rdev fl_st.st_rdev
79 #define fl_size fl_st.st_size
80 #define fl_mtime fl_st.st_mtime
207 static void dumpAttrRec(
const char * msg,
AttrRec ar)
212 fprintf(stderr,
"%s:\t", msg);
213 fprintf(stderr,
"(%s, %s, %s, %s)\n",
230 static char *olds = NULL;
239 s += strspn(s, delim);
248 s = strchr(token,
'"');
250 s = strpbrk(token, delim);
256 olds = strchr(token,
'\0');
286 for (i = 0; i < he->
c; i++) {
287 xx = currentTime - mtime[i];
288 if (xx < 0) xx = -xx;
293 mtime =
_free(mtime);
336 unsigned *resultVerify;
338 unsigned verifyFlags;
341 if ((p = strstr(buf, (name =
"%verify"))) != NULL) {
344 }
else if ((p = strstr(buf, (name =
"%defverify"))) != NULL) {
350 for (pe = p; (size_t)(pe-p) < strlen(name); pe++)
363 for (p = pe; *pe && *pe !=
')'; pe++)
382 for (p = q; *p !=
'\0'; p = pe) {
392 for (vfa = verifyAttrs; vfa->
attribute != NULL; vfa++) {
395 verifyFlags |= vfa->
flag;
403 if (!strcmp(p,
"not")) {
412 *resultVerify = negated ? ~(verifyFlags) : verifyFlags;
427 #define isAttrDefault(_ars) ((_ars)[0] == '-' && (_ars)[1] == '\0')
440 const char * errstr = NULL;
444 if ((p = strstr(buf, (name =
"%dev"))) == NULL)
447 for (pe = p; (size_t)(pe-p) < strlen(name); pe++)
458 for (p = pe; *pe && *pe !=
')'; pe++)
473 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
484 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
485 for (pe = p; *pe &&
xisdigit(*pe); pe++)
502 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
503 for (pe = p; *pe &&
xisdigit(*pe); pe++)
547 if ((p = strstr(buf, (name =
"%attr"))) != NULL) {
550 }
else if ((p = strstr(buf, (name =
"%defattr"))) != NULL) {
556 for (pe = p; (size_t)(pe-p) < strlen(name); pe++)
569 for (p = pe; *pe && *pe !=
')'; pe++)
572 if (ret_ar == &(fl->
def_ar)) {
578 _(
"Non-white space follows %s(): %s\n"), name, q);
595 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
600 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
605 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
609 if (*p !=
'\0' && ret_ar == &(fl->
def_ar)) {
610 pe = p;
SKIPNONWHITE(pe);
if (*pe !=
'\0') *pe++ =
'\0';
615 if (!(ar->ar_fmodestr && ar->ar_user && ar->ar_group) || *p !=
'\0') {
624 x = sscanf(ar->ar_fmodestr,
"%o", &ui);
625 if ((x == 0) || (ar->ar_fmode & ~
MYALLPERMS)) {
632 ar->ar_fmodestr = NULL;
636 x = sscanf(ar->ar_dmodestr,
"%o", &ui);
637 if ((x == 0) || (ar->ar_dmode & ~
MYALLPERMS)) {
644 ar->ar_dmodestr = NULL;
672 if ((p = strstr(buf, (name =
"%config"))) == NULL)
678 for (pe = p; (size_t)(pe-p) < strlen(name); pe++)
686 for (p = pe; *pe && *pe !=
')'; pe++)
702 for (p = q; *p !=
'\0'; p = pe) {
710 if (!strcmp(p,
"missingok")) {
712 }
else if (!strcmp(p,
"noreplace")) {
726 static int langCmp(
const void * ap,
const void * bp)
729 return strcmp(*(
const char **)ap, *(
const char **)bp);
745 while ((p = strstr(buf, (name =
"%lang"))) != NULL) {
747 for (pe = p; (size_t)(pe-p) < strlen(name); pe++)
759 for (pe = p; *pe && *pe !=
')'; pe++)
776 for (p = q; *p !=
'\0'; p = pe) {
788 if (np < 1 || (np == 1 && *p !=
'C') || np >= 32) {
790 _(
"Unusual locale length: \"%.*s\" in %%lang(%s)\n"),
798 for (i = 0; i < fl->
nLangs; i++) {
811 strncpy(newp, p, np);
814 if (*pe ==
',') pe++;
831 static int initialized = 0;
832 static int hasRegex = 0;
833 static regex_t compiledPatt;
834 static char buf[BUFSIZ];
836 regmatch_t matches[2];
840 const char *patt =
rpmExpand(
"%{?_langpatt}", NULL);
842 if (!(patt && *patt !=
'\0'))
844 else if (regcomp(&compiledPatt, patt, REG_EXTENDED))
853 memset(matches, 0,
sizeof(matches));
854 if (! hasRegex || regexec(&compiledPatt, fileName, 2, matches, REG_NOTEOL))
858 s = fileName + matches[1].rm_eo - 1;
859 x = (int)matches[1].rm_eo - (
int)matches[1].rm_so;
887 {
"%spec", 0, RPMFILE_SPEC },
907 char * buf,
FileList fl,
const char ** fileName)
918 char specialDocBuf[BUFSIZ];
921 specialDocBuf[0] =
'\0';
927 if (!strcmp(s,
"%docdir")) {
944 #if defined(__LCLINT__)
950 for (vfa = virtualFileAttributes; vfa->
attribute != NULL; vfa++) {
954 if (!strcmp(s,
"%dir"))
981 strcat(specialDocBuf,
" ");
982 strcat(specialDocBuf, s);
988 const char * sfn = NULL;
993 _(
"File must begin with \"/\": %s\n"), s);
1010 _(
"Can't mix special %%doc with other forms: %s\n"),
1011 (*fileName ? *fileName :
""));
1018 static char *_docdir_fmt = NULL;
1019 static int oneshot = 0;
1020 const char *ddir, *fmt, *errstr;
1022 _docdir_fmt =
rpmExpand(
"%{?_docdir_fmt}", NULL);
1023 if (!(_docdir_fmt && *_docdir_fmt))
1024 _docdir_fmt =
_free(_docdir_fmt);
1027 if (_docdir_fmt == NULL)
1028 _docdir_fmt =
xstrdup(
"%{NAME}-%{VERSION}");
1052 mkdir_p =
rpmExpand(
"%{?__mkdir_p}%{!?__mkdir_p:mkdir -p}", NULL);
1054 mkdir_p =
xstrdup(
"mkdir -p");
1056 mkdir_p =
_free(mkdir_p);
1059 compress_doc =
rpmExpand(
"%{__compress_doc}", NULL);
1060 if (compress_doc && *compress_doc !=
'%')
1062 compress_doc =
_free(compress_doc);
1085 const char *a = NULL;
1087 const char *b = NULL;
1090 return strcmp(a, b);
1104 k = strlen(fileName);
1107 if (l < k && strncmp(fileName, fl->
docDirs[x], l) == 0 && fileName[l] ==
'/')
1127 if (!(S_ISREG(ilp->fl_mode) && ilp->fl_nlink > 1))
1134 if (!S_ISREG(jlp->fl_mode))
1136 if (ilp->fl_nlink != jlp->fl_nlink)
1138 if (ilp->fl_ino != jlp->fl_ino)
1140 if (ilp->fl_dev != jlp->fl_dev)
1150 static int dncmp(
const void * a,
const void * b)
1153 const char ** aurlp = (
const char **)a;
1154 const char ** burlp = (
const char **)b;
1159 return strcmp(adn, bdn);
1171 const char ** fileNames;
1173 const char ** dirNames;
1174 const char ** baseNames;
1195 fileNames = he->
p.
argv;
1197 if (!xx || fileNames == NULL || count <= 0)
1200 dirNames =
alloca(
sizeof(*dirNames) * count);
1201 baseNames =
alloca(
sizeof(*dirNames) * count);
1202 dirIndexes =
alloca(
sizeof(*dirIndexes) * count);
1204 (void)
urlPath(fileNames[0], &fn);
1208 dirNames[dirIndex] =
"";
1209 for (i = 0; i < count; i++) {
1210 dirIndexes[i] = dirIndex;
1211 baseNames[i] = fileNames[i];
1216 for (i = 0; i < count; i++) {
1217 const char ** needle;
1222 if (fileNames[i] == NULL)
1224 baseName = strrchr(fileNames[i],
'/') + 1;
1225 len = baseName - fileNames[i];
1227 savechar = *baseName;
1231 (needle = bsearch(&fileNames[i], dirNames, dirIndex + 1,
sizeof(dirNames[0]),
dncmp)) == NULL) {
1232 char *s =
alloca(len + 1);
1233 memcpy(s, fileNames[i], len + 1);
1235 dirIndexes[i] = ++dirIndex;
1236 dirNames[dirIndex] = s;
1238 dirIndexes[i] = needle - dirNames;
1241 *baseName = savechar;
1242 baseNames[i] = baseName;
1249 he->
p.
ui32p = dirIndexes;
1255 he->
p.
argv = baseNames;
1261 he->
p.
argv = dirNames;
1262 he->
c = dirIndex + 1;
1266 fileNames =
_free(fileNames);
1278 static int oneshot = 0;
1290 dalgo = (isSrc ? source_file_dalgo : binary_file_dalgo);
1343 int _addDotSlash = !isSrc;
1354 memset(buf, 0,
sizeof(buf));
1365 skipLen += strlen(fl->
prefix);
1368 for (i = 0, flp = fl->
fileList; i < fl->fileListRecsUsed; i++, flp++) {
1382 int terminate =
rpmExpandNumeric(
"%{?_files_listed_twice_terminate_build}");
1391 if (S_ISDIR(flp->fl_mode)) {
1394 flp[1].fl_mode = flp->fl_mode;
1398 flp[1].fl_mode = flp->fl_mode;
1405 flp[1].fl_uid = flp->fl_uid;
1413 flp[1].fl_gid = flp->fl_gid;
1432 apathlen += (strlen(apath) - skipLen + (_addDotSlash ? 3 : 1));
1435 dpathlen += (strlen(flp->
diskURL) + 2);
1494 { dev_t _dev = flp->fl_rdev;
1506 { dev_t _dev = flp->fl_dev;
1518 { ino_t _ino = flp->fl_ino;
1540 if (S_ISREG(flp->fl_mode)) {
1541 unsigned dflags = 0x01;
1542 #define _mask (RPMVERIFY_FDIGEST|RPMVERIFY_HMAC)
1576 const char * buildRoot;
1579 if (buf[0] ==
'/' && strcmp(buildRoot,
"/") &&
1580 !strncmp(buf, buildRoot, strlen(buildRoot))) {
1582 _(
"Symlink points to BuildRoot: %s -> %s\n"),
1613 if (S_ISDIR(flp->fl_mode))
1650 {
static int scareMem = 0;
1655 if (fi == NULL)
return;
1662 fi->dnl =
_free(fi->dnl);
1663 fi->bnl =
_free(fi->bnl);
1664 if (!scareMem) fi->dil =
_free(fi->dil);
1667 fi->dnl =
xmalloc(fi->fc *
sizeof(*fi->dnl) + dpathlen + 1);
1668 d = (
char *)(fi->dnl + fi->fc);
1671 fi->bnl =
xmalloc(fi->fc * (
sizeof(*fi->bnl) +
sizeof(*fi->dil)));
1673 fi->dil = (!scareMem)
1674 ?
xcalloc(
sizeof(*fi->dil), fi->fc)
1679 fi->apath =
xmalloc(fi->fc *
sizeof(*fi->apath) + apathlen + 1);
1680 a = (
char *)(fi->apath + fi->fc);
1683 fi->actions =
_free(fi->actions);
1684 fi->actions =
xcalloc(
sizeof(*fi->actions), fi->fc);
1685 fi->fmapflags =
xcalloc(
sizeof(*fi->fmapflags), fi->fc);
1690 fi->fuser =
_free(fi->fuser);
1691 fi->fgroup =
_free(fi->fgroup);
1694 if (fi->dil != NULL)
1695 for (i = 0, flp = fl->
fileList; (
unsigned)i < fi->fc; i++, flp++) {
1710 size_t fnlen = strlen(flp->
diskURL);
1711 if (fnlen > fi->fnlen) {
1713 assert(fi->fn == NULL);
1721 fi->dnl[fi->dil[i]] = d;
1726 for (b = d; b > fi->dnl[fi->dil[i]] && *b !=
'/'; b--)
1740 a =
stpcpy(a, (apath + skipLen));
1753 if (S_ISREG(flp->fl_mode)) {
1756 if (flp->fl_nlink > 1) {
1759 for (; (unsigned)j < fi->fc; j++, jlp++) {
1770 if (!S_ISREG(jlp->fl_mode))
1772 if (flp->fl_nlink != jlp->fl_nlink)
1774 if (flp->fl_ino != jlp->fl_ino)
1776 if (flp->fl_dev != jlp->fl_dev)
1812 fileList[count].
diskURL =
_free(fileList[count].diskURL);
1813 fileList[count].
fileURL =
_free(fileList[count].fileURL);
1814 fileList[count].
langs =
_free(fileList[count].langs);
1816 fileList =
_free(fileList);
1838 struct stat * statp)
1847 const char *fn =
xstrdup(diskURL);
1848 const char *fileURL = fn;
1849 struct stat statbuf;
1853 const char *fileUname;
1854 const char *fileGname;
1869 {
const char *fileName;
1873 fileURL += (fileName - fileURL);
1876 const char * s = fileURL + nb;
1877 char * t = (
char *) fileURL;
1878 (void) memmove(t, s, nb);
1890 if (*fileURL ==
'\0')
1895 const char *prefixTest;
1896 const char *prefixPtr = fl->
prefix;
1898 (void)
urlPath(fileURL, &prefixTest);
1899 while (*prefixPtr && *prefixTest && (*prefixTest == *prefixPtr)) {
1903 if (*prefixPtr || (*prefixTest && *prefixTest !=
'/')) {
1912 if (statp == NULL) {
1914 memset(statp, 0,
sizeof(*statp));
1916 time_t now = time(NULL);
1919 statp->st_nlink = 1;
1922 statp->st_dev = statp->st_rdev;
1923 statp->st_mode = (fl->
devtype ==
'b' ? S_IFBLK : S_IFCHR);
1925 statp->st_atime = now;
1926 statp->st_mtime = now;
1927 statp->st_ctime = now;
1928 }
else if (
Lstat(diskURL, statp)) {
1941 if ((! fl->
isDir) && S_ISDIR(statp->st_mode)) {
1948 fileMode = statp->st_mode;
1949 fileUid = statp->st_uid;
1950 fileGid = statp->st_gid;
1971 if (fileUname == NULL)
1973 if (fileGname == NULL)
1986 flp->
fl_st = *statp;
1987 flp->fl_mode = fileMode;
1988 flp->fl_uid = fileUid;
1989 flp->fl_gid = fileGid;
1993 flp->
uname = fileUname;
1994 flp->
gname = fileGname;
2000 for (i = 0; i < fl->
nLangs; i++)
2004 for (i = 0; i < fl->
nLangs; i++) {
2006 if (i) *ncl++ =
'|';
2047 ftsSet[0] = (
char *) diskURL;
2049 ftsp =
Fts_open(ftsSet, myFtsOpts, NULL);
2050 while ((fts =
Fts_read(ftsp)) != NULL) {
2104 const char * buildURL =
"%{_builddir}/%{?buildsubdir}/";
2105 const char * fn = NULL;
2106 const char * apkt = NULL;
2128 if ((xx =
pgpReadPkts(fn, &pkt, (
size_t *)&pktlen)) <= 0) {
2140 if (!(xx == 0 && iob != NULL)) {
2144 apkt = (
const char *) iob->b;
2181 const char * fileURL)
2190 const char *diskURL = NULL;
2197 {
const char * fileName;
2198 (void)
urlPath(fileURL, &fileName);
2199 if (*fileName !=
'/') {
2218 const char ** argv = NULL;
2230 xx =
rpmGlob(diskURL, &argc, &argv);
2231 if (xx == 0 && argc >= 1) {
2232 for (i = 0; i < argc; i++) {
2233 rc =
addFile(fl, argv[i], NULL);
2234 argv[i] =
_free(argv[i]);
2250 rc =
addFile(fl, diskURL, NULL);
2253 diskURL =
_free(diskURL);
2262 int installSpecialDoc,
int test)
2273 const char *fileName;
2276 AttrRec specialDocAttrRec = &arbuf;
2277 char *specialDoc = NULL;
2284 char *saveptr = NULL;
2287 char *token = strtok_r(filesFiles,
",", &saveptr);
2295 if (*token ==
'/') {
2304 fd =
Fopen(ffn,
"r.fpio");
2306 if (fd == NULL ||
Ferror(fd)) {
2308 _(
"Could not open %%files file %s: %s\n"),
2316 while (fgets(buf, (
int)
sizeof(buf), f)) {
2326 }
while((token = strtok_r(NULL,
",", &saveptr)) != NULL);
2327 filesFiles =
_free(filesFiles);
2331 memset(&fl, 0,
sizeof(fl));
2368 #if defined(RPM_VENDOR_OPENPKG)
2392 for (fp = files; *fp != NULL; fp++) {
2400 strncpy(buf, s,
sizeof(buf)-1);
2401 buf[
sizeof(buf)-1] =
'\0';
2421 for (i = 0; i < fl.
nLangs; i++)
2447 if (fileName == NULL)
2452 specialDoc =
_free(specialDoc);
2453 specialDoc =
xstrdup(fileName);
2472 if (installSpecialDoc) {
2473 int _missing_doc_files_terminate_build =
2478 if (rc !=
RPMRC_OK && _missing_doc_files_terminate_build)
2496 for (i = 0; i < fl.
nLangs; i++)
2511 specialDoc =
_free(specialDoc);
2522 "PartialHardlinkSets",
"4.0.4-1");
2540 for (i = 0; i < fl.
nLangs; i++)
2559 static rpmTag classTag = 0xffffffff;
2563 if (classTag == 0xffffffff)
2597 #if defined(RPM_VENDOR_OPENPKG)
2607 if (classTag == he->
tag && he->
p.
ptr != NULL)
2624 for (i = 0; i < spec->
nfoo; i++) {
2625 const char * str = spec->
foo[i].str;
2630 if (str == NULL || iob == NULL)
2636 if (!(he->
p.
str != NULL && he->
p.
str[0] !=
'\0')) {
2652 he->
p.
argv = (
const char **) &s;
2664 if (sfp != NULL && *sfp != NULL)
2673 for (srcPtr = spec->
sources; srcPtr != NULL; srcPtr = srcPtr->
next) {
2677 #
if defined(RPM_VENDOR_OPENPKG)
2740 rpmiob sourceFiles, *sfp = &sourceFiles;
2747 char _srcdefattr_buf[BUFSIZ];
2748 char * _srcdefattr =
rpmExpand(
"%{?_srcdefattr}", NULL);
2755 memset(&fl, 0,
sizeof(fl));
2756 if (_srcdefattr && *_srcdefattr) {
2757 xx =
snprintf(_srcdefattr_buf,
sizeof(_srcdefattr_buf),
"%%defattr %s", _srcdefattr);
2758 _srcdefattr_buf[
sizeof(_srcdefattr_buf)-1] =
'\0';
2774 for (fp = files; *fp != NULL; fp++) {
2775 const char * diskURL, *diskPath;
2787 if (*diskURL ==
'!') {
2792 (void)
urlPath(diskURL, &diskPath);
2795 diskPath = strrchr(diskPath,
'/');
2806 diskURL, strerror(
errno));
2810 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_MANDRIVA)
2813 flp->fl_mode &= S_IFMT;
2845 _srcdefattr =
_free(_srcdefattr);
2860 static const char * av_ckfile[] = {
"%{?__check_files}", NULL };
2862 rpmiob iob_stdout = NULL;
2878 for (pkg = spec->
packages; pkg != NULL; pkg = pkg->
next) {
2903 rc =
rpmfcExec(av_ckfile, fileList, &iob_stdout, 0);
2908 int _unpackaged_files_terminate_build =
2913 if ((*t !=
'\0') && (*t !=
'\n')) {
2914 rc = (_unpackaged_files_terminate_build) ? 1 : 0;
2916 _(
"Installed (but unpackaged) file(s) found:\n%s"), t);
2930 size_t buildrootL,
int _duplicate_files_terminate_build)
2936 const char *fn1, *fn2;
2949 if (strcmp(fn1, fn2))
2960 const char *N1, *N2;
2969 _(
"File(s) packaged into both %s and %s:\n%s"),
2986 int _duplicate_files_terminate_build)
3001 if (fi1 == NULL)
continue;
3003 for (pkg2 = pkg1->
next; pkg2; pkg2 = pkg2->
next) {
3009 if (fi2 == NULL)
continue;
3011 n +=
fiIntersect(fi1, fi2, buildrootL, _duplicate_files_terminate_build);
3027 return rpmbfChk(
rpmfiFNBF(pkg->
fi), d, strlen(d));
3044 char **unpackaged = NULL;
3065 while ((p = strchr(p + 1,
'/'))) {
3076 while ((p = strchr(p + 1,
'/'))) {
3084 for (j = 0; j < n; j++)
3085 if (strcmp(fn, unpackaged[j]) == 0) {
3093 unpackaged =
xrealloc(unpackaged,
sizeof(*unpackaged) * (n + 1));
3094 unpackaged[n++] =
xstrdup(fn);
3108 for (i = 0; i < n; i++) {
3110 list =
rpmiobAppend(list, unpackaged[i]+buildrootL, 1);
3111 unpackaged[i] =
_free(unpackaged[i]);
3113 unpackaged =
_free(unpackaged);
3116 _(
"Unpackaged subdir(s) in %s:\n%s"),
3151 char *buildroot =
rpmExpand(
"%{?buildroot}", NULL);
3152 size_t buildrootL = strlen(buildroot);
3154 buildroot =
_free(buildroot);
3156 for (pkg = spec->
packages; pkg != NULL; pkg = pkg->
next) {
3195 int _duplicate_files_terminate_build =
3197 int _unpackaged_subdirs_terminate_build =
3202 _duplicate_files_terminate_build)
3205 _unpackaged_subdirs_terminate_build)