Description of problem: RPM scripts fail on cygwin due to bugs in cygwin's signal handling. To work around this issue, I set the psm->sq.reaper = 0 for cygwin. This should envoke the waitpid handler instead of the numerous threaded voodoo. Version-Release number of selected component (if applicable): RPM 4.3+ How reproducible: In lib/psm.c change psm->sq.reaper = 0. Scripts will no longer run properly. Additional info: The problem was determined to be that "rpmsqInsert" normally resets all of the "sq" values. However, when the reaper = 0, rpmsqInsert is never called, so they have to be manually reset. Also the sq->pipes only get setup if the reaper = 1. So the closing/monitoring of these needs to be avoided when reaper = 0. I have attached a patch that we used to work around this. Unfortunatly it won't cleanly apply to anything but RPM's HEAD branch. (It works with James Olin Oden's dead lock patch.. see rpm-devel mailing list, 1/28/05.)
Created attachment 116711 [details] Enable waitpid for cygwin
Most of the patch was long since incorporated into rpm-4.4.3 (iirc). Meanwhile, this patch avoids blocking the child on the parent's pipe close if waitpid (i.e. sq->reaper = 0) is compiled in: Index: rpmsq.c =============================================================== ==== RCS file: /cvs/devel/rpm/rpmio/rpmsq.c,v retrieving revision 1.17.2.6 diff -u -b -B -w -p -r1.17.2.6 rpmsq.c --- rpmsq.c 16 Nov 2005 13:59:38 -0000 1.17.2.6 +++ rpmsq.c 7 Jul 2006 04:26:54 -0000 @@ -449,6 +449,7 @@ fprintf(stderr, " Enable(%p): %p\n", /* Block to permit parent time to wait. */ /*@-bounds@*/ xx = close(sq->pipes[1]); + if (sq->reaper) xx = read(sq->pipes[0], &yy, sizeof(yy)); xx = close(sq->pipes[0]); sq->pipes[0] = sq->pipes[1] = -1;