2 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
4 * This file is part of TUD:OS and distributed under the terms of the
5 * GNU Lesser General Public License 2.1.
6 * Please see the COPYING-LGPL-2.1 file for details.
17 #include <sys/mount.h>
23 String(const char *s, const char *e) : _s(s), _e(e), _p(s) {}
24 const char *s() const { return _s; }
25 const char *e() const { return _e; }
26 const char *p() const { return _p; }
27 unsigned l() const { return _e - _s; }
29 const char *next_space()
32 while (i < _e && !isspace(*i))
39 while (_p < e() && isspace(*_p))
43 bool empty() const { return !(_e - _s); }
44 const char *dupnultermstr() const
45 { return strndup(s(), l()); }
47 const char *_s, *_e, *_p;
50 static void parse_fstab_line(const char *fn, int line_nr,
51 const char *s, const char *end)
54 while (i < end && *i != '#')
62 String from(line.s(), line.next_space());
67 const char *x = line.p();
68 String mountpoint(x, line.next_space());
74 String fsname(x, line.next_space());
80 String data(x, line.next_space());
82 if (from.empty() || mountpoint.empty() || fsname.empty())
85 printf("libmount: Invalid line: %s.%d: %.*s\n",
86 fn, line_nr, line.l(), line.s());
90 const char *s1 = from.dupnultermstr();
91 const char *s2 = mountpoint.dupnultermstr();
92 const char *s3 = fsname.dupnultermstr();
93 const char *s5 = data.dupnultermstr();
94 int r = mount(s1, *s2 == '/' ? s2 + 1 : s2, s3, 0, s5);
96 fprintf(stderr, "libmount: %s.%d: mount(\"%s\", \"%s\", \"%s\", %d, \"%s\"): %s\n",
97 fn, line_nr, s1, s2, s3, 0, s5, strerror(errno));
99 printf("libmount: Mounted '%s' to '%s' with file-system '%s'\n",
107 static void parse_fstab(const char *fn, char *fstab, size_t sz)
110 char *end = fstab + sz;
114 printf("libmount: Parsing '%s'\n", fn);
118 while (s < end && *s != '\n')
120 parse_fstab_line(fn, line_nr, fstab, s);
128 static void libmount_init(void) __attribute__((constructor));
129 static void libmount_init()
131 verbose = getenv("FSTAB_DEBUG");
133 const char *fstab_path = getenv("FSTAB_FILE");
135 fstab_path = "/etc/fstab";
137 int fd = open(fstab_path, O_RDONLY);
141 printf("libmount: Could not open '%s': %s.\n", fstab_path, strerror(errno));
146 if (fstat(fd, &st) < 0)
149 printf("libmount: Could not stat '%s'.\n", fstab_path);
153 char *fstab = (char *)mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
157 printf("libmount: Could not mmap '%s'.\n", fstab_path);
161 parse_fstab(fstab_path, fstab, st.st_size);
163 munmap(fstab, st.st_size);