xref: /csrg-svn/usr.bin/f77/libI77/endfile.c (revision 2491)
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