Move the mtab support stuff into libbb
[platform/upstream/busybox.git] / libbb / mtab.c
1 /* vi: set sw=4 ts=4: */
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <stdio.h>
7 #include <mntent.h>
8 #include "libbb.h"
9
10 extern const char mtab_file[];  /* Defined in utility.c */
11 static const int MS_RDONLY = 1; /* Mount read-only.  */
12
13 void erase_mtab(const char *name)
14 {
15         struct mntent entries[20];
16         int count = 0;
17         FILE *mountTable = setmntent(mtab_file, "r");
18         struct mntent *m;
19
20         /* Check if reading the mtab file failed */
21         if (mountTable == 0
22                         /* Bummer.  fall back on trying the /proc filesystem */
23                         && (mountTable = setmntent("/proc/mounts", "r")) == 0) {
24                 perror_msg("%s", mtab_file);
25                 return;
26         }
27
28         while ((m = getmntent(mountTable)) != 0) {
29                 entries[count].mnt_fsname = strdup(m->mnt_fsname);
30                 entries[count].mnt_dir = strdup(m->mnt_dir);
31                 entries[count].mnt_type = strdup(m->mnt_type);
32                 entries[count].mnt_opts = strdup(m->mnt_opts);
33                 entries[count].mnt_freq = m->mnt_freq;
34                 entries[count].mnt_passno = m->mnt_passno;
35                 count++;
36         }
37         endmntent(mountTable);
38         if ((mountTable = setmntent(mtab_file, "w"))) {
39                 int i;
40
41                 for (i = 0; i < count; i++) {
42                         int result = (strcmp(entries[i].mnt_fsname, name) == 0
43                                                   || strcmp(entries[i].mnt_dir, name) == 0);
44
45                         if (result)
46                                 continue;
47                         else
48                                 addmntent(mountTable, &entries[i]);
49                 }
50                 endmntent(mountTable);
51         } else if (errno != EROFS)
52                 perror_msg("%s", mtab_file);
53 }
54
55 void write_mtab(char *blockDevice, char *directory,
56                                 char *filesystemType, long flags, char *string_flags)
57 {
58         FILE *mountTable = setmntent(mtab_file, "a+");
59         struct mntent m;
60
61         if (mountTable == 0) {
62                 perror_msg("%s", mtab_file);
63                 return;
64         }
65         if (mountTable) {
66                 int length = strlen(directory);
67
68                 if (length > 1 && directory[length - 1] == '/')
69                         directory[length - 1] = '\0';
70
71                 if (filesystemType == 0) {
72                         struct mntent *p = find_mount_point(blockDevice, "/proc/mounts");
73
74                         if (p && p->mnt_type)
75                                 filesystemType = p->mnt_type;
76                 }
77                 m.mnt_fsname = blockDevice;
78                 m.mnt_dir = directory;
79                 m.mnt_type = filesystemType ? filesystemType : "default";
80
81                 if (*string_flags) {
82                         m.mnt_opts = string_flags;
83                 } else {
84                         if ((flags | MS_RDONLY) == flags)
85                                 m.mnt_opts = "ro";
86                         else
87                                 m.mnt_opts = "rw";
88                 }
89
90                 m.mnt_freq = 0;
91                 m.mnt_passno = 0;
92                 addmntent(mountTable, &m);
93                 endmntent(mountTable);
94         }
95 }