home *** CD-ROM | disk | FTP | other *** search
- #include "fio.h"
- static alist *ax;
- f_end(a) alist *a;
- {
- unit *b;
- if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
- b = &units[a->aunit];
- if(b->ufd==NULL) return(0);
- b->uend=1;
- if( b->useek==0) return(0);
- ax=a;
- if(b->uwrt) nowreading(b);
- return(t_runc(b));
- }
- t_runc(b) unit *b;
- {
- char buf[128],nm[16];
- FILE *tmp;
- int n,m;
- long loc,len;
- if(b->url) return(0); /*don't truncate direct files*/
- loc=ftell(b->ufd);
- fseek(b->ufd,0L,2);
- len=ftell(b->ufd);
- if(loc==len || b->useek==0 || b->ufnm==NULL) return(0);
- strcpy(nm,"tmp.FXXXXXX");
- if(b->uwrt) nowreading(b);
- mktemp(nm);
- tmp=fopen(nm,"w");
- fseek(b->ufd,0L,0);
- for(;loc>0;)
- {
- n=fread(buf,1,loc>128?128:(int)loc,b->ufd);
- if(n>loc) n=loc;
- loc -= n;
- fwrite(buf,1,n,tmp);
- }
- fflush(tmp);
- for(n=0;n<10;n++)
- {
- if((m=fork())==-1) continue;
- else if(m==0)
- {
- execl("/bin/cp","cp",nm,b->ufnm,0);
- execl("/usr/bin/cp","cp",nm,b->ufnm,0);
- fprintf(stdout,"no cp\n");
- exit(1);
- }
- wait(&m);
- if(m!=0) err(ax->aerr,111,"endfile");
- fclose(tmp);
- unlink(nm);
- return(0);
- }
- err(ax->aerr,111,"endfile");
- }
-