On 06/06/2011 02:40 PM, Michael Schroeder wrote:

Hi guys,

what's the reason for the complex pipe handling with sigpipe_handler(),
sigpipe_init() and sigpipe_finish()?

The point was to make it more robust:
a) use blocking io instead of spinning on a timeout that will inevitably be wrong for some case somewhere b) be tolerant against errors, such as missing script interpreters and bad arguments which cause the generator helpers to exit before reading their stdin at all

Both being more important than before now that we're encouraging packagers to add dependency generators on their own instead of piling everything into rpm itself.

IMHO aborting the read when a SIGCHLD occurs is wrong, as the
pipe may still contain unread data (and data is only read in
sizeof(buf)-1 chunks). Wouldn't it make more sense to simply
ignore SIGCHLD and read until an EOF is returned, i.e. the
read returns zero bytes?

SIGCHLD needs to be caught to avoid hanging in the select if the child exists without flushing its stdin, but you're probably right the reading side could (in some rather rare conditions) miss some final bits from the child output. Hum, I guess SIGCHLD should only abort the loop if there are unwritten bytes left. Need to scratch head + consume coffee some more...

Mind you, I do agree the thing is more complex and error prone than I care for. On more than one occasion I've considered replacing it with a dirt-simple setup using temporary files and letting the shell deal with the pesky little details.

        - Panu -
_______________________________________________
Rpm-maint mailing list
Rpm-maint@lists.rpm.org
http://lists.rpm.org/mailman/listinfo/rpm-maint

Reply via email to