Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/utils/mount_opts.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 815 - (hide annotations) (download)
Fri Apr 24 18:32:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 2108 byte(s)
-updated to klibc-1.5.15
1 niro 532 /*
2     * by rmk
3     *
4     * Decode mount options.
5     */
6     #include <sys/mount.h>
7     #include <stdlib.h>
8     #include <string.h>
9    
10     #include "mount_opts.h"
11    
12     #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
13    
14     static const struct mount_opts options[] = {
15     /* name mask set noset */
16     {"async", MS_SYNCHRONOUS, 0, MS_SYNCHRONOUS},
17     {"atime", MS_NOATIME, 0, MS_NOATIME},
18     {"bind", MS_TYPE, MS_BIND, 0,},
19     {"dev", MS_NODEV, 0, MS_NODEV},
20     {"diratime", MS_NODIRATIME, 0, MS_NODIRATIME},
21     {"dirsync", MS_DIRSYNC, MS_DIRSYNC, 0},
22     {"exec", MS_NOEXEC, 0, MS_NOEXEC},
23     {"move", MS_TYPE, MS_MOVE, 0},
24 niro 815 {"nodev", MS_NODEV, MS_NODEV, 0},
25     {"noexec", MS_NOEXEC, MS_NOEXEC, 0},
26     {"nosuid", MS_NOSUID, MS_NOSUID, 0},
27 niro 532 {"recurse", MS_REC, MS_REC, 0},
28     {"remount", MS_TYPE, MS_REMOUNT, 0},
29     {"ro", MS_RDONLY, MS_RDONLY, 0},
30     {"rw", MS_RDONLY, 0, MS_RDONLY},
31     {"suid", MS_NOSUID, 0, MS_NOSUID},
32     {"sync", MS_SYNCHRONOUS, MS_SYNCHRONOUS, 0},
33     {"verbose", MS_VERBOSE, MS_VERBOSE, 0},
34     };
35    
36     static void add_extra_option(struct extra_opts *extra, char *s)
37     {
38     int len = strlen(s);
39     int newlen = extra->used_size + len;
40    
41     if (extra->str)
42     len++; /* +1 for ',' */
43    
44     if (newlen >= extra->alloc_size) {
45     char *new;
46    
47     new = realloc(extra->str, newlen + 1); /* +1 for NUL */
48     if (!new)
49     return;
50    
51     extra->str = new;
52     extra->end = extra->str + extra->used_size;
53     extra->alloc_size = newlen;
54     }
55    
56     if (extra->used_size) {
57     *extra->end = ',';
58     extra->end++;
59     }
60     strcpy(extra->end, s);
61     extra->used_size += len;
62    
63     }
64    
65     unsigned long
66     parse_mount_options(char *arg, unsigned long rwflag, struct extra_opts *extra)
67     {
68     char *s;
69    
70     while ((s = strsep(&arg, ",")) != NULL) {
71     char *opt = s;
72     unsigned int i;
73     int res, no = s[0] == 'n' && s[1] == 'o';
74    
75     if (no)
76     s += 2;
77    
78     for (i = 0, res = 1; i < ARRAY_SIZE(options); i++) {
79     res = strcmp(s, options[i].str);
80    
81     if (res == 0) {
82     rwflag &= ~options[i].rwmask;
83     if (no)
84     rwflag |= options[i].rwnoset;
85     else
86     rwflag |= options[i].rwset;
87     }
88     if (res <= 0)
89     break;
90     }
91    
92     if (res != 0 && s[0])
93     add_extra_option(extra, opt);
94     }
95    
96     return rwflag;
97     }