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