aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parsehdlist.c25
-rw-r--r--rpmtools.spec6
-rw-r--r--rpmtools.xs41
3 files changed, 48 insertions, 24 deletions
diff --git a/parsehdlist.c b/parsehdlist.c
index 16137eb..88c9235 100644
--- a/parsehdlist.c
+++ b/parsehdlist.c
@@ -1,7 +1,10 @@
+#include <sys/select.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <rpm/rpmlib.h>
@@ -314,6 +317,15 @@ int main(int argc, char **argv)
int fdno[2];
if (!pipe(fdno)) {
if ((pid = fork()) != 0) {
+ fd_set readfds;
+ struct timeval timeout;
+
+ FD_ZERO(&readfds);
+ FD_SET(fdno[0], &readfds);
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+ select(fdno[0]+1, &readfds, NULL, NULL, &timeout);
+
fd = fdDup(fdno[0]);
close(fdno[0]);
close(fdno[1]);
@@ -376,7 +388,17 @@ int main(int argc, char **argv)
long count = 0;
/* fprintf(stderr, "parsehdlist: reading %s\n", argv[i]); */
- while ((header=headerRead(fd, HEADER_MAGIC_YES))) {
+ while (count < 20 && (header=headerRead(fd, HEADER_MAGIC_YES)) == 0) {
+ struct timeval timeout;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 10000;
+ select(0, NULL, NULL, NULL, &timeout);
+
+ ++count;
+ }
+ count = 0;
+ while (header != 0) {
char *name = get_name(header, RPMTAG_NAME);
++count;
@@ -413,6 +435,7 @@ int main(int argc, char **argv)
}
headerFree(header);
}
+ header=headerRead(fd, HEADER_MAGIC_YES);
}
if (!count) exit(3); /* no package is an error */
}
diff --git a/rpmtools.spec b/rpmtools.spec
index 82ad4b4..3b56637 100644
--- a/rpmtools.spec
+++ b/rpmtools.spec
@@ -1,5 +1,5 @@
%define name rpmtools
-%define release 6mdk
+%define release 7mdk
# do not modify here, see Makefile in the CVS
%define version 4.0
@@ -54,6 +54,10 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/perl5/man/*/*
%changelog
+* Thu Jan 17 2002 François Pons <fpons@mandrakesoft.com> 4.0-7mdk
+- added safe guard delay to ensure data is available.
+- updated parsehdlist with such above feature.
+
* Thu Jan 17 2002 François Pons <fpons@mandrakesoft.com> 4.0-6mdk
- modified delay management in respect to rpmlib, use
select to wait for input before giving up to rpmlib.
diff --git a/rpmtools.xs b/rpmtools.xs
index e73998d..975ad89 100644
--- a/rpmtools.xs
+++ b/rpmtools.xs
@@ -522,9 +522,21 @@ _parse_(fileno_or_rpmfile, flag, info, ...)
/* start the big loop,
parse all header from fileno, then extract information to store into iinfo and iprovides. */
- while (fd_is_hdlist >= 0 ? (fd_is_hdlist > 0 ?
- ((header=headerRead(fd, HEADER_MAGIC_YES)) != 0) :
- ((fd_is_hdlist = -1), rpmReadPackageHeader(fd, &header, &i, NULL, NULL) == 0)) : 0) {
+ if (fd_is_hdlist) {
+ while (fd_is_hdlist < 20 && (header=headerRead(fd, HEADER_MAGIC_YES)) == 0) {
+ struct timeval timeout;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 10000;
+ select(0, NULL, NULL, NULL, &timeout);
+
+ ++fd_is_hdlist;
+ }
+ } else {
+ if (rpmReadPackageHeader(fd, &header, &i, NULL, NULL) != 0)
+ header = 0;
+ }
+ while (header != 0) {
SV *fullname_sv = get_fullname_sv(header);
HV* header_info = get_info(header, bflag, iprovides);
@@ -533,28 +545,13 @@ _parse_(fileno_or_rpmfile, flag, info, ...)
/* return fullname on stack */
EXTEND(SP, 1);
PUSHs(sv_2mortal(fullname_sv));
-#if 0
- char *name = get_name(header, RPMTAG_NAME);
- char *version = get_name(header, RPMTAG_VERSION);
- char *release = get_name(header, RPMTAG_RELEASE);
- char *arch = get_name(header, RPMTAG_ARCH);
- char *fullname = (char*)alloca(strlen(name)+strlen(version)+strlen(release)+strlen(arch)+4);
- STRLEN fullname_len = sprintf(fullname, "%s-%s-%s.%s", name, version, release, arch);
- HV* header_info = get_info(header, bflag, iprovides);
-
- /* once the hash header_info is built, store a reference to it
- in iinfo.
- note sv_name is not incremented here, it has the default value of before. */
- /* hv_store(iinfo, name, strlen(name), newRV_noinc((SV*)header_info), 0); */
- hv_store(iinfo, fullname, fullname_len, newRV_noinc((SV*)header_info), 0);
-
- /* return fullname on stack */
- EXTEND(SP, 1);
- PUSHs(sv_2mortal(newSVpv(fullname, fullname_len)));
-#endif
/* dispose of some memory */
headerFree(header);
+
+ /* continue loop for hdlist */
+ if (fd_is_hdlist)
+ header=headerRead(fd, HEADER_MAGIC_YES);
}
fdClose(fd);
} else croak("bad arguments list");