|
|
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.