Bell 32V development
authorTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:14:58 +0000 (19:14 -0500)
committerTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:14:58 +0000 (19:14 -0500)
Work on file usr/src/cmd/pwd.c

Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v

usr/src/cmd/pwd.c [new file with mode: 0644]

diff --git a/usr/src/cmd/pwd.c b/usr/src/cmd/pwd.c
new file mode 100644 (file)
index 0000000..b060709
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Print working (current) directory
+ */
+#include       <stdio.h>
+#include       <sys/param.h>
+#include       <sys/stat.h>
+#include       <sys/dir.h>
+
+char   dot[]   = ".";
+char   dotdot[] = "..";
+char   name[512];
+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) > 511)
+               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];
+}