/* * Release all resources */ void virCommandFree(virCommandPtr cmd) { int i; if (!cmd) return; for (i = STDERR_FILENO + 1; i < FD_SETSIZE; i++) { if (FD_ISSET(i, &cmd->transfer)) { int tmpfd = i; VIR_FORCE_CLOSE(tmpfd); } } VIR_FREE(cmd->inbuf); VIR_FORCE_CLOSE(cmd->outfd); VIR_FORCE_CLOSE(cmd->errfd); for (i = 0 ; i < cmd->nargs ; i++) VIR_FREE(cmd->args[i]); VIR_FREE(cmd->args); for (i = 0 ; i < cmd->nenv ; i++) VIR_FREE(cmd->env[i]); VIR_FREE(cmd->env); VIR_FREE(cmd->pwd); VIR_FREE(cmd->pidfile); if (cmd->reap) virCommandAbort(cmd); VIR_FREE(cmd); }
static int virUUIDGenerateRandomBytes(unsigned char *buf, int buflen) { int fd; if ((fd = open("/dev/urandom", O_RDONLY)) < 0) return errno; while (buflen > 0) { int n; if ((n = read(fd, buf, buflen)) <= 0) { if (errno == EINTR) continue; VIR_FORCE_CLOSE(fd); return n < 0 ? errno : ENODATA; } buf += n; buflen -= n; } VIR_FORCE_CLOSE(fd); return 0; }
static int virLXCProcessReadLogOutput(virDomainObjPtr vm, char *logfile, off_t pos, char *buf, size_t buflen) { int fd = -1; int ret; if ((fd = open(logfile, O_RDONLY)) < 0) { virReportSystemError(errno, _("Unable to open log file %s"), logfile); return -1; } if (lseek(fd, pos, SEEK_SET) < 0) { virReportSystemError(errno, _("Unable to seek log file %s to %llu"), logfile, (unsigned long long)pos); VIR_FORCE_CLOSE(fd); return -1; } ret = virLXCProcessReadLogOutputData(vm, fd, buf, buflen); VIR_FORCE_CLOSE(fd); return ret; }
static int testRotatingFileInitOne(const char *filename, off_t size, char pattern) { if (size == (off_t)-1) { VIR_DEBUG("Deleting %s", filename); unlink(filename); } else { VIR_DEBUG("Creating %s size %zu", filename, (size_t)size); char buf[1024]; int fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0700); if (fd < 0) { fprintf(stderr, "Cannot create %s\n", filename); return -1; } memset(buf, pattern, sizeof(buf)); while (size) { size_t towrite = size; if (towrite > sizeof(buf)) towrite = sizeof(buf); if (safewrite(fd, buf, towrite) != towrite) { fprintf(stderr, "Cannot write to %s\n", filename); VIR_FORCE_CLOSE(fd); return -1; } size -= towrite; } VIR_FORCE_CLOSE(fd); } return 0; }
int virtTestCaptureProgramOutput(const char *const argv[], char **buf, int maxlen) { int pipefd[2]; int len; if (pipe(pipefd) < 0) return -1; pid_t pid = fork(); switch (pid) { case 0: VIR_FORCE_CLOSE(pipefd[0]); virtTestCaptureProgramExecChild(argv, pipefd[1]); VIR_FORCE_CLOSE(pipefd[1]); _exit(1); case -1: return -1; default: VIR_FORCE_CLOSE(pipefd[1]); len = virFileReadLimFD(pipefd[0], maxlen, buf); VIR_FORCE_CLOSE(pipefd[0]); if (virProcessWait(pid, NULL) < 0) return -1; return len; } }
/** * brInit: * @ctlp: pointer to bridge control return value * * Initialize a new bridge layer. In case of success * @ctlp will contain a pointer to the new bridge structure. * * Returns 0 in case of success, an error code otherwise. */ int brInit(brControl **ctlp) { int fd; int flags; if (!ctlp || *ctlp) return EINVAL; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) return errno; if ((flags = fcntl(fd, F_GETFD)) < 0 || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { int err = errno; VIR_FORCE_CLOSE(fd); return err; } if (VIR_ALLOC(*ctlp) < 0) { VIR_FORCE_CLOSE(fd); return ENOMEM; } (*ctlp)->fd = fd; return 0; }
static int getDMISystemUUID(char *uuid, int len) { unsigned int i = 0; const char *paths[] = { "/sys/devices/virtual/dmi/id/product_uuid", "/sys/class/dmi/id/product_uuid", NULL }; while (paths[i]) { int fd = open(paths[i], O_RDONLY); if (fd >= 0) { if (saferead(fd, uuid, len - 1) == len - 1) { uuid[len - 1] = '\0'; VIR_FORCE_CLOSE(fd); return 0; } VIR_FORCE_CLOSE(fd); } i++; } return -1; }
int virStorageGenerateQcowPassphrase(unsigned char *dest) { int fd; size_t i; /* A qcow passphrase is up to 16 bytes, with any data following a NUL ignored. Prohibit control and non-ASCII characters to avoid possible unpleasant surprises with the qemu monitor input mechanism. */ fd = open("/dev/urandom", O_RDONLY); if (fd < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot open /dev/urandom")); return -1; } i = 0; while (i < VIR_STORAGE_QCOW_PASSPHRASE_SIZE) { ssize_t r; while ((r = read(fd, dest + i, 1)) == -1 && errno == EINTR) ; if (r <= 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot read from /dev/urandom")); VIR_FORCE_CLOSE(fd); return -1; } if (dest[i] >= 0x20 && dest[i] <= 0x7E) i++; /* Got an acceptable character */ } VIR_FORCE_CLOSE(fd); return 0; }
static int lxcSetupLoopDevice(virDomainFSDefPtr fs) { int lofd = -1; int fsfd = -1; struct loop_info64 lo; char *loname = NULL; int ret = -1; if ((lofd = lxcGetLoopFD(&loname)) < 0) return -1; memset(&lo, 0, sizeof(lo)); lo.lo_flags = LO_FLAGS_AUTOCLEAR; if ((fsfd = open(fs->src, O_RDWR)) < 0) { virReportSystemError(errno, _("Unable to open %s"), fs->src); goto cleanup; } if (ioctl(lofd, LOOP_SET_FD, fsfd) < 0) { virReportSystemError(errno, _("Unable to attach %s to loop device"), fs->src); goto cleanup; } if (ioctl(lofd, LOOP_SET_STATUS64, &lo) < 0) { virReportSystemError(errno, "%s", _("Unable to mark loop device as autoclear")); if (ioctl(lofd, LOOP_CLR_FD, 0) < 0) VIR_WARN("Unable to detach %s from loop device", fs->src); goto cleanup; } VIR_DEBUG("Attached loop device %s %d to %s", fs->src, lofd, loname); /* * We now change it into a block device type, so that * the rest of container setup 'just works' */ fs->type = VIR_DOMAIN_FS_TYPE_BLOCK; VIR_FREE(fs->src); fs->src = loname; loname = NULL; ret = 0; cleanup: VIR_FREE(loname); VIR_FORCE_CLOSE(fsfd); if (ret == -1) VIR_FORCE_CLOSE(lofd); return lofd; }
static virNetClientPtr virNetClientNew(virNetSocketPtr sock, const char *hostname) { virNetClientPtr client = NULL; int wakeupFD[2] = { -1, -1 }; if (pipe2(wakeupFD, O_CLOEXEC) < 0) { virReportSystemError(errno, "%s", _("unable to make pipe")); goto error; } if (VIR_ALLOC(client) < 0) goto no_memory; client->refs = 1; if (virMutexInit(&client->lock) < 0) goto error; client->sock = sock; client->wakeupReadFD = wakeupFD[0]; client->wakeupSendFD = wakeupFD[1]; wakeupFD[0] = wakeupFD[1] = -1; if (hostname && !(client->hostname = strdup(hostname))) goto no_memory; /* Set up a callback to listen on the socket data */ client->refs++; if (virNetSocketAddIOCallback(client->sock, VIR_EVENT_HANDLE_READABLE, virNetClientIncomingEvent, client, virNetClientEventFree) < 0) { client->refs--; VIR_DEBUG("Failed to add event watch, disabling events"); } PROBE(RPC_CLIENT_NEW, "client=%p refs=%d sock=%p", client, client->refs, client->sock); return client; no_memory: virReportOOMError(); error: VIR_FORCE_CLOSE(wakeupFD[0]); VIR_FORCE_CLOSE(wakeupFD[1]); virNetClientFree(client); return NULL; }
static int SELinuxInitialize(void) { char *ptr = NULL; int fd = 0; fd = open(selinux_virtual_domain_context_path(), O_RDONLY); if (fd < 0) { virReportSystemError(errno, _("cannot open SELinux virtual domain context file '%s'"), selinux_virtual_domain_context_path()); return -1; } if (saferead(fd, default_domain_context, sizeof(default_domain_context)) < 0) { virReportSystemError(errno, _("cannot read SELinux virtual domain context file %s"), selinux_virtual_domain_context_path()); VIR_FORCE_CLOSE(fd); return -1; } VIR_FORCE_CLOSE(fd); ptr = strchrnul(default_domain_context, '\n'); *ptr = '\0'; if ((fd = open(selinux_virtual_image_context_path(), O_RDONLY)) < 0) { virReportSystemError(errno, _("cannot open SELinux virtual image context file %s"), selinux_virtual_image_context_path()); return -1; } if (saferead(fd, default_image_context, sizeof(default_image_context)) < 0) { virReportSystemError(errno, _("cannot read SELinux virtual image context file %s"), selinux_virtual_image_context_path()); VIR_FORCE_CLOSE(fd); return -1; } VIR_FORCE_CLOSE(fd); ptr = strchrnul(default_image_context, '\n'); if (*ptr == '\n') { *ptr = '\0'; strcpy(default_content_context, ptr+1); ptr = strchrnul(default_content_context, '\n'); if (*ptr == '\n') *ptr = '\0'; } return 0; }
static int libxlNextFreeVncPort(libxlDriverPrivatePtr driver, int startPort) { int i; for (i = startPort ; i < LIBXL_VNC_PORT_MAX; i++) { int fd; int reuse = 1; struct sockaddr_in addr; bool used = false; if (virBitmapGetBit(driver->reservedVNCPorts, i - LIBXL_VNC_PORT_MIN, &used) < 0) VIR_DEBUG("virBitmapGetBit failed on bit %d", i - LIBXL_VNC_PORT_MIN); if (used) continue; addr.sin_family = AF_INET; addr.sin_port = htons(i); addr.sin_addr.s_addr = htonl(INADDR_ANY); fd = socket(PF_INET, SOCK_STREAM, 0); if (fd < 0) return -1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)) < 0) { VIR_FORCE_CLOSE(fd); break; } if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) { /* Not in use, lets grab it */ VIR_FORCE_CLOSE(fd); /* Add port to bitmap of reserved ports */ if (virBitmapSetBit(driver->reservedVNCPorts, i - LIBXL_VNC_PORT_MIN) < 0) { VIR_DEBUG("virBitmapSetBit failed on bit %d", i - LIBXL_VNC_PORT_MIN); } return i; } VIR_FORCE_CLOSE(fd); if (errno == EADDRINUSE) { /* In use, try next */ continue; } /* Some other bad failure, get out.. */ break; } return -1; }
static void virLXCControllerConsoleClose(virLXCControllerConsolePtr console) { if (console->hostWatch != -1) virEventRemoveHandle(console->hostWatch); VIR_FORCE_CLOSE(console->hostFd); if (console->contWatch != -1) virEventRemoveHandle(console->contWatch); VIR_FORCE_CLOSE(console->contFd); if (console->epollWatch != -1) virEventRemoveHandle(console->epollWatch); VIR_FORCE_CLOSE(console->epollFd); }
static int virStorageBackendMpathUpdateVolTargetInfo(virStorageVolTargetPtr target, unsigned long long *allocation, unsigned long long *capacity) { int ret = -1; int fdret, fd = -1; if ((fdret = virStorageBackendVolOpen(target->path)) < 0) goto out; fd = fdret; if (virStorageBackendUpdateVolTargetInfoFD(target, fd, allocation, capacity) < 0) goto out; if (virStorageBackendDetectBlockVolFormatFD(target, fd) < 0) goto out; ret = 0; out: VIR_FORCE_CLOSE(fd); return ret; }
static void lxcClientIO(int watch ATTRIBUTE_UNUSED, int fd, int events, void *opaque) { struct lxcMonitor *monitor = opaque; char buf[1024]; ssize_t ret; if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) { virEventRemoveHandle(monitor->clientWatch); monitor->clientWatch = -1; return; } reread: ret = read(fd, buf, sizeof(buf)); if (ret == -1 && errno == EINTR) goto reread; if (ret == -1 && errno == EAGAIN) return; if (ret == -1) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to read from monitor client")); virMutexLock(&lock); quit = true; virMutexUnlock(&lock); return; } if (ret == 0) { VIR_DEBUG("Client %d gone", fd); VIR_FORCE_CLOSE(monitor->clientFd); virEventRemoveHandle(monitor->clientWatch); monitor->clientWatch = -1; } }
static int openvzWriteConfigParam(const char * conf_file, const char *param, const char *value) { char * temp_file = NULL; int temp_fd = -1; FILE *fp; char *line = NULL; size_t line_size = 0; if (virAsprintf(&temp_file, "%s.tmp", conf_file)<0) { virReportOOMError(); return -1; } fp = fopen(conf_file, "r"); if (fp == NULL) goto error; temp_fd = open(temp_file, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (temp_fd == -1) { goto error; } while (1) { if (getline(&line, &line_size, fp) <= 0) break; if (!(STRPREFIX(line, param) && line[strlen(param)] == '=')) { if (safewrite(temp_fd, line, strlen(line)) != strlen(line)) goto error; } } if (safewrite(temp_fd, param, strlen(param)) < 0 || safewrite(temp_fd, "=\"", 2) < 0 || safewrite(temp_fd, value, strlen(value)) < 0 || safewrite(temp_fd, "\"\n", 2) < 0) goto error; if (VIR_FCLOSE(fp) < 0) goto error; if (VIR_CLOSE(temp_fd) < 0) goto error; if (rename(temp_file, conf_file) < 0) goto error; VIR_FREE(line); return 0; error: VIR_FREE(line); VIR_FORCE_FCLOSE(fp); VIR_FORCE_CLOSE(temp_fd); if (temp_file) unlink(temp_file); VIR_FREE(temp_file); return -1; }
int virPidFileWritePath(const char *pidfile, pid_t pid) { int rc; int fd; char pidstr[INT_BUFSIZE_BOUND(pid)]; if ((fd = open(pidfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) < 0) { rc = -errno; goto cleanup; } snprintf(pidstr, sizeof(pidstr), "%lld", (long long) pid); if (safewrite(fd, pidstr, strlen(pidstr)) < 0) { rc = -errno; VIR_FORCE_CLOSE(fd); goto cleanup; } rc = 0; cleanup: if (VIR_CLOSE(fd) < 0) rc = -errno; return rc; }
int virNetMessageDupFD(virNetMessagePtr msg, size_t slot) { int fd; if (slot >= msg->nfds) { virReportError(VIR_ERR_INTERNAL_ERROR, _("No FD available at slot %zu"), slot); return -1; } if ((fd = dup(msg->fds[slot])) < 0) { virReportSystemError(errno, _("Unable to duplicate FD %d"), msg->fds[slot]); return -1; } if (virSetInherit(fd, false) < 0) { VIR_FORCE_CLOSE(fd); virReportSystemError(errno, _("Cannot set close-on-exec %d"), fd); return -1; } return fd; }
static int lxcSetupLoopDevices(virDomainDefPtr def, size_t *nloopDevs, int **loopDevs) { size_t i; int ret = -1; for (i = 0 ; i < def->nfss ; i++) { int fd; if (def->fss[i]->type != VIR_DOMAIN_FS_TYPE_FILE) continue; fd = lxcSetupLoopDevice(def->fss[i]); if (fd < 0) goto cleanup; VIR_DEBUG("Saving loop fd %d", fd); if (VIR_REALLOC_N(*loopDevs, *nloopDevs+1) < 0) { VIR_FORCE_CLOSE(fd); virReportOOMError(); goto cleanup; } (*loopDevs)[(*nloopDevs)++] = fd; } VIR_DEBUG("Setup all loop devices"); ret = 0; cleanup: return ret; }
static void virLXCControllerFree(virLXCControllerPtr ctrl) { size_t i; if (!ctrl) return; virLXCControllerStopInit(ctrl); virSecurityManagerFree(ctrl->securityManager); for (i = 0 ; i < ctrl->nveths ; i++) VIR_FREE(ctrl->veths[i]); VIR_FREE(ctrl->veths); for (i = 0 ; i < ctrl->nconsoles ; i++) virLXCControllerConsoleClose(&(ctrl->consoles[i])); VIR_FREE(ctrl->consoles); VIR_FORCE_CLOSE(ctrl->handshakeFd); VIR_FREE(ctrl->devptmx); virDomainDefFree(ctrl->def); VIR_FREE(ctrl->name); if (ctrl->timerShutdown != -1) virEventRemoveTimeout(ctrl->timerShutdown); virObjectUnref(ctrl->server); VIR_FREE(ctrl); }
static uint32_t virNetDevVPortProfileGetLldpadPid(void) { int fd; uint32_t pid = 0; fd = open(LLDPAD_PID_FILE, O_RDONLY); if (fd >= 0) { char buffer[10]; if (saferead(fd, buffer, sizeof(buffer)) <= sizeof(buffer)) { unsigned int res; char *endptr; if (virStrToLong_ui(buffer, &endptr, 10, &res) == 0 && (*endptr == '\0' || c_isspace(*endptr)) && res != 0) { pid = res; } else { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("error parsing pid of lldpad")); } } } else { virReportSystemError(errno, _("Error opening file %s"), LLDPAD_PID_FILE); } VIR_FORCE_CLOSE(fd); return pid; }
static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl) { size_t i; int ret = -1; for (i = 0 ; i < ctrl->def->nfss ; i++) { int fd; if (ctrl->def->fss[i]->type != VIR_DOMAIN_FS_TYPE_FILE) continue; fd = virLXCControllerSetupLoopDevice(ctrl->def->fss[i]); if (fd < 0) goto cleanup; VIR_DEBUG("Saving loop fd %d", fd); if (VIR_EXPAND_N(ctrl->loopDevFds, ctrl->nloopDevs, 1) < 0) { VIR_FORCE_CLOSE(fd); virReportOOMError(); goto cleanup; } ctrl->loopDevFds[ctrl->nloopDevs - 1] = fd; } VIR_DEBUG("Setup all loop devices"); ret = 0; cleanup: return ret; }
void qemuAgentClose(qemuAgentPtr mon) { if (!mon) return; VIR_DEBUG("mon=%p", mon); qemuAgentLock(mon); if (mon->fd >= 0) { if (mon->watch) virEventRemoveHandle(mon->watch); VIR_FORCE_CLOSE(mon->fd); } /* If there is somebody waiting for a message * wake him up. No message will arrive anyway. */ if (mon->msg && !mon->msg->finished) { mon->msg->finished = 1; virCondSignal(&mon->notify); } qemuAgentUnlock(mon); virObjectUnref(mon); }
static int virNetDevBridgeCmd(const char *brname, u_long op, void *arg, size_t argsize) { int s; int ret = -1; struct ifdrv ifd; memset(&ifd, 0, sizeof(ifd)); if ((s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) { virReportSystemError(errno, "%s", _("Cannot open network interface control socket")); return -1; } if (virStrcpyStatic(ifd.ifd_name, brname) == NULL) { virReportSystemError(ERANGE, _("Network interface name '%s' is too long"), brname); goto cleanup; } ifd.ifd_cmd = op; ifd.ifd_len = argsize; ifd.ifd_data = arg; ret = ioctl(s, SIOCSDRVSPEC, &ifd); cleanup: VIR_FORCE_CLOSE(s); return ret; }
static void virNetServerGotInhibitReply(DBusPendingCall *pending, void *opaque) { virNetServerPtr srv = opaque; DBusMessage *reply; int fd; virObjectLock(srv); srv->autoShutdownCallingInhibit = false; VIR_DEBUG("srv=%p", srv); reply = dbus_pending_call_steal_reply(pending); if (reply == NULL) goto cleanup; if (dbus_message_get_args(reply, NULL, DBUS_TYPE_UNIX_FD, &fd, DBUS_TYPE_INVALID)) { if (srv->autoShutdownInhibitions) { srv->autoShutdownInhibitFd = fd; } else { /* We stopped the last VM since we made the inhibit call */ VIR_FORCE_CLOSE(fd); } } dbus_message_unref(reply); cleanup: virObjectUnlock(srv); }
static int virNetDevSetupControlFull(const char *ifname, struct ifreq *ifr, int domain, int type) { int fd; memset(ifr, 0, sizeof(*ifr)); if (virStrcpyStatic(ifr->ifr_name, ifname) == NULL) { virReportSystemError(ERANGE, _("Network interface name '%s' is too long"), ifname); return -1; } if ((fd = socket(domain, type, 0)) < 0) { virReportSystemError(errno, "%s", _("Cannot open network interface control socket")); return -1; } if (virSetInherit(fd, false) < 0) { virReportSystemError(errno, "%s", _("Cannot set close-on-exec flag for socket")); VIR_FORCE_CLOSE(fd); return -1; } return fd; }
/** * virNetDevSetMAC: * @ifname: interface name to set MTU for * @macaddr: MAC address (VIR_MAC_BUFLEN in size) * * This function sets the @macaddr for a given interface @ifname. This * gets rid of the kernel's automatically assigned random MAC. * * Returns 0 in case of success or -1 on failure */ int virNetDevSetMAC(const char *ifname, const unsigned char *macaddr) { int fd = -1; int ret = -1; struct ifreq ifr; if ((fd = virNetDevSetupControl(ifname, &ifr)) < 0) return -1; /* To fill ifr.ifr_hdaddr.sa_family field */ if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { virReportSystemError(errno, _("Cannot get interface MAC on '%s'"), ifname); goto cleanup; } memcpy(ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN); if (ioctl(fd, SIOCSIFHWADDR, &ifr) < 0) { virReportSystemError(errno, _("Cannot set interface MAC on '%s'"), ifname); goto cleanup; } ret = 0; cleanup: VIR_FORCE_CLOSE(fd); return ret; }
static void virLockSpaceResourceFree(virLockSpaceResourcePtr res) { if (!res) return; if (res->lockHeld && (res->flags & VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE)) { if (res->flags & VIR_LOCK_SPACE_ACQUIRE_SHARED) { /* We must upgrade to an exclusive lock to ensure * no one else still has it before trying to delete */ if (virFileLock(res->fd, false, 0, 1) < 0) { VIR_DEBUG("Could not upgrade shared lease to exclusive, not deleting"); } else { if (unlink(res->path) < 0 && errno != ENOENT) { char ebuf[1024]; VIR_WARN("Failed to unlink resource %s: %s", res->path, virStrerror(errno, ebuf, sizeof(ebuf))); } } } else { if (unlink(res->path) < 0 && errno != ENOENT) { char ebuf[1024]; VIR_WARN("Failed to unlink resource %s: %s", res->path, virStrerror(errno, ebuf, sizeof(ebuf))); } } } VIR_FORCE_CLOSE(res->fd); VIR_FREE(res->path); VIR_FREE(res->name); VIR_FREE(res); }
static int virStorageBackendSCSIUpdateVolTargetInfo(virStorageVolTargetPtr target, unsigned long long *allocation, unsigned long long *capacity) { int fdret, fd = -1; int ret = -1; struct stat sb; if ((fdret = virStorageBackendVolOpenCheckMode(target->path, &sb, VIR_STORAGE_VOL_OPEN_DEFAULT)) < 0) goto cleanup; fd = fdret; if (virStorageBackendUpdateVolTargetInfoFD(target, fd, &sb, allocation, capacity) < 0) goto cleanup; if (virStorageBackendDetectBlockVolFormatFD(target, fd) < 0) goto cleanup; ret = 0; cleanup: VIR_FORCE_CLOSE(fd); return ret; }
int virNetMessageAddFD(virNetMessagePtr msg, int fd) { int newfd = -1; if ((newfd = dup(fd)) < 0) { virReportSystemError(errno, _("Unable to duplicate FD %d"), fd); goto error; } if (virSetInherit(newfd, false) < 0) { virReportSystemError(errno, _("Cannot set close-on-exec %d"), newfd); goto error; } if (VIR_APPEND_ELEMENT(msg->fds, msg->nfds, newfd) < 0) goto error; return 0; error: VIR_FORCE_CLOSE(newfd); return -1; }