Annotation of 3BSD/libI77/util.c, revision 1.1

1.1     ! root        1: #include <sys/types.h>
        !             2: #include <sys/stat.h>
        !             3: #include <sys/dir.h>
        !             4: #include "fio.h"
        !             5: #define DIRSIZE        14
        !             6: g_char(a,alen,b) char *a,*b; ftnlen alen;
        !             7: {      char *x=a+alen-1,*y=b+alen-1;
        !             8:        *(y+1)=0;
        !             9:        for(;x>=a && *x==' ';x--) *y--=0;
        !            10:        for(;x>=a;*y--= *x--);
        !            11: }
        !            12: b_char(a,b,blen) char *a,*b; ftnlen blen;
        !            13: {      int i;
        !            14:        for(i=0;i<blen && *a!=0;i++) *b++= *a++;
        !            15:        for(;i<blen;i++) *b++=' ';
        !            16: }
        !            17: inode(a) char *a;
        !            18: {      struct stat x;
        !            19:        if(stat(a,&x)<0) return(-1);
        !            20:        return(x.st_ino);
        !            21: }
        !            22: #define DONE {*bufpos++=0; close(file); return;}
        !            23: #define INTBOUND sizeof(int)-1
        !            24: #define register 
        !            25: mvgbt(n,len,a,b) char *a,*b;
        !            26: {      register int num=n*len;
        !            27:        if( ((int)a&INTBOUND)==0 && ((int)b&INTBOUND)==0 && (num&INTBOUND)==0 )
        !            28:        {       register int *x=(int *)a,*y=(int *)b;
        !            29:                num /= sizeof(int);
        !            30:                if(x>y) for(;num>0;num--) *y++= *x++;
        !            31:                else for(num--;num>=0;num--) *(y+num)= *(x+num);
        !            32:        }
        !            33:        else
        !            34:        {       register char *x=a,*y=b;
        !            35:                if(x>y) for(;num>0;num--) *y++= *x++;
        !            36:                else for(num--;num>=0;num--) *(y+num)= *(x+num);
        !            37:        }
        !            38: }
        !            39: char *curdir()
        !            40: {      char name[256],*bufpos = name;
        !            41:        struct stat x;
        !            42:        struct direct y;
        !            43:        int file,i;
        !            44:        *bufpos++ = 0;
        !            45: loop:  stat(".",&x);
        !            46:        if((file=open("..",0))<0) goto done;
        !            47:        do
        !            48:        {       if(read(file,&y,sizeof(y))<sizeof(y)) goto done;
        !            49:        } while(y.d_ino!=x.st_ino);
        !            50:        close(file);
        !            51:        if(y.d_ino!=2)
        !            52:        {       dcat(name,y.d_name);
        !            53:                chdir("..");
        !            54:                goto loop;
        !            55:        }
        !            56:        if(stat(y.d_name,&x)<0 || chdir("/")<0
        !            57:                || (file=open("/",0))<0) goto done;
        !            58:        i=x.st_dev;
        !            59:        do
        !            60:        {       if(read(file,&y,sizeof(y))<sizeof(y)) goto done;
        !            61:                if(y.d_ino==0) continue;
        !            62:                if(stat(y.d_name,&x)<0) goto done;
        !            63:        } while(x.st_dev!=i || (x.st_mode&S_IFMT)!=S_IFDIR);
        !            64:        if(strcmp(".",y.d_name) || strcmp("..",y.d_name))
        !            65:                dcat(name,y.d_name);
        !            66:        dcat(name,"/");
        !            67: done:
        !            68:        bufpos=calloc(strlen(name)+1,1);
        !            69:        strcpy(bufpos,name);
        !            70:        chdir(name);
        !            71:        close(file);
        !            72:        return(bufpos);
        !            73: }
        !            74: dcat(a,b) char *a,*b;
        !            75: {
        !            76:        int i,j;
        !            77:        i=strlen(b);
        !            78:        j=strlen(a);
        !            79:        mvgbt(1,j+1,a,a+i+1);
        !            80:        mvgbt(1,i,b,a);
        !            81:        a[i]='/';
        !            82: }
        !            83: fullpath(a,b,errflag) char *a,*b;
        !            84: {
        !            85:        char *a1,*a2,*npart,*dpart,*p;
        !            86:        a1=curdir();
        !            87:        npart=NULL;
        !            88:        for(p=a;*p!=0;p++)
        !            89:                if(*p=='/') npart=p;
        !            90:        if(npart==NULL)
        !            91:        {       dpart=NULL;
        !            92:                npart=a;
        !            93:        }
        !            94:        else
        !            95:        {       dpart=a;
        !            96:                *npart++ = 0;
        !            97:        }
        !            98:        if(dpart!=NULL)
        !            99:        {       chdir(dpart);
        !           100:                a2=curdir();
        !           101:                strcpy(b,a2);
        !           102:        }
        !           103:        else
        !           104:        {       a2=NULL;
        !           105:                strcpy(b, a1);
        !           106:        }
        !           107:        strcat(b,npart);
        !           108:        chdir(a1);
        !           109:        if(a1!=NULL)
        !           110:        {       free(a1);
        !           111:                a1=NULL;
        !           112:        }
        !           113:        if(a2!=NULL)
        !           114:        {       free(a2);
        !           115:        }
        !           116:        return(0);
        !           117: }

unix.superglobalmegacorp.com

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