1 /* 2 * Virtio 9p 3 * 4 * Copyright IBM, Corp. 2010 5 * 6 * Authors: 7 * Gautham R Shenoy <ego@in.ibm.com> 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" 19 #include "qemu-config.h" 20 21 static QTAILQ_HEAD(FsTypeEntry_head, FsTypeListEntry) fstype_entries = 22 QTAILQ_HEAD_INITIALIZER(fstype_entries); 23 24 static FsTypeTable FsTypes[] = { 25 { .name = "local", .ops = &local_ops}, 26 }; 27 28 int qemu_fsdev_add(QemuOpts *opts) 29 { 30 struct FsTypeListEntry *fsle; 31 int i; 32 const char *fsdev_id = qemu_opts_id(opts); 33 const char *fstype = qemu_opt_get(opts, "fstype"); 34 const char *path = qemu_opt_get(opts, "path"); 35 const char *sec_model = qemu_opt_get(opts, "security_model"); 36 37 if (!fsdev_id) { 38 fprintf(stderr, "fsdev: No id specified\n"); 39 return -1; 40 } 41 42 if (fstype) { 43 for (i = 0; i < ARRAY_SIZE(FsTypes); i++) { 44 if (strcmp(FsTypes[i].name, fstype) == 0) { 45 break; 46 } 47 } 48 49 if (i == ARRAY_SIZE(FsTypes)) { 50 fprintf(stderr, "fsdev: fstype %s not found\n", fstype); 51 return -1; 52 } 53 } else { 54 fprintf(stderr, "fsdev: No fstype specified\n"); 55 return -1; 56 } 57 58 if (!sec_model) { 59 fprintf(stderr, "fsdev: No security_model specified.\n"); 60 return -1; 61 } 62 63 if (!path) { 64 fprintf(stderr, "fsdev: No path specified.\n"); 65 return -1; 66 } 67 68 fsle = qemu_malloc(sizeof(*fsle)); 69 70 fsle->fse.fsdev_id = qemu_strdup(fsdev_id); 71 fsle->fse.path = qemu_strdup(path); 72 fsle->fse.security_model = qemu_strdup(sec_model); 73 fsle->fse.ops = FsTypes[i].ops; 74 75 QTAILQ_INSERT_TAIL(&fstype_entries, fsle, next); 76 return 0; 77 78 } 79 80 FsTypeEntry *get_fsdev_fsentry(char *id) 81 { 82 if (id) { 83 struct FsTypeListEntry *fsle; 84 85 QTAILQ_FOREACH(fsle, &fstype_entries, next) { 86 if (strcmp(fsle->fse.fsdev_id, id) == 0) { 87 return &fsle->fse; 88 } 89 } 90 } 91 return NULL; 92 } 93 94 static void fsdev_register_config(void) 95 { 96 qemu_add_opts(&qemu_fsdev_opts); 97 qemu_add_opts(&qemu_virtfs_opts); 98 } 99 machine_init(fsdev_register_config); 100 101