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