|
|
1.1 root 1: /*
2: * Virtio 9p
3: *
4: * Copyright IBM, Corp. 2010
5: *
6: * Authors:
7: * Gautham R Shenoy <[email protected]>
8: *
9: * This work is licensed under the terms of the GNU GPL, version 2. See
10: * the COPYING file in the top-level directory.
11: *
12: */
13: #include <stdio.h>
14: #include <string.h>
15: #include "qemu-fsdev.h"
16: #include "qemu-queue.h"
17: #include "osdep.h"
18: #include "qemu-common.h"
1.1.1.2 root 19: #include "qemu-config.h"
1.1 root 20:
1.1.1.3 ! root 21: static QTAILQ_HEAD(FsDriverEntry_head, FsDriverListEntry) fsdriver_entries =
! 22: QTAILQ_HEAD_INITIALIZER(fsdriver_entries);
1.1 root 23:
1.1.1.3 ! root 24: static FsDriverTable FsDrivers[] = {
1.1 root 25: { .name = "local", .ops = &local_ops},
1.1.1.3 ! root 26: #ifdef CONFIG_OPEN_BY_HANDLE
! 27: { .name = "handle", .ops = &handle_ops},
! 28: #endif
! 29: { .name = "synth", .ops = &synth_ops},
1.1 root 30: };
31:
32: int qemu_fsdev_add(QemuOpts *opts)
33: {
1.1.1.3 ! root 34: struct FsDriverListEntry *fsle;
1.1 root 35: int i;
1.1.1.2 root 36: const char *fsdev_id = qemu_opts_id(opts);
1.1.1.3 ! root 37: const char *fsdriver = qemu_opt_get(opts, "fsdriver");
1.1.1.2 root 38: const char *path = qemu_opt_get(opts, "path");
39: const char *sec_model = qemu_opt_get(opts, "security_model");
1.1.1.3 ! root 40: const char *writeout = qemu_opt_get(opts, "writeout");
! 41: bool ro = qemu_opt_get_bool(opts, "readonly", 0);
1.1 root 42:
1.1.1.2 root 43: if (!fsdev_id) {
1.1 root 44: fprintf(stderr, "fsdev: No id specified\n");
45: return -1;
46: }
47:
1.1.1.3 ! root 48: if (fsdriver) {
! 49: for (i = 0; i < ARRAY_SIZE(FsDrivers); i++) {
! 50: if (strcmp(FsDrivers[i].name, fsdriver) == 0) {
1.1.1.2 root 51: break;
52: }
1.1 root 53: }
54:
1.1.1.3 ! root 55: if (i == ARRAY_SIZE(FsDrivers)) {
! 56: fprintf(stderr, "fsdev: fsdriver %s not found\n", fsdriver);
1.1.1.2 root 57: return -1;
58: }
59: } else {
1.1.1.3 ! root 60: fprintf(stderr, "fsdev: No fsdriver specified\n");
1.1 root 61: return -1;
62: }
63:
1.1.1.3 ! root 64: if (!strcmp(fsdriver, "local") && !sec_model) {
! 65: fprintf(stderr, "security model not specified, "
! 66: "local fs needs security model\nvalid options are:"
! 67: "\tsecurity_model=[passthrough|mapped|none]\n");
! 68: return -1;
! 69: }
! 70:
! 71: if (strcmp(fsdriver, "local") && sec_model) {
! 72: fprintf(stderr, "only local fs driver needs security model\n");
1.1 root 73: return -1;
74: }
75:
1.1.1.2 root 76: if (!path) {
77: fprintf(stderr, "fsdev: No path specified.\n");
78: return -1;
79: }
80:
1.1.1.3 ! root 81: fsle = g_malloc(sizeof(*fsle));
1.1 root 82:
1.1.1.3 ! root 83: fsle->fse.fsdev_id = g_strdup(fsdev_id);
! 84: fsle->fse.path = g_strdup(path);
! 85: fsle->fse.ops = FsDrivers[i].ops;
! 86: fsle->fse.export_flags = 0;
! 87: if (writeout) {
! 88: if (!strcmp(writeout, "immediate")) {
! 89: fsle->fse.export_flags |= V9FS_IMMEDIATE_WRITEOUT;
! 90: }
! 91: }
! 92: if (ro) {
! 93: fsle->fse.export_flags |= V9FS_RDONLY;
! 94: } else {
! 95: fsle->fse.export_flags &= ~V9FS_RDONLY;
! 96: }
1.1 root 97:
1.1.1.3 ! root 98: if (strcmp(fsdriver, "local")) {
! 99: goto done;
! 100: }
1.1 root 101:
1.1.1.3 ! root 102: if (!strcmp(sec_model, "passthrough")) {
! 103: fsle->fse.export_flags |= V9FS_SM_PASSTHROUGH;
! 104: } else if (!strcmp(sec_model, "mapped")) {
! 105: fsle->fse.export_flags |= V9FS_SM_MAPPED;
! 106: } else if (!strcmp(sec_model, "none")) {
! 107: fsle->fse.export_flags |= V9FS_SM_NONE;
! 108: } else {
! 109: fprintf(stderr, "Invalid security model %s specified, valid options are"
! 110: "\n\t [passthrough|mapped|none]\n", sec_model);
! 111: return -1;
! 112: }
! 113: done:
! 114: QTAILQ_INSERT_TAIL(&fsdriver_entries, fsle, next);
! 115: return 0;
1.1 root 116: }
117:
1.1.1.3 ! root 118: FsDriverEntry *get_fsdev_fsentry(char *id)
1.1 root 119: {
1.1.1.2 root 120: if (id) {
1.1.1.3 ! root 121: struct FsDriverListEntry *fsle;
1.1 root 122:
1.1.1.3 ! root 123: QTAILQ_FOREACH(fsle, &fsdriver_entries, next) {
1.1.1.2 root 124: if (strcmp(fsle->fse.fsdev_id, id) == 0) {
125: return &fsle->fse;
126: }
1.1 root 127: }
128: }
129: return NULL;
130: }
1.1.1.2 root 131:
132: static void fsdev_register_config(void)
133: {
134: qemu_add_opts(&qemu_fsdev_opts);
135: qemu_add_opts(&qemu_virtfs_opts);
136: }
137: machine_init(fsdev_register_config);
138:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.