|
|
researchv9-SUN3(old)
#include "ps.h"
#define NNAMES 16
char *fspts[3];
struct direct *fsbeg, *fsend, *fsprev;
#ifdef TEST
main(argc, argv)
char **argv;
{
register struct direct *fs; int dev; char *getfs();
getfstab();
if (argc <= 1)
for (fs=fsbeg; fs < fsend; fs++)
printf("%3d,%3d %.14s\n",
major(fs->d_ino), minor(fs->d_ino), fs->d_name);
else while ((argc -= 2) > 0) {
dev = atoi(*++argv);
dev = makedev(dev, atoi(*++argv));
printf("%3d,%3d %.14s\n", major(dev), minor(dev), getfs(dev));
}
exit(0);
}
#endif
char *
getfs(dev)
register dev;
{
register struct direct *fs;
if ((fs = fsprev) && fs->d_ino == dev)
return fs->d_name;
for (fs=fsbeg; fs < fsend; fs++)
if (fs->d_ino == dev ||
(major(fs->d_ino) == major(dev) && minor(fs->d_ino) == 255)) {
fsprev = fs;
return fs->d_name;
}
return 0;
}
getfstab()
{
char *buffer, *bufpt, *nlpt, *strchr(), *strrchr(), *sindex();
struct stat fd_st;
register struct direct *fs = 0;
register char *p; int fd;
if (fsbeg)
return 0;
if ((fd = open("/etc/fstab", 0)) < 0)
return 1;
if (fstat(fd, &fd_st) || (buffer = malloc((int)fd_st.st_size+1)) == 0)
return close(fd), 1;
if (!Read(fd, buffer, (int)fd_st.st_size))
return free(buffer), close(fd), 1;
buffer[fd_st.st_size] = 0;
for (bufpt=buffer; nlpt=strchr(bufpt, '\n'); bufpt=nlpt) {
*nlpt++ = 0;
if ((p = strchr(bufpt, ':')) == 0)
continue;
*p = 0;
if (stat(bufpt, &fd_st))
continue;
if ((fs = Nalloc(struct direct, fspts, NNAMES)) == 0)
break;
if (p = strrchr(bufpt, '/'))
++p;
else
p = bufpt;
strncpy(fs->d_name, p, DIRSIZ);
fs->d_ino = fd_st.st_rdev;
}
free(buffer), close(fd);
if ((fd = open("/usr/net/friends", 0)) < 0)
return 1;
if (fstat(fd, &fd_st) || (buffer = malloc((int)fd_st.st_size+1)) == 0)
return close(fd), 1;
if (!Read(fd, buffer, (int)fd_st.st_size))
return free(buffer), close(fd), 1;
buffer[fd_st.st_size] = 0;
for (bufpt=buffer; nlpt=strchr(bufpt, '\n'); bufpt=nlpt) {
*nlpt++ = 0;
if ((bufpt = sindex(bufpt, " \t")) == 0)
continue;
if ((bufpt = strrchr(bufpt, '/')) == 0)
continue;
if ((p = sindex(++bufpt, " \t")) == 0)
continue;
*p = 0;
if ((fs = Nalloc(struct direct, fspts, NNAMES)) == 0)
break;
strncpy(fs->d_name, bufpt, DIRSIZ);
fs->d_ino = makedev(atoi(++p), 255);
}
free(buffer), close(fd);
if (stat(bufpt = "/proc", &fd_st) == 0 &&
(fs = Nalloc(struct direct, fspts, NNAMES))) {
strncpy(fs->d_name, bufpt+1, DIRSIZ);
fs->d_ino = fd_st.st_dev;
}
if (fs) {
fsbeg = (struct direct *)fspts[0];
fsend = (struct direct *)fspts[1];
}
return 0;
}
char *
sindex(s, c)
register char *s, *c;
{
register char *p = 0, *q;
while (*c) {
if ((q = strchr(s, *c++)) == 0)
continue;
if (p == 0 || q < p)
p = q;
}
return p;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.