1 /*-
2 * Copyright (c) 1980 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)due.c 5.3 (Berkeley) 04/12/91";
10 #endif /* not lint */
11
12 /*
13 * direct unformatted external i/o
14 */
15
16 #include "fio.h"
17
18 LOCAL char rdue[] = "read due";
19 LOCAL char wdue[] = "write due";
20
s_rdue(a)21 s_rdue(a) cilist *a;
22 {
23 int n;
24 reading = YES;
25 if(n=c_due(a,READ)) return(n);
26 if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rdue);
27 return(OK);
28 }
29
s_wdue(a)30 s_wdue(a) cilist *a;
31 {
32 int n;
33 reading = NO;
34 if(n=c_due(a,WRITE)) return(n);
35 curunit->uend = NO;
36 if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wdue)
37 return(OK);
38 }
39
40 LOCAL
c_due(a,flg)41 c_due(a,flg) cilist *a;
42 { int n;
43 lfname = NULL;
44 elist = NO;
45 sequential=formatted=NO;
46 recpos = reclen = 0;
47 external = YES;
48 errflag = a->cierr;
49 endflag = a->ciend;
50 lunit = a->ciunit;
51 if(not_legal(lunit)) err(errflag,F_ERUNIT,rdue+5);
52 curunit = &units[lunit];
53 if (!curunit->ufd && (n=fk_open(flg,DIR,UNF,(ftnint)lunit)) )
54 err(errflag,n,rdue+5)
55 cf = curunit->ufd;
56 elist = YES;
57 lfname = curunit->ufnm;
58 if (curunit->ufmt) err(errflag,F_ERNOUIO,rdue+5)
59 if (!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,rdue+5)
60 if (fseek(cf, (long)((a->cirec-1)*curunit->url), 0) < 0)
61 return(due_err(rdue+5));
62 else
63 return(OK);
64 }
65
e_rdue()66 e_rdue()
67 {
68 return(OK);
69 }
70
e_wdue()71 e_wdue()
72 {/* This is to ensure full records. It is really necessary. */
73 int n = 0;
74 if (curunit->url!=1 && recpos!=curunit->url &&
75 (fseek(cf, (long)(curunit->url-recpos-1), 1) < 0
76 || fwrite(&n, 1, 1, cf) != 1))
77 return(due_err(rdue+5));
78 return(OK);
79 }
80