Annotation of researchv9/libc/gen/getwd.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * getwd() returns the pathname of the current working directory. On error
        !             3:  * an error message is copied to pathname and null pointer is returned.
        !             4:  */
        !             5: #include <sys/param.h>
        !             6: #include <sys/stat.h>
        !             7: #include <ndir.h>
        !             8: 
        !             9: #define CURDIR         "."
        !            10: #define GETWDERR(s)    strcpy(pathname, (s));
        !            11: #define PARENTDIR      ".."
        !            12: #define PATHSEP                "/"
        !            13: #define ROOTDIR                "/"
        !            14: #define        MAXPATHLEN      512
        !            15: 
        !            16: char *strcpy();
        !            17: static int pathsize;                   /* pathname length */
        !            18: 
        !            19: char *
        !            20: getwd(pathname)
        !            21:        char *pathname;
        !            22: {
        !            23:        char pathbuf[MAXPATHLEN];               /* temporary pathname buffer */
        !            24:        char *pnptr = &pathbuf[(sizeof pathbuf)-1]; /* pathname pointer */
        !            25:        char *prepend();                /* prepend dirname to pathname */
        !            26:        dev_t rdev;                     /* root device number */
        !            27:        DIR *dirp;                      /* directory stream */
        !            28:        ino_t rino;                     /* root inode number */
        !            29:        struct direct *dir;             /* directory entry struct */
        !            30:        struct stat d ,dd;              /* file status struct */
        !            31: 
        !            32:        pathsize = 0;
        !            33:        *pnptr = '\0';
        !            34:        stat(ROOTDIR, &d);
        !            35:        rdev = d.st_dev;
        !            36:        rino = d.st_ino;
        !            37:        for (;;) {
        !            38:                stat(CURDIR, &d);
        !            39:                if (d.st_ino == rino && d.st_dev == rdev)
        !            40:                        break;          /* reached root directory */
        !            41:                if ((dirp = opendir(PARENTDIR)) == NULL) {
        !            42:                        GETWDERR("getwd: can't open ..");
        !            43:                        goto fail;
        !            44:                }
        !            45:                if (chdir(PARENTDIR) < 0) {
        !            46:                        GETWDERR("getwd: can't chdir to ..");
        !            47:                        goto fail;
        !            48:                }
        !            49:                fstat(dirp->dd_fd, &dd);
        !            50:                if (d.st_dev == dd.st_dev) {
        !            51:                        if (d.st_ino == dd.st_ino) {
        !            52:                                /* reached root directory */
        !            53:                                closedir(dirp);
        !            54:                                break;
        !            55:                        }
        !            56:                        do {
        !            57:                                if ((dir = readdir(dirp)) == NULL) {
        !            58:                                        closedir(dirp);
        !            59:                                        GETWDERR("getwd: read error in ..");
        !            60:                                        goto fail;
        !            61:                                }
        !            62:                        } while (dir->d_ino != d.st_ino);
        !            63:                } else
        !            64:                        do {
        !            65:                                if((dir = readdir(dirp)) == NULL) {
        !            66:                                        closedir(dirp);
        !            67:                                        GETWDERR("getwd: read error in ..");
        !            68:                                        goto fail;
        !            69:                                }
        !            70:                                stat(dir->d_name, &dd);
        !            71:                        } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
        !            72:                closedir(dirp);
        !            73:                pnptr = prepend(PATHSEP, prepend(dir->d_name, pnptr));
        !            74:        }
        !            75:        if (*pnptr == '\0')             /* current dir == root dir */
        !            76:                strcpy(pathname, ROOTDIR);
        !            77:        else {
        !            78:                strcpy(pathname, pnptr);
        !            79:                if (chdir(pnptr) < 0) {
        !            80:                        GETWDERR("getwd: can't change back to .");
        !            81:                        return (NULL);
        !            82:                }
        !            83:        }
        !            84:        return (pathname);
        !            85: 
        !            86: fail:
        !            87:        chdir(prepend(CURDIR, pnptr));
        !            88:        return (NULL);
        !            89: }
        !            90: 
        !            91: /*
        !            92:  * prepend() tacks a directory name onto the front of a pathname.
        !            93:  */
        !            94: static char *
        !            95: prepend(dirname, pathname)
        !            96:        register char *dirname;
        !            97:        register char *pathname;
        !            98: {
        !            99:        register int i;                 /* directory name size counter */
        !           100: 
        !           101:        for (i = 0; *dirname != '\0'; i++, dirname++)
        !           102:                continue;
        !           103:        if ((pathsize += i) < MAXPATHLEN)
        !           104:                while (i-- > 0)
        !           105:                        *--pathname = *--dirname;
        !           106:        return (pathname);
        !           107: }
        !           108: 
        !           109: char *
        !           110: getcwd(buf, size)
        !           111: register char *buf;
        !           112: {
        !           113:        if (buf == (char *)NULL) {
        !           114:                buf = (char *)malloc(size);
        !           115:                if (buf == (char *)NULL)
        !           116:                        return(buf);
        !           117:        }
        !           118:        return (getwd(buf));
        !           119: }

unix.superglobalmegacorp.com

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