uid = (vol->target.perms.uid != st.st_uid) ? vol->target.perms.uid : -1;
gid = (vol->target.perms.gid != st.st_gid) ? vol->target.perms.gid : -1;
if (((uid != -1) || (gid != -1))
- && (fchown(fd, vol->target.perms.uid, vol->target.perms.gid) < 0)) {
+ && (fchown(fd, uid, gid) < 0)) {
virReportSystemError(errno,
_("cannot chown '%s' to (%u, %u)"),
- vol->target.path, vol->target.perms.uid,
- vol->target.perms.gid);
+ vol->target.path, uid, gid);
goto cleanup;
}
if (fchmod(fd, vol->target.perms.mode) < 0) {
goto cleanup;
}
+ uid_t uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid;
+ gid_t gid = (vol->target.perms.gid == -1) ? getgid() : vol->target.perms.gid;
+
if ((createstat = virFileOperation(vol->target.path,
O_RDWR | O_CREAT | O_EXCL | O_DSYNC,
- vol->target.perms.mode,
- vol->target.perms.uid, vol->target.perms.gid,
+ vol->target.perms.mode, uid, gid,
createRawFileOpHook, &hdata,
VIR_FILE_OP_FORCE_PERMS |
(pool->def->type == VIR_STORAGE_POOL_NETFS
static int virStorageBuildSetUIDHook(void *data) {
virStorageVolDefPtr vol = data;
- if ((vol->target.perms.gid != 0)
+ if ((vol->target.perms.gid != -1)
&& (setgid(vol->target.perms.gid) != 0)) {
virReportSystemError(errno,
_("Cannot set gid to %u before creating %s"),
vol->target.perms.gid, vol->target.path);
return -1;
}
- if ((vol->target.perms.uid != 0)
+ if ((vol->target.perms.uid != -1)
&& (setuid(vol->target.perms.uid) != 0)) {
virReportSystemError(errno,
_("Cannot set uid to %u before creating %s"),
int filecreated = 0;
if ((pool->def->type == VIR_STORAGE_POOL_NETFS)
- && (getuid() == 0)
- && ((vol->target.perms.uid != 0) || (vol->target.perms.gid != 0))) {
+ && (((getuid() == 0)
+ && (vol->target.perms.uid != -1)
+ && (vol->target.perms.uid != 0))
+ || ((vol->target.perms.gid != -1)
+ && (vol->target.perms.gid != getgid())))) {
if (virRunWithHook(cmdargv,
virStorageBuildSetUIDHook, vol, NULL) == 0) {
/* command was successfully run, check if the file was created */
&& (chown(vol->target.path, uid, gid) < 0)) {
virReportSystemError(errno,
_("cannot chown %s to (%u, %u)"),
- vol->target.path, vol->target.perms.uid,
- vol->target.perms.gid);
+ vol->target.path, uid, gid);
return -1;
}
if (chmod(vol->target.path, vol->target.perms.mode) < 0) {
/* Now create the final dir in the path with the uid/gid/mode
* requested in the config. If the dir already exists, just set
* the perms. */
- if ((err = virDirCreate(pool->def->target.path,
- pool->def->target.perms.mode,
- pool->def->target.perms.uid,
- pool->def->target.perms.gid,
- VIR_DIR_CREATE_FORCE_PERMS | VIR_DIR_CREATE_ALLOW_EXIST |
- (pool->def->type == VIR_STORAGE_POOL_NETFS
- ? VIR_DIR_CREATE_AS_UID : 0)) != 0)) {
- virReportSystemError(err, _("cannot create path '%s'"),
- pool->def->target.path);
- goto error;
+
+ struct stat st;
+
+ if ((stat(pool->def->target.path, &st) < 0)
+ || (pool->def->target.perms.uid != -1)) {
+
+ uid_t uid = (pool->def->target.perms.uid == -1)
+ ? getuid() : pool->def->target.perms.uid;
+ gid_t gid = (pool->def->target.perms.gid == -1)
+ ? getgid() : pool->def->target.perms.gid;
+
+ if ((err = virDirCreate(pool->def->target.path,
+ pool->def->target.perms.mode,
+ uid, gid,
+ VIR_DIR_CREATE_FORCE_PERMS |
+ VIR_DIR_CREATE_ALLOW_EXIST |
+ (pool->def->type == VIR_STORAGE_POOL_NETFS
+ ? VIR_DIR_CREATE_AS_UID : 0)) != 0)) {
+ virReportSystemError(err, _("cannot create path '%s'"),
+ pool->def->target.path);
+ goto error;
+ }
}
ret = 0;
error:
return -1;
}
+ uid_t uid = (vol->target.perms.uid == -1)
+ ? getuid() : vol->target.perms.uid;
+ gid_t gid = (vol->target.perms.gid == -1)
+ ? getgid() : vol->target.perms.gid;
+
if ((err = virDirCreate(vol->target.path, vol->target.perms.mode,
- vol->target.perms.uid, vol->target.perms.gid,
+ uid, gid,
VIR_DIR_CREATE_FORCE_PERMS |
(pool->def->type == VIR_STORAGE_POOL_NETFS
? VIR_DIR_CREATE_AS_UID : 0))) != 0) {