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