Annotation of coherent/d/lib/libc/gen/getwd.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Return a static string containing the current
        !             3:  * working directory for this process.
        !             4:  * (Warning: this call may change the current directory
        !             5:  * of the process if for any reason it fails.)
        !             6:  */
        !             7: 
        !             8: #include <stdio.h>
        !             9: #include <sys/types.h>
        !            10: #include <sys/stat.h>
        !            11: #include <sys/dir.h>
        !            12: #include <canon.h>
        !            13: 
        !            14: #define        MAXNAME 400             /* Longest pathname */
        !            15: 
        !            16: extern int     errno;
        !            17: static int     oerrno;
        !            18: 
        !            19: static
        !            20: char *
        !            21: fail()
        !            22: {
        !            23:        if (errno == 0)
        !            24:                errno = oerrno;         /* preserve previous errno */
        !            25:        return NULL;
        !            26: }
        !            27: 
        !            28: char *
        !            29: getwd()
        !            30: {
        !            31:        struct stat d, dd;
        !            32:        struct direct dir;
        !            33:        static char fnbuf[MAXNAME];
        !            34:        register char *cp, *dp;
        !            35:        register int file;
        !            36:        register dev_t rdev;
        !            37:        register ino_t rino;
        !            38: 
        !            39:        oerrno = errno;                 /* save old errno */
        !            40:        errno = 0;
        !            41:        dp = fnbuf+MAXNAME-1;
        !            42:        *dp = '\0';
        !            43:        if (stat("/", &d) < 0)
        !            44:                return fail();
        !            45:        rdev = d.st_dev;
        !            46:        rino = d.st_ino;
        !            47:        while (stat(".", &d)>=0 && (d.st_ino!=rino || d.st_dev!=rdev)) {
        !            48:                if ((file = open("..", 0)) < 0)
        !            49:                        return fail();
        !            50:                if (fstat(file, &dd)<0 || chdir("..")<0) {
        !            51:                        close(file);
        !            52:                        return fail();
        !            53:                }
        !            54:                if (d.st_dev == dd.st_dev) {
        !            55:                        if (d.st_ino == dd.st_ino) {
        !            56:                                close(file);
        !            57:                                break;
        !            58:                        }
        !            59:                        do {
        !            60:                                if (read(file, (char *)&dir, sizeof (dir))
        !            61:                                    != sizeof (dir)) {
        !            62:                                        close(file);
        !            63:                                        return fail();
        !            64:                                }
        !            65:                                canino(dir.d_ino);
        !            66:                        } while (dir.d_ino != d.st_ino);
        !            67:                } else
        !            68:                        do {
        !            69:                                if (read(file, (char *)&dir, sizeof (dir))
        !            70:                                    != sizeof  (dir)) {
        !            71:                                        close(file);
        !            72:                                        return fail();
        !            73:                                }
        !            74:                                canino(dir.d_ino);
        !            75:                                if (dir.d_ino!=0 && stat(dir.d_name, &dd)<0) {
        !            76:                                        close(file);
        !            77:                                        return fail();
        !            78:                                }
        !            79:                        } while (dd.st_ino!=d.st_ino || dd.st_dev!=d.st_dev);
        !            80:                close(file);
        !            81:                if (dp-DIRSIZ <= fnbuf)
        !            82:                        return fail();
        !            83:                for (cp=dir.d_name; cp!=dir.d_name+DIRSIZ && *cp!='\0'; cp++)
        !            84:                        ;
        !            85:                while (cp > dir.d_name)
        !            86:                        *--dp = *--cp;
        !            87:                *--dp = '/';
        !            88:        }
        !            89:        if (errno)
        !            90:                return NULL;
        !            91:        if (*dp != '/')
        !            92:                *--dp = '/';
        !            93:        if (chdir(dp) < 0)
        !            94:                return fail();
        !            95:        errno = oerrno;
        !            96:        return dp;
        !            97: }

unix.superglobalmegacorp.com

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