VIR_FREE(def->target.compat);
virBitmapFree(def->target.features);
VIR_FREE(def->target.path);
- VIR_FREE(def->target.perms.label);
+ if (def->target.perms) {
+ VIR_FREE(def->target.perms->label);
+ VIR_FREE(def->target.perms);
+ }
VIR_FREE(def->target.timestamps);
virStorageEncryptionFree(def->target.encryption);
VIR_FREE(def->backingStore.path);
- VIR_FREE(def->backingStore.perms.label);
+ if (def->backingStore.perms) {
+ VIR_FREE(def->backingStore.perms->label);
+ VIR_FREE(def->backingStore.perms);
+ }
VIR_FREE(def->backingStore.timestamps);
virStorageEncryptionFree(def->backingStore.encryption);
VIR_FREE(def);
VIR_FREE(format);
}
- if (virStorageDefParsePerms(ctxt, &ret->target.perms,
+ if (VIR_ALLOC(ret->target.perms) < 0)
+ goto error;
+ if (virStorageDefParsePerms(ctxt, ret->target.perms,
"./target/permissions",
DEFAULT_VOL_PERM_MODE) < 0)
goto error;
VIR_FREE(nodes);
}
- if (virStorageDefParsePerms(ctxt, &ret->backingStore.perms,
+ if (VIR_ALLOC(ret->backingStore.perms) < 0)
+ goto error;
+ if (virStorageDefParsePerms(ctxt, ret->backingStore.perms,
"./backingStore/permissions",
DEFAULT_VOL_PERM_MODE) < 0)
goto error;
virBufferAdjustIndent(buf, 2);
virBufferAsprintf(buf, "<mode>0%o</mode>\n",
- def->perms.mode);
+ def->perms->mode);
virBufferAsprintf(buf, "<owner>%u</owner>\n",
- (unsigned int) def->perms.uid);
+ (unsigned int) def->perms->uid);
virBufferAsprintf(buf, "<group>%u</group>\n",
- (unsigned int) def->perms.gid);
+ (unsigned int) def->perms->gid);
virBufferEscapeString(buf, "<label>%s</label>\n",
- def->perms.label);
+ def->perms->label);
virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</permissions>\n");
struct _virStorageVolSource {
int nextent;
virStorageVolSourceExtentPtr extents;
+
+ int partType; /* enum virStorageVolTypeDisk, only used by disk
+ * backend for partition type creation */
};
typedef virStorageVolTarget *virStorageVolTargetPtr;
struct _virStorageVolTarget {
char *path;
- int format;
- virStoragePerms perms;
+ int format; /* enum virStorageFileFormat */
+ virStoragePermsPtr perms;
virStorageTimestampsPtr timestamps;
- int type; /* only used by disk backend for partition type */
+
/* The next three are currently only used in vol->target,
* not in vol->backingStore. */
virStorageEncryptionPtr encryption;
vol->target.path);
goto cleanup;
}
- uid = (vol->target.perms.uid != st.st_uid) ? vol->target.perms.uid : (uid_t) -1;
- gid = (vol->target.perms.gid != st.st_gid) ? vol->target.perms.gid : (gid_t) -1;
+ uid = (vol->target.perms->uid != st.st_uid) ? vol->target.perms->uid
+ : (uid_t) -1;
+ gid = (vol->target.perms->gid != st.st_gid) ? vol->target.perms->gid
+ : (gid_t) -1;
if (((uid != (uid_t) -1) || (gid != (gid_t) -1))
&& (fchown(fd, uid, gid) < 0)) {
virReportSystemError(errno,
(unsigned int) gid);
goto cleanup;
}
- if (fchmod(fd, vol->target.perms.mode) < 0) {
+ if (fchmod(fd, vol->target.perms->mode) < 0) {
virReportSystemError(errno,
_("cannot set mode of '%s' to %04o"),
- vol->target.path, vol->target.perms.mode);
+ vol->target.path, vol->target.perms->mode);
goto cleanup;
}
if (VIR_CLOSE(fd) < 0) {
if ((fd = virFileOpenAs(vol->target.path,
O_RDWR | O_CREAT | O_EXCL,
- vol->target.perms.mode,
- vol->target.perms.uid,
- vol->target.perms.gid,
+ vol->target.perms->mode,
+ vol->target.perms->uid,
+ vol->target.perms->gid,
operation_flags)) < 0) {
virReportSystemError(-fd,
_("Failed to create file '%s'"),
if ((pool->def->type == VIR_STORAGE_POOL_NETFS)
&& (((geteuid() == 0)
- && (vol->target.perms.uid != (uid_t) -1)
- && (vol->target.perms.uid != 0))
- || ((vol->target.perms.gid != (gid_t) -1)
- && (vol->target.perms.gid != getegid())))) {
+ && (vol->target.perms->uid != (uid_t) -1)
+ && (vol->target.perms->uid != 0))
+ || ((vol->target.perms->gid != (gid_t) -1)
+ && (vol->target.perms->gid != getegid())))) {
- virCommandSetUID(cmd, vol->target.perms.uid);
- virCommandSetGID(cmd, vol->target.perms.gid);
+ virCommandSetUID(cmd, vol->target.perms->uid);
+ virCommandSetGID(cmd, vol->target.perms->gid);
if (virCommandRun(cmd, NULL) == 0) {
/* command was successfully run, check if the file was created */
}
}
- uid = (vol->target.perms.uid != st.st_uid) ? vol->target.perms.uid : (uid_t) -1;
- gid = (vol->target.perms.gid != st.st_gid) ? vol->target.perms.gid : (gid_t) -1;
+ uid = (vol->target.perms->uid != st.st_uid) ? vol->target.perms->uid
+ : (uid_t) -1;
+ gid = (vol->target.perms->gid != st.st_gid) ? vol->target.perms->gid
+ : (gid_t) -1;
if (((uid != (uid_t) -1) || (gid != (gid_t) -1))
&& (chown(vol->target.path, uid, gid) < 0)) {
virReportSystemError(errno,
(unsigned int) gid);
return -1;
}
- if (chmod(vol->target.path, vol->target.perms.mode) < 0) {
+ if (chmod(vol->target.path, vol->target.perms->mode) < 0) {
virReportSystemError(errno,
_("cannot set mode of '%s' to %04o"),
- vol->target.path, vol->target.perms.mode);
+ vol->target.path, vol->target.perms->mode);
return -1;
}
return 0;
}
}
- target->perms.mode = sb->st_mode & S_IRWXUGO;
- target->perms.uid = sb->st_uid;
- target->perms.gid = sb->st_gid;
+ if (!target->perms && VIR_ALLOC(target->perms) < 0)
+ return -1;
+ target->perms->mode = sb->st_mode & S_IRWXUGO;
+ target->perms->uid = sb->st_uid;
+ target->perms->gid = sb->st_gid;
if (!target->timestamps && VIR_ALLOC(target->timestamps) < 0)
return -1;
target->timestamps->ctime = get_stat_ctime(sb);
target->timestamps->mtime = get_stat_mtime(sb);
- VIR_FREE(target->perms.label);
+ VIR_FREE(target->perms->label);
#if WITH_SELINUX
/* XXX: make this a security driver call */
return -1;
}
} else {
- if (VIR_STRDUP(target->perms.label, filecon) < 0) {
+ if (VIR_STRDUP(target->perms->label, filecon) < 0) {
freecon(filecon);
return -1;
}
/* set partition type */
if (STREQ(groups[1], "normal"))
- vol->target.type = VIR_STORAGE_VOL_DISK_TYPE_PRIMARY;
+ vol->source.partType = VIR_STORAGE_VOL_DISK_TYPE_PRIMARY;
else if (STREQ(groups[1], "logical"))
- vol->target.type = VIR_STORAGE_VOL_DISK_TYPE_LOGICAL;
+ vol->source.partType = VIR_STORAGE_VOL_DISK_TYPE_LOGICAL;
else if (STREQ(groups[1], "extended"))
- vol->target.type = VIR_STORAGE_VOL_DISK_TYPE_EXTENDED;
+ vol->source.partType = VIR_STORAGE_VOL_DISK_TYPE_EXTENDED;
else
- vol->target.type = VIR_STORAGE_VOL_DISK_TYPE_NONE;
+ vol->source.partType = VIR_STORAGE_VOL_DISK_TYPE_NONE;
vol->type = VIR_STORAGE_VOL_BLOCK;
size_t i;
int count = 0;
for (i = 0; i < pool->volumes.count; i++) {
- if (pool->volumes.objs[i]->target.type == VIR_STORAGE_VOL_DISK_TYPE_PRIMARY ||
- pool->volumes.objs[i]->target.type == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) {
- count++;
- }
+ int partType = pool->volumes.objs[i]->source.partType;
+ if (partType == VIR_STORAGE_VOL_DISK_TYPE_PRIMARY ||
+ partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED)
+ count++;
}
if (count >= 4) {
return VIR_STORAGE_VOL_DISK_TYPE_LOGICAL;
*end -= (*start % cylinderSize);
}
- /* counting in byte, we want the last byte of the current sector */
+ /* counting in bytes, we want the last byte of the current sector */
*end -= 1;
VIR_DEBUG("final aligned start %llu, end %llu", *start, *end);
return 0;
return -1;
}
- if ((err = virDirCreate(vol->target.path, vol->target.perms.mode,
- vol->target.perms.uid,
- vol->target.perms.gid,
+ if ((err = virDirCreate(vol->target.path, vol->target.perms->mode,
+ vol->target.perms->uid,
+ vol->target.perms->gid,
VIR_DIR_CREATE_FORCE_PERMS |
(pool->def->type == VIR_STORAGE_POOL_NETFS
? VIR_DIR_CREATE_AS_UID : 0))) < 0) {
/*
* storage_backend_logical.c: storage backend for logical volume handling
*
- * Copyright (C) 2007-2009, 2011, 2013 Red Hat, Inc.
+ * Copyright (C) 2007-2014 Red Hat, Inc.
* Copyright (C) 2007-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
/* We can only chown/grp if root */
if (geteuid() == 0) {
- if (fchown(fd, vol->target.perms.uid, vol->target.perms.gid) < 0) {
+ if (fchown(fd, vol->target.perms->uid, vol->target.perms->gid) < 0) {
virReportSystemError(errno,
_("cannot set file owner '%s'"),
vol->target.path);
goto error;
}
}
- if (fchmod(fd, vol->target.perms.mode) < 0) {
+ if (fchmod(fd, vol->target.perms->mode) < 0) {
virReportSystemError(errno,
_("cannot set file mode '%s'"),
vol->target.path);