xref: /openbmc/qemu/fsdev/qemu-fsdev.c (revision 7c6da3de)
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     { .name = "handle", .ops = &handle_ops},
27 };
28 
29 int qemu_fsdev_add(QemuOpts *opts)
30 {
31     struct FsTypeListEntry *fsle;
32     int i;
33     const char *fsdev_id = qemu_opts_id(opts);
34     const char *fstype = qemu_opt_get(opts, "fstype");
35     const char *path = qemu_opt_get(opts, "path");
36     const char *sec_model = qemu_opt_get(opts, "security_model");
37 
38     if (!fsdev_id) {
39         fprintf(stderr, "fsdev: No id specified\n");
40         return -1;
41     }
42 
43     if (fstype) {
44         for (i = 0; i < ARRAY_SIZE(FsTypes); i++) {
45             if (strcmp(FsTypes[i].name, fstype) == 0) {
46                 break;
47             }
48         }
49 
50         if (i == ARRAY_SIZE(FsTypes)) {
51             fprintf(stderr, "fsdev: fstype %s not found\n", fstype);
52             return -1;
53         }
54     } else {
55         fprintf(stderr, "fsdev: No fstype specified\n");
56         return -1;
57     }
58 
59     if (!sec_model) {
60         fprintf(stderr, "fsdev: No security_model specified.\n");
61         return -1;
62     }
63 
64     if (!path) {
65         fprintf(stderr, "fsdev: No path specified.\n");
66         return -1;
67     }
68 
69     fsle = g_malloc(sizeof(*fsle));
70 
71     fsle->fse.fsdev_id = g_strdup(fsdev_id);
72     fsle->fse.path = g_strdup(path);
73     fsle->fse.security_model = g_strdup(sec_model);
74     fsle->fse.ops = FsTypes[i].ops;
75 
76     QTAILQ_INSERT_TAIL(&fstype_entries, fsle, next);
77     return 0;
78 
79 }
80 
81 FsTypeEntry *get_fsdev_fsentry(char *id)
82 {
83     if (id) {
84         struct FsTypeListEntry *fsle;
85 
86         QTAILQ_FOREACH(fsle, &fstype_entries, next) {
87             if (strcmp(fsle->fse.fsdev_id, id) == 0) {
88                 return &fsle->fse;
89             }
90         }
91     }
92     return NULL;
93 }
94 
95 static void fsdev_register_config(void)
96 {
97     qemu_add_opts(&qemu_fsdev_opts);
98     qemu_add_opts(&qemu_virtfs_opts);
99 }
100 machine_init(fsdev_register_config);
101 
102