Minix1.5/commands/umount.c

Compare this file to the similar file:
Show the results in this format:

/* umount - unmount a file system		Author: Andy Tanenbaum */

#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>

#define BUFSIZE 1024

extern int errno;
char *mounttable = "/etc/mtab";
char buffer[BUFSIZE], *p = &buffer[0], *q;

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);
  }
  std_err(argv[1]);
  std_err(" unmounted\n");
  do_mtab(argv[1]);
  exit(0);
}

do_mtab(devname)
char *devname;
{
/* Remove an entry from mtab. */
  int n, fd;
  char line[256];

  /* Read in the mount table and then overwrite the file. */
  fd = open(mounttable, O_RDWR);
  n = read(fd, buffer, BUFSIZE);
  close(fd);
  q = &buffer[n];
  fd = creat(mounttable, 0554);

  n = strlen(devname);
  while (getline(line) != 0) {
	if (strncmp(line, devname, n) == 0) continue;
	write(fd, line, strlen(line));
  }
}

int getline(ptr)
char *ptr;
{
  char c;

  while (p < q) {
	c = *p++;
	*ptr++ = c;
	if (c == '\n') {
		*ptr++ = 0;
		return(1);
	}
  }
  return(0);
}


usage()
{
  std_err("Usage: umount special\n");
  exit(1);
}