diff options
author | Avi Kivity <avi@redhat.com> | 2009-12-07 11:04:32 +0200 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-07 11:04:32 +0200 |
commit | 149d76049af52aa76f4665b6bc9bdbd5904a8588 (patch) | |
tree | e07c6dfe28f03438dff9bb07240a7534c010f990 /osdep.c | |
parent | Merge commit 'e9b2e81889d9877415710484b876ee57a42b0bcb' into upstream-merge (diff) | |
parent | Don't leak file descriptors (diff) | |
download | qemu-kvm-149d76049af52aa76f4665b6bc9bdbd5904a8588.tar.gz qemu-kvm-149d76049af52aa76f4665b6bc9bdbd5904a8588.tar.bz2 qemu-kvm-149d76049af52aa76f4665b6bc9bdbd5904a8588.zip |
Merge commit '40ff6d7e8dceca227e7f8a3e8e0d58b2c66d19b4' into upstream-merge
* commit '40ff6d7e8dceca227e7f8a3e8e0d58b2c66d19b4':
Don't leak file descriptors
qemu-img: There is more than one host device driver
qcow2: Fix some more qemu_malloc fallout
qcow2: Store exact backing format length
virtio-blk: Implement rerror option
ide: Implement rerror option
Conflicts:
posix-aio-compat.c
Extended qemu_set_cloexec() to compatfd.c.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'osdep.c')
-rw-r--r-- | osdep.c | 104 |
1 files changed, 103 insertions, 1 deletions
@@ -125,7 +125,7 @@ int qemu_create_pidfile(const char *filename) #ifndef _WIN32 int fd; - fd = open(filename, O_RDWR | O_CREAT, 0600); + fd = qemu_open(filename, O_RDWR | O_CREAT, 0600); if (fd == -1) return -1; @@ -205,11 +205,113 @@ int inet_aton(const char *cp, struct in_addr *ia) ia->s_addr = addr; return 1; } + +void qemu_set_cloexec(int fd) +{ +} + #else + void socket_set_nonblock(int fd) { int f; f = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, f | O_NONBLOCK); } + +void qemu_set_cloexec(int fd) +{ + int f; + f = fcntl(fd, F_GETFD); + fcntl(fd, F_SETFD, f | FD_CLOEXEC); +} + +#endif + +/* + * Opens a file with FD_CLOEXEC set + */ +int qemu_open(const char *name, int flags, ...) +{ + int ret; + int mode = 0; + + if (flags & O_CREAT) { + va_list ap; + + va_start(ap, flags); + mode = va_arg(ap, int); + va_end(ap); + } + +#ifdef O_CLOEXEC + ret = open(name, flags | O_CLOEXEC, mode); +#else + ret = open(name, flags, mode); + if (ret >= 0) { + qemu_set_cloexec(ret); + } #endif + + return ret; +} + +#ifndef _WIN32 +/* + * Creates a pipe with FD_CLOEXEC set on both file descriptors + */ +int qemu_pipe(int pipefd[2]) +{ + int ret; + +#ifdef CONFIG_PIPE2 + ret = pipe2(pipefd, O_CLOEXEC); +#else + ret = pipe(pipefd); + if (ret == 0) { + qemu_set_cloexec(pipefd[0]); + qemu_set_cloexec(pipefd[1]); + } +#endif + + return ret; +} +#endif + +/* + * Opens a socket with FD_CLOEXEC set + */ +int qemu_socket(int domain, int type, int protocol) +{ + int ret; + +#ifdef SOCK_CLOEXEC + ret = socket(domain, type | SOCK_CLOEXEC, protocol); +#else + ret = socket(domain, type, protocol); + if (ret >= 0) { + qemu_set_cloexec(ret); + } +#endif + + return ret; +} + +/* + * Accept a connection and set FD_CLOEXEC + */ +int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + int ret; + +#ifdef CONFIG_ACCEPT4 + ret = accept4(s, addr, addrlen, SOCK_CLOEXEC); +#else + ret = accept(s, addr, addrlen); + if (ret >= 0) { + qemu_set_cloexec(ret); + } +#endif + + return ret; +} |