common parse for all dependency token syntax.
CVS patchset: 3094
CVS date: 1999/06/17 15:44:47
- updated ru translation (Sergey Kubushin).
- add vpkg-provides.sh (Tim Mooney).
- don't clobber LDFLAGS in top-level Makefile (Tim Mooney).
- - build root from cmd line did not set macro %buildroot.
- - resurrect "rpm -Va --nofiles" (i.e. dependencies only) (#3111)
+ - fix: build root from cmd line did not set macro %buildroot (#1026).
+ - fix: resurrect "rpm -Va --nofiles" (verify dependencies only) (#3111).
- rpm-devel should require popt (#3125).
+ - don't spin while waiting for delayed requires/provides input (#3289).
+ - common parse for all dependency token syntax.
3.0 -> 3.0.1
- fix: %verifyscript resurrected (Shing-Gene Yung).
int fromProg[2];
int status;
void *oldhandler;
- int bytesWritten;
StringBuf readBuff;
- int bytes;
unsigned char buf[BUFSIZ+1];
+ int done;
oldhandler = signal(SIGPIPE, SIG_IGN);
readBuff = newStringBuf();
do {
+ fd_set ibits, obits;
+ struct timeval tv;
+ int nfd, nbw, nbr;
+ int rc;
+
+ done = 0;
+top:
+ /* XXX the select is mainly a timer since all I/O is non-blocking */
+ FD_ZERO(&ibits);
+ FD_ZERO(&obits);
+ if (fromProg[0] >= 0) {
+ FD_SET(fromProg[0], &ibits);
+ }
+ if (toProg[1] >= 0) {
+ FD_SET(toProg[1], &obits);
+ }
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ nfd = ((fromProg[0] > toProg[1]) ? fromProg[0] : toProg[1]);
+ if ((rc = select(nfd, &ibits, &obits, NULL, &tv)) < 0) {
+ if (errno == EINTR)
+ goto top;
+ break;
+ }
+
/* Write any data to program */
- if (writeBytesLeft) {
- if ((bytesWritten =
- write(toProg[1], writePtr,
+ if (toProg[1] >= 0 && FD_ISSET(toProg[1], &obits)) {
+ if (writeBytesLeft) {
+ if ((nbw = write(toProg[1], writePtr,
(1024<writeBytesLeft) ? 1024 : writeBytesLeft)) < 0) {
if (errno != EAGAIN) {
perror("getOutputFrom()");
exit(EXIT_FAILURE);
}
- bytesWritten = 0;
+ nbw = 0;
}
- writeBytesLeft -= bytesWritten;
- writePtr += bytesWritten;
- } else if (toProg[1] >= 0) { /* close write fd */
+ writeBytesLeft -= nbw;
+ writePtr += nbw;
+ } else if (toProg[1] >= 0) { /* close write fd */
close(toProg[1]);
toProg[1] = -1;
+ }
}
/* Read any data from prog */
- while ((bytes = read(fromProg[0], buf, sizeof(buf)-1)) > 0) {
- buf[bytes] = '\0';
+ while ((nbr = read(fromProg[0], buf, sizeof(buf)-1)) > 0) {
+ buf[nbr] = '\0';
appendStringBuf(readBuff, buf);
}
/* terminate on (non-blocking) EOF or error */
- } while (!(bytes == 0 || (bytes < 0 && errno != EAGAIN)));
+ done = (nbr == 0 || (nbr < 0 && errno != EAGAIN));
+
+ } while (!done);
/* Clean up */
if (toProg[1] >= 0)
close(toProg[1]);
- close(fromProg[0]);
+ if (fromProg[0] >= 0)
+ close(fromProg[0]);
(void)signal(SIGPIPE, oldhandler);
/* Collect status from prog */
case RPMTAG_RELEASE:
case RPMTAG_URL:
SINGLE_TOKEN_ONLY;
- /* These are for backward compatibility */
+ /* These macros are for backward compatibility */
if (tag == RPMTAG_VERSION) {
if (strchr(field, '-') != NULL) {
rpmError(RPMERR_BADSPEC, _("line %d: Illegal char '-' in %s: %s"),
break;
case RPMTAG_OBSOLETES:
case RPMTAG_PROVIDES:
- if ((rc = parseProvidesObsoletes(spec, pkg, field, tag))) {
- return rc;
- }
- break;
case RPMTAG_BUILDREQUIRES:
case RPMTAG_BUILDCONFLICTS:
case RPMTAG_BUILDPREREQ:
case RPMTAG_REQUIREFLAGS:
case RPMTAG_CONFLICTFLAGS:
case RPMTAG_PREREQ:
- if ((rc = parseRequiresConflicts(spec, pkg, field, tag, 0))) {
+ if ((rc = parseRCPOT(spec, pkg, field, tag, 0))) {
return rc;
}
break;
#define SKIPWHITE(_x) {while(*(_x) && (isspace(*_x) || *(_x) == ',')) (_x)++;}
#define SKIPNONWHITE(_x){while(*(_x) &&!(isspace(*_x) || *(_x) == ',')) (_x)++;}
-int parseRequiresConflicts(Spec spec, Package pkg, const char *field,
- int tag, int index)
+int parseRCPOT(Spec spec, Package pkg, const char *field, int tag, int index)
{
const char *r, *re, *v, *ve;
char *req, *version;
Header h;
int flags;
+ switch (tag) {
+ case RPMTAG_PROVIDES:
+ flags = RPMSENSE_PROVIDES;
+ h = pkg->header;
+ break;
+ case RPMTAG_OBSOLETES:
+ flags = RPMSENSE_OBSOLETES;
+ h = pkg->header;
+ break;
+ case RPMTAG_CONFLICTFLAGS:
+ flags = RPMSENSE_CONFLICTS;
+ h = pkg->header;
+ break;
+ case RPMTAG_BUILDCONFLICTS:
+ flags = RPMSENSE_CONFLICTS;
+ h = spec->buildRestrictions;
+ break;
+ case RPMTAG_PREREQ:
+ flags = RPMSENSE_PREREQ;
+ h = pkg->header;
+ break;
+ case RPMTAG_BUILDPREREQ:
+ flags = RPMSENSE_PREREQ;
+ h = spec->buildRestrictions;
+ break;
+ case RPMTAG_TRIGGERIN:
+ flags = RPMSENSE_TRIGGERIN;
+ h = pkg->header;
+ break;
+ case RPMTAG_TRIGGERPOSTUN:
+ flags = RPMSENSE_TRIGGERPOSTUN;
+ h = pkg->header;
+ break;
+ case RPMTAG_TRIGGERUN:
+ flags = RPMSENSE_TRIGGERUN;
+ h = pkg->header;
+ break;
+ case RPMTAG_BUILDREQUIRES:
+ flags = RPMSENSE_ANY;
+ h = spec->buildRestrictions;
+ break;
+ default:
+ case RPMTAG_REQUIREFLAGS:
+ flags = RPMSENSE_ANY;
+ h = pkg->header;
+ break;
+ }
+
for (r = field; *r; r = re) {
SKIPWHITE(r);
if (*r == '\0')
break;
-
+
+ /* Tokens must begin with alphanumeric, _, or / */
+ if (!(isalnum(r[0]) || r[0] == '_' || r[0] == '/')) {
+ rpmError(RPMERR_BADSPEC,
+ _("line %d: Dependency tokens must begin with alpha-numeric, '_' or '/': %s"),
+ spec->lineNum, spec->line);
+ return RPMERR_BADSPEC;
+ }
+
+ /* Don't permit file names as args for certain tags */
switch (tag) {
+ case RPMTAG_OBSOLETES:
case RPMTAG_CONFLICTFLAGS:
- if (r[0] == '/') {
- rpmError(RPMERR_BADSPEC,_("line %d: File name not permitted: %s"),
- spec->lineNum, spec->line);
- return RPMERR_BADSPEC;
- }
- flags = RPMSENSE_CONFLICTS;
- h = pkg->header;
- break;
case RPMTAG_BUILDCONFLICTS:
if (r[0] == '/') {
rpmError(RPMERR_BADSPEC,_("line %d: File name not permitted: %s"),
spec->lineNum, spec->line);
return RPMERR_BADSPEC;
}
- flags = RPMSENSE_CONFLICTS;
- h = spec->buildRestrictions;
- break;
- case RPMTAG_PREREQ:
- flags = RPMSENSE_PREREQ;
- h = pkg->header;
- break;
- case RPMTAG_BUILDPREREQ:
- flags = RPMSENSE_PREREQ;
- h = spec->buildRestrictions;
- break;
- case RPMTAG_TRIGGERIN:
- flags = RPMSENSE_TRIGGERIN;
- h = pkg->header;
- break;
- case RPMTAG_TRIGGERPOSTUN:
- flags = RPMSENSE_TRIGGERPOSTUN;
- h = pkg->header;
- break;
- case RPMTAG_TRIGGERUN:
- flags = RPMSENSE_TRIGGERUN;
- h = pkg->header;
- break;
- case RPMTAG_BUILDREQUIRES:
- flags = RPMSENSE_ANY;
- h = spec->buildRestrictions;
break;
default:
- case RPMTAG_REQUIREFLAGS:
- flags = RPMSENSE_ANY;
- h = pkg->header;
break;
}
ve = v;
SKIPNONWHITE(ve);
+ re = v; /* ==> next token (if no version found) starts here */
+
/* Check for possible logical operator */
if (ve > v) {
struct ReqComp *rc;
return RPMERR_BADSPEC;
}
switch(tag) {
+ case RPMTAG_PROVIDES:
+ case RPMTAG_OBSOLETES:
case RPMTAG_BUILDPREREQ:
case RPMTAG_PREREQ:
rpmError(RPMERR_BADSPEC,
version = malloc((ve-v) + 1);
strncpy(version, v, (ve-v));
version[ve-v] = '\0';
+ re = ve; /* ==> next token after version string starts here */
} else
version = NULL;
if (req) free(req);
if (version) free(version);
- re = ve;
- }
-
- return 0;
-}
-
-int parseProvidesObsoletes(Spec spec, Package pkg, const char *field, int tag)
-{
- const char *p, *pe;
- char *prov;
- int flags;
-
- flags = (tag == RPMTAG_PROVIDES) ? RPMSENSE_PROVIDES : RPMSENSE_OBSOLETES;
-
- for (p = field; *p; p = pe) {
- SKIPWHITE(p);
- if (*p == '\0')
- break;
-
- if (p[0] == '/' && tag != RPMTAG_PROVIDES) {
- rpmError(RPMERR_BADSPEC,
- _("line %d: No file names in Obsoletes: %s"),
- spec->lineNum, spec->line);
- return RPMERR_BADSPEC;
- }
- if (!(isalnum(p[0]) || p[0] == '_') &&
- (tag == RPMTAG_OBSOLETES || p[0] != '/')) {
- rpmError(RPMERR_BADSPEC,
- _("line %d: tokens must begin with alpha-numeric: %s"),
- spec->lineNum, spec->line);
- return RPMERR_BADSPEC;
- }
-
- pe = p;
- SKIPNONWHITE(pe);
- prov = malloc((pe-p) + 1);
- strncpy(prov, p, (pe-p));
- prov[pe-p] = '\0';
- addReqProv(spec, pkg->header, flags, prov, NULL, 0);
- free(prov);
}
return 0;
/* %trigger is a strange combination of %pre and Requires: behavior */
/* We can handle it by parsing the args before "--" in parseScript. */
-/* We then pass the remaining arguments to parseReqProv, along with */
+/* We then pass the remaining arguments to parseRCPOT, along with */
/* an index we just determined. */
int parseScript(Spec spec, int parsePart)
index = addTriggerIndex(pkg, file, p, prog);
/* Generate the trigger tags */
- if ((rc = parseRequiresConflicts(spec, pkg, reqargs, reqtag, index))) {
+ if ((rc = parseRCPOT(spec, pkg, reqargs, reqtag, index))) {
freeStringBuf(sb);
FREE(progArgv);
FREE(argv);
int parseFiles(Spec spec);
int parsePreamble(Spec spec, int initialPackage);
int parsePrep(Spec spec);
-int parseRequiresConflicts(Spec spec, Package pkg, const char *field,
- int tag, int index);
-int parseProvidesObsoletes(Spec spec, Package pkg, const char *field, int tag);
+int parseRCPOT(Spec spec, Package pkg, const char *field, int tag, int index);
int parseTrigger(Spec spec, Package pkg, char *field, int tag);
int parseScript(Spec spec, int parsePart);
int parseBuildInstallClean(Spec spec, int parsePart);
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 1999-06-16 16:15-0400\n"
+"POT-Creation-Date: 1999-06-17 11:17-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "Bad owner/group: %s"
msgstr ""
-#: ../build/files.c:1512
+#: ../build/files.c:1511
#, c-format
msgid "Couldn't exec %s"
msgstr ""
-#: ../build/files.c:1516
+#: ../build/files.c:1515
#, c-format
msgid "Couldn't fork %s"
msgstr ""
-#: ../build/files.c:1566
+#: ../build/files.c:1594
#, c-format
msgid "%s failed"
msgstr ""
-#: ../build/files.c:1570
+#: ../build/files.c:1598
#, c-format
msgid "failed to write all data to %s"
msgstr ""
-#: ../build/files.c:1604
+#: ../build/files.c:1632
msgid "Finding provides...\n"
msgstr ""
-#: ../build/files.c:1611
+#: ../build/files.c:1639
msgid "Failed to find provides"
msgstr ""
-#: ../build/files.c:1630
+#: ../build/files.c:1658
msgid "Finding requires...\n"
msgstr ""
-#: ../build/files.c:1637
+#: ../build/files.c:1665
msgid "Failed to find requires"
msgstr ""
-#: ../build/files.c:1671
+#: ../build/files.c:1699
msgid "Provides:"
msgstr ""
-#: ../build/files.c:1686
+#: ../build/files.c:1714
msgid "Prereqs:"
msgstr ""
-#: ../build/files.c:1698
+#: ../build/files.c:1726
msgid "Requires:"
msgstr ""
-#: ../build/files.c:1722
+#: ../build/files.c:1750
#, c-format
msgid "Processing files: %s\n"
msgstr ""
msgid "line %d: Epoch/Serial field must be a number: %s"
msgstr ""
-#: ../build/parsePreamble.c:526
+#: ../build/parsePreamble.c:522
#, c-format
msgid "line %d: Bad BuildArchitecture format: %s"
msgstr ""
-#: ../build/parsePreamble.c:536
+#: ../build/parsePreamble.c:532
#, c-format
msgid "Internal error: Bogus tag %d"
msgstr ""
-#: ../build/parsePreamble.c:683
+#: ../build/parsePreamble.c:679
#, c-format
msgid "Bad package specification: %s"
msgstr ""
-#: ../build/parsePreamble.c:689
+#: ../build/parsePreamble.c:685
#, c-format
msgid "Package already exists: %s"
msgstr ""
-#: ../build/parsePreamble.c:716
+#: ../build/parsePreamble.c:712
#, c-format
msgid "line %d: Unknown tag: %s"
msgstr ""
-#: ../build/parsePreamble.c:741
+#: ../build/parsePreamble.c:737
msgid "Spec file can't use BuildRoot"
msgstr ""
msgid "line %d: second %%prep"
msgstr ""
-#: ../build/parseReqs.c:47 ../build/parseReqs.c:56
+#: ../build/parseReqs.c:95
+#, c-format
+msgid "line %d: tokens must begin with alpha-numeric, '_' or '/': %s"
+msgstr ""
+
+#: ../build/parseReqs.c:106
#, c-format
msgid "line %d: File name not permitted: %s"
msgstr ""
-#: ../build/parseReqs.c:115
+#: ../build/parseReqs.c:139
#, c-format
msgid "line %d: Versioned file name not permitted: %s"
msgstr ""
-#: ../build/parseReqs.c:123
+#: ../build/parseReqs.c:149
#, c-format
msgid "line %d: Version not permitted: %s"
msgstr ""
-#: ../build/parseReqs.c:143
+#: ../build/parseReqs.c:169
#, c-format
msgid "line %d: Version required: %s"
msgstr ""
-#: ../build/parseReqs.c:179
-#, c-format
-msgid "line %d: No file names in Obsoletes: %s"
-msgstr ""
-
-#: ../build/parseReqs.c:186
-#, c-format
-msgid "line %d: tokens must begin with alpha-numeric: %s"
-msgstr ""
-
#: ../build/parseScript.c:138
#, c-format
msgid "line %d: triggers must have --: %s"