minix/commands/simple/umount.c
Thomas Veerman c2ffe723d1 - Moved (u)mount prototypes from unistd.h to sys/mount.h.
- Prepared mount system call to accept multiple mount flags
   instead of just read_only (however, it remains backwards
   compatible).
 - Updated the man mount(2) to reflect new header file usage. 
 - Updated badblocks, newroot, mount, and umount commands to use the
   new header file.
2009-08-12 19:57:37 +00:00

87 lines
1.7 KiB
C
Executable file

/* umount - unmount a file system Author: Andy Tanenbaum */
#define _MINIX 1 /* for proto of the non-POSIX umount() */
#define _POSIX_SOURCE 1 /* for PATH_MAX from limits.h */
#include <minix/type.h>
#include <sys/types.h>
#include <sys/svrctl.h>
#include <fcntl.h>
#include <errno.h>
#include <limits.h>
#include <minix/minlib.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mount.h>
#include <stdio.h>
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(void update_mtab, (char *devname));
_PROTOTYPE(void usage, (void));
_PROTOTYPE(void tell, (char *this));
static char mountpoint[PATH_MAX+1];
int main(argc, argv)
int argc;
char *argv[];
{
if (argc != 2) usage();
if (umount(argv[1]) < 0) {
if (errno == EINVAL)
std_err("Device not mounted\n");
else
perror("umount");
exit(1);
}
update_mtab(argv[1]);
tell(argv[1]);
tell(" unmounted");
if (*mountpoint != '\0') {
tell(" from ");
tell(mountpoint);
}
tell("\n");
return(0);
}
void update_mtab(devname)
char *devname;
{
/* Remove an entry from /etc/mtab. */
int n;
char special[PATH_MAX+1], mounted_on[PATH_MAX+1], version[10], rw_flag[10];
if (load_mtab("umount") < 0) {
std_err("/etc/mtab not updated.\n");
exit(1);
}
while (1) {
n = get_mtab_entry(special, mounted_on, version, rw_flag);
if (n < 0) break;
if (strcmp(devname, special) == 0) {
strcpy(mountpoint, mounted_on);
continue;
}
(void) put_mtab_entry(special, mounted_on, version, rw_flag);
}
n = rewrite_mtab("umount");
if (n < 0) {
std_err("/etc/mtab not updated.\n");
exit(1);
}
}
void usage()
{
std_err("Usage: umount special\n");
exit(1);
}
void tell(this)
char *this;
{
write(1, this, strlen(this));
}