15 #include "popt/popt.h"
17 void addOrAppendListEntry(Header h, int_32 tag, char *line)
22 poptParseArgvString(line, &argc, &argv);
24 headerAddOrAppendEntry(h, tag, RPM_STRING_ARRAY_TYPE, argv, argc);
29 /* Parse a simple part line that only take -n <pkg> or <pkg> */
30 /* <pkg> is return in name as a pointer into a static buffer */
32 int parseSimplePart(char *line, char **name, int *flag)
36 static char buf[BUFSIZ];
38 strcpy(linebuf, line);
40 /* Throw away the first token (the %xxxx) */
41 strtok(linebuf, " \t\n");
43 if (!(tok = strtok(NULL, " \t\n"))) {
48 if (!strcmp(tok, "-n")) {
49 if (!(tok = strtok(NULL, " \t\n"))) {
59 return (strtok(NULL, " \t\n")) ? 1 : 0;
62 int parseYesNo(char *s)
64 if (!s || (s[0] == 'n' || s[0] == 'N') ||
65 !strcasecmp(s, "false") ||
66 !strcasecmp(s, "off") ||
74 char *findLastChar(char *s)
88 int parseNum(char *line, int *res)
93 *res = strtoul(line, &s1, 10);
94 if ((*s1) || (s1 == line) || (*res == ULONG_MAX)) {
101 StringBuf getOutputFrom(char *dir, char *argv[],
102 char *writePtr, int writeBytesLeft,
114 unsigned char buf[8193];
116 oldhandler = signal(SIGPIPE, SIG_IGN);
121 if (!(progPID = fork())) {
125 dup2(toProg[0], 0); /* Make stdin the in pipe */
126 dup2(fromProg[1], 1); /* Make stdout the out pipe */
135 execvp(argv[0], argv);
136 rpmError(RPMERR_EXEC, "Couldn't exec %s", argv[0]);
140 rpmError(RPMERR_FORK, "Couldn't fork %s", argv[0]);
147 /* Do not block reading or writing from/to prog. */
148 fcntl(fromProg[0], F_SETFL, O_NONBLOCK);
149 fcntl(toProg[1], F_SETFL, O_NONBLOCK);
151 readBuff = newStringBuf();
155 if (waitpid(progPID, &status, WNOHANG)) {
159 /* Write some stuff to the process if possible */
160 if (writeBytesLeft) {
162 write(toProg[1], writePtr,
163 (1024<writeBytesLeft) ? 1024 : writeBytesLeft)) < 0) {
164 if (errno != EAGAIN) {
165 perror("getOutputFrom()");
170 writeBytesLeft -= bytesWritten;
171 writePtr += bytesWritten;
176 /* Read any data from prog */
177 bytes = read(fromProg[0], buf, sizeof(buf)-1);
180 appendStringBuf(readBuff, buf);
181 bytes = read(fromProg[0], buf, sizeof(buf)-1);
184 /* terminate when prog dies */
189 signal(SIGPIPE, oldhandler);
191 if (writeBytesLeft) {
192 rpmError(RPMERR_EXEC, "failed to write all data to %s", argv[0]);
195 waitpid(progPID, &status, 0);
196 if (failNonZero && (!WIFEXITED(status) || WEXITSTATUS(status))) {
197 rpmError(RPMERR_EXEC, "%s failed", argv[0]);