BSD 4_1c_2 release
[unix-history] / usr / src / usr.lib / libI77 / endfile.c
/*
char id_endfile[] = "@(#)endfile.c 1.2";
*
* endfile
*/
#include "fio.h"
char *endf = "endfile";
extern char *tmplate;
f_end(a) alist *a;
{
unit *b;
lfname = NULL;
elist = NO;
errflag = a->aerr;
lunit = a->aunit;
if (not_legal(lunit)) err(errflag,F_ERUNIT,endf)
b = &units[lunit];
if(!b->ufd) err(errflag,F_ERNOPEN,endf)
if(b->uend) return(0);
lfname = b->ufnm;
b->uend = YES;
return(t_runc(b,errflag));
}
t_runc(b,flag) unit *b; ioflag flag;
{
char buf[128],nm[16];
FILE *tmp;
int n,m;
long loc,len;
fflush(b->ufd);
if(b->uwrt) nowreading(b);
if(b->url || !b->useek || !b->ufnm) return(OK); /*don't trunc dir files*/
loc=ftell(b->ufd);
fseek(b->ufd,0L,2);
len=ftell(b->ufd);
if (loc==len) return(OK);
strcpy(nm,tmplate);
mktemp(nm);
if(!(tmp=fopen(nm,"w"))) err(flag,errno,endf);
fseek(b->ufd,0L,0);
while (loc)
{
n=fread(buf,1,loc>sizeof(buf)?sizeof(buf):(int)loc,b->ufd);
loc -= n;
fwrite(buf,1,n,tmp);
}
fflush(tmp);
for(n=0;n<10;n++)
{
if((m=fork())==-1) continue;
else if(m==0)
{
execl("/bin/cp","cp",nm,b->ufnm,0);
execl("/usr/bin/cp","cp",nm,b->ufnm,0);
fatal(F_ERSYS,"no cp for trunc");
}
wait(&m);
if(m) err(flag,F_ERTRUNC,endf);
fclose(tmp);
unlink(nm);
return(OK);
}
err(flag,F_ERTRUNC,endf);
}