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: }

Defined functions

b_char defined in line 12; used 16 times
curdir defined in line 39; used 2 times
dcat defined in line 74; used 3 times
fullpath defined in line 83; never used
g_char defined in line 6; used 4 times
inode defined in line 17; used 3 times
mvgbt defined in line 25; used 2 times

Defined macros

DIRSIZE defined in line 5; never used
DONE defined in line 22; never used
INTBOUND defined in line 23; used 3 times
  • in line 27(3)
register defined in line 24; never used
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 649
Valid CSS Valid XHTML 1.0 Strict