-#include "config.h"
-#ifdef HAVE_GLOB_H
-# include <glob.h>
-#else
-# include "misc-glob.h"
-#endif
+#include "system.h"
-#include <string.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <sys/types.h>
#include <regex.h>
+#include <signal.h> /* getOutputFrom() */
+#include <time.h>
#include "spec.h"
#include "package.h"
#include "messages.h"
#include "macro.h"
#include "build.h"
+#include "read.h"
+#include "reqprov.h"
#define MAXDOCDIR 1024
int fileListRecsUsed;
};
+#ifdef DYING
static int processPackageFiles(Spec spec, Package pkg,
int installSpecialDoc, int test);
static void freeFileList(struct FileListRec *fileList, int count);
struct cpioFileMapping **cpioList,
int *cpioCount, Header h, int isSrc);
static char *strtokWithQuotes(char *s, char *delim);
+#endif
-int processSourceFiles(Spec spec)
+/* glob_pattern_p() taken from bash
+ * Copyright (C) 1985, 1988, 1989 Free Software Foundation, Inc.
+ *
+ * Return nonzero if PATTERN has any special globbing chars in it.
+ */
+static int myGlobPatternP (char *pattern)
{
- struct Source *srcPtr;
- char buf[BUFSIZ];
- StringBuf sourceFiles;
- int x, isSpec = 1;
- struct FileList fl;
- char *s, **files, **fp, *fn;
- struct stat sb;
- HeaderIterator hi;
- int tag, type, count;
- Package pkg;
- void * ptr;
+ register char *p = pattern;
+ register char c;
+ int open = 0;
+
+ while ((c = *p++) != '\0')
+ switch (c) {
+ case '?':
+ case '*':
+ return (1);
+ case '[': /* Only accept an open brace if there is a close */
+ open++; /* brace to match it. Bracket expressions must be */
+ continue; /* complete, according to Posix.2 */
+ case ']':
+ if (open)
+ return (1);
+ continue;
+ case '\\':
+ if (*p++ == '\0')
+ return (0);
+ }
- sourceFiles = newStringBuf();
- spec->sourceHeader = headerNew();
+ return (0);
+}
- /* Only specific tags are added to the source package header */
- hi = headerInitIterator(spec->packages->header);
- while (headerNextIterator(hi, &tag, &type, &ptr, &count)) {
- switch (tag) {
- case RPMTAG_NAME:
- case RPMTAG_VERSION:
- case RPMTAG_RELEASE:
- case RPMTAG_SERIAL:
- case RPMTAG_SUMMARY:
- case RPMTAG_DESCRIPTION:
- case RPMTAG_PACKAGER:
- case RPMTAG_DISTRIBUTION:
- case RPMTAG_VENDOR:
- case RPMTAG_COPYRIGHT:
- case RPMTAG_GROUP:
- case RPMTAG_OS:
- case RPMTAG_ARCH:
- case RPMTAG_CHANGELOGTIME:
- case RPMTAG_CHANGELOGNAME:
- case RPMTAG_CHANGELOGTEXT:
- case RPMTAG_URL:
- case HEADER_I18NTABLE:
- headerAddEntry(spec->sourceHeader, tag, type, ptr, count);
- break;
- default:
- /* do not copy */
- break;
- }
- if (type == RPM_STRING_ARRAY_TYPE || type == RPM_I18NSTRING_TYPE) {
- FREE(ptr);
- }
- }
- headerFreeIterator(hi);
+static int glob_error(const char *foo, int bar)
+{
+ return 1;
+}
- /* Construct the file list and source entries */
- appendLineStringBuf(sourceFiles, spec->specFile);
- srcPtr = spec->sources;
- while (srcPtr) {
- if (srcPtr->flags & RPMBUILD_ISSOURCE) {
- headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_SOURCE,
- RPM_STRING_ARRAY_TYPE, &srcPtr->source, 1);
- if (srcPtr->flags & RPMBUILD_ISNO) {
- headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_NOSOURCE,
- RPM_INT32_TYPE, &srcPtr->num, 1);
- }
- }
- if (srcPtr->flags & RPMBUILD_ISPATCH) {
- headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_PATCH,
- RPM_STRING_ARRAY_TYPE, &srcPtr->source, 1);
- if (srcPtr->flags & RPMBUILD_ISNO) {
- headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_NOPATCH,
- RPM_INT32_TYPE, &srcPtr->num, 1);
- }
- }
- sprintf(buf, "%s%s/%s",
- srcPtr->flags & RPMBUILD_ISNO ? "!" : "",
- rpmGetVar(RPMVAR_SOURCEDIR), srcPtr->source);
- appendLineStringBuf(sourceFiles, buf);
- srcPtr = srcPtr->next;
- }
+/* strtokWithQuotes() modified from glibc strtok() */
+/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
- pkg = spec->packages;
- while (pkg) {
- srcPtr = pkg->icon;
- while (srcPtr) {
- sprintf(buf, "%s%s/%s",
- srcPtr->flags & RPMBUILD_ISNO ? "!" : "",
- rpmGetVar(RPMVAR_SOURCEDIR), srcPtr->source);
- appendLineStringBuf(sourceFiles, buf);
- srcPtr = srcPtr->next;
- }
- pkg = pkg->next;
- }
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
- spec->sourceCpioList = NULL;
- spec->sourceCpioCount = 0;
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
- fl.fileList = malloc((spec->numSources + 1) * sizeof(struct FileListRec));
- fl.processingFailed = 0;
- fl.fileListRecsUsed = 0;
- fl.totalFileSize = 0;
- fl.prefix = NULL;
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If
+ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
- s = getStringBuf(sourceFiles);
- files = splitString(s, strlen(s), '\n');
- fp = files;
+static char *strtokWithQuotes(char *s, char *delim)
+{
+ static char *olds = NULL;
+ char *token;
- /* The first source file is the spec file */
- x = 0;
- while (*fp) {
- s = *fp;
- SKIPSPACE(s);
- if (! *s) {
- fp++; continue;
- }
+ if (s == NULL) {
+ s = olds;
+ }
- fl.fileList[x].flags = isSpec ? RPMFILE_SPECFILE : 0;
- /* files with leading ! are no source files */
- if (*s == '!') {
- fl.fileList[x].flags |= RPMFILE_GHOST;
- s++;
- }
- fl.fileList[x].diskName = strdup(s);
- fn = strrchr(s, '/');
- if (fn) {
- fn++;
- } else {
- fn = s;
- }
- fl.fileList[x].fileName = strdup(fn);
- fl.fileList[x].verifyFlags = RPMVERIFY_ALL;
- stat(s, &sb);
- fl.fileList[x].mode = sb.st_mode;
- fl.fileList[x].uid = sb.st_uid;
- fl.fileList[x].gid = sb.st_gid;
- fl.fileList[x].uname = getUname(sb.st_uid);
- fl.fileList[x].gname = getGname(sb.st_gid);
- fl.fileList[x].size = sb.st_size;
- fl.fileList[x].mtime = sb.st_mtime;
- fl.fileList[x].rdev = sb.st_rdev;
- fl.fileList[x].device = sb.st_dev;
- fl.fileList[x].inode = sb.st_ino;
- fl.fileList[x].lang = strdup("");
-
- fl.totalFileSize += sb.st_size;
-
- if (! (fl.fileList[x].uname && fl.fileList[x].gname)) {
- rpmError(RPMERR_BADSPEC, "Bad owner/group: %s", s);
- fl.processingFailed = 1;
- }
+ /* Skip leading delimiters */
+ s += strspn(s, delim);
+ if (*s == '\0') {
+ return NULL;
+ }
- isSpec = 0;
- fp++;
- x++;
+ /* Find the end of the token. */
+ token = s;
+ if (*token == '"') {
+ token++;
+ /* Find next " char */
+ s = strchr(token, '"');
+ } else {
+ s = strpbrk(token, delim);
}
- fl.fileListRecsUsed = x;
- freeSplitString(files);
- if (! fl.processingFailed) {
- genCpioListAndHeader(&fl, &(spec->sourceCpioList),
- &(spec->sourceCpioCount), spec->sourceHeader, 1);
+ /* Terminate it */
+ if (s == NULL) {
+ /* This token finishes the string */
+ olds = strchr(token, '\0');
+ } else {
+ /* Terminate the token and make olds point past it */
+ *s = '\0';
+ olds = s+1;
}
- freeStringBuf(sourceFiles);
- freeFileList(fl.fileList, fl.fileListRecsUsed);
- return fl.processingFailed;
+ return token;
}
-int processBinaryFiles(Spec spec, int installSpecialDoc, int test)
+static void timeCheck(int tc, Header h)
{
- Package pkg;
- int res, rc;
- char *name;
+ int *mtime;
+ char **file;
+ int count, x, currentTime;
+
+ headerGetEntry(h, RPMTAG_FILENAMES, NULL, (void **) &file, &count);
+ headerGetEntry(h, RPMTAG_FILEMTIMES, NULL, (void **) &mtime, NULL);
+
+ currentTime = time(NULL);
- pkg = spec->packages;
- res = 0;
- while (pkg) {
- if (!pkg->fileList) {
- pkg = pkg->next;
- continue;
+ x = 0;
+ while (x < count) {
+ if (currentTime - mtime[x] > tc) {
+ rpmMessage(RPMMESS_WARNING, "TIMECHECK failure: %s\n", file[x]);
}
+ x++;
+ }
+}
- headerGetEntry(pkg->header, RPMTAG_NAME, NULL, (void **)&name, NULL);
- rpmMessage(RPMMESS_NORMAL, "Processing files: %s\n", name);
-
- if ((rc = processPackageFiles(spec, pkg, installSpecialDoc, test))) {
- res = rc;
+static int parseForVerify(char *buf, struct FileList *fl)
+{
+ char *p, *start, *end, *name;
+ char ourbuf[BUFSIZ];
+ int not, verifyFlags;
+ int *resultVerify;
+
+ if (!(p = start = strstr(buf, "%verify"))) {
+ if (!(p = start = strstr(buf, "%defverify"))) {
+ return 0;
}
+ name = "%defverify";
+ resultVerify = &(fl->defVerifyFlags);
+ p += 10;
+ } else {
+ name = "%verify";
+ resultVerify = &(fl->currentVerifyFlags);
+ p += 7;
+ }
- generateAutoReqProv(spec, pkg, pkg->cpioList, pkg->cpioCount);
- printReqs(spec, pkg);
-
- pkg = pkg->next;
+ SKIPSPACE(p);
+
+ if (*p != '(') {
+ rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
}
+ p++;
- return res;
-}
+ end = p;
+ while (*end && *end != ')') {
+ end++;
+ }
-static int processPackageFiles(Spec spec, Package pkg,
- int installSpecialDoc, int test)
-{
- struct FileList fl;
- char *s, **files, **fp, *fileName;
- char buf[BUFSIZ];
- FILE *f;
+ if (! *end) {
+ rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
- struct AttrRec specialDocAttrRec;
- char *specialDoc = NULL;
-
- pkg->cpioList = NULL;
- pkg->cpioCount = 0;
+ strncpy(ourbuf, p, end-p);
+ ourbuf[end-p] = '\0';
+ while (start <= end) {
+ *start++ = ' ';
+ }
- if (pkg->fileFile) {
- if (spec->buildSubdir) {
- sprintf(buf, "%s/%s/%s", rpmGetVar(RPMVAR_BUILDDIR),
- spec->buildSubdir, pkg->fileFile);
+ p = strtok(ourbuf, ", \n\t");
+ not = 0;
+ verifyFlags = RPMVERIFY_NONE;
+ while (p) {
+ if (!strcmp(p, "not")) {
+ not = 1;
+ } else if (!strcmp(p, "md5")) {
+ verifyFlags |= RPMVERIFY_MD5;
+ } else if (!strcmp(p, "size")) {
+ verifyFlags |= RPMVERIFY_FILESIZE;
+ } else if (!strcmp(p, "link")) {
+ verifyFlags |= RPMVERIFY_LINKTO;
+ } else if (!strcmp(p, "user")) {
+ verifyFlags |= RPMVERIFY_USER;
+ } else if (!strcmp(p, "group")) {
+ verifyFlags |= RPMVERIFY_GROUP;
+ } else if (!strcmp(p, "mtime")) {
+ verifyFlags |= RPMVERIFY_MTIME;
+ } else if (!strcmp(p, "mode")) {
+ verifyFlags |= RPMVERIFY_MODE;
+ } else if (!strcmp(p, "rdev")) {
+ verifyFlags |= RPMVERIFY_RDEV;
} else {
- sprintf(buf, "%s/%s", rpmGetVar(RPMVAR_BUILDDIR), pkg->fileFile);
- }
- if ((f = fopen(buf, "r")) == NULL) {
- rpmError(RPMERR_BADFILENAME,
- "Could not open %%files file: %s", pkg->fileFile);
- return RPMERR_BADFILENAME;
- }
- while (fgets(buf, sizeof(buf), f)) {
- handleComments(buf);
- if (expandMacros(spec, &spec->macros, buf, sizeof(buf))) {
- rpmError(RPMERR_BADSPEC, "line: %s", buf);
- return RPMERR_BADSPEC;
- }
- appendStringBuf(pkg->fileList, buf);
+ rpmError(RPMERR_BADSPEC, "Invalid %s token: %s", name, p);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
}
- fclose(f);
+ p = strtok(NULL, ", \n\t");
}
-
- /* Init the file list structure */
-
- fl.buildRoot = spec->buildRoot ? spec->buildRoot : "";
- if (headerGetEntry(pkg->header, RPMTAG_DEFAULTPREFIX,
- NULL, (void *)&fl.prefix, NULL)) {
- fl.prefix = strdup(fl.prefix);
+
+ *resultVerify = not ? ~(verifyFlags) : verifyFlags;
+
+ return 0;
+}
+
+static int parseForAttr(char *buf, struct FileList *fl)
+{
+ char *p, *s, *start, *end, *name;
+ char ourbuf[1024];
+ int x, defattr = 0;
+ struct AttrRec *resultAttr;
+
+ if (!(p = start = strstr(buf, "%attr"))) {
+ if (!(p = start = strstr(buf, "%defattr"))) {
+ return 0;
+ }
+ defattr = 1;
+ name = "%defattr";
+ resultAttr = &(fl->def);
+ p += 8;
} else {
- fl.prefix = NULL;
+ name = "%attr";
+ resultAttr = &(fl->current);
+ p += 5;
}
- fl.fileCount = 0;
- fl.totalFileSize = 0;
- fl.processingFailed = 0;
+ resultAttr->PmodeString = resultAttr->Uname = resultAttr->Gname = NULL;
- fl.passedSpecialDoc = 0;
-
- fl.current.PmodeString = NULL;
- fl.current.PdirmodeString = NULL;
- fl.current.Uname = NULL;
- fl.current.Gname = NULL;
- fl.def.PmodeString = NULL;
- fl.def.PdirmodeString = NULL;
- fl.def.Uname = NULL;
- fl.def.Gname = NULL;
- fl.def.Pmode = 0;
- fl.def.Pdirmode = 0;
- fl.currentLang = NULL;
+ SKIPSPACE(p);
- fl.defVerifyFlags = RPMVERIFY_ALL;
+ if (*p != '(') {
+ rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ p++;
- fl.docDirCount = 0;
- fl.docDirs[fl.docDirCount++] = strdup("/usr/doc");
- fl.docDirs[fl.docDirCount++] = strdup("/usr/man");
- fl.docDirs[fl.docDirCount++] = strdup("/usr/info");
- fl.docDirs[fl.docDirCount++] = strdup("/usr/X11R6/man");
- fl.docDirs[fl.docDirCount++] = strdup(spec->docDir);
-
- fl.fileList = NULL;
- fl.fileListRecsAlloced = 0;
- fl.fileListRecsUsed = 0;
+ end = p;
+ while (*end && *end != ')') {
+ end++;
+ }
- s = getStringBuf(pkg->fileList);
- files = splitString(s, strlen(s), '\n');
- fp = files;
+ if (! *end) {
+ rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
- while (*fp) {
- s = *fp;
+ if (defattr) {
+ s = end;
+ s++;
SKIPSPACE(s);
- if (! *s) {
- fp++; continue;
- }
- fileName = NULL;
- strcpy(buf, s);
-
- /* Reset for a new line in %files */
- fl.isDir = 0;
- fl.inFtw = 0;
- fl.currentFlags = 0;
- fl.currentVerifyFlags = fl.defVerifyFlags;
- fl.current.Pmode = fl.def.Pmode;
- fl.current.Pdirmode = fl.def.Pdirmode;
- fl.isSpecialDoc = 0;
- FREE(fl.current.PmodeString);
- FREE(fl.current.PdirmodeString);
- FREE(fl.current.Uname);
- FREE(fl.current.Gname);
- FREE(fl.currentLang);
- if (fl.def.PmodeString) {
- fl.current.PmodeString = strdup(fl.def.PmodeString);
- }
- if (fl.def.PdirmodeString) {
- fl.current.PdirmodeString = strdup(fl.def.PdirmodeString);
- }
- if (fl.def.Uname) {
- fl.current.Uname = strdup(fl.def.Uname);
- }
- if (fl.def.Gname) {
- fl.current.Gname = strdup(fl.def.Gname);
+ if (*s) {
+ rpmError(RPMERR_BADSPEC,
+ "No files after %%defattr(): %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
}
+ }
- if (parseForVerify(buf, &fl)) {
- fp++; continue;
- }
- if (parseForAttr(buf, &fl)) {
- fp++; continue;
- }
- if (parseForConfig(buf, &fl)) {
- fp++; continue;
- }
- if (parseForLang(buf, &fl)) {
- fp++; continue;
- }
- if (parseForSimple(spec, pkg, buf, &fl, &fileName)) {
- fp++; continue;
- }
- if (! fileName) {
- fp++; continue;
- }
+ strncpy(ourbuf, p, end-p);
+ ourbuf[end-p] = '\0';
- if (fl.isSpecialDoc) {
- /* Save this stuff for last */
- specialDoc = strdup(fileName);
- specialDocAttrRec = fl.current;
- if (specialDocAttrRec.PmodeString) {
- specialDocAttrRec.PmodeString =
- strdup(specialDocAttrRec.PmodeString);
- }
- if (specialDocAttrRec.PdirmodeString) {
- specialDocAttrRec.PdirmodeString =
- strdup(specialDocAttrRec.PdirmodeString);
- }
- if (specialDocAttrRec.Uname) {
- specialDocAttrRec.Uname = strdup(specialDocAttrRec.Uname);
- }
- if (specialDocAttrRec.Gname) {
- specialDocAttrRec.Gname = strdup(specialDocAttrRec.Gname);
- }
+ resultAttr->PmodeString = strtok(ourbuf, ", \n\t");
+ resultAttr->Uname = strtok(NULL, ", \n\t");
+ resultAttr->Gname = strtok(NULL, ", \n\t");
+ resultAttr->PdirmodeString = strtok(NULL, ", \n\t");
+
+ if (! (resultAttr->PmodeString &&
+ resultAttr->Uname && resultAttr->Gname)) {
+ rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ resultAttr->PmodeString = resultAttr->Uname = resultAttr->Gname = NULL;
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+
+ /* Do a quick test on the mode argument and adjust for "-" */
+ if (!strcmp(resultAttr->PmodeString, "-")) {
+ resultAttr->PmodeString = NULL;
+ } else {
+ x = sscanf(resultAttr->PmodeString, "%o", &(resultAttr->Pmode));
+ if ((x == 0) || (resultAttr->Pmode >> 12)) {
+ rpmError(RPMERR_BADSPEC, "Bad %s() mode spec: %s", name, buf);
+ resultAttr->PmodeString = resultAttr->Uname =
+ resultAttr->Gname = NULL;
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ resultAttr->PmodeString = strdup(resultAttr->PmodeString);
+ }
+ if (resultAttr->PdirmodeString) {
+ /* The processing here is slightly different to maintain */
+ /* compatibility with old spec files. */
+ if (!strcmp(resultAttr->PdirmodeString, "-")) {
+ resultAttr->PdirmodeString = strdup(resultAttr->PdirmodeString);
} else {
- processBinaryFile(pkg, &fl, fileName);
+ x = sscanf(resultAttr->PdirmodeString, "%o",
+ &(resultAttr->Pdirmode));
+ if ((x == 0) || (resultAttr->Pdirmode >> 12)) {
+ rpmError(RPMERR_BADSPEC,
+ "Bad %s() dirmode spec: %s", name, buf);
+ resultAttr->PmodeString = resultAttr->Uname =
+ resultAttr->Gname = resultAttr->PdirmodeString = NULL;
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ resultAttr->PdirmodeString = strdup(resultAttr->PdirmodeString);
}
-
- fp++;
+ }
+ if (!strcmp(resultAttr->Uname, "-")) {
+ resultAttr->Uname = NULL;
+ } else {
+ resultAttr->Uname = strdup(resultAttr->Uname);
+ }
+ if (!strcmp(resultAttr->Gname, "-")) {
+ resultAttr->Gname = NULL;
+ } else {
+ resultAttr->Gname = strdup(resultAttr->Gname);
+ }
+
+ /* Set everything we just parsed to blank spaces */
+ while (start <= end) {
+ *start++ = ' ';
}
- /* Now process special doc, if there is one */
- if (specialDoc) {
- if (installSpecialDoc) {
- doScript(spec, RPMBUILD_STRINGBUF, "%doc", pkg->specialDoc, test);
+ return 0;
+}
+
+static int parseForConfig(char *buf, struct FileList *fl)
+{
+ char *p, *start, *end;
+ char ourbuf[1024];
+
+ if (!(p = start = strstr(buf, "%config"))) {
+ return 0;
+ }
+ fl->currentFlags = RPMFILE_CONFIG;
+
+ p += 7;
+ SKIPSPACE(p);
+
+ if (*p != '(') {
+ while (start < p) {
+ *start++ = ' ';
}
+ return 0;
+ }
+ p++;
- /* fl.current now takes on "ownership" of the specialDocAttrRec */
- /* allocated string data. */
- fl.current = specialDocAttrRec;
- fl.isDir = 0;
- fl.inFtw = 0;
- fl.currentFlags = 0;
- fl.currentVerifyFlags = 0;
- processBinaryFile(pkg, &fl, specialDoc);
- FREE(specialDoc);
+ end = p;
+ while (*end && *end != ')') {
+ end++;
+ }
+
+ if (! *end) {
+ rpmError(RPMERR_BADSPEC, "Bad %%config() syntax: %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+
+ strncpy(ourbuf, p, end-p);
+ ourbuf[end-p] = '\0';
+ while (start <= end) {
+ *start++ = ' ';
+ }
+
+ p = strtok(ourbuf, ", \n\t");
+ while (p) {
+ if (!strcmp(p, "missingok")) {
+ fl->currentFlags |= RPMFILE_MISSINGOK;
+ } else if (!strcmp(p, "noreplace")) {
+ fl->currentFlags |= RPMFILE_NOREPLACE;
+ } else {
+ rpmError(RPMERR_BADSPEC, "Invalid %%config token: %s", p);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ p = strtok(NULL, ", \n\t");
}
+
+ return 0;
+}
+
+static int parseForLang(char *buf, struct FileList *fl)
+{
+ char *p, *start, *end;
+ char ourbuf[1024];
+
+ if (!(p = start = strstr(buf, "%lang"))) {
+ return 0;
+ }
+
+ p += 5;
+ SKIPSPACE(p);
+
+ if (*p != '(') {
+ rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ p++;
+
+ end = p;
+ while (*end && *end != ')') {
+ end++;
+ }
+
+ if (! *end) {
+ rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+
+ strncpy(ourbuf, p, end-p);
+ ourbuf[end-p] = '\0';
+ while (start <= end) {
+ *start++ = ' ';
+ }
+
+ p = strtok(ourbuf, ", \n\t");
+ if (!p) {
+ rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ if (strlen(p) != 2) {
+ rpmError(RPMERR_BADSPEC, "%%lang() entries are 2 characters: %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ if (strtok(NULL, ", \n\t")) {
+ rpmError(RPMERR_BADSPEC, "Only one entry in %%lang(): %s", buf);
+ fl->processingFailed = 1;
+ return RPMERR_BADSPEC;
+ }
+ fl->currentLang = strdup(p);
- freeSplitString(files);
+ return 0;
+}
- if (! fl.processingFailed) {
- genCpioListAndHeader(&fl, &(pkg->cpioList), &(pkg->cpioCount),
- pkg->header, 0);
+static int parseForRegexLang(char *fileName, char **lang)
+{
+ static int initialized = 0;
+ static int hasRegex = 0;
+ static regex_t compiledPatt;
+ static char buf[BUFSIZ];
+ int x;
+ regmatch_t matches[2];
+ char *patt, *s;
- if (spec->timeCheck) {
- timeCheck(spec->timeCheck, pkg->header);
+ if (! initialized) {
+ initialized = 1;
+ patt = rpmGetVar(RPMVAR_LANGPATT);
+ if (! patt) {
+ return 1;
+ }
+ if (regcomp(&compiledPatt, patt, REG_EXTENDED)) {
+ return -1;
}
+ hasRegex = 1;
}
- /* Clean up */
- FREE(fl.prefix);
- FREE(fl.current.PmodeString);
- FREE(fl.current.PdirmodeString);
- FREE(fl.current.Uname);
- FREE(fl.current.Gname);
- FREE(fl.def.PmodeString);
- FREE(fl.def.PdirmodeString);
- FREE(fl.def.Uname);
- FREE(fl.def.Gname);
- FREE(fl.currentLang);
- freeFileList(fl.fileList, fl.fileListRecsUsed);
- while (fl.docDirCount--) {
- FREE(fl.docDirs[fl.docDirCount]);
+ if (! hasRegex) {
+ return 1;
+ }
+
+ if (! regexec(&compiledPatt, fileName, 2, matches, REG_NOTEOL)) {
+ /* Got match */
+ s = fileName + matches[1].rm_eo - 1;
+ x = matches[1].rm_eo - matches[1].rm_so;
+ buf[x] = '\0';
+ while (x) {
+ buf[--x] = *s--;
+ }
+ *lang = buf;
+ return 0;
+ }
+
+ return 1;
+}
+
+static int parseForSimple(Spec spec, Package pkg, char *buf,
+ struct FileList *fl, char **fileName)
+{
+ char *s;
+ int res, specialDoc = 0;
+ char *name, *version;
+ char specialDocBuf[BUFSIZ];
+
+ specialDocBuf[0] = '\0';
+ *fileName = NULL;
+ res = 0;
+ s = strtokWithQuotes(buf, " \t\n");
+ while (s) {
+ if (!strcmp(s, "%docdir")) {
+ s = strtokWithQuotes(NULL, " \t\n");
+ if (fl->docDirCount == MAXDOCDIR) {
+ rpmError(RPMERR_INTERNAL, "Hit limit for %%docdir");
+ fl->processingFailed = 1;
+ res = 1;
+ }
+ fl->docDirs[fl->docDirCount++] = strdup(s);
+ if (strtokWithQuotes(NULL, " \t\n")) {
+ rpmError(RPMERR_INTERNAL, "Only one arg for %%docdir");
+ fl->processingFailed = 1;
+ res = 1;
+ }
+ break;
+ } else if (!strcmp(s, "%doc")) {
+ fl->currentFlags |= RPMFILE_DOC;
+ } else if (!strcmp(s, "%ghost")) {
+ fl->currentFlags |= RPMFILE_GHOST;
+ } else if (!strcmp(s, "%dir")) {
+ fl->isDir = 1;
+ } else {
+ if (*fileName) {
+ /* We already got a file -- error */
+ rpmError(RPMERR_BADSPEC,
+ "Two files on one line: %s", *fileName);
+ fl->processingFailed = 1;
+ res = 1;
+ }
+ if (*s != '/') {
+ if (fl->currentFlags & RPMFILE_DOC) {
+ specialDoc = 1;
+ strcat(specialDocBuf, " ");
+ strcat(specialDocBuf, s);
+ } else {
+ /* not in %doc, does not begin with / -- error */
+ rpmError(RPMERR_BADSPEC,
+ "File must begin with \"/\": %s", s);
+ fl->processingFailed = 1;
+ res = 1;
+ }
+ } else {
+ *fileName = s;
+ }
+ }
+ s = strtokWithQuotes(NULL, " \t\n");
+ }
+
+ if (specialDoc) {
+ if (*fileName || (fl->currentFlags & ~(RPMFILE_DOC))) {
+ rpmError(RPMERR_BADSPEC,
+ "Can't mix special %%doc with other forms: %s",
+ *fileName);
+ fl->processingFailed = 1;
+ res = 1;
+ } else {
+ headerGetEntry(pkg->header, RPMTAG_NAME, NULL,
+ (void *) &name, NULL);
+ headerGetEntry(pkg->header, RPMTAG_VERSION, NULL,
+ (void *) &version, NULL);
+ sprintf(buf, "%s/%s-%s", spec->docDir, name, version);
+
+ if (! fl->passedSpecialDoc) {
+ pkg->specialDoc = newStringBuf();
+ appendStringBuf(pkg->specialDoc, "DOCDIR=$RPM_BUILD_ROOT");
+ appendLineStringBuf(pkg->specialDoc, buf);
+ appendLineStringBuf(pkg->specialDoc, "export DOCDIR");
+ appendLineStringBuf(pkg->specialDoc, "rm -rf $DOCDIR");
+ appendLineStringBuf(pkg->specialDoc, MKDIR_P " $DOCDIR");
+
+ *fileName = buf;
+ fl->passedSpecialDoc = 1;
+ fl->isSpecialDoc = 1;
+ }
+
+ appendStringBuf(pkg->specialDoc, "cp -pr ");
+ appendStringBuf(pkg->specialDoc, specialDocBuf);
+ appendLineStringBuf(pkg->specialDoc, " $DOCDIR");
+ }
}
- return fl.processingFailed;
+
+ return res;
}
-static void timeCheck(int tc, Header h)
+static int compareFileListRecs(const void *ap, const void *bp)
{
- int *mtime;
- char **file;
- int count, x, currentTime;
+ char *a, *b;
- headerGetEntry(h, RPMTAG_FILENAMES, NULL, (void **) &file, &count);
- headerGetEntry(h, RPMTAG_FILEMTIMES, NULL, (void **) &mtime, NULL);
+ a = ((struct FileListRec *)ap)->fileName;
+ b = ((struct FileListRec *)bp)->fileName;
- currentTime = time(NULL);
-
- x = 0;
- while (x < count) {
- if (currentTime - mtime[x] > tc) {
- rpmMessage(RPMMESS_WARNING, "TIMECHECK failure: %s\n", file[x]);
- }
- x++;
+ return strcmp(a, b);
+}
+
+static int isDoc(struct FileList *fl, char *fileName)
+{
+ int x = fl->docDirCount;
+
+ while (x--) {
+ if (strstr(fileName, fl->docDirs[x]) == fileName) {
+ return 1;
+ }
}
+ return 0;
}
static void genCpioListAndHeader(struct FileList *fl,
FREE(fileList);
}
-void freeCpioList(struct cpioFileMapping *cpioList, int cpioCount)
-{
- struct cpioFileMapping *p = cpioList;
-
- while (cpioCount--) {
- rpmMessage(RPMMESS_DEBUG, "archive = %s, fs = %s\n",
- p->archivePath, p->fsPath);
- FREE(p->archivePath);
- FREE(p->fsPath);
- p++;
- }
- FREE(cpioList);
-}
-
-static int compareFileListRecs(const void *ap, const void *bp)
-{
- char *a, *b;
-
- a = ((struct FileListRec *)ap)->fileName;
- b = ((struct FileListRec *)bp)->fileName;
-
- return strcmp(a, b);
-}
-
-static int isDoc(struct FileList *fl, char *fileName)
-{
- int x = fl->docDirCount;
-
- while (x--) {
- if (strstr(fileName, fl->docDirs[x]) == fileName) {
- return 1;
- }
- }
- return 0;
-}
-
-static int processBinaryFile(Package pkg, struct FileList *fl, char *fileName)
-{
- char fullname[BUFSIZ];
- glob_t glob_result;
- int x, offset, rc = 0;
-
- /* check that file starts with leading "/" */
- if (*fileName != '/') {
- rpmError(RPMERR_BADSPEC, "File needs leading \"/\": %s", *fileName);
- fl->processingFailed = 1;
- return 1;
- }
-
- if (myGlobPatternP(fileName)) {
- if (fl->buildRoot) {
- sprintf(fullname, "%s%s", fl->buildRoot, fileName);
- offset = strlen(fl->buildRoot);
- } else {
- strcpy(fullname, fileName);
- offset = 0;
- }
-
- if (glob(fullname, 0, glob_error, &glob_result) ||
- (glob_result.gl_pathc < 1)) {
- rpmError(RPMERR_BADSPEC, "File not found: %s", fullname);
- fl->processingFailed = 1;
- globfree(&glob_result);
- return 1;
- }
-
- x = 0;
- while (x < glob_result.gl_pathc) {
- rc = addFile(fl, &(glob_result.gl_pathv[x][offset]), NULL);
- x++;
- }
- globfree(&glob_result);
- } else {
- rc = addFile(fl, fileName, NULL);
- }
-
- return rc;
-}
-
static int addFile(struct FileList *fl, char *name, struct stat *statp)
{
char fileName[BUFSIZ];
return 0;
}
-static int parseForSimple(Spec spec, Package pkg, char *buf,
- struct FileList *fl, char **fileName)
-{
- char *s;
- int res, specialDoc = 0;
- char *name, *version;
- char specialDocBuf[BUFSIZ];
-
- specialDocBuf[0] = '\0';
- *fileName = NULL;
- res = 0;
- s = strtokWithQuotes(buf, " \t\n");
- while (s) {
- if (!strcmp(s, "%docdir")) {
- s = strtokWithQuotes(NULL, " \t\n");
- if (fl->docDirCount == MAXDOCDIR) {
- rpmError(RPMERR_INTERNAL, "Hit limit for %%docdir");
- fl->processingFailed = 1;
- res = 1;
- }
- fl->docDirs[fl->docDirCount++] = strdup(s);
- if (strtokWithQuotes(NULL, " \t\n")) {
- rpmError(RPMERR_INTERNAL, "Only one arg for %%docdir");
- fl->processingFailed = 1;
- res = 1;
- }
- break;
- } else if (!strcmp(s, "%doc")) {
- fl->currentFlags |= RPMFILE_DOC;
- } else if (!strcmp(s, "%ghost")) {
- fl->currentFlags |= RPMFILE_GHOST;
- } else if (!strcmp(s, "%dir")) {
- fl->isDir = 1;
- } else {
- if (*fileName) {
- /* We already got a file -- error */
- rpmError(RPMERR_BADSPEC,
- "Two files on one line: %s", *fileName);
- fl->processingFailed = 1;
- res = 1;
- }
- if (*s != '/') {
- if (fl->currentFlags & RPMFILE_DOC) {
- specialDoc = 1;
- strcat(specialDocBuf, " ");
- strcat(specialDocBuf, s);
- } else {
- /* not in %doc, does not begin with / -- error */
- rpmError(RPMERR_BADSPEC,
- "File must begin with \"/\": %s", s);
- fl->processingFailed = 1;
- res = 1;
- }
- } else {
- *fileName = s;
- }
- }
- s = strtokWithQuotes(NULL, " \t\n");
- }
-
- if (specialDoc) {
- if (*fileName || (fl->currentFlags & ~(RPMFILE_DOC))) {
- rpmError(RPMERR_BADSPEC,
- "Can't mix special %%doc with other forms: %s",
- *fileName);
- fl->processingFailed = 1;
- res = 1;
- } else {
- headerGetEntry(pkg->header, RPMTAG_NAME, NULL,
- (void *) &name, NULL);
- headerGetEntry(pkg->header, RPMTAG_VERSION, NULL,
- (void *) &version, NULL);
- sprintf(buf, "%s/%s-%s", spec->docDir, name, version);
-
- if (! fl->passedSpecialDoc) {
- pkg->specialDoc = newStringBuf();
- appendStringBuf(pkg->specialDoc, "DOCDIR=$RPM_BUILD_ROOT");
- appendLineStringBuf(pkg->specialDoc, buf);
- appendLineStringBuf(pkg->specialDoc, "export DOCDIR");
- appendLineStringBuf(pkg->specialDoc, "rm -rf $DOCDIR");
- appendLineStringBuf(pkg->specialDoc, MKDIR_P " $DOCDIR");
-
- *fileName = buf;
- fl->passedSpecialDoc = 1;
- fl->isSpecialDoc = 1;
- }
-
- appendStringBuf(pkg->specialDoc, "cp -pr ");
- appendStringBuf(pkg->specialDoc, specialDocBuf);
- appendLineStringBuf(pkg->specialDoc, " $DOCDIR");
- }
- }
-
- return res;
-}
-
-static int parseForVerify(char *buf, struct FileList *fl)
+static int processBinaryFile(Package pkg, struct FileList *fl, char *fileName)
{
- char *p, *start, *end, *name;
- char ourbuf[BUFSIZ];
- int not, verifyFlags;
- int *resultVerify;
-
- if (!(p = start = strstr(buf, "%verify"))) {
- if (!(p = start = strstr(buf, "%defverify"))) {
- return 0;
- }
- name = "%defverify";
- resultVerify = &(fl->defVerifyFlags);
- p += 10;
- } else {
- name = "%verify";
- resultVerify = &(fl->currentVerifyFlags);
- p += 7;
- }
-
- SKIPSPACE(p);
-
- if (*p != '(') {
- rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
- p++;
-
- end = p;
- while (*end && *end != ')') {
- end++;
- }
-
- if (! *end) {
- rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
+ char fullname[BUFSIZ];
+ glob_t glob_result;
+ int x, offset, rc = 0;
+
+ /* check that file starts with leading "/" */
+ if (*fileName != '/') {
+ rpmError(RPMERR_BADSPEC, "File needs leading \"/\": %s", *fileName);
fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
-
- strncpy(ourbuf, p, end-p);
- ourbuf[end-p] = '\0';
- while (start <= end) {
- *start++ = ' ';
+ return 1;
}
-
- p = strtok(ourbuf, ", \n\t");
- not = 0;
- verifyFlags = RPMVERIFY_NONE;
- while (p) {
- if (!strcmp(p, "not")) {
- not = 1;
- } else if (!strcmp(p, "md5")) {
- verifyFlags |= RPMVERIFY_MD5;
- } else if (!strcmp(p, "size")) {
- verifyFlags |= RPMVERIFY_FILESIZE;
- } else if (!strcmp(p, "link")) {
- verifyFlags |= RPMVERIFY_LINKTO;
- } else if (!strcmp(p, "user")) {
- verifyFlags |= RPMVERIFY_USER;
- } else if (!strcmp(p, "group")) {
- verifyFlags |= RPMVERIFY_GROUP;
- } else if (!strcmp(p, "mtime")) {
- verifyFlags |= RPMVERIFY_MTIME;
- } else if (!strcmp(p, "mode")) {
- verifyFlags |= RPMVERIFY_MODE;
- } else if (!strcmp(p, "rdev")) {
- verifyFlags |= RPMVERIFY_RDEV;
+
+ if (myGlobPatternP(fileName)) {
+ if (fl->buildRoot) {
+ sprintf(fullname, "%s%s", fl->buildRoot, fileName);
+ offset = strlen(fl->buildRoot);
} else {
- rpmError(RPMERR_BADSPEC, "Invalid %s token: %s", name, p);
+ strcpy(fullname, fileName);
+ offset = 0;
+ }
+
+ if (glob(fullname, 0, glob_error, &glob_result) ||
+ (glob_result.gl_pathc < 1)) {
+ rpmError(RPMERR_BADSPEC, "File not found: %s", fullname);
fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ globfree(&glob_result);
+ return 1;
}
- p = strtok(NULL, ", \n\t");
+
+ x = 0;
+ while (x < glob_result.gl_pathc) {
+ rc = addFile(fl, &(glob_result.gl_pathv[x][offset]), NULL);
+ x++;
+ }
+ globfree(&glob_result);
+ } else {
+ rc = addFile(fl, fileName, NULL);
}
- *resultVerify = not ? ~(verifyFlags) : verifyFlags;
-
- return 0;
+ return rc;
}
-static int parseForRegexLang(char *fileName, char **lang)
+static int processPackageFiles(Spec spec, Package pkg,
+ int installSpecialDoc, int test)
{
- static int initialized = 0;
- static int hasRegex = 0;
- static regex_t compiledPatt;
- static char buf[BUFSIZ];
- int x;
- regmatch_t matches[2];
- char *patt, *s;
+ struct FileList fl;
+ char *s, **files, **fp, *fileName;
+ char buf[BUFSIZ];
+ FILE *f;
- if (! initialized) {
- initialized = 1;
- patt = rpmGetVar(RPMVAR_LANGPATT);
- if (! patt) {
- return 1;
+ struct AttrRec specialDocAttrRec;
+ char *specialDoc = NULL;
+
+ pkg->cpioList = NULL;
+ pkg->cpioCount = 0;
+
+ if (pkg->fileFile) {
+ if (spec->buildSubdir) {
+ sprintf(buf, "%s/%s/%s", rpmGetVar(RPMVAR_BUILDDIR),
+ spec->buildSubdir, pkg->fileFile);
+ } else {
+ sprintf(buf, "%s/%s", rpmGetVar(RPMVAR_BUILDDIR), pkg->fileFile);
}
- if (regcomp(&compiledPatt, patt, REG_EXTENDED)) {
- return -1;
+ if ((f = fopen(buf, "r")) == NULL) {
+ rpmError(RPMERR_BADFILENAME,
+ "Could not open %%files file: %s", pkg->fileFile);
+ return RPMERR_BADFILENAME;
}
- hasRegex = 1;
+ while (fgets(buf, sizeof(buf), f)) {
+ handleComments(buf);
+ if (expandMacros(spec, &spec->macros, buf, sizeof(buf))) {
+ rpmError(RPMERR_BADSPEC, "line: %s", buf);
+ return RPMERR_BADSPEC;
+ }
+ appendStringBuf(pkg->fileList, buf);
+ }
+ fclose(f);
}
- if (! hasRegex) {
- return 1;
+ /* Init the file list structure */
+
+ fl.buildRoot = spec->buildRoot ? spec->buildRoot : "";
+ if (headerGetEntry(pkg->header, RPMTAG_DEFAULTPREFIX,
+ NULL, (void *)&fl.prefix, NULL)) {
+ fl.prefix = strdup(fl.prefix);
+ } else {
+ fl.prefix = NULL;
}
- if (! regexec(&compiledPatt, fileName, 2, matches, REG_NOTEOL)) {
- /* Got match */
- s = fileName + matches[1].rm_eo - 1;
- x = matches[1].rm_eo - matches[1].rm_so;
- buf[x] = '\0';
- while (x) {
- buf[--x] = *s--;
- }
- *lang = buf;
- return 0;
- }
+ fl.fileCount = 0;
+ fl.totalFileSize = 0;
+ fl.processingFailed = 0;
- return 1;
-}
+ fl.passedSpecialDoc = 0;
+
+ fl.current.PmodeString = NULL;
+ fl.current.PdirmodeString = NULL;
+ fl.current.Uname = NULL;
+ fl.current.Gname = NULL;
+ fl.def.PmodeString = NULL;
+ fl.def.PdirmodeString = NULL;
+ fl.def.Uname = NULL;
+ fl.def.Gname = NULL;
+ fl.def.Pmode = 0;
+ fl.def.Pdirmode = 0;
+ fl.currentLang = NULL;
-static int parseForLang(char *buf, struct FileList *fl)
-{
- char *p, *start, *end;
- char ourbuf[1024];
+ fl.defVerifyFlags = RPMVERIFY_ALL;
- if (!(p = start = strstr(buf, "%lang"))) {
- return 0;
- }
+ fl.docDirCount = 0;
+ fl.docDirs[fl.docDirCount++] = strdup("/usr/doc");
+ fl.docDirs[fl.docDirCount++] = strdup("/usr/man");
+ fl.docDirs[fl.docDirCount++] = strdup("/usr/info");
+ fl.docDirs[fl.docDirCount++] = strdup("/usr/X11R6/man");
+ fl.docDirs[fl.docDirCount++] = strdup(spec->docDir);
+
+ fl.fileList = NULL;
+ fl.fileListRecsAlloced = 0;
+ fl.fileListRecsUsed = 0;
- p += 5;
- SKIPSPACE(p);
+ s = getStringBuf(pkg->fileList);
+ files = splitString(s, strlen(s), '\n');
+ fp = files;
- if (*p != '(') {
- rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
- p++;
+ while (*fp) {
+ s = *fp;
+ SKIPSPACE(s);
+ if (! *s) {
+ fp++; continue;
+ }
+ fileName = NULL;
+ strcpy(buf, s);
+
+ /* Reset for a new line in %files */
+ fl.isDir = 0;
+ fl.inFtw = 0;
+ fl.currentFlags = 0;
+ fl.currentVerifyFlags = fl.defVerifyFlags;
+ fl.current.Pmode = fl.def.Pmode;
+ fl.current.Pdirmode = fl.def.Pdirmode;
+ fl.isSpecialDoc = 0;
+ FREE(fl.current.PmodeString);
+ FREE(fl.current.PdirmodeString);
+ FREE(fl.current.Uname);
+ FREE(fl.current.Gname);
+ FREE(fl.currentLang);
+ if (fl.def.PmodeString) {
+ fl.current.PmodeString = strdup(fl.def.PmodeString);
+ }
+ if (fl.def.PdirmodeString) {
+ fl.current.PdirmodeString = strdup(fl.def.PdirmodeString);
+ }
+ if (fl.def.Uname) {
+ fl.current.Uname = strdup(fl.def.Uname);
+ }
+ if (fl.def.Gname) {
+ fl.current.Gname = strdup(fl.def.Gname);
+ }
- end = p;
- while (*end && *end != ')') {
- end++;
+ if (parseForVerify(buf, &fl)) {
+ fp++; continue;
+ }
+ if (parseForAttr(buf, &fl)) {
+ fp++; continue;
+ }
+ if (parseForConfig(buf, &fl)) {
+ fp++; continue;
+ }
+ if (parseForLang(buf, &fl)) {
+ fp++; continue;
+ }
+ if (parseForSimple(spec, pkg, buf, &fl, &fileName)) {
+ fp++; continue;
+ }
+ if (! fileName) {
+ fp++; continue;
+ }
+
+ if (fl.isSpecialDoc) {
+ /* Save this stuff for last */
+ specialDoc = strdup(fileName);
+ specialDocAttrRec = fl.current;
+ if (specialDocAttrRec.PmodeString) {
+ specialDocAttrRec.PmodeString =
+ strdup(specialDocAttrRec.PmodeString);
+ }
+ if (specialDocAttrRec.PdirmodeString) {
+ specialDocAttrRec.PdirmodeString =
+ strdup(specialDocAttrRec.PdirmodeString);
+ }
+ if (specialDocAttrRec.Uname) {
+ specialDocAttrRec.Uname = strdup(specialDocAttrRec.Uname);
+ }
+ if (specialDocAttrRec.Gname) {
+ specialDocAttrRec.Gname = strdup(specialDocAttrRec.Gname);
+ }
+ } else {
+ processBinaryFile(pkg, &fl, fileName);
+ }
+
+ fp++;
}
- if (! *end) {
- rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
+ /* Now process special doc, if there is one */
+ if (specialDoc) {
+ if (installSpecialDoc) {
+ doScript(spec, RPMBUILD_STRINGBUF, "%doc", pkg->specialDoc, test);
+ }
- strncpy(ourbuf, p, end-p);
- ourbuf[end-p] = '\0';
- while (start <= end) {
- *start++ = ' ';
+ /* fl.current now takes on "ownership" of the specialDocAttrRec */
+ /* allocated string data. */
+ fl.current = specialDocAttrRec;
+ fl.isDir = 0;
+ fl.inFtw = 0;
+ fl.currentFlags = 0;
+ fl.currentVerifyFlags = 0;
+ processBinaryFile(pkg, &fl, specialDoc);
+ FREE(specialDoc);
}
+
+ freeSplitString(files);
- p = strtok(ourbuf, ", \n\t");
- if (!p) {
- rpmError(RPMERR_BADSPEC, "Bad %%lang() syntax: %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
- if (strlen(p) != 2) {
- rpmError(RPMERR_BADSPEC, "%%lang() entries are 2 characters: %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
- if (strtok(NULL, ", \n\t")) {
- rpmError(RPMERR_BADSPEC, "Only one entry in %%lang(): %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ if (! fl.processingFailed) {
+ genCpioListAndHeader(&fl, &(pkg->cpioList), &(pkg->cpioCount),
+ pkg->header, 0);
+
+ if (spec->timeCheck) {
+ timeCheck(spec->timeCheck, pkg->header);
+ }
}
- fl->currentLang = strdup(p);
- return 0;
+ /* Clean up */
+ FREE(fl.prefix);
+ FREE(fl.current.PmodeString);
+ FREE(fl.current.PdirmodeString);
+ FREE(fl.current.Uname);
+ FREE(fl.current.Gname);
+ FREE(fl.def.PmodeString);
+ FREE(fl.def.PdirmodeString);
+ FREE(fl.def.Uname);
+ FREE(fl.def.Gname);
+ FREE(fl.currentLang);
+ freeFileList(fl.fileList, fl.fileListRecsUsed);
+ while (fl.docDirCount--) {
+ FREE(fl.docDirs[fl.docDirCount]);
+ }
+ return fl.processingFailed;
}
-static int parseForAttr(char *buf, struct FileList *fl)
+void freeCpioList(struct cpioFileMapping *cpioList, int cpioCount)
{
- char *p, *s, *start, *end, *name;
- char ourbuf[1024];
- int x, defattr = 0;
- struct AttrRec *resultAttr;
+ struct cpioFileMapping *p = cpioList;
- if (!(p = start = strstr(buf, "%attr"))) {
- if (!(p = start = strstr(buf, "%defattr"))) {
- return 0;
- }
- defattr = 1;
- name = "%defattr";
- resultAttr = &(fl->def);
- p += 8;
- } else {
- name = "%attr";
- resultAttr = &(fl->current);
- p += 5;
+ while (cpioCount--) {
+ rpmMessage(RPMMESS_DEBUG, "archive = %s, fs = %s\n",
+ p->archivePath, p->fsPath);
+ FREE(p->archivePath);
+ FREE(p->fsPath);
+ p++;
}
+ FREE(cpioList);
+}
- resultAttr->PmodeString = resultAttr->Uname = resultAttr->Gname = NULL;
+int processSourceFiles(Spec spec)
+{
+ struct Source *srcPtr;
+ char buf[BUFSIZ];
+ StringBuf sourceFiles;
+ int x, isSpec = 1;
+ struct FileList fl;
+ char *s, **files, **fp, *fn;
+ struct stat sb;
+ HeaderIterator hi;
+ int tag, type, count;
+ Package pkg;
+ void * ptr;
- SKIPSPACE(p);
+ sourceFiles = newStringBuf();
+ spec->sourceHeader = headerNew();
- if (*p != '(') {
- rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ /* Only specific tags are added to the source package header */
+ hi = headerInitIterator(spec->packages->header);
+ while (headerNextIterator(hi, &tag, &type, &ptr, &count)) {
+ switch (tag) {
+ case RPMTAG_NAME:
+ case RPMTAG_VERSION:
+ case RPMTAG_RELEASE:
+ case RPMTAG_SERIAL:
+ case RPMTAG_SUMMARY:
+ case RPMTAG_DESCRIPTION:
+ case RPMTAG_PACKAGER:
+ case RPMTAG_DISTRIBUTION:
+ case RPMTAG_VENDOR:
+ case RPMTAG_COPYRIGHT:
+ case RPMTAG_GROUP:
+ case RPMTAG_OS:
+ case RPMTAG_ARCH:
+ case RPMTAG_CHANGELOGTIME:
+ case RPMTAG_CHANGELOGNAME:
+ case RPMTAG_CHANGELOGTEXT:
+ case RPMTAG_URL:
+ case HEADER_I18NTABLE:
+ headerAddEntry(spec->sourceHeader, tag, type, ptr, count);
+ break;
+ default:
+ /* do not copy */
+ break;
+ }
+ if (type == RPM_STRING_ARRAY_TYPE || type == RPM_I18NSTRING_TYPE) {
+ FREE(ptr);
+ }
}
- p++;
+ headerFreeIterator(hi);
- end = p;
- while (*end && *end != ')') {
- end++;
+ /* Construct the file list and source entries */
+ appendLineStringBuf(sourceFiles, spec->specFile);
+ srcPtr = spec->sources;
+ while (srcPtr) {
+ if (srcPtr->flags & RPMBUILD_ISSOURCE) {
+ headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_SOURCE,
+ RPM_STRING_ARRAY_TYPE, &srcPtr->source, 1);
+ if (srcPtr->flags & RPMBUILD_ISNO) {
+ headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_NOSOURCE,
+ RPM_INT32_TYPE, &srcPtr->num, 1);
+ }
+ }
+ if (srcPtr->flags & RPMBUILD_ISPATCH) {
+ headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_PATCH,
+ RPM_STRING_ARRAY_TYPE, &srcPtr->source, 1);
+ if (srcPtr->flags & RPMBUILD_ISNO) {
+ headerAddOrAppendEntry(spec->sourceHeader, RPMTAG_NOPATCH,
+ RPM_INT32_TYPE, &srcPtr->num, 1);
+ }
+ }
+ sprintf(buf, "%s%s/%s",
+ srcPtr->flags & RPMBUILD_ISNO ? "!" : "",
+ rpmGetVar(RPMVAR_SOURCEDIR), srcPtr->source);
+ appendLineStringBuf(sourceFiles, buf);
+ srcPtr = srcPtr->next;
}
- if (! *end) {
- rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ pkg = spec->packages;
+ while (pkg) {
+ srcPtr = pkg->icon;
+ while (srcPtr) {
+ sprintf(buf, "%s%s/%s",
+ srcPtr->flags & RPMBUILD_ISNO ? "!" : "",
+ rpmGetVar(RPMVAR_SOURCEDIR), srcPtr->source);
+ appendLineStringBuf(sourceFiles, buf);
+ srcPtr = srcPtr->next;
+ }
+ pkg = pkg->next;
}
- if (defattr) {
- s = end;
- s++;
+ spec->sourceCpioList = NULL;
+ spec->sourceCpioCount = 0;
+
+ fl.fileList = malloc((spec->numSources + 1) * sizeof(struct FileListRec));
+ fl.processingFailed = 0;
+ fl.fileListRecsUsed = 0;
+ fl.totalFileSize = 0;
+ fl.prefix = NULL;
+
+ s = getStringBuf(sourceFiles);
+ files = splitString(s, strlen(s), '\n');
+ fp = files;
+
+ /* The first source file is the spec file */
+ x = 0;
+ while (*fp) {
+ s = *fp;
SKIPSPACE(s);
- if (*s) {
- rpmError(RPMERR_BADSPEC,
- "No files after %%defattr(): %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ if (! *s) {
+ fp++; continue;
+ }
+
+ fl.fileList[x].flags = isSpec ? RPMFILE_SPECFILE : 0;
+ /* files with leading ! are no source files */
+ if (*s == '!') {
+ fl.fileList[x].flags |= RPMFILE_GHOST;
+ s++;
+ }
+ fl.fileList[x].diskName = strdup(s);
+ fn = strrchr(s, '/');
+ if (fn) {
+ fn++;
+ } else {
+ fn = s;
+ }
+ fl.fileList[x].fileName = strdup(fn);
+ fl.fileList[x].verifyFlags = RPMVERIFY_ALL;
+ stat(s, &sb);
+ fl.fileList[x].mode = sb.st_mode;
+ fl.fileList[x].uid = sb.st_uid;
+ fl.fileList[x].gid = sb.st_gid;
+ fl.fileList[x].uname = getUname(sb.st_uid);
+ fl.fileList[x].gname = getGname(sb.st_gid);
+ fl.fileList[x].size = sb.st_size;
+ fl.fileList[x].mtime = sb.st_mtime;
+ fl.fileList[x].rdev = sb.st_rdev;
+ fl.fileList[x].device = sb.st_dev;
+ fl.fileList[x].inode = sb.st_ino;
+ fl.fileList[x].lang = strdup("");
+
+ fl.totalFileSize += sb.st_size;
+
+ if (! (fl.fileList[x].uname && fl.fileList[x].gname)) {
+ rpmError(RPMERR_BADSPEC, "Bad owner/group: %s", s);
+ fl.processingFailed = 1;
}
+
+ isSpec = 0;
+ fp++;
+ x++;
}
+ fl.fileListRecsUsed = x;
+ freeSplitString(files);
- strncpy(ourbuf, p, end-p);
- ourbuf[end-p] = '\0';
+ if (! fl.processingFailed) {
+ genCpioListAndHeader(&fl, &(spec->sourceCpioList),
+ &(spec->sourceCpioCount), spec->sourceHeader, 1);
+ }
- resultAttr->PmodeString = strtok(ourbuf, ", \n\t");
- resultAttr->Uname = strtok(NULL, ", \n\t");
- resultAttr->Gname = strtok(NULL, ", \n\t");
- resultAttr->PdirmodeString = strtok(NULL, ", \n\t");
+ freeStringBuf(sourceFiles);
+ freeFileList(fl.fileList, fl.fileListRecsUsed);
+ return fl.processingFailed;
+}
- if (! (resultAttr->PmodeString &&
- resultAttr->Uname && resultAttr->Gname)) {
- rpmError(RPMERR_BADSPEC, "Bad %s() syntax: %s", name, buf);
- resultAttr->PmodeString = resultAttr->Uname = resultAttr->Gname = NULL;
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
- }
+static StringBuf getOutputFrom(char *dir, char *argv[],
+ char *writePtr, int writeBytesLeft,
+ int failNonZero)
+{
+ int progPID;
+ int progDead;
+ int toProg[2];
+ int fromProg[2];
+ int status;
+ void *oldhandler;
+ int bytesWritten;
+ StringBuf readBuff;
+ int bytes;
+ unsigned char buf[8193];
+
+ oldhandler = signal(SIGPIPE, SIG_IGN);
+
+ pipe(toProg);
+ pipe(fromProg);
+
+ if (!(progPID = fork())) {
+ close(toProg[1]);
+ close(fromProg[0]);
+
+ dup2(toProg[0], 0); /* Make stdin the in pipe */
+ dup2(fromProg[1], 1); /* Make stdout the out pipe */
- /* Do a quick test on the mode argument and adjust for "-" */
- if (!strcmp(resultAttr->PmodeString, "-")) {
- resultAttr->PmodeString = NULL;
- } else {
- x = sscanf(resultAttr->PmodeString, "%o", &(resultAttr->Pmode));
- if ((x == 0) || (resultAttr->Pmode >> 12)) {
- rpmError(RPMERR_BADSPEC, "Bad %s() mode spec: %s", name, buf);
- resultAttr->PmodeString = resultAttr->Uname =
- resultAttr->Gname = NULL;
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ close(toProg[0]);
+ close(fromProg[1]);
+
+ if (dir) {
+ chdir(dir);
}
- resultAttr->PmodeString = strdup(resultAttr->PmodeString);
+
+ execvp(argv[0], argv);
+ rpmError(RPMERR_EXEC, "Couldn't exec %s", argv[0]);
+ _exit(RPMERR_EXEC);
}
- if (resultAttr->PdirmodeString) {
- /* The processing here is slightly different to maintain */
- /* compatibility with old spec files. */
- if (!strcmp(resultAttr->PdirmodeString, "-")) {
- resultAttr->PdirmodeString = strdup(resultAttr->PdirmodeString);
- } else {
- x = sscanf(resultAttr->PdirmodeString, "%o",
- &(resultAttr->Pdirmode));
- if ((x == 0) || (resultAttr->Pdirmode >> 12)) {
- rpmError(RPMERR_BADSPEC,
- "Bad %s() dirmode spec: %s", name, buf);
- resultAttr->PmodeString = resultAttr->Uname =
- resultAttr->Gname = resultAttr->PdirmodeString = NULL;
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ if (progPID < 0) {
+ rpmError(RPMERR_FORK, "Couldn't fork %s", argv[0]);
+ return NULL;
+ }
+
+ close(toProg[0]);
+ close(fromProg[1]);
+
+ /* Do not block reading or writing from/to prog. */
+ fcntl(fromProg[0], F_SETFL, O_NONBLOCK);
+ fcntl(toProg[1], F_SETFL, O_NONBLOCK);
+
+ readBuff = newStringBuf();
+
+ progDead = 0;
+ do {
+ if (waitpid(progPID, &status, WNOHANG)) {
+ progDead = 1;
+ }
+
+ /* Write some stuff to the process if possible */
+ if (writeBytesLeft) {
+ if ((bytesWritten =
+ write(toProg[1], writePtr,
+ (1024<writeBytesLeft) ? 1024 : writeBytesLeft)) < 0) {
+ if (errno != EAGAIN) {
+ perror("getOutputFrom()");
+ exit(1);
+ }
+ bytesWritten = 0;
}
- resultAttr->PdirmodeString = strdup(resultAttr->PdirmodeString);
+ writeBytesLeft -= bytesWritten;
+ writePtr += bytesWritten;
+ } else {
+ close(toProg[1]);
}
+
+ /* Read any data from prog */
+ bytes = read(fromProg[0], buf, sizeof(buf)-1);
+ while (bytes > 0) {
+ buf[bytes] = '\0';
+ appendStringBuf(readBuff, buf);
+ bytes = read(fromProg[0], buf, sizeof(buf)-1);
+ }
+
+ /* terminate when prog dies */
+ } while (!progDead);
+
+ close(toProg[1]);
+ close(fromProg[0]);
+ signal(SIGPIPE, oldhandler);
+
+ if (writeBytesLeft) {
+ rpmError(RPMERR_EXEC, "failed to write all data to %s", argv[0]);
+ return NULL;
}
- if (!strcmp(resultAttr->Uname, "-")) {
- resultAttr->Uname = NULL;
- } else {
- resultAttr->Uname = strdup(resultAttr->Uname);
- }
- if (!strcmp(resultAttr->Gname, "-")) {
- resultAttr->Gname = NULL;
- } else {
- resultAttr->Gname = strdup(resultAttr->Gname);
- }
-
- /* Set everything we just parsed to blank spaces */
- while (start <= end) {
- *start++ = ' ';
+ waitpid(progPID, &status, 0);
+ if (failNonZero && (!WIFEXITED(status) || WEXITSTATUS(status))) {
+ rpmError(RPMERR_EXEC, "%s failed", argv[0]);
+ return NULL;
}
- return 0;
+ return readBuff;
}
-static int parseForConfig(char *buf, struct FileList *fl)
+static int generateAutoReqProv(Spec spec, Package pkg,
+ struct cpioFileMapping *cpioList, int cpioCount)
{
- char *p, *start, *end;
- char ourbuf[1024];
+ StringBuf writeBuf;
+ int writeBytes;
+ StringBuf readBuf;
+ char *argv[2];
+ char **f, **fsave;
- if (!(p = start = strstr(buf, "%config"))) {
+ if (!cpioCount) {
return 0;
}
- fl->currentFlags = RPMFILE_CONFIG;
-
- p += 7;
- SKIPSPACE(p);
- if (*p != '(') {
- while (start < p) {
- *start++ = ' ';
- }
+ if (! (spec->autoReq || spec->autoProv)) {
return 0;
}
- p++;
-
- end = p;
- while (*end && *end != ')') {
- end++;
- }
-
- if (! *end) {
- rpmError(RPMERR_BADSPEC, "Bad %%config() syntax: %s", buf);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+
+ writeBuf = newStringBuf();
+ writeBytes = 0;
+ while (cpioCount--) {
+ writeBytes += strlen(cpioList->fsPath) + 1;
+ appendLineStringBuf(writeBuf, cpioList->fsPath);
+ cpioList++;
}
- strncpy(ourbuf, p, end-p);
- ourbuf[end-p] = '\0';
- while (start <= end) {
- *start++ = ' ';
- }
+ /*** Do Provides ***/
- p = strtok(ourbuf, ", \n\t");
- while (p) {
- if (!strcmp(p, "missingok")) {
- fl->currentFlags |= RPMFILE_MISSINGOK;
- } else if (!strcmp(p, "noreplace")) {
- fl->currentFlags |= RPMFILE_NOREPLACE;
- } else {
- rpmError(RPMERR_BADSPEC, "Invalid %%config token: %s", p);
- fl->processingFailed = 1;
- return RPMERR_BADSPEC;
+ if (spec->autoProv) {
+ rpmMessage(RPMMESS_NORMAL, "Finding provides...\n");
+
+ argv[0] = FINDPROVIDES;
+ argv[1] = NULL;
+ readBuf = getOutputFrom(NULL, argv,
+ getStringBuf(writeBuf), writeBytes, 1);
+ if (!readBuf) {
+ rpmError(RPMERR_EXEC, "Failed to find provides");
+ freeStringBuf(writeBuf);
+ return RPMERR_EXEC;
}
- p = strtok(NULL, ", \n\t");
+
+ f = fsave = splitString(getStringBuf(readBuf),
+ strlen(getStringBuf(readBuf)), '\n');
+ freeStringBuf(readBuf);
+ while (*f) {
+ if (**f) {
+ addReqProv(spec, pkg, RPMSENSE_PROVIDES, *f, NULL, 0);
+ }
+ f++;
+ }
+ freeSplitString(fsave);
}
- return 0;
-}
-
-/* glob_pattern_p() taken from bash
- * Copyright (C) 1985, 1988, 1989 Free Software Foundation, Inc.
- *
- * Return nonzero if PATTERN has any special globbing chars in it.
- */
-static int myGlobPatternP (char *pattern)
-{
- register char *p = pattern;
- register char c;
- int open = 0;
-
- while ((c = *p++) != '\0')
- switch (c) {
- case '?':
- case '*':
- return (1);
- case '[': /* Only accept an open brace if there is a close */
- open++; /* brace to match it. Bracket expressions must be */
- continue; /* complete, according to Posix.2 */
- case ']':
- if (open)
- return (1);
- continue;
- case '\\':
- if (*p++ == '\0')
- return (0);
- }
+ /*** Do Requires ***/
- return (0);
-}
+ if (spec->autoReq) {
+ rpmMessage(RPMMESS_NORMAL, "Finding requires...\n");
-static int glob_error(const char *foo, int bar)
-{
- return 1;
-}
+ argv[0] = FINDREQUIRES;
+ argv[1] = NULL;
+ readBuf = getOutputFrom(NULL, argv,
+ getStringBuf(writeBuf), writeBytes, 0);
+ if (!readBuf) {
+ rpmError(RPMERR_EXEC, "Failed to find requires");
+ freeStringBuf(writeBuf);
+ return RPMERR_EXEC;
+ }
-/* strtokWithQuotes() modified from glibc strtok() */
-/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
+ f = fsave = splitString(getStringBuf(readBuf),
+ strlen(getStringBuf(readBuf)), '\n');
+ freeStringBuf(readBuf);
+ while (*f) {
+ if (**f) {
+ addReqProv(spec, pkg, RPMSENSE_ANY, *f, NULL, 0);
+ }
+ f++;
+ }
+ freeSplitString(fsave);
+ }
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
+ /*** Clean Up ***/
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
+ freeStringBuf(writeBuf);
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If
- not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ return 0;
+}
-static char *strtokWithQuotes(char *s, char *delim)
+static void printReqs(Spec spec, Package pkg)
{
- static char *olds = NULL;
- char *token;
+ int startedPreReq = 0;
+ int startedReq = 0;
- if (s == NULL) {
- s = olds;
- }
+ char **names;
+ int x, count;
+ int *flags;
- /* Skip leading delimiters */
- s += strspn(s, delim);
- if (*s == '\0') {
- return NULL;
+ if (headerGetEntry(pkg->header, RPMTAG_PROVIDES,
+ NULL, (void **) &names, &count)) {
+ rpmMessage(RPMMESS_NORMAL, "Provides:");
+ x = 0;
+ while (x < count) {
+ rpmMessage(RPMMESS_NORMAL, " %s", names[x]);
+ x++;
+ }
+ rpmMessage(RPMMESS_NORMAL, "\n");
+ FREE(names);
}
- /* Find the end of the token. */
- token = s;
- if (*token == '"') {
- token++;
- /* Find next " char */
- s = strchr(token, '"');
- } else {
- s = strpbrk(token, delim);
+ if (headerGetEntry(pkg->header, RPMTAG_REQUIRENAME,
+ NULL, (void **) &names, &count)) {
+ headerGetEntry(pkg->header, RPMTAG_REQUIREFLAGS,
+ NULL, (void **) &flags, NULL);
+ x = 0;
+ while (x < count) {
+ if (flags[x] & RPMSENSE_PREREQ) {
+ if (! startedPreReq) {
+ rpmMessage(RPMMESS_NORMAL, "Prereqs:");
+ startedPreReq = 1;
+ }
+ rpmMessage(RPMMESS_NORMAL, " %s", names[x]);
+ }
+ x++;
+ }
+ if (startedPreReq) {
+ rpmMessage(RPMMESS_NORMAL, "\n");
+ }
+ x = 0;
+ while (x < count) {
+ if (! (flags[x] & RPMSENSE_PREREQ)) {
+ if (! startedReq) {
+ rpmMessage(RPMMESS_NORMAL, "Requires:");
+ startedReq = 1;
+ }
+ rpmMessage(RPMMESS_NORMAL, " %s", names[x]);
+ }
+ x++;
+ }
+ rpmMessage(RPMMESS_NORMAL, "\n");
+ FREE(names);
}
+}
- /* Terminate it */
- if (s == NULL) {
- /* This token finishes the string */
- olds = strchr(token, '\0');
- } else {
- /* Terminate the token and make olds point past it */
- *s = '\0';
- olds = s+1;
+int processBinaryFiles(Spec spec, int installSpecialDoc, int test)
+{
+ Package pkg;
+ int res, rc;
+ char *name;
+
+ pkg = spec->packages;
+ res = 0;
+ while (pkg) {
+ if (!pkg->fileList) {
+ pkg = pkg->next;
+ continue;
+ }
+
+ headerGetEntry(pkg->header, RPMTAG_NAME, NULL, (void **)&name, NULL);
+ rpmMessage(RPMMESS_NORMAL, "Processing files: %s\n", name);
+
+ if ((rc = processPackageFiles(spec, pkg, installSpecialDoc, test))) {
+ res = rc;
+ }
+
+ generateAutoReqProv(spec, pkg, pkg->cpioList, pkg->cpioCount);
+ printReqs(spec, pkg);
+
+ pkg = pkg->next;
}
- return token;
+ return res;
}