Some callers expected virFileMakePath to set errno, some expected
it to return an errno value. Unify this to return 0 on success and
-1 on error. Set errno to report detailed error information.
Also Make virFileMakePath report an error when stat fails with an
errno different from ENOENT.
---
src/conf/domain_conf.c | 2 +-
src/conf/network_conf.c | 5 +--
src/conf/nwfilter_conf.c | 11 +++-----
src/conf/storage_conf.c | 6 +---
src/libxl/libxl_driver.c | 14 ++++-----
src/lxc/lxc_container.c | 18 ++++++------
src/lxc/lxc_controller.c | 2 +-
src/lxc/lxc_driver.c | 10 +++----
src/network/bridge_driver.c | 25 ++++++++---------
src/qemu/qemu_driver.c | 28 ++++++++-----------
src/qemu/qemu_process.c | 2 +-
src/storage/storage_backend_fs.c | 4 +-
src/storage/storage_driver.c | 6 +---
src/uml/uml_driver.c | 10 +++----
src/util/dnsmasq.c | 5 +--
src/util/util.c | 56 ++++++++++++++++++++++++-------------
16 files changed, 100 insertions(+), 104 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 109a947..64c5636 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9986,7 +9986,7 @@ int virDomainSaveXML(const char *configDir,
if ((configFile = virDomainConfigFile(configDir, def->name)) == NULL)
goto cleanup;
- if (virFileMakePath(configDir)) {
+ if (virFileMakePath(configDir) < 0) {
virReportSystemError(errno,
_("cannot create config directory '%s'"),
configDir);
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 45ddee2..ae479bf 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -1114,13 +1114,12 @@ int virNetworkSaveXML(const char *configDir,
char *configFile = NULL;
int fd = -1, ret = -1;
size_t towrite;
- int err;
if ((configFile = virNetworkConfigFile(configDir, def->name)) == NULL)
goto cleanup;
- if ((err = virFileMakePath(configDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(configDir) < 0) {
+ virReportSystemError(errno,
_("cannot create config directory '%s'"),
configDir);
goto cleanup;
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 127d4be..036c61a 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -2184,13 +2184,12 @@ int virNWFilterSaveXML(const char *configDir,
char *configFile = NULL;
int fd = -1, ret = -1;
size_t towrite;
- int err;
if ((configFile = virNWFilterConfigFile(configDir, def->name)) == NULL)
goto cleanup;
- if ((err = virFileMakePath(configDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(configDir) < 0) {
+ virReportSystemError(errno,
_("cannot create config directory '%s'"),
configDir);
goto cleanup;
@@ -2574,10 +2573,8 @@ virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
ssize_t towrite;
if (!nwfilter->configFile) {
- int err;
-
- if ((err = virFileMakePath(driver->configDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->configDir) < 0) {
+ virReportSystemError(errno,
_("cannot create config directory %s"),
driver->configDir);
return -1;
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index ca86f19..f6f8be1 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1512,10 +1512,8 @@ virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
ssize_t towrite;
if (!pool->configFile) {
- int err;
-
- if ((err = virFileMakePath(driver->configDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->configDir) < 0) {
+ virReportSystemError(errno,
_("cannot create config directory %s"),
driver->configDir);
return -1;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 7fd257d..ade69d8 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -914,25 +914,25 @@ libxlStartup(int privileged) {
"%s", LIBXL_SAVE_DIR) == -1)
goto out_of_memory;
- if (virFileMakePath(libxl_driver->logDir) != 0) {
+ if (virFileMakePath(libxl_driver->logDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create log dir '%s': %s"),
libxl_driver->logDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(libxl_driver->stateDir) != 0) {
+ if (virFileMakePath(libxl_driver->stateDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create state dir '%s': %s"),
libxl_driver->stateDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(libxl_driver->libDir) != 0) {
+ if (virFileMakePath(libxl_driver->libDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create lib dir '%s': %s"),
libxl_driver->libDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(libxl_driver->saveDir) != 0) {
+ if (virFileMakePath(libxl_driver->saveDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create save dir '%s': %s"),
libxl_driver->saveDir, virStrerror(errno, ebuf, sizeof ebuf));
@@ -3389,10 +3389,8 @@ libxlDomainSetAutostart(virDomainPtr dom, int autostart)
goto cleanup;
if (autostart) {
- int err;
-
- if ((err = virFileMakePath(driver->autostartDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->autostartDir) < 0) {
+ virReportSystemError(errno,
_("cannot create autostart directory
%s"),
driver->autostartDir);
goto cleanup;
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index 7924858..ef8469c 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -308,7 +308,7 @@ static int lxcContainerChildMountSort(const void *a, const void *b)
static int lxcContainerPivotRoot(virDomainFSDefPtr root)
{
- int rc, ret;
+ int ret;
char *oldroot = NULL, *newroot = NULL;
ret = -1;
@@ -325,8 +325,8 @@ static int lxcContainerPivotRoot(virDomainFSDefPtr root)
goto err;
}
- if ((rc = virFileMakePath(oldroot)) != 0) {
- virReportSystemError(rc,
+ if (virFileMakePath(oldroot) < 0) {
+ virReportSystemError(errno,
_("Failed to create %s"),
oldroot);
goto err;
@@ -347,8 +347,8 @@ static int lxcContainerPivotRoot(virDomainFSDefPtr root)
goto err;
}
- if ((rc = virFileMakePath(newroot)) != 0) {
- virReportSystemError(rc,
+ if (virFileMakePath(newroot) < 0) {
+ virReportSystemError(errno,
_("Failed to create %s"),
newroot);
goto err;
@@ -415,7 +415,7 @@ static int lxcContainerMountBasicFS(virDomainFSDefPtr root)
}
for (i = 0 ; i < ARRAY_CARDINALITY(mnts) ; i++) {
- if (virFileMakePath(mnts[i].dst) != 0) {
+ if (virFileMakePath(mnts[i].dst) < 0) {
virReportSystemError(errno,
_("Failed to mkdir %s"),
mnts[i].src);
@@ -429,8 +429,8 @@ static int lxcContainerMountBasicFS(virDomainFSDefPtr root)
}
}
- if ((rc = virFileMakePath("/dev/pts") != 0)) {
- virReportSystemError(rc, "%s",
+ if (virFileMakePath("/dev/pts") < 0) {
+ virReportSystemError(errno, "%s",
_("Cannot create /dev/pts"));
goto cleanup;
}
@@ -531,7 +531,7 @@ static int lxcContainerMountNewFS(virDomainDefPtr vmDef)
return -1;
}
- if (virFileMakePath(vmDef->fss[i]->dst) != 0) {
+ if (virFileMakePath(vmDef->fss[i]->dst) < 0) {
virReportSystemError(errno,
_("Failed to create %s"),
vmDef->fss[i]->dst);
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 7d60090..31c7d4f 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -690,7 +690,7 @@ lxcControllerRun(virDomainDefPtr def,
goto cleanup;
}
- if (virFileMakePath(devpts) != 0) {
+ if (virFileMakePath(devpts) < 0) {
virReportSystemError(errno,
_("Failed to make path %s"),
devpts);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 7220a9b..ffcfe4d 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1502,8 +1502,8 @@ static int lxcVmStart(virConnectPtr conn,
return -1;
}
- if ((r = virFileMakePath(driver->logDir)) != 0) {
- virReportSystemError(r,
+ if (virFileMakePath(driver->logDir) < 0) {
+ virReportSystemError(errno,
_("Cannot create log directory '%s'"),
driver->logDir);
return -1;
@@ -2539,10 +2539,8 @@ static int lxcDomainSetAutostart(virDomainPtr dom,
goto cleanup;
if (autostart) {
- int err;
-
- if ((err = virFileMakePath(driver->autostartDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->autostartDir) < 0) {
+ virReportSystemError(errno,
_("Cannot create autostart directory %s"),
driver->autostartDir);
goto cleanup;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 660dd65..170bf98 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -692,17 +692,16 @@ networkStartDhcpDaemon(virNetworkObjPtr network)
virCommandPtr cmd = NULL;
char *pidfile = NULL;
int ret = -1;
- int err;
dnsmasqContext *dctx = NULL;
- if ((err = virFileMakePath(NETWORK_PID_DIR)) != 0) {
- virReportSystemError(err,
+ if (virFileMakePath(NETWORK_PID_DIR) < 0) {
+ virReportSystemError(errno,
_("cannot create directory %s"),
NETWORK_PID_DIR);
goto cleanup;
}
- if ((err = virFileMakePath(NETWORK_STATE_DIR)) != 0) {
- virReportSystemError(err,
+ if (virFileMakePath(NETWORK_STATE_DIR) < 0) {
+ virReportSystemError(errno,
_("cannot create directory %s"),
NETWORK_STATE_DIR);
goto cleanup;
@@ -713,8 +712,8 @@ networkStartDhcpDaemon(virNetworkObjPtr network)
goto cleanup;
}
- if ((err = virFileMakePath(DNSMASQ_STATE_DIR)) != 0) {
- virReportSystemError(err,
+ if (virFileMakePath(DNSMASQ_STATE_DIR) < 0) {
+ virReportSystemError(errno,
_("cannot create directory %s"),
DNSMASQ_STATE_DIR);
goto cleanup;
@@ -777,14 +776,14 @@ networkStartRadvd(virNetworkObjPtr network)
goto cleanup;
}
- if ((err = virFileMakePath(NETWORK_PID_DIR)) != 0) {
- virReportSystemError(err,
+ if (virFileMakePath(NETWORK_PID_DIR) < 0) {
+ virReportSystemError(errno,
_("cannot create directory %s"),
NETWORK_PID_DIR);
goto cleanup;
}
- if ((err = virFileMakePath(RADVD_STATE_DIR)) != 0) {
- virReportSystemError(err,
+ if (virFileMakePath(RADVD_STATE_DIR) < 0) {
+ virReportSystemError(errno,
_("cannot create directory %s"),
RADVD_STATE_DIR);
goto cleanup;
@@ -2500,7 +2499,7 @@ static int networkSetAutostart(virNetworkPtr net,
struct network_driver *driver = net->conn->networkPrivateData;
virNetworkObjPtr network;
char *configFile = NULL, *autostartLink = NULL;
- int ret = -1;
+ int ret = -1, err;
networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
@@ -2526,7 +2525,7 @@ static int networkSetAutostart(virNetworkPtr net,
goto cleanup;
if (autostart) {
- if (virFileMakePath(driver->networkAutostartDir)) {
+ if (virFileMakePath(driver->networkAutostartDir) < 0) {
virReportSystemError(errno,
_("cannot create autostart directory
'%s'"),
driver->networkAutostartDir);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index aab3ab9..0f645fa 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -469,37 +469,37 @@ qemudStartup(int privileged) {
goto out_of_memory;
}
- if (virFileMakePath(qemu_driver->stateDir) != 0) {
+ if (virFileMakePath(qemu_driver->stateDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create state dir '%s': %s"),
qemu_driver->stateDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(qemu_driver->libDir) != 0) {
+ if (virFileMakePath(qemu_driver->libDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create lib dir '%s': %s"),
qemu_driver->libDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(qemu_driver->cacheDir) != 0) {
+ if (virFileMakePath(qemu_driver->cacheDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create cache dir '%s': %s"),
qemu_driver->cacheDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(qemu_driver->saveDir) != 0) {
+ if (virFileMakePath(qemu_driver->saveDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create save dir '%s': %s"),
qemu_driver->saveDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(qemu_driver->snapshotDir) != 0) {
+ if (virFileMakePath(qemu_driver->snapshotDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create save dir '%s': %s"),
qemu_driver->snapshotDir, virStrerror(errno, ebuf, sizeof ebuf));
goto error;
}
- if (virFileMakePath(qemu_driver->autoDumpPath) != 0) {
+ if (virFileMakePath(qemu_driver->autoDumpPath) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create dump dir '%s': %s"),
qemu_driver->autoDumpPath, virStrerror(errno, ebuf, sizeof ebuf));
@@ -586,8 +586,8 @@ qemudStartup(int privileged) {
if (virAsprintf(&mempath, "%s/libvirt/qemu",
qemu_driver->hugetlbfs_mount) < 0)
goto out_of_memory;
- if ((rc = virFileMakePath(mempath)) != 0) {
- virReportSystemError(rc,
+ if (virFileMakePath(mempath) < 0) {
+ virReportSystemError(errno,
_("unable to create hugepage path %s"),
mempath);
VIR_FREE(mempath);
goto error;
@@ -5017,10 +5017,8 @@ static int qemudDomainSetAutostart(virDomainPtr dom,
goto cleanup;
if (autostart) {
- int err;
-
- if ((err = virFileMakePath(driver->autostartDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->autostartDir) < 0) {
+ virReportSystemError(errno,
_("cannot create autostart directory
%s"),
driver->autostartDir);
goto cleanup;
@@ -7483,7 +7481,6 @@ static int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
int ret = -1;
char *snapDir = NULL;
char *snapFile = NULL;
- int err;
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(vm->def->uuid, uuidstr);
@@ -7497,9 +7494,8 @@ static int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
virReportOOMError();
goto cleanup;
}
- err = virFileMakePath(snapDir);
- if (err != 0) {
- virReportSystemError(err, _("cannot create snapshot directory
'%s'"),
+ if (virFileMakePath(snapDir) < 0) {
+ virReportSystemError(errno, _("cannot create snapshot directory
'%s'"),
snapDir);
goto cleanup;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f2c439b..c9145cb 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2448,7 +2448,7 @@ int qemuProcessStart(virConnectPtr conn,
}
}
- if (virFileMakePath(driver->logDir) != 0) {
+ if (virFileMakePath(driver->logDir) < 0) {
virReportSystemError(errno,
_("cannot create log directory %s"),
driver->logDir);
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index f2912f0..d87401f 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -559,8 +559,8 @@ virStorageBackendFileSystemBuild(virConnectPtr conn ATTRIBUTE_UNUSED,
/* assure all directories in the path prior to the final dir
* exist, with default uid/gid/mode. */
*p = '\0';
- if ((err = virFileMakePath(parent)) != 0) {
- virReportSystemError(err, _("cannot create path '%s'"),
+ if (virFileMakePath(parent) < 0) {
+ virReportSystemError(errno, _("cannot create path '%s'"),
parent);
goto error;
}
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index f9652f8..a990118 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -1019,10 +1019,8 @@ storagePoolSetAutostart(virStoragePoolPtr obj,
if (pool->autostart != autostart) {
if (autostart) {
- int err;
-
- if ((err = virFileMakePath(driver->autostartDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->autostartDir) < 0) {
+ virReportSystemError(errno,
_("cannot create autostart directory
%s"),
driver->autostartDir);
goto cleanup;
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index a71ea21..f0f053b 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -420,7 +420,7 @@ umlStartup(int privileged)
goto error;
}
- if (virFileMakePath(uml_driver->monitorDir) != 0) {
+ if (virFileMakePath(uml_driver->monitorDir) < 0) {
char ebuf[1024];
VIR_ERROR(_("Failed to create monitor directory %s: %s"),
uml_driver->monitorDir, virStrerror(errno, ebuf, sizeof ebuf));
@@ -839,7 +839,7 @@ static int umlStartVMDaemon(virConnectPtr conn,
return -1;
}
- if (virFileMakePath(driver->logDir) != 0) {
+ if (virFileMakePath(driver->logDir) < 0) {
virReportSystemError(errno,
_("cannot create log directory %s"),
driver->logDir);
@@ -2004,10 +2004,8 @@ static int umlDomainSetAutostart(virDomainPtr dom,
goto cleanup;
if (autostart) {
- int err;
-
- if ((err = virFileMakePath(driver->autostartDir))) {
- virReportSystemError(err,
+ if (virFileMakePath(driver->autostartDir) < 0) {
+ virReportSystemError(errno,
_("cannot create autostart directory
%s"),
driver->autostartDir);
goto cleanup;
diff --git a/src/util/dnsmasq.c b/src/util/dnsmasq.c
index aadca10..55db96b 100644
--- a/src/util/dnsmasq.c
+++ b/src/util/dnsmasq.c
@@ -523,11 +523,10 @@ dnsmasqAddHost(dnsmasqContext *ctx,
int
dnsmasqSave(const dnsmasqContext *ctx)
{
- int err;
int ret = 0;
- if ((err = virFileMakePath(ctx->config_dir))) {
- virReportSystemError(err, _("cannot create config directory
'%s'"),
+ if (virFileMakePath(ctx->config_dir) < 0) {
+ virReportSystemError(errno, _("cannot create config directory
'%s'"),
ctx->config_dir);
return -1;
}
diff --git a/src/util/util.c b/src/util/util.c
index 13973c3..482ca6b 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -1010,66 +1010,80 @@ int virDirCreate(const char *path ATTRIBUTE_UNUSED,
}
#endif /* WIN32 */
-static int virFileMakePathHelper(char *path) {
+static int virFileMakePathHelper(char *path)
+{
struct stat st;
char *p = NULL;
- int err;
if (stat(path, &st) >= 0)
return 0;
+ else if (errno != ENOENT)
+ return -1;
- if ((p = strrchr(path, '/')) == NULL)
- return EINVAL;
+ if ((p = strrchr(path, '/')) == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
if (p != path) {
*p = '\0';
- err = virFileMakePathHelper(path);
+
+ if (virFileMakePathHelper(path) < 0)
+ return -1;
+
*p = '/';
- if (err != 0)
- return err;
}
- if (mkdir(path, 0777) < 0 && errno != EEXIST) {
- return errno;
- }
+ if (mkdir(path, 0777) < 0 && errno != EEXIST)
+ return -1;
+
return 0;
}
+/**
+ * Creates the given path with mode 0777 if it's not already existing
+ * completely.
+ *
+ * Returns 0 on success, or -1 if an error occurred (in which case, errno
+ * is set appropriately).
+ */
int virFileMakePath(const char *path)
{
+ int ret = -1;
struct stat st;
char *parent = NULL;
char *p;
- int err = 0;
if (stat(path, &st) >= 0)
+ return 0;
+ else if (errno != ENOENT)
goto cleanup;
if ((parent = strdup(path)) == NULL) {
- err = ENOMEM;
+ errno = ENOMEM;
goto cleanup;
}
if ((p = strrchr(parent, '/')) == NULL) {
- err = EINVAL;
+ errno = EINVAL;
goto cleanup;
}
if (p != parent) {
*p = '\0';
- if ((err = virFileMakePathHelper(parent)) != 0) {
+
+ if (virFileMakePathHelper(parent) < 0)
goto cleanup;
- }
}
- if (mkdir(path, 0777) < 0 && errno != EEXIST) {
- err = errno;
+ if (mkdir(path, 0777) < 0 && errno != EEXIST)
goto cleanup;
- }
+
+ ret = 0;
cleanup:
VIR_FREE(parent);
- return err;
+ return ret;
}
/* Build up a fully qualified path for a config file to be
@@ -1182,8 +1196,10 @@ int virFileWritePid(const char *dir,
goto cleanup;
}
- if ((rc = virFileMakePath(dir)))
+ if (virFileMakePath(dir) < 0) {
+ rc = errno;
goto cleanup;
+ }
if (!(pidfile = virFilePid(dir, name))) {
rc = ENOMEM;
--
1.7.4.1