Annotation of 43BSDTahoe/new/rcs/src/curdir.c, revision 1.1.1.1

1.1       root        1: /*******************************************************************
                      2:  *                     curdir: get current directory
                      3:  *******************************************************************
                      4:  * returns full pathname of working (current) directory.
                      5:  * This is an adaptation of pwd, and works for grafted directories.
                      6:  * Unlike pwd, returns to current directory after it is finished.
                      7:  * Uses stdio buffering for directory reads.
                      8:  */
                      9: 
                     10:  static char rcsid[]=
                     11:  "$Header: /arthur/src/local/bin/rcs/src/RCS/curdir.c,v 3.2 87/10/18 10:21:49 narten Exp $";
                     12: 
                     13: /*******************************************************************
                     14:  *      $Log:  curdir.c,v $
                     15:  * Revision 3.2  87/10/18  10:21:49  narten
                     16:  * Updating version numbers. Changes relative to 1.1 are actually 
                     17:  * relative to 3.2
                     18:  * 
                     19:  * Revision 1.1  84/01/23  14:50:01  kcs
                     20:  * Initial revision
                     21:  * 
                     22:  * Revision 3.2  82/12/24  15:41:51  wft
                     23:  * Changed curdir() such that it returns a pointer to the pathname of
                     24:  * the current working directory, just as Berkeley's getcwd().
                     25:  * 
                     26:  * Revision 3.1  82/10/18  21:16:21  wft
                     27:  * curdir() now uses stdio buffering for directory reads,
                     28:  * returns to working directory after done, and closes the directories.
                     29:  * A testprogram was also added.
                     30:  * 
                     31:  *******************************************************************/
                     32:  
                     33: 
                     34: #include        "rcsbase.h"
                     35: #include        <sys/param.h>
                     36: #include        <sys/stat.h>
                     37: #include        <sys/dir.h>
                     38: #define dot     "."
                     39: #define dotdot  ".."
                     40: 
                     41: 
                     42: static char cwd[NCPPN];
                     43: 
                     44: char * curdir()
                     45: /* Function: places the pathname of the current directory into cwd
                     46:  * and returns a pointer to it. Returns NULL on failure.
                     47:  */
                     48: {
                     49:         FILE    *file;
                     50:         struct  stat    d, dd;
                     51:         struct  direct  dir;
                     52: 
                     53:         int rdev, rino;
                     54:         int off;
                     55:         register i,j;
                     56: 
                     57:         cwd[off= 0] = '/';
                     58:         cwd[1] = '\0';
                     59:         stat("/", &d);
                     60:         rdev = d.st_dev;
                     61:         rino = d.st_ino;
                     62:         for (;;) {
                     63:                 if (stat(dot, &d)<0) return NULL;
                     64:                 if (d.st_ino==rino && d.st_dev==rdev) {
                     65:                         if (cwd[off] == '/') cwd[off] = '\0';
                     66:                         chdir(cwd); /*change back to current directory*/
                     67:                         return cwd;
                     68:                 }
                     69:                 if ((file = fopen(dotdot,"r")) == NULL) return NULL;
                     70:                 if (fstat(fileno(file), &dd)<0) goto fail;
                     71:                 chdir(dotdot);
                     72:                 if(d.st_dev == dd.st_dev) {
                     73:                         if(d.st_ino == dd.st_ino) {
                     74:                             if (cwd[off] == '/') cwd[off] = '\0';
                     75:                             chdir(cwd); /*change back to current directory*/
                     76:                             fclose(file);
                     77:                             return cwd;
                     78:                         }
                     79:                         do {
                     80:                             if (fread((char *)&dir, sizeof(dir), 1, file) !=1)
                     81:                                 goto fail;
                     82:                         } while (dir.d_ino != d.st_ino);
                     83:                 }
                     84:                 else do {
                     85:                         if(fread((char *)&dir, sizeof(dir), 1, file) != 1) {
                     86:                             goto fail;
                     87:                         }
                     88:                         stat(dir.d_name, &dd);
                     89:                 } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
                     90:                 fclose(file);
                     91: 
                     92:                 /* concatenate file name */
                     93:                 i = -1;
                     94:                 while (dir.d_name[++i] != 0);
                     95:                 for(j=off+1; j>0; --j)
                     96:                         cwd[j+i+1] = cwd[j];
                     97:                 off=i+off+1;
                     98:                 cwd[i+1] = '/';
                     99:                 for(--i; i>=0; --i)
                    100:                         cwd[i+1] = dir.d_name[i];
                    101:         } /* end for */
                    102: 
                    103: fail:   fclose(file);
                    104:         return NULL;
                    105: }
                    106: 
                    107: 
                    108: #ifdef TEST
                    109: main ()
                    110: {
                    111:         printf ("pwd = %s\n", curdir());
                    112: }
                    113: #endif TEST
                    114: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.