From 3a54d117713a807621be418c199bb9c02ec1b880 Mon Sep 17 00:00:00 2001 From: Bill Joy Date: Sun, 30 Dec 1979 00:52:09 -0800 Subject: [PATCH] BSD 3 development Work on file usr/src/cmd/pwd.c Synthesized-from: 3bsd --- usr/src/cmd/pwd.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 usr/src/cmd/pwd.c diff --git a/usr/src/cmd/pwd.c b/usr/src/cmd/pwd.c new file mode 100644 index 0000000000..c0dcd8d829 --- /dev/null +++ b/usr/src/cmd/pwd.c @@ -0,0 +1,80 @@ +/* + * Print working (current) directory + */ +#include +#include +#include +#include + +char dot[] = "."; +char dotdot[] = ".."; +char name[BUFSIZ]; +int file; +int off = -1; +struct stat d, dd; +struct direct dir; + +main() +{ + int rdev, rino; + + stat("/", &d); + rdev = d.st_dev; + rino = d.st_ino; + for (;;) { + stat(dot, &d); + if (d.st_ino==rino && d.st_dev==rdev) + prname(); + if ((file = open(dotdot,0)) < 0) { + fprintf(stderr,"pwd: cannot open ..\n"); + exit(1); + } + fstat(file, &dd); + chdir(dotdot); + if(d.st_dev == dd.st_dev) { + if(d.st_ino == dd.st_ino) + prname(); + do + if (read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { + fprintf(stderr,"read error in ..\n"); + exit(1); + } + while (dir.d_ino != d.st_ino); + } + else do { + if(read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { + fprintf(stderr,"read error in ..\n"); + exit(1); + } + stat(dir.d_name, &dd); + } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); + close(file); + cat(); + } +} + +prname() +{ + write(1, "/", 1); + if (off<0) + off = 0; + name[off] = '\n'; + write(1, name, off+1); + exit(0); +} + +cat() +{ + register i, j; + + i = -1; + while (dir.d_name[++i] != 0); + if ((off+i+2) > BUFSIZ-1) + prname(); + for(j=off+1; j>=0; --j) + name[j+i+1] = name[j]; + off=i+off+1; + name[i] = '/'; + for(--i; i>=0; --i) + name[i] = dir.d_name[i]; +} -- 2.20.1