Commit | Line | Data |
---|---|---|
cf9cb894 | 1 | /* |
4b9ccde7 | 2 | char id_endfile[] = "@(#)endfile.c 1.2"; |
cf9cb894 DW |
3 | * |
4 | * endfile | |
5 | */ | |
6 | ||
7 | #include "fio.h" | |
8 | ||
55162a5a | 9 | char *endf = "endfile"; |
cf9cb894 DW |
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; | |
43666f58 | 19 | if (not_legal(lunit)) err(errflag,F_ERUNIT,endf) |
cf9cb894 | 20 | b = &units[lunit]; |
43666f58 | 21 | if(!b->ufd) err(errflag,F_ERNOPEN,endf) |
cf9cb894 DW |
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); | |
55162a5a | 35 | if(b->uwrt) nowreading(b); |
cf9cb894 DW |
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); | |
55162a5a | 40 | if (loc==len) return(OK); |
cf9cb894 DW |
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); | |
43666f58 | 59 | fatal(F_ERSYS,"no cp for trunc"); |
cf9cb894 DW |
60 | } |
61 | wait(&m); | |
43666f58 | 62 | if(m) err(flag,F_ERTRUNC,endf); |
cf9cb894 DW |
63 | fclose(tmp); |
64 | unlink(nm); | |
65 | return(OK); | |
66 | } | |
43666f58 | 67 | err(flag,F_ERTRUNC,endf); |
cf9cb894 | 68 | } |