Annotation of researchv10no/dk/cmd/pupu/curdir.c, revision 1.1.1.1

1.1       root        1: static char Sccsid[]="@(#)curdir.c     3.4";
                      2: 
                      3: # define       IROOT   2
                      4: # include      "sys/types.h"
                      5: # include      "macros.h"
                      6: 
                      7: #include <stdio.h>
                      8: #include "sys/param.h"
                      9: #include <mtab.h>
                     10: #include "sys/dir.h"
                     11: #include "sys/filsys.h"
                     12: /*
                     13:        current directory.
                     14:        Places the full pathname of the current directory in `str'.
                     15:        Handles file systems not mounted on a root directory
                     16:        via /etc/mtab (see mtab(V)).
                     17:        NOTE: PWB systems don't use mtab(V), but they don't mount
                     18:        file systems anywhere but on a root directory (so far, at least).
                     19: 
                     20:        returns 0 on success
                     21:        < 0 on failure.
                     22: 
                     23:        Current directory on return:
                     24:                success: same as on entry
                     25:                failure: UNKNOWN!
                     26: */
                     27: static char *curdirp;
                     28: 
                     29: static char    *flg[] = {
                     30:        "read/write",
                     31:        "read only"
                     32:        };
                     33: 
                     34: static struct mtab mtab[NMOUNT], *mp;
                     35: static struct filsys super;
                     36: 
                     37: 
                     38: curdir(str)
                     39: char *str;
                     40: {
                     41:        register int n;
                     42: 
                     43:        curdirp = str;
                     44:        n = findir(0);
                     45:        return(n+chdir(str));
                     46: }
                     47: 
                     48: 
                     49: # define ADDSLASH      if (flag) *curdirp++ = '/';
                     50: # define QUIT          { close(fd); return(-1); }
                     51: 
                     52: findir(flag)
                     53: {
                     54:        register int fd,inum;
                     55:        register char *tp;
                     56:        char *slashp,tmp[100];
                     57:        int dev, r;
                     58:        struct direct entry;
                     59:        struct stat s;
                     60: 
                     61:        if (stat(".",&s)<0) return(-1);
                     62:        if ((inum = s.st_ino) == IROOT) {
                     63:                dev = s.st_dev;
                     64:                if ((fd = open("/",0))<0) return(-1);
                     65:                if (fstat(fd,&s)<0)
                     66:                        QUIT;
                     67:                if (dev == s.st_dev) {
                     68:                        *curdirp++ = '/';
                     69:                        *curdirp = 0;
                     70:                        close(fd);
                     71:                        return(0);
                     72:                }
                     73:                slashp = entry.d_name;
                     74:                slashp--;
                     75:                while (read(fd,&entry,sizeof(entry)) == sizeof(entry)) {
                     76:                        if (entry.d_ino == 0) continue;
                     77:                        *slashp = '/';
                     78:                        if (stat(slashp,&s)<0) continue;
                     79:                        if (s.st_dev != dev) continue;
                     80:                        if ((s.st_mode&S_IFMT) != S_IFDIR) continue;
                     81:                        for (tp = slashp; *curdirp = (*tp++); curdirp++);
                     82:                        ADDSLASH;
                     83:                        *curdirp = 0;
                     84:                        close(fd);
                     85:                        return(0);
                     86:                }
                     87:                close(fd);
                     88: 
                     89:                fd = open("/etc/mtab",0);
                     90:                if(fd < 0) {
                     91:                        fprintf(stderr, "curdir: cannot open /etc/mtab!\n");
                     92:                        return(-1);
                     93:                }
                     94:                read(fd, mtab, sizeof mtab);
                     95:                for(mp = mtab; mp < &mtab[NMOUNT]; mp++) {
                     96:                        if(mp->m_dname[0]) {
                     97:                                sprintf(tmp,"/dev/%s",mp->m_dname);
                     98:                                if ( stat(tmp,&s) < 0 )
                     99:                                        QUIT;
                    100:                                if ( s.st_rdev != dev ) continue;
                    101:                                for ( tp = mp->m_path; *curdirp = (*tp++); curdirp++ );
                    102:                                ADDSLASH;
                    103:                                close(fd);
                    104:        /*  test print
                    105:                                printf("%.10s on /dev/%s %s on %s",
                    106:                                mp->m_path, mp->m_dname);
                    107:        end test print */
                    108:                                return(0);
                    109:                        }
                    110:                }
                    111:        
                    112:                QUIT;
                    113:        }
                    114:        if ((fd = open("..",0))<0) return(-1);
                    115:        for (entry.d_ino = 0; entry.d_ino != inum; )
                    116:                if (read(fd,&entry,sizeof(entry)) != sizeof(entry))
                    117:                        QUIT;
                    118:        close(fd);
                    119:        if (chdir("..")<0) return(-1);
                    120:        if (findir(-1)<0) r = -1;
                    121:        else r = 0;
                    122:        for (tp = entry.d_name; *curdirp = (*tp++); curdirp++);
                    123:        ADDSLASH;
                    124:        *curdirp = 0;
                    125:        return(r);
                    126: }

unix.superglobalmegacorp.com

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