AUSAM/source/S/umount.c
#include <mtab.h>
#include <errnos.h>
#include <stat.h>
char *devd "/dev/xxxxxxxxxxxxxx";
int errortotal;
main(argc, argv)
char **argv;
{
register struct mtab *mp;
register char *p1, *p2;
int n, m, mf;
extern int errno;
extern char *sys_errlist[];
struct statb sb[1];
if(argc < 2)
{
prints(2, "Usage: umount devname|rootdir ...\n");
return 1;
}
sys_errlist[EINVAL] = "Device not currently mounted";
if((mf = open(mtabf, 0)) < 0)
{
perror(mtabf);
return 1;
}
n = read(mf, mtab, sizeof mtab);
if(n%sizeof mtab[0])
{
error(mtabf, "Wrong format?\n");
return 1;
}
close(mf);
sync();
m = 0;
for(p2 = *++argv; --argc; p2 = *++argv)
{
if(stat(p2, sb) < 0)
{
perror(p2);
errortotal++;
continue;
}
switch(sb->i_mode & IFMT)
{
case IFDIR:
if(sb->i_ino != 1)
{
error(p2, ": Not a filesystem rootdir\n");
errortotal++;
continue;
}
if( (p1 = dsearch(sb->i_dev)) == 0)
{
error(p2, ": Device not found in /dev\n");
errortotal++;
continue;
}
devd[5] = 0;
p2 = strcat(devd, p1);
break;
case IFBLK:
p1 = p2;
while(*p1++);
p1--;
while(*--p1 == '/') *p1 = 0;
while(p1 > p2 && *--p1 != '/');
p1++;
break;
default:
error(p2, ": Not a block device or filesystem root\n");
errortotal++;
continue;
}
if(umount(p2) < 0)
{
perror(p2);
errortotal = errortotal || (errno != EINVAL);
continue;
}
n = 0;
for(mp = mtab; mp < &mtab[NMOUNT]; mp++)
{
if(strcmp(p1, mp->m_spec) == 0)
{
mp->m_file[0] = 0;
n++,m++;
}
}
if(n == 0)
{
error(p2, ": Not in mount table (non-fatal)\n");
}
}
if(m != 0)
{
if( (mf = creat(mtabf, 0604)) < 0)
{
perror(mtabf);
return errortotal+1;
}
for(mp = mtab; mp < &mtab[NMOUNT]; mp++)
{
if(*mp->m_file)
write(mf, mp, sizeof mtab[0]);
}
}
return errortotal;
}
dsearch(device)
register int device;
{
struct statb sb[1];
static char buf[18];
register int df, *bp;
bp = buf;
if( (df = open("/dev", 0)) < 0)
{
perror("/dev");
return 0;
}
while(read(df, bp, 16) == 16)
{
if(*bp && strcmp(bp+1, "swap") != 0)
{
devd[5] = 0;
stat(strcat(devd, bp+1), sb);
if((sb->i_mode&IFMT) == IFBLK && sb->i_addr[0] == device)
{
close(df);
return bp+1;
}
}
}
close(df);
return 0;
}
error(s1, s2)
{
prints(2, s1);
prints(2, s2);
}