libvirt/src/util
Laszlo Ersek d19149dda8 virCommandProcessIO(): make poll() usage more robust
POLLIN and POLLHUP are not mutually exclusive. Currently the following
seems possible: the child writes 3K to its stdout or stderr pipe, and
immediately closes it. We get POLLIN|POLLHUP (I'm not sure that's possible
on Linux, but SUSv4 seems to allow it). We read 1K and throw away the
rest.

When poll() returns and we're about to check the /revents/ member in a
given array element, let's map all the revents bits to two (independent)
ideas: "let's attempt to read()", and "let's attempt to write()". This
should cover all errors, EOFs, and normal conditions; the read()/write()
call should report any pending error.

Under this approach, both POLLHUP and POLLERR are mapped to "needs read()"
if we're otherwise prepared for POLLIN. POLLERR also maps to "needs
write()" if we're otherwise prepared for POLLOUT. The rest of the mappings
(POLLPRI etc.) would be easy, but probably useless for pipes.

Additionally, SUSv4 doesn't appear to forbid POLLIN|POLLERR (or
POLLOUT|POLLERR) set simultaneously. One could argue that the read() or
write() call would return without blocking in these cases (with an error),
so POLLIN / POLLOUT would be justified beside POLLERR.

The code now penalizes POLLIN|POLLERR differently from plain POLLERR. The
former (ie. read() returning -1) is terminal and we jump to cleanup, while
plain POLLERR masks only the affected file descriptor for the future.
Let's unify those.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
2012-01-24 13:50:45 -07:00
..
authhelper.c esx: Move username and password helper functions to authhelper.c 2010-03-16 20:15:32 +01:00
authhelper.h esx: Move username and password helper functions to authhelper.c 2010-03-16 20:15:32 +01:00
bitmap.c maint: rename virBufferVSprintf to virBufferAsprintf 2011-05-05 13:47:40 -06:00
bitmap.h Put <stdbool.h> into internal.h so it is available everywhere 2011-02-24 12:04:06 +00:00
buf.c Fix strchr call triggering gcc 4.3 & 4.4 bug 2011-11-15 15:00:10 -05:00
buf.h virbuf: add auto-indentation support 2011-10-20 16:02:16 -06:00
cgroup.c Add functions to set/get cgroup cpuset parameters 2011-12-20 09:13:36 -07:00
cgroup.h Add functions to set/get cgroup cpuset parameters 2011-12-20 09:13:36 -07:00
command.c virCommandProcessIO(): make poll() usage more robust 2012-01-24 13:50:45 -07:00
command.h command: move all docs into .c file 2011-07-21 10:34:51 -06:00
conf.c error: drop old-style error reporting 2012-01-19 13:26:04 -07:00
conf.h esx: Allow '-' in VMX entry names 2010-09-23 10:37:10 +02:00
dnsmasq.c maint: fix improper use of 'an' 2011-12-03 17:11:56 -07:00
dnsmasq.h Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
ebtables.c Move virRun, virExec*, virFork to util/command 2011-06-07 14:06:11 -04:00
ebtables.h build: consistently indent preprocessor directives 2010-03-09 19:22:28 +01:00
event_poll.c Remove time APIs from src/util/util.h 2011-11-30 11:43:50 +00:00
event_poll.h Move event code out of the daemon/ into src/util/ 2011-03-07 14:16:13 +00:00
event.c Introduce virConnectSetKeepAlive 2011-11-24 11:44:08 +01:00
event.h Promote virEvent*Handle/Timeout to public API 2011-06-21 10:08:47 -04:00
hash.c Compare two hash tables for equality 2012-01-23 15:35:54 -05:00
hash.h Compare two hash tables for equality 2012-01-23 15:35:54 -05:00
hooks.c utils: More useful error message for hook script failure 2011-07-29 22:40:47 +08:00
hooks.h qemu: add two hook script events "prepare" and "release" 2011-03-22 21:12:36 +08:00
hostusb.c qemu: Keep list of USB devices attached to domains 2011-12-24 18:12:04 +01:00
hostusb.h qemu: Keep list of USB devices attached to domains 2011-12-24 18:12:04 +01:00
iohelper.c util: fix thinko in runIO 2011-11-25 05:37:39 -07:00
iptables.c maint: fix improper use of 'an' 2011-12-03 17:11:56 -07:00
iptables.h Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
json.c Remove bogus warning message in JSON code 2011-06-30 18:04:01 +01:00
json.h json: Fix *GetBoolean functions 2011-05-09 14:02:13 +02:00
keymaps.csv Rsync keymaps.csv file with GTK-VNC 2012-01-12 20:44:55 +00:00
logging.c maint: typo fixes 2011-12-01 16:08:34 -07:00
logging.h logging: Do not log timestamp through syslog 2011-09-29 13:42:34 +02:00
memory.c build: fix cygwin strerror_r failure 2011-02-11 12:32:17 -07:00
memory.h build: make VIR_FREE do some type checking 2011-04-25 10:20:18 -06:00
netlink.c build: fix compilation on systems missing libnl and new includes 2011-06-23 11:54:11 -04:00
netlink.h build: fix compilation on systems missing libnl and new includes 2011-06-23 11:54:11 -04:00
pci.c qemu: Introduce inactive PCI device list 2012-01-17 17:05:32 -07:00
pci.h qemu: Introduce inactive PCI device list 2012-01-17 17:05:32 -07:00
processinfo.c build: update gnulib 2010-05-06 14:35:38 -06:00
processinfo.h build: consistently indent preprocessor directives 2010-03-09 19:22:28 +01:00
qparams.c qparams.c: do not skip va_end, twice 2010-02-19 11:52:04 +01:00
qparams.h build: consistently indent preprocessor directives 2010-03-09 19:22:28 +01:00
sexpr.c Don't copy sexpr node value that is an empty string 2011-11-18 16:00:31 -07:00
sexpr.h Use virBufferPtr for sexpr2string instead of manual buffer handling 2011-04-05 09:14:59 +02:00
stats_linux.c build: rename files.h to virfile.h 2011-07-21 10:34:51 -06:00
stats_linux.h build: consistently indent preprocessor directives 2010-03-09 19:22:28 +01:00
storage_file.c util: avoid null deref on qcowXGetBackingStore 2011-11-30 11:05:13 +01:00
storage_file.h storage: Avoid memory leak on metadata fetching 2011-07-14 16:39:42 +02:00
sysinfo.c snapshot: simplify indentation of sysinfo 2011-10-20 16:02:16 -06:00
sysinfo.h snapshot: simplify indentation of sysinfo 2011-10-20 16:02:16 -06:00
threadpool.c threadpool: Use while loop on virCondWait 2011-12-09 19:33:11 +01:00
threadpool.h daemon: Create priority workers pool 2011-09-05 18:14:08 +02:00
threads-pthread.c threads: check for failure to set thread-local value 2012-01-19 13:14:10 -07:00
threads-pthread.h threads: add one-time initialization support 2011-04-25 08:53:09 -06:00
threads-win32.c threads: check for failure to set thread-local value 2012-01-19 13:14:10 -07:00
threads-win32.h threads: add one-time initialization support 2011-04-25 08:53:09 -06:00
threads.c build: avoid pthreads-win32 on mingw 2010-06-10 06:05:31 -06:00
threads.h threads: check for failure to set thread-local value 2012-01-19 13:14:10 -07:00
util.c util: add new file for virTypedParameter utils 2012-01-19 13:14:10 -07:00
util.h util: add new file for virTypedParameter utils 2012-01-19 13:14:10 -07:00
uuid.c uuid: fix off-by-one 2012-01-12 15:18:23 -07:00
uuid.h build: add compiler attributes to virUUIDParse 2011-10-13 12:23:37 -06:00
viraudit.c build: rename files.h to virfile.h 2011-07-21 10:34:51 -06:00
viraudit.h maint: rename virtaudit to match file contents 2011-07-12 07:24:43 -06:00
virfile.c Introduce virFileRewrite for safe file rewrite 2011-10-27 20:11:24 +02:00
virfile.h Introduce virFileRewrite for safe file rewrite 2011-10-27 20:11:24 +02:00
virkeycode-mapgen.py Fix keymap used to talk with QEMU 2011-08-26 14:18:57 +01:00
virkeycode.c Fix keymap used to talk with QEMU 2011-08-26 14:18:57 +01:00
virkeycode.h util: add virtkeycode module 2011-07-21 15:57:47 +08:00
virnetdev.c Added Function virNetDevGetVirtualFunctions 2012-01-11 13:01:16 -07:00
virnetdev.h Added Function virNetDevGetVirtualFunctions 2012-01-11 13:01:16 -07:00
virnetdevbandwidth.c bandwidth: Fix funky identation 2011-11-29 14:26:14 +01:00
virnetdevbandwidth.h Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
virnetdevbridge.c bridge: Fix forward delay APIs 2011-12-09 13:57:45 +01:00
virnetdevbridge.h Split bridge.h into three separate files 2011-11-09 16:34:25 +00:00
virnetdevmacvlan.c util: Plug memory leak on virNetDevMacVLanCreateWithVPortProfile() error path 2011-11-30 16:57:08 -07:00
virnetdevmacvlan.h Allow creation of plain macvlan devices 2011-11-18 16:10:37 +00:00
virnetdevtap.c Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
virnetdevtap.h Split bridge.h into three separate files 2011-11-09 16:34:25 +00:00
virnetdevveth.c Move LXC veth.c code into shared utility APIs 2011-11-15 10:28:02 +00:00
virnetdevveth.h Move LXC veth.c code into shared utility APIs 2011-11-15 10:28:02 +00:00
virnetdevvportprofile.c Fix disabling of virtual port profile code on old hosts 2011-11-23 12:29:37 +00:00
virnetdevvportprofile.h Rename and split the macvtap.c file 2011-11-18 16:10:01 +00:00
virnodesuspend.c Don't mark suspend as active until we know it is running 2011-11-30 10:12:30 +00:00
virnodesuspend.h Move suspend capabilities APIs out of util.h into virnodesuspend.c 2011-11-30 10:12:29 +00:00
virpidfile.c debug: Annotate some variables as unused 2011-09-27 10:16:46 +02:00
virpidfile.h Add some APIs which use locking for crashsafe pidfile handling 2011-08-12 20:37:00 +01:00
virsocketaddr.c Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
virsocketaddr.h Split src/util/network.{c,h} into 5 pieces 2011-11-15 10:27:54 +00:00
virterror_internal.h error: drop old-style error reporting 2012-01-19 13:26:04 -07:00
virterror.c error: drop old-style error reporting 2012-01-19 13:26:04 -07:00
virtime.c Don't use undocumented __isleap macro 2011-12-01 13:28:44 +00:00
virtime.h Add internal APIs for dealing with time 2011-11-30 11:43:49 +00:00
virtypedparam.c maint: enforce use of _LAST marker 2012-01-20 16:16:04 -07:00
virtypedparam.h util: add new file for virTypedParameter utils 2012-01-19 13:14:10 -07:00
xml.c build: fix build with older libxml2 2011-12-08 11:37:24 +08:00
xml.h build: fix build with older libxml2 2011-12-08 11:37:24 +08:00