xref: /openbmc/qemu/fsdev/qemu-fsdev.c (revision 7267c094)
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 = g_malloc(sizeof(*fsle));
69 
70     fsle->fse.fsdev_id = g_strdup(fsdev_id);
71     fsle->fse.path = g_strdup(path);
72     fsle->fse.security_model = g_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