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