12 #include <sys/types.h>
13 #include <sys/mount.h>
16 #define MTAB_TMP _PATH_MOUNTED".tmp"
21 printf("Usage: lufsumount mount-point\n");
26 fullpath(char *path, char *full){
30 if(strlen(path) >= PATH_MAX - 1)
33 if(!realpath(path, full))
40 main(int argc, char **argv){
42 static char fpath[PATH_MAX];
45 FILE *mtab, *new_mtab;
53 fprintf(stderr, "lufsumount should be installed suid root\n");
59 fullpath(mountpoint, fpath);
61 if((fd = open(_PATH_MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) < 0){
62 fprintf(stderr, "can't get "_PATH_MOUNTED"~ lock file");
68 if((mtab = setmntent(_PATH_MOUNTED, "r")) == NULL){
69 fprintf(stderr, "can't open "_PATH_MOUNTED ":%s\n", strerror(errno));
73 if((new_mtab = setmntent(MTAB_TMP, "w")) == NULL){
74 fprintf(stderr, "can't open "MTAB_TMP": %s\n", strerror(errno));
79 while((ment = getmntent(mtab))){
80 if(!strcmp(ment->mnt_dir, fpath)){
81 sscanf(ment->mnt_opts, "owner=%u,", &muid);
83 addmntent(new_mtab, ment);
88 if(fchmod(fileno(new_mtab), 0644) < 0){
89 fprintf(stderr, "can't change mode for "MTAB_TMP"\n");
96 fprintf(stderr, "mtab entry for %s not found\n", fpath);
100 if((getuid()) && (getuid() != muid)){
101 fprintf(stderr, "you are not allowed to umount this filesystem.\n");
106 fprintf(stderr, "could not umount %s: %s\n", fpath, strerror(errno));
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));
115 if(unlink(_PATH_MOUNTED"~") < 0){
116 fprintf(stderr, "can't remove "_PATH_MOUNTED"~\n");
125 unlink(_PATH_MOUNTED"~");