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
10extern const char mtab_file[];	/* Defined in utility.c */
11static const int MS_RDONLY = 1;	/* Mount read-only.  */
12
13void 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
55void 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}
96