home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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];
- }
-