diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2014-11-03 14:55:17 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2014-11-03 14:55:17 +0000 |
commit | 7135781f65f1267a72bf554ee2b7bd605f9e59aa (patch) | |
tree | 403f29f7852bf516c8df05fec487281a12b9834e /os-posix.c | |
parent | f67d23b1ae32b97064fa8f05330efbb09e5d4b07 (diff) | |
parent | f18a768efb990d9cd02911159de02e8ff5475239 (diff) | |
download | qemu-7135781f65f1267a72bf554ee2b7bd605f9e59aa.zip qemu-7135781f65f1267a72bf554ee2b7bd605f9e59aa.tar.gz qemu-7135781f65f1267a72bf554ee2b7bd605f9e59aa.tar.bz2 |
Merge remote-tracking branch 'remotes/mjt/tags/pull-trivial-patches-2014-11-02' into staging
trivial patches for 2014-11-02
# gpg: Signature made Sun 02 Nov 2014 11:54:43 GMT using RSA key ID A4C3D7DB
# gpg: Good signature from "Michael Tokarev <mjt@tls.msk.ru>"
# gpg: aka "Michael Tokarev <mjt@corpit.ru>"
# gpg: aka "Michael Tokarev <mjt@debian.org>"
* remotes/mjt/tags/pull-trivial-patches-2014-11-02: (23 commits)
vdi: wrapped uuid_unparse() in #ifdef
tap: fix possible fd leak in net_init_tap
tap: do not close(fd) in net_init_tap_one
target-i386: Remove unused model_features_t struct
tap_int.h: remove repeating NETWORK_SCRIPT defines
os-posix: reorder parent notification for -daemonize
pidfile: stop making pidfile error a special case
os-posix: replace goto again with a proper loop
os-posix: use global daemon_pipe instead of cryptic fds[1]
dump: Fix dump-guest-memory termination and use-after-close
virtio-9p-proxy: improve error messages in connect_namedsocket()
virtio-9p-proxy: fix error return in proxy_init()
virtio-9p-proxy: Fix sockfd leak
target-tricore: check return value before using it
net/slirp: specify logbase for smbd
Revert "os-posix: report error message when lock file failed"
util: Improve os_mem_prealloc error message
sparse: fix build
target-arm: A64: remove redundant store
target-xtensa: mark XtensaConfig structs as unused
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'os-posix.c')
-rw-r--r-- | os-posix.c | 66 |
1 files changed, 24 insertions, 42 deletions
@@ -47,7 +47,7 @@ static struct passwd *user_pwd; static const char *chroot_dir; static int daemonize; -static int fds[2]; +static int daemon_pipe; void os_setup_early_signal_handling(void) { @@ -205,6 +205,7 @@ void os_daemonize(void) { if (daemonize) { pid_t pid; + int fds[2]; if (pipe(fds) == -1) { exit(1); @@ -217,26 +218,21 @@ void os_daemonize(void) close(fds[1]); - again: - len = read(fds[0], &status, 1); - if (len == -1 && (errno == EINTR)) { - goto again; - } - if (len != 1) { - exit(1); - } - else if (status == 1) { - fprintf(stderr, "Could not acquire pidfile\n"); - exit(1); - } else { - exit(0); - } - } else if (pid < 0) { - exit(1); - } + do { + len = read(fds[0], &status, 1); + } while (len < 0 && errno == EINTR); + + /* only exit successfully if our child actually wrote + * a one-byte zero to our pipe, upon successful init */ + exit(len == 1 && status == 0 ? 0 : 1); + + } else if (pid < 0) { + exit(1); + } close(fds[0]); - qemu_set_cloexec(fds[1]); + daemon_pipe = fds[1]; + qemu_set_cloexec(daemon_pipe); setsid(); @@ -259,17 +255,6 @@ void os_setup_post(void) int fd = 0; if (daemonize) { - uint8_t status = 0; - ssize_t len; - - again1: - len = write(fds[1], &status, 1); - if (len == -1 && (errno == EINTR)) { - goto again1; - } - if (len != 1) { - exit(1); - } if (chdir("/")) { perror("not able to chdir to /"); exit(1); @@ -284,23 +269,22 @@ void os_setup_post(void) change_process_uid(); if (daemonize) { + uint8_t status = 0; + ssize_t len; + dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); close(fd); - } -} -void os_pidfile_error(void) -{ - if (daemonize) { - uint8_t status = 1; - if (write(fds[1], &status, 1) != 1) { - perror("daemonize. Writing to pipe\n"); + do { + len = write(daemon_pipe, &status, 1); + } while (len < 0 && errno == EINTR); + if (len != 1) { + exit(1); } - } else - fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno)); + } } void os_set_line_buffering(void) @@ -319,8 +303,6 @@ int qemu_create_pidfile(const char *filename) return -1; } if (lockf(fd, F_TLOCK, 0) == -1) { - fprintf(stderr, "lock file '%s' failed: %s\n", - filename, strerror(errno)); close(fd); return -1; } |