Annotation of coherent/b/lib/libc/gen/getwd.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * libc/gen/getwd.c
                      3:  * Return a static string containing the current
                      4:  * working directory for this process.
                      5:  * The arguments to this function are NOT compatible with
                      6:  * the BSD function getwd(), so it is now called _getwd().
                      7:  * Warning: this call may change the current directory
                      8:  * of the process if for any reason it fails.
                      9:  */
                     10: 
                     11: #include <stddef.h>
                     12: #include <errno.h>
                     13: #include <sys/stat.h>
                     14: #include <dirent.h>
                     15: 
                     16: #define        MAXNAME 400             /* Longest pathname */
                     17: 
                     18: static int     oerrno;
                     19: 
                     20: static
                     21: char *
                     22: fail()
                     23: {
                     24:        if (errno == 0)
                     25:                errno = oerrno;         /* preserve previous errno */
                     26:        return NULL;
                     27: }
                     28: 
                     29: char *
                     30: _getwd()
                     31: {
                     32:        struct stat d, dd;
                     33:        static char fnbuf[MAXNAME];
                     34:        register char *cp, *dp;
                     35:        register dev_t rdev;
                     36:        register ino_t rino;
                     37:        DIR           * dirp;
                     38:        struct dirent * direntp;
                     39: 
                     40:        oerrno = errno;                 /* save old errno */
                     41:        errno = 0;
                     42:        dp = fnbuf + MAXNAME - 1;
                     43:        * dp = '\0';
                     44:        if (stat ("/", & d) < 0)
                     45:                return fail ();
                     46:        rdev = d.st_dev;
                     47:        rino = d.st_ino;
                     48:        while (stat( ".", & d) >= 0 && (d.st_ino!=rino || d.st_dev!=rdev)) {
                     49:                if (stat ("..", & dd) < 0 || chdir ("..") < 0)
                     50:                        return fail ();
                     51:                if ((dirp = opendir (".")) == NULL)
                     52:                        return fail ();
                     53:                if (d.st_dev == dd.st_dev) {
                     54:                        if (d.st_ino == dd.st_ino) {
                     55:                                closedir (dirp);
                     56:                                break;
                     57:                        }
                     58:                        do {
                     59:                                if ((direntp = readdir (dirp)) == NULL) {
                     60:                                        closedir (dirp);
                     61:                                        return fail ();
                     62:                                }
                     63:                        } while (direntp->d_ino != d.st_ino);
                     64:                } else
                     65:                        do {
                     66:                                if ((direntp = readdir (dirp)) == NULL) {
                     67:                                        closedir (dirp);
                     68:                                        return fail ();
                     69:                                }
                     70:                                if (direntp->d_ino != 0 &&
                     71:                                    stat (direntp->d_name, & dd) < 0) {
                     72:                                        closedir (dirp);
                     73:                                        return fail ();
                     74:                                }
                     75:                        } while (dd.st_ino != d.st_ino ||
                     76:                                 dd.st_dev != d.st_dev);
                     77: 
                     78:                for (cp = direntp->d_name ; * cp != '\0' ; cp ++)
                     79:                        /* DO NOTHING */ ;
                     80: 
                     81:                while (cp > direntp->d_name) {
                     82:                        if (dp <= fnbuf) {
                     83:                                closedir (dirp);
                     84:                                return fail ();
                     85:                        }
                     86:                        * -- dp = * -- cp;
                     87:                }
                     88:                closedir (dirp);
                     89: 
                     90:                * -- dp = '/';
                     91:        }
                     92:        if (errno)
                     93:                return NULL;
                     94:        if (* dp != '/')
                     95:                * -- dp = '/';
                     96:        if (chdir (dp) < 0)
                     97:                return fail ();
                     98:        errno = oerrno;
                     99:        return dp;
                    100: }
                    101: 
                    102: /* end of libc/gen/getwd.c */

unix.superglobalmegacorp.com

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