1*2491Sdlw /* 2*2491Sdlw char id_endfile[] = "@(#)endfile.c 1.1"; 3*2491Sdlw * 4*2491Sdlw * endfile 5*2491Sdlw */ 6*2491Sdlw 7*2491Sdlw #include "fio.h" 8*2491Sdlw 9*2491Sdlw char *endf = "endfile"; 10*2491Sdlw extern char *tmplate; 11*2491Sdlw 12*2491Sdlw f_end(a) alist *a; 13*2491Sdlw { 14*2491Sdlw unit *b; 15*2491Sdlw lfname = NULL; 16*2491Sdlw elist = NO; 17*2491Sdlw errflag = a->aerr; 18*2491Sdlw lunit = a->aunit; 19*2491Sdlw if (not_legal(lunit)) err(errflag,101,endf) 20*2491Sdlw b = &units[lunit]; 21*2491Sdlw if(!b->ufd) err(errflag,114,endf) 22*2491Sdlw if(b->uend) return(0); 23*2491Sdlw lfname = b->ufnm; 24*2491Sdlw b->uend = YES; 25*2491Sdlw return(t_runc(b,errflag)); 26*2491Sdlw } 27*2491Sdlw 28*2491Sdlw t_runc(b,flag) unit *b; ioflag flag; 29*2491Sdlw { 30*2491Sdlw char buf[128],nm[16]; 31*2491Sdlw FILE *tmp; 32*2491Sdlw int n,m; 33*2491Sdlw long loc,len; 34*2491Sdlw fflush(b->ufd); 35*2491Sdlw if(b->uwrt) nowreading(b); 36*2491Sdlw if(b->url || !b->useek || !b->ufnm) return(OK); /*don't trunc dir files*/ 37*2491Sdlw loc=ftell(b->ufd); 38*2491Sdlw fseek(b->ufd,0L,2); 39*2491Sdlw len=ftell(b->ufd); 40*2491Sdlw if (loc==len) return(OK); 41*2491Sdlw strcpy(nm,tmplate); 42*2491Sdlw mktemp(nm); 43*2491Sdlw if(!(tmp=fopen(nm,"w"))) err(flag,errno,endf); 44*2491Sdlw fseek(b->ufd,0L,0); 45*2491Sdlw while (loc) 46*2491Sdlw { 47*2491Sdlw n=fread(buf,1,loc>sizeof(buf)?sizeof(buf):(int)loc,b->ufd); 48*2491Sdlw loc -= n; 49*2491Sdlw fwrite(buf,1,n,tmp); 50*2491Sdlw } 51*2491Sdlw fflush(tmp); 52*2491Sdlw for(n=0;n<10;n++) 53*2491Sdlw { 54*2491Sdlw if((m=fork())==-1) continue; 55*2491Sdlw else if(m==0) 56*2491Sdlw { 57*2491Sdlw execl("/bin/cp","cp",nm,b->ufnm,0); 58*2491Sdlw execl("/usr/bin/cp","cp",nm,b->ufnm,0); 59*2491Sdlw fatal(119,"no cp for trunc"); 60*2491Sdlw } 61*2491Sdlw wait(&m); 62*2491Sdlw if(m) err(flag,111,endf); 63*2491Sdlw fclose(tmp); 64*2491Sdlw unlink(nm); 65*2491Sdlw return(OK); 66*2491Sdlw } 67*2491Sdlw err(flag,111,endf); 68*2491Sdlw } 69