Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libjcl/open.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2003-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
22
/*
23
* jcl handle open/close
24
*/
25
26
#include "jcllib.h"
27
28
Redirect_t redirect[] =
29
{
30
{ "SYSOUT", 1 },
31
{ "SYSERR", 2 },
32
};
33
34
/*
35
* open a handle to the jcl deck
36
*/
37
38
Jcl_t*
39
jclopen(Jcl_t* scope, const char* file, unsigned long flags, Jcldisc_t* disc)
40
{
41
register Jcl_t* jcl;
42
Dt_t* dt;
43
Sfio_t* sp;
44
Vmalloc_t* vm;
45
Vmalloc_t* vs;
46
int i;
47
48
if (!(vm = vmopen(Vmdcheap, Vmbest, 0)) || !(vs = vmopen(Vmdcheap, Vmbest, 0)))
49
{
50
nospace(NiL, disc);
51
if (vm)
52
vmclose(vm);
53
return 0;
54
}
55
if (!(jcl = vmnewof(vm, 0, Jcl_t, 1, 0)))
56
{
57
nospace(NiL, disc);
58
vmclose(vm);
59
vmclose(vs);
60
return 0;
61
}
62
jcl->id = "jcl";
63
jcl->vs = jcl->vm = vm;
64
jcl->vx = vs;
65
jcl->disc = disc;
66
jcl->flags = flags & JCL_INHERIT;
67
jcl->scope = scope;
68
jcl->step = &jcl->current;
69
for (i = 0; i < elementsof(redirect); i++)
70
jcl->redirect[i] = dup(redirect[i].fd);
71
if (!(jcl->cp = sfstropen()) || !(jcl->rp = sfstropen()) || !(jcl->tp = sfstropen()) || !(jcl->vp = sfstropen()) || !(jcl->xp = sfstropen()))
72
goto mem;
73
jcl->dddisc.link = offsetof(Jcldd_t, link);
74
jcl->dddisc.key = offsetof(Jcldd_t, name);
75
jcl->dddisc.size = -1;
76
jcl->outdirdisc.link = offsetof(Jcldir_t, link);
77
jcl->outdirdisc.key = offsetof(Jcldir_t, name);
78
jcl->outdirdisc.size = 0;
79
jcl->outputdisc.link = offsetof(Jcloutput_t, link);
80
jcl->outputdisc.key = offsetof(Jcloutput_t, name);
81
jcl->outputdisc.size = -1;
82
jcl->rcdisc.link = offsetof(Rc_t, link);
83
jcl->rcdisc.key = offsetof(Rc_t, name);
84
jcl->rcdisc.size = 0;
85
jcl->symdisc.link = offsetof(Jclsym_t, link);
86
jcl->symdisc.key = offsetof(Jclsym_t, name);
87
jcl->symdisc.size = 0;
88
if (!(jcl->dd = dtnew(jcl->vm, &jcl->dddisc, Dtoset)) ||
89
!(jcl->ds = dtnew(jcl->vm, &jcl->dddisc, Dtoset)) ||
90
!(jcl->outdir = dtnew(jcl->vm, &jcl->outdirdisc, Dtoset)) ||
91
!(jcl->output = dtnew(jcl->vm, &jcl->outputdisc, Dtoset)) ||
92
!(jcl->rcs = dtnew(jcl->vm, &jcl->rcdisc, Dtoset)) ||
93
!(jcl->syms = dtnew(jcl->vm, &jcl->symdisc, Dtoset)) ||
94
!(jcl->ss = dtnew(jcl->vm, &jcl->symdisc, Dtoset)) ||
95
!(jcl->step->syms = dtnew(jcl->vm, &jcl->symdisc, Dtoset)))
96
goto mem;
97
jcl->step->dd = jcl->ds;
98
jcl->step->syms = jcl->ss;
99
if (!(flags & JCL_SCOPE))
100
{
101
if (!file || streq(file, "-") || streq(file, "/dev/stdin"))
102
{
103
file = 0;
104
sp = sfstdin;
105
}
106
else if (!(file = jclfind(jcl, file, flags, 2, &sp)))
107
goto bad;
108
if (jclpush(jcl, sp, file, 0))
109
goto bad;
110
if (!jclstep(jcl))
111
goto bad;
112
dt = jcl->dd;
113
jcl->dd = jcl->ds;
114
jcl->ds = dt;
115
dt = jcl->output;
116
if (!jcl->name && error_info.line && jcl->disc->errorf)
117
(*jcl->disc->errorf)(NiL, jcl->disc, 1, "no JOB or PROC statement");
118
}
119
jcl->vs = vs;
120
return jcl;
121
mem:
122
nospace(jcl, NiL);
123
bad:
124
jclclose(jcl);
125
return 0;
126
}
127
128
/*
129
* close jcl handle
130
*/
131
132
int
133
jclclose(Jcl_t* jcl)
134
{
135
int i;
136
int r;
137
138
if (!jcl)
139
return -1;
140
if ((r = jcl->rc) < 0)
141
r = 256 + 6;
142
sfsync(sfstdout);
143
sfsync(sfstderr);
144
for (i = 0; i < elementsof(redirect); i++)
145
if (jcl->redirect[i] >= 0)
146
dup2(jcl->redirect[i], redirect[i].fd);
147
if (!jcl->scope && jclstats(sfstdout, jcl->flags, jcl->disc))
148
r = -1;
149
while (jclpop(jcl) > 0);
150
if (jcl->cp)
151
sfclose(jcl->cp);
152
if (jcl->dp)
153
sfclose(jcl->dp);
154
if (jcl->rp)
155
sfclose(jcl->rp);
156
if (jcl->tp)
157
sfclose(jcl->tp);
158
if (jcl->vp)
159
sfclose(jcl->vp);
160
if (jcl->xp)
161
sfclose(jcl->xp);
162
vmclose(jcl->vx);
163
vmclose(jcl->vm);
164
return r;
165
}
166
167
/*
168
* push an include file
169
*/
170
171
int
172
jclpush(register Jcl_t* jcl, Sfio_t* sp, const char* file, long line)
173
{
174
register Include_t* ip;
175
176
if (!(ip = vmnewof(jcl->vm, 0, Include_t, 1, file ? strlen(file) : 0)))
177
{
178
nospace(jcl, NiL);
179
return -1;
180
}
181
ip->sp = jcl->sp;
182
jcl->sp = sp;
183
ip->file = error_info.file;
184
error_info.file = file ? strcpy(ip->path, file) : (char*)0;
185
ip->line = error_info.line;
186
error_info.line = 0;
187
ip->prev = jcl->include;
188
jcl->include = ip;
189
if (file && (jcl->flags & JCL_LISTSCRIPTS))
190
uniq(file, NiL, 0, jcl->disc);
191
return 0;
192
}
193
194
/*
195
* pop the top include file
196
* return
197
* >0 some includes left
198
* 0 last include popped
199
* <0 no includes left
200
*/
201
202
int
203
jclpop(Jcl_t* jcl)
204
{
205
Include_t* ip;
206
207
if (!(ip = jcl->include))
208
return -1;
209
jcl->include = ip->prev;
210
if (jcl->sp != sfstdin)
211
sfclose(jcl->sp);
212
jcl->sp = ip->sp;
213
error_info.file = ip->file;
214
error_info.line = ip->line;
215
vmfree(jcl->vm, ip);
216
return jcl->sp != 0;
217
}
218
219