|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.