Cosmetic: Adjusted 'progress' message text.
[lufs.git] / util / lufsumount.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <limits.h>
6 #include <errno.h>
7 #include <mntent.h>
8 #include <paths.h>
9 #include <fcntl.h>
10 #include <string.h>
11
12 #include <sys/types.h>
13 #include <sys/mount.h>
14 #include <sys/stat.h>
15
16 #define MTAB_TMP _PATH_MOUNTED".tmp"
17
18 static void
19 help(){
20     printf("\n");
21     printf("Usage: lufsumount mount-point\n");
22
23 }
24
25 static int
26 fullpath(char *path, char *full){
27     
28     full[0] = 0;
29     
30     if(strlen(path) >= PATH_MAX - 1)
31         return -1;
32
33     if(!realpath(path, full))
34         return -1;
35     else 
36         return 0;
37 }
38
39 int
40 main(int argc, char **argv){
41     char *mountpoint;
42     static char fpath[PATH_MAX];
43     struct mntent *ment;
44     int fd, muid = -1;
45     FILE *mtab, *new_mtab;
46     
47     if(argc != 2){
48         help();
49         return 1;
50     }
51     
52     if(geteuid()){
53         fprintf(stderr, "lufsumount should be installed suid root\n");
54         return 1;
55     }
56         
57     mountpoint = argv[1];
58
59     fullpath(mountpoint, fpath);
60     
61     if((fd = open(_PATH_MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) < 0){
62         fprintf(stderr, "can't get "_PATH_MOUNTED"~ lock file");
63         return 1;
64     }
65     
66     close(fd);
67     
68     if((mtab = setmntent(_PATH_MOUNTED, "r")) == NULL){
69         fprintf(stderr, "can't open "_PATH_MOUNTED ":%s\n", strerror(errno));
70         goto err;
71     }
72
73     if((new_mtab = setmntent(MTAB_TMP, "w")) == NULL){
74         fprintf(stderr, "can't open "MTAB_TMP": %s\n", strerror(errno));
75         endmntent(mtab);
76         goto err;
77     }
78     
79     while((ment = getmntent(mtab))){
80         if(!strcmp(ment->mnt_dir, fpath)){
81             sscanf(ment->mnt_opts, "owner=%u,", &muid);
82         }else
83             addmntent(new_mtab, ment);
84     }
85
86     endmntent(mtab);
87
88     if(fchmod(fileno(new_mtab), 0644) < 0){
89         fprintf(stderr, "can't change mode for "MTAB_TMP"\n");
90         goto err;
91     }
92
93     endmntent(new_mtab);
94     
95     if(muid == -1){
96         fprintf(stderr, "mtab entry for %s not found\n", fpath);
97         goto err_mtab;
98     }
99
100     if((getuid()) && (getuid() != muid)){
101         fprintf(stderr, "you are not allowed to umount this filesystem.\n");
102         goto err_mtab;
103     }
104
105     if(umount(fpath)){
106         fprintf(stderr, "could not umount %s: %s\n", fpath, strerror(errno));
107         goto err_mtab;
108     }
109
110     if(rename(MTAB_TMP, _PATH_MOUNTED) < 0){
111         fprintf(stderr, "can't rename %s to %s: %s\n", MTAB_TMP, _PATH_MOUNTED, strerror(errno));
112         goto err_mtab;
113     }
114
115     if(unlink(_PATH_MOUNTED"~") < 0){
116         fprintf(stderr, "can't remove "_PATH_MOUNTED"~\n");
117         return 1;
118     }
119     
120     return 0;
121
122 err_mtab:
123     unlink(MTAB_TMP);
124 err:
125     unlink(_PATH_MOUNTED"~");
126     return 1;
127 }
128