-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmntparse.c
More file actions
61 lines (50 loc) · 1.16 KB
/
mntparse.c
File metadata and controls
61 lines (50 loc) · 1.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mntent.h>
#include <assert.h>
char *fname2dev(char *fname)
{
FILE *fd;
struct mntent minfo;
char buffer[4096];
char *apath, *dev;
int len;
apath = realpath(fname, NULL);
dev = NULL;
fd = setmntent("/etc/mtab", "r");
assert(fd != NULL);
while (getmntent_r(fd, &minfo, buffer, sizeof(buffer)) != NULL) {
len = strlen(minfo.mnt_dir);
if (strncmp(apath, minfo.mnt_dir, len) == 0) {
if (strlen(apath) > len) {
if ((apath[len] == '/') || (minfo.mnt_dir[len-1] == '/')) {
if (dev) free(dev);
dev = strdup(minfo.mnt_fsname);
}
} else {
if (dev) free(dev);
dev = strdup(minfo.mnt_fsname);
}
}
}
endmntent(fd);
return(dev);
}
int main(int argc, char **argv)
{
char *fname, *dev;
if (argc != 2) {
printf("mntparse fname\n");
return(0);
}
fname = argv[1];
dev = fname2dev(fname);
if (dev == NULL) {
printf("Missing device entry for fname=%s\n", fname);
} else {
printf("fname=%s maps to devic=%s\n",fname, dev);
}
return(0);
}