This is vumount.c in view mode; [Download] [Up]
/* * Name: vumount.c * Description: Unmount the given vmounted volume * Author: Christian Starkjohann <cs@hal.kph.tuwien.ac.at> * Date: 1997-04-30 * Copyright: GNU-GPL * Tabsize: 4 */ #include <libc.h> #include <errno.h> #include <mntent.h> #include "my_defines.h" /* ------------------------------------------------------------------------- */ extern int errno; static char *my_name; /* ------------------------------------------------------------------------- */ static void remove_entry(char *path) { FILE *fpout, *fpin; struct mntent *ent; char tempfile[2048]; int changed = 0; sprintf(tempfile, "%s-%d.tmp", MOUNTED, getpid()); if((fpin = setmntent(MOUNTED, "r")) == NULL){ fprintf(stderr, "%s: cannot open mtab file ->%s<-: %s\n", my_name, MOUNTED, strerror(errno)); return; }else{ if((fpout = setmntent(tempfile, "w")) == NULL){ fprintf(stderr, "%s: error creating ->%s<-: %s\n", my_name, tempfile, strerror(errno)); endmntent(fpin); return; } while((ent = getmntent(fpin)) != NULL){ if(strcmp(ent->mnt_dir, path) != 0) addmntent(fpout, ent); else changed = 1; } endmntent(fpout); endmntent(fpin); if(changed){ if(rename(tempfile, MOUNTED) != 0){ fprintf(stderr, "%s: error moving temp file ->%s<- to " "->%s<-\n", my_name, tempfile, MOUNTED); unlink(tempfile); } }else unlink(tempfile); } } /* ------------------------------------------------------------------------- */ static int umount_dir(char *path) { FILE *fpin; struct mntent *ent; int i, pid, rval = 0, found_any = 0; if((fpin = setmntent(MOUNTED, "r")) == NULL){ fprintf(stderr, "%s: cannot open mtab file ->%s<-: %s\n", my_name, MOUNTED, strerror(errno)); return -1; }else{ while((ent = getmntent(fpin)) != NULL){ if(strcmp(ent->mnt_dir, path) == 0){ found_any = 1; if(sscanf(ent->mnt_type, "vmount-%d", &pid) == 1){ if(unmount(path) != 0){ fprintf(stderr, "%s: cannot unmount ->%s<-: %s\n", my_name, ent->mnt_dir, strerror(errno)); rval = -1; }else{ if(fork() != 0){ /* parent */ kill(pid, 1); for(i=0; kill(pid, 0) == 0 && i < 600; i++){ usleep(100000); } /* wait up to 60s for terminate */ }else{ signal(SIGHUP, SIG_IGN); signal(SIGTERM, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGURG, SIG_IGN); signal(SIGCONT, SIG_IGN); signal(SIGCHLD, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGIO, SIG_IGN); signal(SIGWINCH, SIG_IGN); /* * Note: This is an evil hack. Workspace overwrites /etc/mtab to what it * thinks is correct, but that is wrong if more than one volume was mounted * by an *.util program. So we wait several seconds (until Workspace has * done its evil things) and overwrite mtab with what _we_ think is correct. */ sleep(4); lock_mtab(); remove_entry(path); unlock_mtab(); exit(0); } } }else{ fprintf(stderr, "%s: type ->%s<- not mounted by vmount\n", my_name, ent->mnt_type); rval = -1; } } } endmntent(fpin); if(!found_any){ fprintf(stderr, "%s: directory ->%s<- not found in mtab\n", my_name, path); } } return rval; } /* ------------------------------------------------------------------------- */ static void print_all(void) { FILE *fpin; struct mntent *ent; int pid; if((fpin = setmntent(MOUNTED, "r")) == NULL){ fprintf(stderr, "%s: cannot open mtab file ->%s<-: %s\n", my_name, MOUNTED, strerror(errno)); return; }else{ while((ent = getmntent(fpin)) != NULL){ if(sscanf(ent->mnt_type, "vmount-%d", &pid) == 1){ printf("%s\n", ent->mnt_dir); } } endmntent(fpin); } } /* ------------------------------------------------------------------------- */ int main(int argc, char **argv) { int i, error = 0, rval; my_name = argv[0]; if(argc == 1){ printf("vmount mounted directories:\n"); print_all(); }else{ for(i=1;i<argc;i++){ error |= umount_dir(argv[i]); } } rval = error ? 1 : 0; return rval; } /* ------------------------------------------------------------------------- */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.