83 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "f2c.h"
 | |
| #include "fio.h"
 | |
| #include "sys/types.h"
 | |
| #include "fcntl.h"
 | |
| #ifndef O_RDONLY
 | |
| #define O_RDONLY 0
 | |
| #endif
 | |
| 
 | |
| extern char *mktemp(), *strcpy();
 | |
| 
 | |
| integer f_end(a) alist *a;
 | |
| {
 | |
| 	unit *b;
 | |
| 	if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
 | |
| 	b = &units[a->aunit];
 | |
| 	if(b->ufd==NULL) {
 | |
| 		char nbuf[10];
 | |
| 		(void) sprintf(nbuf,"fort.%ld",a->aunit);
 | |
| 		close(creat(nbuf, 0666));
 | |
| 		return(0);
 | |
| 		}
 | |
| 	b->uend=1;
 | |
| 	return(b->useek ? t_runc(a) : 0);
 | |
| }
 | |
| 
 | |
|  static int
 | |
| copy(from, len, to)
 | |
|  char *from, *to;
 | |
|  register long len;
 | |
| {
 | |
| 	register int n;
 | |
| 	int k, rc = 0, tmp;
 | |
| 	char buf[BUFSIZ];
 | |
| 
 | |
| 	if ((k = open(from, O_RDONLY)) < 0)
 | |
| 		return 1;
 | |
| 	if ((tmp = creat(to,0666)) < 0)
 | |
| 		return 1;
 | |
| 	while((n = read(k, buf, len > BUFSIZ ? BUFSIZ : (int)len)) > 0) {
 | |
| 		if (write(tmp, buf, n) != n)
 | |
| 			{ rc = 1; break; }
 | |
| 		if ((len -= n) <= 0)
 | |
| 			break;
 | |
| 		}
 | |
| 	close(k);
 | |
| 	close(tmp);
 | |
| 	return n < 0 ? 1 : rc;
 | |
| 	}
 | |
| 
 | |
| t_runc(a) alist *a;
 | |
| {
 | |
| 	char nm[16];
 | |
| 	long loc, len;
 | |
| 	unit *b;
 | |
| 	int rc = 0;
 | |
| 
 | |
| 	b = &units[a->aunit];
 | |
| 	if(b->url) return(0);	/*don't truncate direct files*/
 | |
| 	loc=ftell(b->ufd);
 | |
| 	(void) fseek(b->ufd,0L,SEEK_END);
 | |
| 	len=ftell(b->ufd);
 | |
| 	if (loc >= len || b->useek == 0 || b->ufnm == NULL)
 | |
| 		return(0);
 | |
| 	rewind(b->ufd);	/* empty buffer */
 | |
| 	if (!loc) {
 | |
| 		if (close(creat(b->ufnm,0666)))
 | |
| 			{ rc = 1; goto done; }
 | |
| 		if (b->uwrt)
 | |
| 			b->uwrt = 1;
 | |
| 		return 0;
 | |
| 		}
 | |
| 	(void) strcpy(nm,"tmp.FXXXXXX");
 | |
| 	(void) mktemp(nm);
 | |
| 	if (copy(b->ufnm, loc, nm)
 | |
| 	 || copy(nm, loc, b->ufnm))
 | |
| 		rc = 1;
 | |
| 	unlink(nm);
 | |
| done:
 | |
| 	fseek(b->ufd, loc, SEEK_SET);
 | |
| 	if (rc)
 | |
| 		err(a->aerr,111,"endfile");
 | |
| 	return 0;
 | |
| 	}
 |