/* * Opens a file with FD_CLOEXEC set */ int qemu_open(const char *name, int flags, ...) { int ret; int mode = 0; #ifndef _WIN32 const char *fdset_id_str; /* Attempt dup of fd from fd set */ if (strstart(name, "/dev/fdset/", &fdset_id_str)) { int64_t fdset_id; int fd, dupfd; fdset_id = qemu_parse_fdset(fdset_id_str); if (fdset_id == -1) { errno = EINVAL; return -1; } fd = monitor_fdset_get_fd(fdset_id, flags); if (fd == -1) { return -1; } dupfd = qemu_dup_flags(fd, flags); if (dupfd == -1) { return -1; } ret = monitor_fdset_dup_fd_add(fdset_id, dupfd); if (ret == -1) { close(dupfd); errno = EINVAL; return -1; } return dupfd; } #endif if (flags & O_CREAT) { va_list ap; va_start(ap, flags); mode = va_arg(ap, int); va_end(ap); }
int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive) { int ret; struct flock fl = { .l_whence = SEEK_SET, .l_start = start, .l_len = len, .l_type = exclusive ? F_WRLCK : F_RDLCK, }; qemu_probe_lock_ops(); ret = fcntl(fd, fcntl_op_getlk, &fl); if (ret == -1) { return -errno; } else { return fl.l_type == F_UNLCK ? 0 : -EAGAIN; } } #endif /* * Opens a file with FD_CLOEXEC set */ int qemu_open(const char *name, int flags, ...) { int ret; int mode = 0; #ifndef _WIN32 const char *fdset_id_str; /* Attempt dup of fd from fd set */ if (strstart(name, "/dev/fdset/", &fdset_id_str)) { int64_t fdset_id; int fd, dupfd; fdset_id = qemu_parse_fdset(fdset_id_str); if (fdset_id == -1) { errno = EINVAL; return -1; } fd = monitor_fdset_get_fd(fdset_id, flags); if (fd == -1) { return -1; } dupfd = qemu_dup_flags(fd, flags); if (dupfd == -1) { return -1; } ret = monitor_fdset_dup_fd_add(fdset_id, dupfd); if (ret == -1) { close(dupfd); errno = EINVAL; return -1; } return dupfd; } #endif if (flags & O_CREAT) { va_list ap; va_start(ap, flags); mode = va_arg(ap, int); va_end(ap); }