Annotation of freem/src/ssvn_job.c, revision 1.6
1.1 snw 1: /*
1.6 ! snw 2: * $Id: ssvn_job.c,v 1.5 2025/03/24 04:13:11 snw Exp $
1.4 snw 3: * ^$JOB ssvn
1.1 snw 4: *
5: *
1.3 snw 6: * Author: Serena Willis <snw@coherent-logic.com>
1.1 snw 7: * Copyright (C) 1998 MUG Deutschland
1.4 snw 8: * Copyright (C) 2020, 2025 Coherent Logic Development LLC
1.1 snw 9: *
10: *
11: * This file is part of FreeM.
12: *
13: * FreeM is free software: you can redistribute it and/or modify
14: * it under the terms of the GNU Affero Public License as published by
15: * the Free Software Foundation, either version 3 of the License, or
16: * (at your option) any later version.
17: *
18: * FreeM is distributed in the hope that it will be useful,
19: * but WITHOUT ANY WARRANTY; without even the implied warranty of
20: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21: * GNU Affero Public License for more details.
22: *
23: * You should have received a copy of the GNU Affero Public License
24: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
25: *
1.5 snw 26: * $Log: ssvn_job.c,v $
1.6 ! snw 27: * Revision 1.5 2025/03/24 04:13:11 snw
! 28: * Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
! 29: *
1.5 snw 30: * Revision 1.4 2025/03/09 19:50:47 snw
31: * Second phase of REUSE compliance and header reformat
32: *
1.4 snw 33: *
34: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
35: * SPDX-License-Identifier: AGPL-3.0-or-later
1.1 snw 36: **/
37:
38: #include <stdio.h>
39: #include <string.h>
40: #include <stdlib.h>
41: #include <signal.h>
42: #include <sys/types.h>
43: #include <unistd.h>
44: #include <errno.h>
45: #include <sys/time.h>
46: #include <sys/resource.h>
47: #include <ctype.h>
48: #include <time.h>
49:
50: #include "config.h"
51: #include "mpsdef.h"
52: #include "transact.h"
53: #include "namespace.h"
54: #include "freem.h"
55: #include "mref.h"
56: #include "jobtab.h"
57:
58: short cur_symtab = 0;
59:
60: void ssvn_job_add_device(int channel, char *device)
61: {
62: char *k_buf;
63: char *d_buf;
64:
65: k_buf = (char *) malloc (STRLEN * sizeof (char));
66: NULLPTRCHK(k_buf,"ssvn_job_add_device");
67:
68: d_buf = (char *) malloc (STRLEN * sizeof (char));
69: NULLPTRCHK(k_buf,"ssvn_job_add_device");
70:
71: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
72: snprintf (d_buf, 512 - 1, "%s\201", device);
73:
74: symtab_shm (set_sym, k_buf, d_buf);
75:
76: free (k_buf);
77: free (d_buf);
78:
79: return;
80: }
81:
82: void ssvn_job_remove_device(int channel)
83: {
84: char *k_buf;
85: char *d_buf;
86:
87: k_buf = (char *) malloc (STRLEN * sizeof (char));
88: NULLPTRCHK(k_buf,"ssvn_job_add_device");
89:
90: d_buf = (char *) malloc (STRLEN * sizeof (char));
91: NULLPTRCHK(k_buf,"ssvn_job_add_device");
92:
93: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
94: snprintf (d_buf, 512 - 1, "\201");
95:
96: symtab_shm (kill_sym, k_buf, d_buf);
97:
98: free (k_buf);
99: free (d_buf);
100:
101: return;
102:
103: }
104:
105: void ssvn_job_update(void)
106: {
107:
108: char k_buf[512];
109: char d_buf[512];
110:
111: char tk_buf[512];
112: char td_buf[512];
113:
114: #ifndef AMIGA68K
115: uid_t uid;
116: gid_t gid;
117: #else
118: int uid;
119: int gid;
120: #endif
121:
122: int ierr_sav;
123: int tf;
124:
125: #if !defined(AMIGA68K)
126: uid = getuid ();
127: gid = getgid ();
128: #else
129: uid = 0;
130: gid = 0;
131: #endif
132:
133: ierr_sav = ierr;
134:
135: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PIPE_GLVN\201", pid);
136: snprintf (d_buf, 5, "%%\201");
137: symtab_shm (set_sym, k_buf, d_buf);
138:
139: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZCOMMANDS\201", pid);
140: stcpy (d_buf, zcommds);
141: symtab_shm (set_sym, k_buf, d_buf);
142:
143: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZFUNCTIONS\201", pid);
144: stcpy (d_buf, zfunctions);
145: symtab_shm (set_sym, k_buf, d_buf);
146:
147: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZSVS\201", pid);
148: stcpy (d_buf, zsvn);
149: symtab_shm (set_sym, k_buf, d_buf);
150:
151: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202BREAK_HANDLER\201", pid);
152: stcpy (d_buf, brkaction);
153: symtab_shm (set_sym, k_buf, d_buf);
154:
155: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_SIZE\201", pid);
156: snprintf (d_buf, 512 - 1, "%ld\201", PSIZE0 - 1);
157: symtab_shm (set_sym, k_buf, d_buf);
158:
159: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_COUNT\201", pid);
1.2 snw 160: snprintf (d_buf, 512 - 1, "%ld\201", NO_OF_RBUF);
1.1 snw 161: symtab_shm (set_sym, k_buf, d_buf);
162:
163: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_AUTO_ADJUST\201", pid);
164: snprintf (d_buf, 512 - 1, "%d\201", autorsize);
165: symtab_shm (set_sym, k_buf, d_buf);
166:
167: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SYMBOL_TABLE_SIZE\201", pid);
168: snprintf (d_buf, 512 - 1, "%ld\201", PSIZE);
169: symtab_shm (set_sym, k_buf, d_buf);
170:
171: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SYMBOL_TABLE_AUTO_ADJUST\201", pid);
172: snprintf (d_buf, 512 - 1, "%d\201", autopsize);
173: symtab_shm (set_sym, k_buf, d_buf);
174:
175: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_SIZE\201", pid);
176: snprintf (d_buf, 512 - 1, "%ld\201", UDFSVSIZ);
177: symtab_shm (set_sym, k_buf, d_buf);
178:
179: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_AUTO_ADJUST\201", pid);
180: snprintf (d_buf, 512 - 1, "%d\201", autousize);
181: symtab_shm (set_sym, k_buf, d_buf);
182:
183: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_UNIQUE_CHARS\201", pid);
184: snprintf (d_buf, 512 - 1, "%d\201", (glvnflag.one[0] == 0) ? 255 : glvnflag.one[0]);
185: symtab_shm (set_sym, k_buf, d_buf);
186:
187: tf = UNSIGN (glvnflag.one[1]);
188: toggle (tf);
189:
190: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_CASE_SENSITIVE\201", pid);
191: snprintf (d_buf, 512 - 1, "%d\201", tf);
192: symtab_shm (set_sym, k_buf, d_buf);
193:
194: tf = UNSIGN (glvnflag.one[2]);
195: if (tf == 0) tf = 255;
196: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_NAME_SUB_LENGTH\201", pid);
197: snprintf (d_buf, 512 - 1, "%d\201", tf);
198: symtab_shm (set_sym, k_buf, d_buf);
199:
200: tf = UNSIGN (glvnflag.one[3]);
201: if (tf == 0) tf = 255;
202: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_SUB_LENGTH\201", pid);
203: snprintf (d_buf, 512 - 1, "%d\201", tf);
204: symtab_shm (set_sym, k_buf, d_buf);
205:
206: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SINGLE_USER\201", pid);
207: snprintf (d_buf, 512 - 1, "%d\201", lonelyflag);
208: symtab_shm (set_sym, k_buf, d_buf);
209:
210: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LOWERCASE_EVERYWHERE\201", pid);
211: snprintf (d_buf, 512 - 1, "%d\201", lowerflag);
212: symtab_shm (set_sym, k_buf, d_buf);
213:
214: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZCOMMAND_ARGUMENT_NAME\201", pid);
215: stcpy (d_buf, zargdefname);
216: symtab_shm (set_sym, k_buf, d_buf);
217:
218: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202TIMEZONE_OFFSET\201", pid);
219: lintstr (d_buf, tzoffset);
220: symtab_shm (set_sym, k_buf, d_buf);
221:
222: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202%s\201", pid, nsname);
223: snprintf (d_buf, 512 - 1, "%s\201", gbl_u_engine);
224: symtab_shm (set_sym, k_buf, d_buf);
225:
226: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202SYSTEM\201", pid);
227: snprintf (d_buf, 512 - 1, "%s\201", gbl_s_engine);
228: symtab_shm (set_sym, k_buf, d_buf);
229:
230: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202LOCAL\201", pid);
231: snprintf (d_buf, 512 - 1, "%s\201", loc_engine);
232: symtab_shm (set_sym, k_buf, d_buf);
233:
234: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202CHARACTER\201", pid);
235: symtab_shm (set_sym, k_buf, "M\201");
236:
237: snprintf (d_buf, 512 - 1, "%s\201", curdir);
238: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202CWD\201", pid);
239: symtab_shm (set_sym, k_buf, d_buf);
240:
241: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GLOBAL\201", pid);
242: symtab_shm (set_sym, k_buf, " \201");
243:
244: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LOCK\201", pid);
245: symtab_shm (set_sym, k_buf, " \201");
246:
247: snprintf (d_buf, 512 - 1, "%s\201", oucpath);
248: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202IOPATH\201", pid);
249: symtab_shm (set_sym, k_buf, d_buf);
250:
251: #if !defined(MSDOS)
252: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PRIORITY\201", pid);
253: snprintf (d_buf, 512 - 1, "%d\201", getpriority (PRIO_PROCESS, pid));
254: symtab_shm (set_sym, k_buf, d_buf);
255: #endif
256:
257: snprintf (d_buf, 512 - 1, "%s\201", rou_name);
258: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE\201", pid);
259: symtab_shm (set_sym, k_buf, d_buf);
260:
261: snprintf (d_buf, 512 - 1, "0:\"%s\"\201", dev[HOME]);
262: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$PRINCIPAL\201", pid);
263: symtab_shm (set_sym, k_buf, d_buf);
264:
265: snprintf (d_buf, 512 - 1, "%d\201", tp_level);
266: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$TLEVEL\201", pid);
267: symtab_shm (set_sym, k_buf, d_buf);
268:
269: snprintf (d_buf, 512 - 1, "0:\"%s\"\201", dev[HOME]);
270: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$IO\201", pid);
271: symtab_shm (set_sym, k_buf, d_buf);
272:
273: snprintf (d_buf, 512 -1, "%s\201", gvndefault);
274: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVNDEFAULT\201", pid);
275: symtab_shm (set_sym, k_buf, d_buf);
276:
277: snprintf (d_buf, 512 -1, "%s\201", lvndefault);
278: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LVNDEFAULT\201", pid);
279: symtab_shm (set_sym, k_buf, d_buf);
280:
281: ssvn_job_add_device (HOME, dev[HOME]);
282:
283: snprintf (d_buf, 512 - 1, "%d\201", uid);
284: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER\201", pid);
285: symtab_shm (set_sym, k_buf, d_buf);
286:
287: snprintf (d_buf, 512 - 1, "%d\201", gid);
288: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GROUP\201", pid);
289: symtab_shm (set_sym, k_buf, d_buf);
290:
291: snprintf (d_buf, 512 - 1, "%s\201", nsname);
292: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
293: symtab_shm (set_sym, k_buf, d_buf);
294:
295: snprintf (d_buf, 512 - 1, "%d\201", cur_symtab);
296: snprintf (k_buf, 512 - 1, "^$JOB\202\%d\202SYMTAB\201", pid);
297: symtab_shm (set_sym, k_buf, d_buf);
298:
299: snprintf (d_buf, 512 - 1, "%d\201", pid);
300: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PID\201", pid);
301: symtab_shm (set_sym, k_buf, d_buf);
302:
303: snprintf (d_buf, 512 - 1, "%d\201", frm_throw_all_errors);
304: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SET_ALL_ECODES\201", pid);
305: symtab_shm (set_sym, k_buf, d_buf);
306:
307: snprintf (tk_buf, 512 - 1, "^$SYSTEM\202ZDATE_FORMAT\201");
308: ssvn (get_sym, tk_buf, td_buf);
309:
310: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZDATE_FORMAT\201", pid);
311: symtab_shm (set_sym, k_buf, td_buf);
312:
313: snprintf (tk_buf, 512 - 1, "^$SYSTEM\202ZTIME_FORMAT\201");
314: ssvn (get_sym, tk_buf, td_buf);
315:
316: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZTIME_FORMAT\201", pid);
317: symtab_shm (set_sym, k_buf, td_buf);
318:
319: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENVIRONMENT\201", pid);
320: snprintf (d_buf, 512 - 1, "%s\201", shm_env);
321: symtab_shm (set_sym, k_buf, d_buf);
322:
323: switch (fp_mode) {
324:
325: case 0:
326:
327: snprintf (d_buf, 512 - 1, "FIXED\201");
328: break;
329:
330: default:
331:
332: snprintf (d_buf, 512 - 1, "IEEE754\201");
333: snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
334: zprecise = DBL_DIG;
335:
336: break;
337:
338: }
339:
340: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202MATH\201", pid);
341: symtab_shm (set_sym, k_buf, d_buf);
342:
343: snprintf (d_buf, 512 - 1, "%d\201", en_revstrf);
344: snprintf (k_buf, 512 - 1, "^$JOB\202%d\202REVSTR\201", pid);
345: symtab_shm (set_sym, k_buf, d_buf);
346:
347: stcpy (d_buf, rou_name);
348: stcnv_m2c (d_buf);
349:
350: merr_raise (ierr_sav);
351:
352: }
353:
354:
355: void ssvn_job(short action, char *key, char *data)
356: {
357: pid_t t_pid;
358: int i;
359: char ch;
360: job_slot_t *slot;
361: freem_ref_t *r;
362: char *kbuf;
363: char *tbuf;
364:
365: r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
366: NULLPTRCHK(r,"ssvn_job");
367:
368: kbuf = (char *) malloc (STRLEN * sizeof(char));
369: NULLPTRCHK(kbuf,"ssvn_job");
370:
371: tbuf = (char *) malloc (STRLEN * sizeof(char));
372: NULLPTRCHK(tbuf,"ssvn_job");
373:
374: stcpy (kbuf, key);
375:
376: mref_init (r, MREF_RT_SSVN, "^$JOB");
377: internal_to_mref (r, kbuf);
378:
379: t_pid = atol (mref_get_subscript (r, 0));
380:
381: slot = job_get (t_pid);
382:
383: if (r->subscript_count > 1) {
384: for (i = 0; i < strlen (r->subscripts[1]); i++) {
385: r->subscripts[1][i] = toupper (r->subscripts[1][i]);
386: }
387: }
388:
389: key = mref_to_internal (r);
390: stcpy (kbuf, key);
391:
392: switch (action) {
393:
394: case set_sym:
395:
396: {
397: char cbuf[STRLEN];
398:
399: snprintf (cbuf, STRLEN - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
400:
401: if (stcmp (kbuf, cbuf) == 0) {
402:
403: stcpy (tbuf, data);
404: stcnv_m2c (tbuf);
405:
406: if (validate_namespace (tbuf) == FALSE) {
407: merr_raise (M26);
408: }
409: else {
410: set_namespace (tbuf, FALSE);
411: }
412:
413: goto done;
414:
415: }
416:
417:
418: if (strcmp (mref_get_subscript (r, 1), "ZCOMMANDS") == 0) {
419:
420: m_tolower (data);
421:
422: stcpy (zcommds, data);
423: symtab_shm (action, key, data);
424:
425: merr_clear ();
426: goto done;
427:
428: }
429: else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
430: stcpy (l_o_val, data);
431:
432: merr_clear ();
433: goto done;
434: }
435: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
436: stcpy (l_o_val, data);
437:
438: merr_clear ();
439: goto done;
440: }
441: else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
442:
443: stcpy (gvndefault, data);
444:
445: merr_clear ();
446: goto done;
447: }
448: else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
449:
450: stcpy (lvndefault, data);
451:
452: merr_clear ();
453: goto done;
454: }
455: else if (strcmp (mref_get_subscript (r, 1), "PIPE_GLVN") == 0) {
456:
457: symtab_shm (action, key, data);
458:
459: merr_clear ();
460: goto done;
461:
462: }
463: else if (strcmp (mref_get_subscript (r, 1), "ZFUNCTIONS") == 0) {
464:
465: m_tolower (data);
466:
467: stcpy (zfunctions, data);
468: symtab_shm (action, key, data);
469:
470: merr_clear ();
471: goto done;
472:
473: }
474: else if (strcmp (mref_get_subscript (r, 1), "ZSVS") == 0) {
475:
476: m_tolower (data);
477:
478: stcpy (zsvn, data);
479: symtab_shm (action, key, data);
480:
481: merr_clear ();
482: goto done;
483:
484: }
485: else if (strcmp (mref_get_subscript (r, 1), "LOWERCASE_EVERYWHERE") == 0) {
486:
487: int tf = tvexpr (data);
488:
489: lowerflag = tf;
490: snprintf (data, 512 - 1, "%d\n", tf);
491:
492: symtab_shm (action, key, data);
493:
494: merr_clear ();
495: goto done;
496:
497: }
498: else if (strcmp (mref_get_subscript (r, 1), "ZCOMMAND_ARGUMENT_NAME") == 0) {
499:
500: stcpy (zargdefname, data);
501: symtab_shm (action, key, data);
502:
503: merr_clear ();
504: goto done;
505:
506: }
507: else if (strcmp (mref_get_subscript (r, 1), "BREAK_HANDLER") == 0) {
508:
509: stcpy (brkaction, data);
510: symtab_shm (action, key, data);
511:
512: merr_clear ();
513: goto done;
514:
515: }
516: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_SIZE") == 0) {
517:
518: if (intexpr (data) <= 0) {
519: merr_raise (ARGER);
520: goto done;
521: }
522:
523: newrsize (intexpr (data) + 1, NO_OF_RBUF);
524: symtab_shm (action, key, data);
525:
526: merr_clear ();
527: goto done;
528:
529: }
530: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_COUNT") == 0) {
531:
532: if (intexpr (data) <= 0) {
533: merr_raise (ARGER);
534: goto done;
535: }
536:
537: newrsize (PSIZE0, intexpr (data));
538: symtab_shm (action, key, data);
539:
540: merr_clear ();
541: goto done;
542:
543: }
544: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_AUTO_ADJUST") == 0) {
545:
546: autorsize = tvexpr (data);
547: snprintf (data, 512 - 1, "%d\201", tvexpr (data));
548:
549: symtab_shm (action, key, data);
550:
551: merr_clear ();
552: goto done;
553:
554: }
555: else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_SIZE") == 0) {
556:
557: if (intexpr (data) <= 0) {
558: merr_raise (ARGER);
559: goto done;
560: }
561:
562: newpsize (intexpr (data));
563:
564: symtab_shm (action, key, data);
565:
566: merr_clear ();
567: goto done;
568:
569: }
570: else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_AUTO_ADJUST") == 0) {
571:
572: autopsize = tvexpr (data);
573: snprintf (data, 512 - 1, "%d\201", tvexpr (data));
574:
575: symtab_shm (action, key, data);
576:
577: merr_clear ();
578: goto done;
579:
580: }
581: else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_SIZE") == 0) {
582:
583: if (intexpr (data) <= 0) {
584: merr_raise (ARGER);
585: goto done;
586: }
587:
588: newusize (intexpr (data));
589:
590: symtab_shm (action, key, data);
591:
592: merr_clear ();
593: goto done;
594:
595: }
596: else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_AUTO_ADJUST") == 0) {
597: autousize = tvexpr (data);
598: snprintf (data, 512 - 1, "%d\201", tvexpr (data));
599:
600: symtab_shm (action, key, data);
601:
602: merr_clear ();
603: goto done;
604: }
605: else if (strcmp (mref_get_subscript (r, 1), "GVN_UNIQUE_CHARS") == 0) {
606:
607: int t = intexpr (data) & 0377;
608:
609: if (t == 255) t = 0;
610:
611: if (merr () != MXNUM) {
612:
613: glvnflag.one[0] = (char) t;
614:
615: snprintf (data, 512 - 1, "%d\201", t);
616: symtab_shm (action, key, data);
617:
618: merr_clear ();
619:
620: }
621: else {
622: merr_raise (ARGER);
623: }
624:
625: goto done;
626:
627: }
628: else if (strcmp (mref_get_subscript (r, 1), "GVN_CASE_SENSITIVE") == 0) {
629: int t = tvexpr (data);
630: toggle (t);
631:
632: if (merr () != MXNUM) {
633:
634: glvnflag.one[1] = t;
635:
636: snprintf (data, 512 - 1, "%d\201", t);
637: symtab_shm (action, key, data);
638:
639: merr_clear ();
640:
641: }
642: else {
643: merr_raise (ARGER);
644: }
645:
646: goto done;
647:
648: }
649: else if (strcmp (mref_get_subscript (r, 1), "GVN_NAME_SUB_LENGTH") == 0) {
650: int t = intexpr (data) & 0377;
651:
652: if (t == 255) t = 0;
653:
654: if (merr () != MXNUM) {
655: glvnflag.one[2] = (char) t;
656:
657: snprintf (data, 512 - 1, "%d\201", t);
658: symtab_shm (action, key, data);
659:
660: merr_clear ();
661: }
662: else {
663: merr_raise (ARGER);
664: }
665:
666: goto done;
667:
668: }
669: else if (strcmp (mref_get_subscript (r, 1), "GVN_SUB_LENGTH") == 0) {
670: int t = intexpr (data) & 0377;
671:
672: if (t == 255) t = 0;
673:
674: if (merr () != MXNUM) {
675: glvnflag.one[3] = (char) t;
676:
677: snprintf (data, 512 - 1, "%d\201", t);
678: symtab_shm (action, key, data);
679:
680: merr_clear ();
681: }
682: else {
683: merr_raise (ARGER);
684: }
685:
686: goto done;
687:
688: }
689: else if (strcmp (mref_get_subscript (r, 1), "SINGLE_USER") == 0) {
690: int tf = tvexpr (data);
691: close_all_globals ();
692:
693: snprintf (data, 512 - 1, "%d\201", tf);
694: symtab_shm (action, key, data);
695:
696: merr_clear ();
697: goto done;
698: }
699: else if (stcmp (mref_get_subscript (r, 1), "TIMEZONE_OFFSET") == 0) {
700: long tzo = intexpr (data);
701: long tzj;
702:
703: if (merr () > OK) goto done;
704:
705: tzj = time (0L);
706:
707: if ((tzoffset > 0 && ((tzj + 86400 + tzoffset) < 0 || (tzj + tzoffset) < 0)) ||
708: (tzoffset < 0 && ((tzj + 86400 + tzoffset ) > (tzj + 86400) ||
709: (tzj + tzoffset) > tzj))) {
710: merr_raise (ARGER);
711: goto done;
712: }
713:
714: tzoffset = tzo;
715:
1.2 snw 716: snprintf (data, 512 - 1, "%ld\201", tzoffset);
1.1 snw 717: symtab_shm (action, key, data);
718:
719: goto done;
720: }
721: else if (strcmp (mref_get_subscript (r, 1), "ENGINES") == 0) {
722:
723: if (strcmp (mref_get_subscript (r, 2), "GLOBAL") == 0) {
724:
725: if ((strcmp (mref_get_subscript (r, 3), nsname) == 0) && (strcmp (mref_get_subscript (r, 3), "SYSTEM") != 0)) {
726: stcpy (tbuf, data);
727: stcnv_m2c (tbuf);
728:
729: global_set_engine ('u', tbuf);
730:
731: goto done;
732:
733: }
734: else if (strcmp (mref_get_subscript (r, 3), "SYSTEM") == 0) {
735:
736: stcpy (tbuf, data);
737: stcnv_m2c (tbuf);
738:
739: global_set_engine ('s', tbuf);
740:
741: goto done;
742:
743: }
744:
745: }
746:
747: merr_raise (M29);
748: goto done;
749:
750: }
751: else if (strcmp (mref_get_subscript (r, 1), "USER_ERRORS") == 0) {
752:
753: symtab_shm (set_sym, key, data);
754:
755: merr_clear ();
756: goto done;
757:
758: }
759: else if (strcmp (mref_get_subscript (r, 1), "SET_ALL_ECODES") == 0) {
760:
761: frm_throw_all_errors = atol (data);
762: symtab_shm (set_sym, key, data);
763:
764: merr_clear ();
765: goto done;
766:
767: }
768: else if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
769: symtab_shm (set_sym, key, data);
770:
771: merr_clear ();
772: goto done;
773: }
774: else if (strcmp (mref_get_subscript (r, 1), "CWD") == 0) {
775:
776: stcpy (tbuf, data);
777: stcnv_m2c (tbuf);
778:
779: if (chdir (tbuf) != 0) {
780: merr_raise (PROTECT);
781: goto done;
782: }
783: else {
784: strcpy (curdir, tbuf);
785: symtab_shm (set_sym, kbuf, data);
786:
787: merr_clear ();
788: goto done;
789: }
790:
791: }
792: else if (strcmp (mref_get_subscript (r, 1), "EVENT") == 0) {
793: symtab_shm (set_sym, kbuf, data);
794:
795: merr_clear ();
796: goto done;
797: }
798: else if (strcmp (mref_get_subscript (r, 1), "PRIORITY") == 0) {
799:
800: int new_pri;
801:
802: stcpy (tbuf, data);
803: stcnv_m2c (tbuf);
804:
805: new_pri = atoi (tbuf);
806:
807:
808: i = nice (40);
809: nice ((int) (new_pri - 40));
810:
811: symtab_shm (set_sym, kbuf, data);
812:
813: merr_clear ();
814: goto done;
815:
816: }
817: else if (strcmp (mref_get_subscript (r, 1), "IOPATH") == 0) {
818:
819: stcpy (oucpath, data);
820: symtab_shm (set_sym, kbuf, data);
821:
822: merr_clear ();
823: goto done;
824:
825: }
826: else if (strcmp (mref_get_subscript (r, 1), "REVSTR") == 0) {
827:
828: short tres = tvexpr (data);
829:
830: if (tres == TRUE) {
831: en_revstrf = 1;
832: }
833: else {
834: en_revstrf = 0;
835: }
836:
837: symtab_shm (set_sym, kbuf, data);
838:
839: merr_clear ();
840: goto done;
841:
842: }
843: else if (strcmp (mref_get_subscript (r, 1), "ZDATE_FORMAT") == 0) {
844: symtab_shm (set_sym, key, data);
845: merr_clear ();
846: goto done;
847:
848: }
849: else if (strcmp (mref_get_subscript (r, 1), "ZTIME_FORMAT") == 0) {
850: symtab_shm (set_sym, key, data);
851: merr_clear ();
852: goto done;
853:
854: }
855: else if (strcmp (mref_get_subscript (r, 1), "SYMTAB") == 0) {
856:
857: int itmp = atoi (data);
858:
859: if ((data[0] < '0') || (data[0] > '9')) {
860: merr_raise (INVEXPR);
861: goto done;
862: }
863:
864: if (itmp != 0 && itmp != 1) {
865: merr_raise (INVEXPR);
866: goto done;
867: }
868:
869: if (cur_symtab == itmp) {
870: merr_clear ();
871: goto done;
872: }
873:
874: if (cur_symtab == 0) {
875: cur_symtab = 1;
876: }
877: else {
878: cur_symtab = 0;
879: }
880:
881: if (apartition == NULL) {
882:
883: apartition = calloc ((unsigned) PSIZE + 1, 1);
884: asymlen = PSIZE;
885:
886: for (i = 0; i < 128; i++) aalphptr[i] = 0L;
887:
888: }
889:
890: {
891:
892: char *x;
893:
894: x = apartition;
895: apartition = partition;
896: partition = x;
897:
898: }
899:
900: ch = asymlen;
901: asymlen = symlen;
902: symlen = ch;
903:
904: for (i = 0; i < 128; i++) {
905: ch = aalphptr[i];
906: aalphptr[i] = alphptr[i];
907: alphptr[i] = ch;
908: }
909:
910: s = &partition[symlen] - 256; /* pointer to symlen_offset */
911: argptr = partition; /* pointer to beg of tmp-storage */
912:
913: symtab_shm (set_sym, key, data);
914:
915: merr_clear ();
916: goto done;
917:
918:
919: }
920: else if (strcmp (mref_get_subscript (r, 1), "MATH") == 0) {
921:
922: #if !defined(_AIX)
923: if (stcmp (data, "IEEE754\201") == 0) {
924:
925: fp_mode = 1;
926: symtab_shm (set_sym, kbuf, data);
927:
928: snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
929: zprecise = DBL_DIG;
930:
931: merr_clear ();
932: goto done;
933:
934: }
935: else if (stcmp (data, "FIXED\201") == 0) {
936:
937: fp_mode = 0;
938: symtab_shm (set_sym, kbuf, data);
939:
940: zprecise = 100;
941:
942: merr_clear ();
943: goto done;
944:
945: }
946: else {
947: merr_raise (M29);
948: goto done;
949: }
950: #endif
951:
952: }
953:
954: merr_raise (M29);
955: goto done;
956: }
957:
958: case get_sym:
959: if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
960: stcpy (data, l_o_val);
961: goto done;
962: }
963: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
964: stcpy (data, g_o_val);
965: goto done;
966: }
1.5 snw 967: case fra_dat:
1.1 snw 968: case fra_order:
969: case fra_query:
970: if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
971: merr_raise (M38);
972: goto done;
973: }
974: if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
975: merr_raise (M38);
976: goto done;
977: }
978: case bigquery:
979: case getnext:
980: case m_alias:
981: case zdata:
982:
983: if (action == get_sym) {
984:
985: if (strcmp (mref_get_subscript (r, 1), "PROCESS_START") == 0) {
986:
987: unsigned long ilong;
988: unsigned long ilong1;
989:
990: ilong1 = slot->start_time + tzoffset;
991: ilong = ilong1 / 86400;
992:
993: lintstr (data, ilong + 47117);
994: i = stlen (data);
995:
996: data[i++] = ',';
997: ilong = ilong1 - (ilong * 86400);
998:
999: lintstr (&data[i], ilong);
1000:
1001: merr_clear ();
1002: goto done;
1003:
1004: }
1005:
1006: }
1007:
1008: symtab_shm (action, kbuf, data);
1009:
1010: /* here, we need to convert the data on the way out too */
1011: if ((action == fra_query) && (stlen (data) > 0)) {
1012: if (strncmp (data, "^$JOB", 5) != 0) {
1013: snprintf (kbuf, STRLEN - 1, "^$JOB%s\201", data);
1014: stcpy (data, kbuf);
1015: }
1016: }
1017:
1018: merr_clear ();
1019: goto done;
1020:
1021: case killone:
1022: case kill_sym:
1023:
1024: if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
1025:
1026: symtab_shm (action, key, data);
1027:
1028: goto done;
1029:
1030: }
1031: else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
1032: l_o_val[0] = '\201';
1033: merr_clear ();
1034: goto done;
1035: }
1036: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
1037: g_o_val[0] = '\201';
1038: merr_clear ();
1039: goto done;
1040: }
1041: else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
1042: gvndefault[0] = '\201';
1043: symtab_shm (action, key, data);
1044: symtab_shm (set_sym, key, gvndefault);
1045: merr_clear ();
1046: goto done;
1047: }
1048: else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
1049: lvndefault[0] = '\201';
1050: symtab_shm (action, key, data);
1051: symtab_shm (set_sym, key, lvndefault);
1052: merr_clear ();
1053: goto done;
1054: }
1055: else {
1056: job_request_stop (t_pid);
1057: }
1058:
1059: goto done;
1060:
1061:
1062: default:
1063: merr_raise (INVREF);
1064: goto done;
1065:
1066: }
1067:
1068:
1069: done:
1070:
1071: free (r);
1072: free (kbuf);
1073: free (tbuf);
1074: free (key);
1075: return;
1076: }
1077:
1078: void frm_process_alias (char *key)
1079: {
1080: int ierr_sav;
1081: char *ptr;
1082: char name[256];
1083: char *subprt;
1084: register int i;
1085: register char ch;
1086:
1087: char *k_buf;
1088: char *d_buf;
1089: char *t_buf;
1090:
1091: k_buf = (char *) malloc (STRLEN * sizeof (char));
1092: NULLPTRCHK(k_buf,"frm_process_alias");
1093:
1094: d_buf = (char *) malloc (STRLEN * sizeof (char));
1095: NULLPTRCHK(d_buf,"frm_process_alias");
1096:
1097: t_buf = (char *) malloc (STRLEN * sizeof (char));
1098: NULLPTRCHK(t_buf,"frm_process_alias");
1099:
1100: ierr_sav = ierr;
1101: ptr = key;
1102: i = 0;
1103:
1104: while ((ch = *(ptr++)) != DELIM && ch != EOL && i < 256) {
1105: name[i++] = ch;
1106: }
1107:
1108: name[i] = '\0';
1109: subprt = key + i;
1110:
1.2 snw 1111: snprintf (k_buf, STRLEN - 1, "^$JOB\202%ld\202ALIASES\202%s\201", (long) pid, name);
1.1 snw 1112: symtab_shm (get_sym, k_buf, d_buf);
1113:
1114: stcnv_m2c (d_buf);
1115:
1116: if (merr () == OK) {
1117: snprintf (t_buf, STRLEN - 1, "%s%s\201", d_buf, subprt);
1118: stcpy (key, t_buf);
1119: }
1120:
1121: free (k_buf);
1122: free (d_buf);
1123: free (t_buf);
1124:
1125: merr_raise (ierr_sav);
1126:
1127: return;
1128:
1129: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>