Annotation of 43BSDTahoe/new/rcs/src/curdir.c, revision 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.