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;
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);
1325 return ((S_ISREG(flp->fl_mode) && S_ISREG(tlp->fl_mode)) &&
1326 ((flp->fl_nlink > 1) && (flp->fl_nlink == tlp->fl_nlink)) &&
1327 (flp->fl_ino == tlp->fl_ino) &&
1328 (flp->fl_dev == tlp->fl_dev));
1334 for (ilp = fl->
fileList; ilp < flp; ilp++) {
1363 int _addDotSlash = !isSrc;
1374 memset(buf, 0,
sizeof(buf));
1385 skipLen += strlen(fl->
prefix);
1388 for (i = 0, flp = fl->
fileList; i < fl->fileListRecsUsed; i++, flp++) {
1403 int terminate =
rpmExpandNumeric(
"%{?_files_listed_twice_terminate_build}");
1412 if (S_ISDIR(flp->fl_mode)) {
1415 flp[1].fl_mode = flp->fl_mode;
1419 flp[1].fl_mode = flp->fl_mode;
1426 flp[1].fl_uid = flp->fl_uid;
1434 flp[1].fl_gid = flp->fl_gid;
1453 apathlen += (strlen(apath) - skipLen + (_addDotSlash ? 3 : 1));
1456 dpathlen += (strlen(flp->
diskURL) + 2);
1459 if (S_ISREG(flp->fl_mode)) {
1460 if (flp->fl_nlink == 1 || !
seenHardLink(fl, flp, &fileid)) {
1522 { dev_t _dev = flp->fl_rdev;
1534 { dev_t _dev = flp->fl_dev;
1546 { ino_t _ino = flp->fl_ino;
1572 if (S_ISREG(flp->fl_mode)) {
1573 unsigned dflags = 0x01;
1574 #define _mask (RPMVERIFY_FDIGEST|RPMVERIFY_HMAC) 1608 const char * buildRoot;
1611 if (buf[0] ==
'/' && strcmp(buildRoot,
"/") &&
1612 !strncmp(buf, buildRoot, strlen(buildRoot))) {
1614 _(
"Symlink points to BuildRoot: %s -> %s\n"),
1645 if (S_ISDIR(flp->fl_mode))
1682 {
static int scareMem = 0;
1687 if (fi == NULL)
return;
1694 fi->dnl =
_free(fi->dnl);
1695 fi->bnl =
_free(fi->bnl);
1696 if (!scareMem) fi->dil =
_free(fi->dil);
1699 fi->dnl =
xmalloc(fi->fc *
sizeof(*fi->dnl) + dpathlen + 1);
1700 d = (
char *)(fi->dnl + fi->fc);
1703 fi->bnl =
xmalloc(fi->fc * (
sizeof(*fi->bnl) +
sizeof(*fi->dil)));
1705 fi->dil = (!scareMem)
1706 ?
xcalloc(
sizeof(*fi->dil), fi->fc)
1711 fi->apath =
xmalloc(fi->fc *
sizeof(*fi->apath) + apathlen + 1);
1712 a = (
char *)(fi->apath + fi->fc);
1715 fi->actions =
_free(fi->actions);
1716 fi->actions =
xcalloc(
sizeof(*fi->actions), fi->fc);
1717 fi->fmapflags =
xcalloc(
sizeof(*fi->fmapflags), fi->fc);
1722 fi->fuser =
_free(fi->fuser);
1723 fi->fgroup =
_free(fi->fgroup);
1726 if (fi->dil != NULL)
1727 for (i = 0, flp = fl->
fileList; (
unsigned)i < fi->fc; i++, flp++) {
1742 size_t fnlen = strlen(flp->
diskURL);
1743 if (fnlen > fi->fnlen) {
1745 assert(fi->fn == NULL);
1753 fi->dnl[fi->dil[i]] = d;
1758 for (b = d; b > fi->dnl[fi->dil[i]] && *b !=
'/'; b--)
1772 a =
stpcpy(a, (apath + skipLen));
1815 fileList =
_free(fileList);
1837 struct stat * statp)
1846 const char *fn =
xstrdup(diskURL);
1848 struct stat statbuf;
1852 const char *fileUname;
1853 const char *fileGname;
1868 {
const char *fileName;
1872 fileURL += (fileName -
fileURL);
1875 const char * s = fileURL + nb;
1876 char * t = (
char *) fileURL;
1877 (void) memmove(t, s, nb);
1889 if (*fileURL ==
'\0')
1894 const char *prefixTest;
1895 const char *prefixPtr = fl->
prefix;
1897 (void)
urlPath(fileURL, &prefixTest);
1898 while (*prefixPtr && *prefixTest && (*prefixTest == *prefixPtr)) {
1902 if (*prefixPtr || (*prefixTest && *prefixTest !=
'/')) {
1911 if (statp == NULL) {
1913 memset(statp, 0,
sizeof(*statp));
1915 time_t now = time(NULL);
1918 statp->st_nlink = 1;
1921 statp->st_dev = statp->st_rdev;
1922 statp->st_mode = (fl->
devtype ==
'b' ? S_IFBLK : S_IFCHR);
1924 statp->st_atime = now;
1925 statp->st_mtime = now;
1926 statp->st_ctime = now;
1927 }
else if (
Lstat(diskURL, statp)) {
1940 if ((! fl->
isDir) && S_ISDIR(statp->st_mode)) {
1947 fileMode = statp->st_mode;
1948 fileUid = statp->st_uid;
1949 fileGid = statp->st_gid;
1970 if (fileUname == NULL)
1972 if (fileGname == NULL)
1985 flp->
fl_st = *statp;
1986 flp->fl_mode = fileMode;
1987 flp->fl_uid = fileUid;
1988 flp->fl_gid = fileGid;
1992 flp->
uname = fileUname;
1993 flp->
gname = fileGname;
1999 for (i = 0; i < fl->
nLangs; i++)
2003 for (i = 0; i < fl->
nLangs; i++) {
2005 if (i) *ncl++ =
'|';
2046 ftsSet[0] = (
char *) diskURL;
2048 ftsp =
Fts_open(ftsSet, myFtsOpts, NULL);
2049 while ((fts =
Fts_read(ftsp)) != NULL) {
2103 const char * buildURL =
"%{_builddir}/%{?buildsubdir}/";
2104 const char * fn = NULL;
2105 const char * apkt = NULL;
2127 if ((xx =
pgpReadPkts(fn, &pkt, (
size_t *)&pktlen)) <= 0) {
2139 if (!(xx == 0 && iob != NULL)) {
2143 apkt = (
const char *) iob->b;
2189 const char *diskURL = NULL;
2196 {
const char * fileName;
2197 (void)
urlPath(fileURL, &fileName);
2198 if (*fileName !=
'/') {
2217 const char ** argv = NULL;
2229 xx =
rpmGlob(diskURL, &argc, &argv);
2230 if (xx == 0 && argc >= 1) {
2231 for (i = 0; i < argc; i++) {
2232 rc =
addFile(fl, argv[i], NULL);
2233 argv[i] =
_free(argv[i]);
2249 rc =
addFile(fl, diskURL, NULL);
2252 diskURL =
_free(diskURL);
2261 int installSpecialDoc,
int test)
2272 const char *fileName;
2275 AttrRec specialDocAttrRec = &arbuf;
2276 char *specialDoc = NULL;
2283 char *saveptr = NULL;
2286 char *token = strtok_r(filesFiles,
",", &saveptr);
2294 if (*token ==
'/') {
2303 fd =
Fopen(ffn,
"r.fpio");
2305 if (fd == NULL ||
Ferror(fd)) {
2307 _(
"Could not open %%files file %s: %s\n"),
2315 while (fgets(buf, (
int)
sizeof(buf), f)) {
2325 }
while((token = strtok_r(NULL,
",", &saveptr)) != NULL);
2326 filesFiles =
_free(filesFiles);
2330 memset(&fl, 0,
sizeof(fl));
2367 #if defined(RPM_VENDOR_OPENPKG) 2391 for (fp = files; *fp != NULL; fp++) {
2399 strncpy(buf, s,
sizeof(buf)-1);
2400 buf[
sizeof(buf)-1] =
'\0';
2420 for (i = 0; i < fl.
nLangs; i++)
2446 if (fileName == NULL)
2451 specialDoc =
_free(specialDoc);
2452 specialDoc =
xstrdup(fileName);
2471 if (installSpecialDoc) {
2472 int _missing_doc_files_terminate_build =
2477 if (rc !=
RPMRC_OK && _missing_doc_files_terminate_build)
2495 for (i = 0; i < fl.
nLangs; i++)
2510 specialDoc =
_free(specialDoc);
2521 "PartialHardlinkSets",
"4.0.4-1");
2539 for (i = 0; i < fl.
nLangs; i++)
2558 static rpmTag classTag = 0xffffffff;
2562 if (classTag == 0xffffffff)
2596 #if defined(RPM_VENDOR_OPENPKG) 2606 if (classTag == he->
tag && he->
p.
ptr != NULL)
2623 for (i = 0; i < spec->
nfoo; i++) {
2624 const char * str = spec->
foo[i].str;
2629 if (str == NULL || iob == NULL)
2635 if (!(he->
p.
str != NULL && he->
p.
str[0] !=
'\0')) {
2651 he->
p.
argv = (
const char **) &s;
2663 if (sfp != NULL && *sfp != NULL)
2672 for (srcPtr = spec->
sources; srcPtr != NULL; srcPtr = srcPtr->
next) {
2676 #
if defined(RPM_VENDOR_OPENPKG)
2739 rpmiob sourceFiles, *sfp = &sourceFiles;
2746 char _srcdefattr_buf[BUFSIZ];
2747 char * _srcdefattr =
rpmExpand(
"%{?_srcdefattr}", NULL);
2754 memset(&fl, 0,
sizeof(fl));
2755 if (_srcdefattr && *_srcdefattr) {
2756 xx =
snprintf(_srcdefattr_buf,
sizeof(_srcdefattr_buf),
"%%defattr %s", _srcdefattr);
2757 _srcdefattr_buf[
sizeof(_srcdefattr_buf)-1] =
'\0';
2773 for (fp = files; *fp != NULL; fp++) {
2774 const char *
diskURL, *diskPath;
2786 if (*diskURL ==
'!') {
2791 (void)
urlPath(diskURL, &diskPath);
2794 diskPath = strrchr(diskPath,
'/');
2805 diskURL, strerror(
errno));
2809 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_MANDRIVA) 2812 flp->fl_mode &= S_IFMT;
2844 _srcdefattr =
_free(_srcdefattr);
2859 static const char * av_ckfile[] = {
"%{?__check_files}", NULL };
2861 rpmiob iob_stdout = NULL;
2877 for (pkg = spec->
packages; pkg != NULL; pkg = pkg->
next) {
2902 rc =
rpmfcExec(av_ckfile, fileList, &iob_stdout, 0);
2907 int _unpackaged_files_terminate_build =
2912 if ((*t !=
'\0') && (*t !=
'\n')) {
2913 rc = (_unpackaged_files_terminate_build) ? 1 : 0;
2915 _(
"Installed (but unpackaged) file(s) found:\n%s"), t);
2929 size_t buildrootL,
int _duplicate_files_terminate_build)
2935 const char *fn1, *fn2;
2948 if (strcmp(fn1, fn2))
2959 const char *N1, *N2;
2968 _(
"File(s) packaged into both %s and %s:\n%s"),
2985 int _duplicate_files_terminate_build)
3000 if (fi1 == NULL)
continue;
3002 for (pkg2 = pkg1->
next; pkg2; pkg2 = pkg2->
next) {
3008 if (fi2 == NULL)
continue;
3010 n +=
fiIntersect(fi1, fi2, buildrootL, _duplicate_files_terminate_build);
3026 return rpmbfChk(
rpmfiFNBF(pkg->
fi), d, strlen(d));
3043 char **unpackaged = NULL;
3064 while ((p = strchr(p + 1,
'/'))) {
3075 while ((p = strchr(p + 1,
'/'))) {
3083 for (j = 0; j < n; j++)
3084 if (strcmp(fn, unpackaged[j]) == 0) {
3092 unpackaged =
xrealloc(unpackaged,
sizeof(*unpackaged) * (n + 1));
3093 unpackaged[n++] =
xstrdup(fn);
3107 for (i = 0; i < n; i++) {
3109 list =
rpmiobAppend(list, unpackaged[i]+buildrootL, 1);
3110 unpackaged[i] =
_free(unpackaged[i]);
3112 unpackaged =
_free(unpackaged);
3115 _(
"Unpackaged subdir(s) in %s:\n%s"),
3149 short failed_once = 0;
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 if (failed_once == 1)
3199 int _duplicate_files_terminate_build =
3201 int _unpackaged_subdirs_terminate_build =
3206 _duplicate_files_terminate_build)
3209 _unpackaged_subdirs_terminate_build)
int headerMacrosUnload(Header h)
Define per-header macros.
static rpmRC processMetadataFile(Package pkg, FileList fl, const char *fileURL, rpmTag tag)
Add a pubkey/policy/icon to a binary package.
int rpmfiSetHeader(rpmfi fi, Header h)
Link a header to a file info set.
static rpmRC parseForAttr(char *buf, FileList fl)
Parse attr and defattr from file manifest.
FTS * Fts_open(char *const *argv, int options, int(*compar)(const FTSENT **, const FTSENT **))
Create a handle for file hierarchy traversal.
static char * strtokWithQuotes(char *s, const char *delim)
Strip quotes from strtok(3) string.
static void * fdGetFp(FD_t fd)
enum urltype_e urltype
Supported URL types.
rpmRC processBinaryFiles(Spec spec, int installSpecialDoc, int test)
Post-build processing for binary package(s).
enum specdFlags_e specdFlags
Structures used for an "rpmte" transaction element.
char * xstrdup(const char *str)
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
Package file tree walk data.
rpmsx rpmsxFree(rpmsx sx)
Destroy a SELinux wrapper.
int Stat(const char *path, struct stat *st)
stat(2) clone.
static rpmRC genCpioListAndHeader(FileList fl, rpmfi *fip, Header h, int isSrc)
Add file entries to header.
size_t rpmfiFNMaxLen(rpmfi fi)
Return maximum file name length from file info set.
void * rpmfiFNBF(rpmfi fi)
Return FN Bloom filter from file info set.
char * pgpArmorWrap(rpmuint8_t atype, const unsigned char *s, size_t ns)
Wrap a OpenPGP packets in ascii armor for transport.
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
const char * rpmfiFN(rpmfi fi)
Return current file name from file info set.
unsigned short rpmuint16_t
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
int dodigest(int dalgo, const char *fn, unsigned char *digest, unsigned dflags, size_t *fsizep)
Return digest and size of a file.
static void rpmlog(int code, const char *fmt,...)
static int pkgUnpackagedSubdirs(Package pkg, size_t buildrootL, int _unpackaged_subdirs_terminate_build)
const char * getUnameS(const char *uname)
Return cached user name.
static int checkDuplicateFiles(Spec spec, size_t buildrootL, int _duplicate_files_terminate_build)
Check if the same files are packaged into a few sub-packages.
rpmfi rpmfiNew(const void *_ts, Header h, rpmTag tagN, int flags)
Create and load a file info set.
rpmiob rpmiobAppend(rpmiob iob, const char *s, size_t nl)
Append string to I/O buffer.
struct FileList_s * FileList
Package file tree walk data.
static rpmRC recurseDir(FileList fl, const char *diskURL)
Add directory (and all of its files) to the package manifest.
char * headerSprintf(Header h, const char *fmt, headerTagTableEntry tags, headerSprintfExtension exts, errmsg_t *errmsg)
Return formatted output string from header tags.
const char * getUname(uid_t uid)
Return cached user name from user id.
const char * getSourceDir(rpmfileAttrs attr)
Return the macro directory location from source file flags.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
static rpmRC processPackageFiles(Spec spec, Package pkg, int installSpecialDoc, int test)
struct rpmte_s * rpmte
An element of a transaction set, i.e.
rpmTag tagValue(const char *tagstr)
Return tag value from name.
int rpmiobSlurp(const char *fn, rpmiob *iobp)
static int seenHardLink(FileList fl, FileListRec flp, ino_t *fileid)
static int dncmp(const void *a, const void *b)
specdFlags currentSpecdFlags
static int fiIntersect(rpmfi fi1, rpmfi fi2, size_t buildrootL, int _duplicate_files_terminate_build)
pgpArmor pgpReadPkts(const char *fn, rpmuint8_t **pkt, size_t *pktlen)
Parse armored OpenPGP packets from a file.
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
static rpmRC processBinaryFile(Package pkg, FileList fl, const char *fileURL)
Add a file to a binary package.
const char * Fstrerror(FD_t fd)
strerror(3) clone.
void * xcalloc(size_t nmemb, size_t size)
static int isHardLink(FileListRec flp, FileListRec tlp)
static rpmuint32_t getDigestAlgo(Header h, int isSrc)
struct AttrRec_s * AttrRec
unsigned char rpmuint8_t
Private int typedefs to avoid C99 portability issues.
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
rpmuint16_t rpmfiFMode(rpmfi fi)
Return current file mode from file info set.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
static int packagedDir(Package pkg, const char *d)
const char ** currentLangs
const char * getGname(gid_t gid)
Return cached group name from group id.
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
int rpmfcExec(ARGV_t av, rpmiob iob_stdin, rpmiob *iob_stdoutp, int failnonzero)
static VFA_t verifyAttrs[]
int Glob_pattern_p(const char *pattern, int quote)
glob_pattern_p(3) clone.
int headerMacrosLoad(Header h)
Define per-header macros.
static void compressFilelist(Header h)
Convert absolute path tag to (dirname,basename,dirindex) tags.
The FD_t File Handle data structure.
const char * rpmGenPath(const char *urlroot, const char *urlmdir, const char *urlfile)
Merge 3 args into path, any or all of which may be a url.
static rpmRC parseForVerify(char *buf, FileList fl)
Parse verify and defverify from file manifest.
int xstrcasecmp(const char *s1, const char *s2)
Locale insensitive strcasecmp(3).
The structure used to store values parsed from a spec file.
FTSENT * Fts_read(FTS *sp)
Return next node in the file hierarchy traversal.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
static VFA_t virtualFileAttributes[]
int Fclose(FD_t fd)
fclose(3) clone.
static rpmRC parseForSimple(Spec spec, Package pkg, char *buf, FileList fl, const char **fileName)
Parse simple attributes (e.g.
static rpmRC parseForConfig(char *buf, FileList fl)
Parse config from file manifest.
rpmiob rpmiobNew(size_t len)
Create an I/O buffer.
static int checkUnpackagedSubdirs(Spec spec, size_t buildrootL, int _unpackaged_subdirs_terminate_build)
Check for unpackaged subdirectories.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
static int compareFileListRecs(const void *ap, const void *bp)
int processSourceFiles(Spec spec)
Post-build processing for source package.
Routines to read and write packages.
static int isDoc(FileList fl, const char *fileName)
Test if file is located in a docdir.
static rpmRC parseForLang(char *buf, FileList fl)
Parse lang from file manifest.
const char * getGnameS(const char *gname)
Return cached group name.
int Readlink(const char *path, char *buf, size_t bufsiz)
readlink(2) clone.
static void nullAttrRec(AttrRec ar)
#define isAttrDefault(_ars)
enum rpmRC_e rpmRC
RPM return codes.
static int langCmp(const void *ap, const void *bp)
int Ferror(FD_t fd)
ferror(3) clone.
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
rpmfi rpmfiInit(rpmfi fi, int fx)
Initialize file iterator index.
static int xisdigit(int c)
const char * docDirs[1024]
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
static int snprintf(char *buf, int nb, const char *fmt,...)
This is the only module users of librpmbuild should need to include.
rpmfi rpmfiLink(rpmfi fi, const char *msg)
Reference a file info set instance.
struct FileListRec_s * FileListRec
rpmRC doScript(Spec spec, int what, const char *name, rpmiob iob, int test)
Run a build script, assembled from spec file scriptlet section.
char * stpcpy(char *dest, const char *src)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static void timeCheck(int tc, Header h)
static FileListRec freeFileList(FileListRec fileList, int count)
static void freeAttrRec(AttrRec ar)
rpmRC processScriptFiles(Spec spec, Package pkg)
Append files (if any) to scriptlet tags.
static void dupAttrRec(const AttrRec oar, AttrRec nar)
rpmsx rpmsxNew(const char *fn, unsigned int flags)
Create and load a SELinux wrapper.
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
int Fts_close(FTS *sp)
Destroy a file hierarchy traversal handle.
int expandMacros(void *spec, MacroContext mc, char *sbuf, size_t slen)
Expand macro into buffer.
rpmuint32_t hashFunctionString(rpmuint32_t h, const void *data, size_t size)
Return hash value of a string.
File state machine to handle archive I/O and system call's.
The structure used to store values for a package.
static int checkUnpackagedFiles(Spec spec)
Check for unpackaged files against what's in the build root.
rpmRC rpmfcGenerateDepends(void *_spec, void *_pkg)
Generate package dependencies.
unsigned currentVerifyFlags
static int checkHardLinks(FileList fl)
Verify that file attributes scope over hardlinks correctly.
static rpmRC parseForDev(char *buf, FileList fl)
Parse dev from file manifest.
const char * rpmsxMatch(rpmsx sx, const char *fn, mode_t mode)
Return security context for a file.
void handleComments(char *s)
Truncate comment lines.
static int parseForRegexLang(const char *fileName, char **lang)
static struct AttrRec_s root_ar
const char * buildRootURL
int initSourceHeader(Spec spec, rpmiob *sfp)
Create and initialize header for source package.
void providePackageNVR(Header h)
Retrofit an explicit Provides: N = E:V-R dependency into package headers.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
static int addFile(FileList fl, const char *diskURL, struct stat *statp)
Add a file to the package manifest.
int rpmlibNeedsFeature(Header h, const char *feature, const char *featureEVR)
Add rpmlib feature dependency.