return -1;
switch (sb.st_mode & S_IFMT) {
- case S_IFDIR:
- return 1;
- break;
case S_IFSOCK:
return 1;
break;
}
static int
-vah_add_file(virBufferPtr buf, const char *path, const char *perms)
+vah_add_path(virBufferPtr buf, const char *path, const char *perms, bool recursive)
{
char *tmp = NULL;
int rc = -1;
goto cleanup;
}
- virBufferAsprintf(buf, " \"%s\" %s,\n", tmp, perms);
+ virBufferAsprintf(buf, " \"%s%s\" %s,\n", tmp, recursive ? "/**" : "", perms);
if (readonly) {
virBufferAddLit(buf, " # don't audit writes to readonly files\n");
- virBufferAsprintf(buf, " deny \"%s\" w,\n", tmp);
+ virBufferAsprintf(buf, " deny \"%s%s\" w,\n", tmp, recursive ? "/**" : "");
+ }
+ if (recursive) {
+ /* allow reading (but not creating) the dir */
+ virBufferAsprintf(buf, " \"%s/\" r,\n", tmp);
}
cleanup:
return rc;
}
+static int
+vah_add_file(virBufferPtr buf, const char *path, const char *perms)
+{
+ return vah_add_path(buf, path, perms, false);
+}
+
static int
vah_add_file_chardev(virBufferPtr buf,
const char *path,
} /* switch */
}
+ for (i = 0; i < ctl->def->nfss; i++) {
+ if (ctl->def->fss[i] &&
+ ctl->def->fss[i]->type == VIR_DOMAIN_FS_TYPE_MOUNT &&
+ (ctl->def->fss[i]->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_PATH ||
+ ctl->def->fss[i]->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT) &&
+ ctl->def->fss[i]->src){
+ virDomainFSDefPtr fs = ctl->def->fss[i];
+
+ if (vah_add_path(&buf, fs->src, fs->readonly ? "r" : "rw", true) != 0)
+ goto cleanup;
+ }
+ }
+
if (ctl->newfile)
if (vah_add_file(&buf, ctl->newfile, "rw") != 0)
goto cleanup;