|
|
1.1 root 1: #include "sys/types.h"
2: #include "sys/stat.h"
3: #include "fio.h"
4: extern char *mktemp(), *malloc(), *strcpy();
5: f_open(a) olist *a;
6: { unit *b;
7: int n;
8: char buf[256];
9: cllist x;
10: if(a->ounit>=MXUNIT || a->ounit<0)
11: err(a->oerr,101,"open")
12: b= &units[a->ounit];
13: if(b->ufd!=0) goto connected;
14: unconnected:
15: b->url=a->orl;
16: if(a->oblnk && *a->oblnk=='b') b->ublnk=1;
17: else b->ublnk=0;
18: if(a->ofm==0)
19: { if(b->url>0) b->ufmt=0;
20: else b->ufmt=1;
21: }
22: else if(*a->ofm=='f') b->ufmt=1;
23: else b->ufmt=0;
24: if(a->osta==0) goto unknown;
25: switch(*a->osta)
26: {
27: unknown:
28: default:
29: case 'o':
30: if(a->ofnm==0) err(a->oerr,107,"open")
31: g_char(a->ofnm,a->ofnmlen,buf);
32: b->uscrtch=0;
33: if(a->osta == 0)
34: goto done;
35: if(*a->osta=='o' && access(buf,0))
36: err(a->oerr,errno,"open")
37: done:
38: b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
39: if(b->ufnm==NULL) err(a->oerr,113,"no space");
40: (void) strcpy(b->ufnm,buf);
41: b->uend=0;
42: if(isdev(buf))
43: { b->ufd = fopen(buf,"r");
44: if(b->ufd==NULL) err(a->oerr,errno,buf)
45: else b->uwrt = 0;
46: }
47: else
48: { b->ufd = fopen(buf, "a");
49: if(b->ufd != NULL) b->uwrt = 1;
50: else if((b->ufd = fopen(buf, "r")) != NULL)
51: { (void) fseek(b->ufd, 0L, 2);
52: b->uwrt = 0;
53: }
54: else err(a->oerr, errno, buf)
55: }
56: b->useek=canseek(b->ufd);
57: if((b->uinode=inode(buf))==-1)
58: err(a->oerr,108,"open")
59: if(a->orl && b->useek) rewind(b->ufd);
60: return(0);
61: case 's':
62: b->uscrtch=1;
63: (void) strcpy(buf,"tmp.FXXXXXX");
64: (void) mktemp(buf);
65: goto done;
66: case 'n':
67: b->uscrtch=0;
68: if(a->ofnm==0) err(a->oerr,107,"open")
69: g_char(a->ofnm,a->ofnmlen,buf);
70: /*SYSDEP access*/
71: if(access(buf, 0) == -1) (void) close(creat(buf, 0666));
72: goto done;
73: }
74: connected:
75: if(a->ofnm==0)
76: {
77: same: if(a->oblnk!= 0) b->ublnk= *a->oblnk== 'b'?0:1;
78: return(0);
79: }
80: g_char(a->ofnm,a->ofnmlen,buf);
81: if(inode(buf)==b->uinode) goto same;
82: x.cunit=a->ounit;
83: x.csta=0;
84: x.cerr=a->oerr;
85: if((n=f_clos(&x))!=0) return(n);
86: goto unconnected;
87: }
88: fk_open(seq,fmt,n) ftnint n;
89: { char nbuf[10];
90: olist a;
91: (void) sprintf(nbuf,"fort.%ld",n);
92: a.oerr=1;
93: a.ounit=n;
94: a.ofnm=nbuf;
95: a.ofnmlen=strlen(nbuf);
96: a.osta=NULL;
97: a.oacc= seq==SEQ?"s":"d";
98: a.ofm = fmt==FMT?"f":"u";
99: a.orl = seq==DIR?1:0;
100: a.oblnk=NULL;
101: return(f_open(&a));
102: }
103: isdev(s) char *s;
104: { struct stat x;
105: int j;
106: if(stat(s, &x) == -1) return(0);
107: if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(0);
108: else return(1);
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.