1: /*
2: * $Id: ssvn_job.c,v 1.5 2025/03/24 04:13:11 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.5 2025/03/24 04:13:11 snw
28: * Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
29: *
30: * Revision 1.4 2025/03/09 19:50:47 snw
31: * Second phase of REUSE compliance and header reformat
32: *
33: *
34: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
35: * SPDX-License-Identifier: AGPL-3.0-or-later
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);
160: snprintf (d_buf, 512 - 1, "%ld\201", NO_OF_RBUF);
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: #if !defined(__FreeBSD__)
351:
352: if (run_daemon == FALSE) {
353: sprintf (k_buf, " freem: namespace %s routine %s", nsname, d_buf);
354: }
355: else {
356: sprintf (k_buf, " freem: %s environment daemon", shm_env);
357: }
358: if (!libflag) {
359: strcpy (m_argv[0], k_buf);
360: }
361:
362: #endif
363:
364: merr_raise (ierr_sav);
365:
366: }
367:
368:
369: void ssvn_job(short action, char *key, char *data)
370: {
371: int errsav;
372: pid_t t_pid;
373: int i;
374: char ch;
375: job_slot_t *slot;
376: freem_ref_t *r;
377: char *kbuf;
378: char *tbuf;
379:
380: r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
381: NULLPTRCHK(r,"ssvn_job");
382:
383: kbuf = (char *) malloc (STRLEN * sizeof(char));
384: NULLPTRCHK(kbuf,"ssvn_job");
385:
386: tbuf = (char *) malloc (STRLEN * sizeof(char));
387: NULLPTRCHK(tbuf,"ssvn_job");
388:
389: stcpy (kbuf, key);
390:
391: mref_init (r, MREF_RT_SSVN, "^$JOB");
392: internal_to_mref (r, kbuf);
393:
394: t_pid = atol (mref_get_subscript (r, 0));
395:
396: slot = job_get (t_pid);
397:
398: if (r->subscript_count > 1) {
399: for (i = 0; i < strlen (r->subscripts[1]); i++) {
400: r->subscripts[1][i] = toupper (r->subscripts[1][i]);
401: }
402: }
403:
404: key = mref_to_internal (r);
405: stcpy (kbuf, key);
406:
407: switch (action) {
408:
409: case set_sym:
410:
411: {
412: char cbuf[STRLEN];
413:
414: snprintf (cbuf, STRLEN - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
415:
416: if (stcmp (kbuf, cbuf) == 0) {
417:
418: stcpy (tbuf, data);
419: stcnv_m2c (tbuf);
420:
421: if (validate_namespace (tbuf) == FALSE) {
422: merr_raise (M26);
423: }
424: else {
425: set_namespace (tbuf, FALSE);
426: }
427:
428: goto done;
429:
430: }
431:
432:
433: if (strcmp (mref_get_subscript (r, 1), "ZCOMMANDS") == 0) {
434:
435: m_tolower (data);
436:
437: stcpy (zcommds, data);
438: symtab_shm (action, key, data);
439:
440: merr_clear ();
441: goto done;
442:
443: }
444: else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
445: stcpy (l_o_val, data);
446:
447: merr_clear ();
448: goto done;
449: }
450: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
451: stcpy (l_o_val, data);
452:
453: merr_clear ();
454: goto done;
455: }
456: else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
457:
458: stcpy (gvndefault, data);
459:
460: merr_clear ();
461: goto done;
462: }
463: else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
464:
465: stcpy (lvndefault, data);
466:
467: merr_clear ();
468: goto done;
469: }
470: else if (strcmp (mref_get_subscript (r, 1), "PIPE_GLVN") == 0) {
471:
472: symtab_shm (action, key, data);
473:
474: merr_clear ();
475: goto done;
476:
477: }
478: else if (strcmp (mref_get_subscript (r, 1), "ZFUNCTIONS") == 0) {
479:
480: m_tolower (data);
481:
482: stcpy (zfunctions, data);
483: symtab_shm (action, key, data);
484:
485: merr_clear ();
486: goto done;
487:
488: }
489: else if (strcmp (mref_get_subscript (r, 1), "ZSVS") == 0) {
490:
491: m_tolower (data);
492:
493: stcpy (zsvn, data);
494: symtab_shm (action, key, data);
495:
496: merr_clear ();
497: goto done;
498:
499: }
500: else if (strcmp (mref_get_subscript (r, 1), "LOWERCASE_EVERYWHERE") == 0) {
501:
502: int tf = tvexpr (data);
503:
504: lowerflag = tf;
505: snprintf (data, 512 - 1, "%d\n", tf);
506:
507: symtab_shm (action, key, data);
508:
509: merr_clear ();
510: goto done;
511:
512: }
513: else if (strcmp (mref_get_subscript (r, 1), "ZCOMMAND_ARGUMENT_NAME") == 0) {
514:
515: stcpy (zargdefname, data);
516: symtab_shm (action, key, data);
517:
518: merr_clear ();
519: goto done;
520:
521: }
522: else if (strcmp (mref_get_subscript (r, 1), "BREAK_HANDLER") == 0) {
523:
524: stcpy (brkaction, data);
525: symtab_shm (action, key, data);
526:
527: merr_clear ();
528: goto done;
529:
530: }
531: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_SIZE") == 0) {
532:
533: if (intexpr (data) <= 0) {
534: merr_raise (ARGER);
535: goto done;
536: }
537:
538: newrsize (intexpr (data) + 1, NO_OF_RBUF);
539: symtab_shm (action, key, data);
540:
541: merr_clear ();
542: goto done;
543:
544: }
545: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_COUNT") == 0) {
546:
547: if (intexpr (data) <= 0) {
548: merr_raise (ARGER);
549: goto done;
550: }
551:
552: newrsize (PSIZE0, intexpr (data));
553: symtab_shm (action, key, data);
554:
555: merr_clear ();
556: goto done;
557:
558: }
559: else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_AUTO_ADJUST") == 0) {
560:
561: autorsize = tvexpr (data);
562: snprintf (data, 512 - 1, "%d\201", tvexpr (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_SIZE") == 0) {
571:
572: if (intexpr (data) <= 0) {
573: merr_raise (ARGER);
574: goto done;
575: }
576:
577: newpsize (intexpr (data));
578:
579: symtab_shm (action, key, data);
580:
581: merr_clear ();
582: goto done;
583:
584: }
585: else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_AUTO_ADJUST") == 0) {
586:
587: autopsize = tvexpr (data);
588: snprintf (data, 512 - 1, "%d\201", tvexpr (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_SIZE") == 0) {
597:
598: if (intexpr (data) <= 0) {
599: merr_raise (ARGER);
600: goto done;
601: }
602:
603: newusize (intexpr (data));
604:
605: symtab_shm (action, key, data);
606:
607: merr_clear ();
608: goto done;
609:
610: }
611: else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_AUTO_ADJUST") == 0) {
612: autousize = tvexpr (data);
613: snprintf (data, 512 - 1, "%d\201", tvexpr (data));
614:
615: symtab_shm (action, key, data);
616:
617: merr_clear ();
618: goto done;
619: }
620: else if (strcmp (mref_get_subscript (r, 1), "GVN_UNIQUE_CHARS") == 0) {
621:
622: int t = intexpr (data) & 0377;
623:
624: if (t == 255) t = 0;
625:
626: if (merr () != MXNUM) {
627:
628: glvnflag.one[0] = (char) t;
629:
630: snprintf (data, 512 - 1, "%d\201", t);
631: symtab_shm (action, key, data);
632:
633: merr_clear ();
634:
635: }
636: else {
637: merr_raise (ARGER);
638: }
639:
640: goto done;
641:
642: }
643: else if (strcmp (mref_get_subscript (r, 1), "GVN_CASE_SENSITIVE") == 0) {
644: int t = tvexpr (data);
645: toggle (t);
646:
647: if (merr () != MXNUM) {
648:
649: glvnflag.one[1] = t;
650:
651: snprintf (data, 512 - 1, "%d\201", t);
652: symtab_shm (action, key, data);
653:
654: merr_clear ();
655:
656: }
657: else {
658: merr_raise (ARGER);
659: }
660:
661: goto done;
662:
663: }
664: else if (strcmp (mref_get_subscript (r, 1), "GVN_NAME_SUB_LENGTH") == 0) {
665: int t = intexpr (data) & 0377;
666:
667: if (t == 255) t = 0;
668:
669: if (merr () != MXNUM) {
670: glvnflag.one[2] = (char) t;
671:
672: snprintf (data, 512 - 1, "%d\201", t);
673: symtab_shm (action, key, data);
674:
675: merr_clear ();
676: }
677: else {
678: merr_raise (ARGER);
679: }
680:
681: goto done;
682:
683: }
684: else if (strcmp (mref_get_subscript (r, 1), "GVN_SUB_LENGTH") == 0) {
685: int t = intexpr (data) & 0377;
686:
687: if (t == 255) t = 0;
688:
689: if (merr () != MXNUM) {
690: glvnflag.one[3] = (char) t;
691:
692: snprintf (data, 512 - 1, "%d\201", t);
693: symtab_shm (action, key, data);
694:
695: merr_clear ();
696: }
697: else {
698: merr_raise (ARGER);
699: }
700:
701: goto done;
702:
703: }
704: else if (strcmp (mref_get_subscript (r, 1), "SINGLE_USER") == 0) {
705: int tf = tvexpr (data);
706: close_all_globals ();
707:
708: snprintf (data, 512 - 1, "%d\201", tf);
709: symtab_shm (action, key, data);
710:
711: merr_clear ();
712: goto done;
713: }
714: else if (stcmp (mref_get_subscript (r, 1), "TIMEZONE_OFFSET") == 0) {
715: long tzo = intexpr (data);
716: long tzj;
717:
718: if (merr () > OK) goto done;
719:
720: tzj = time (0L);
721:
722: if ((tzoffset > 0 && ((tzj + 86400 + tzoffset) < 0 || (tzj + tzoffset) < 0)) ||
723: (tzoffset < 0 && ((tzj + 86400 + tzoffset ) > (tzj + 86400) ||
724: (tzj + tzoffset) > tzj))) {
725: merr_raise (ARGER);
726: goto done;
727: }
728:
729: tzoffset = tzo;
730:
731: snprintf (data, 512 - 1, "%ld\201", tzoffset);
732: symtab_shm (action, key, data);
733:
734: goto done;
735: }
736: else if (strcmp (mref_get_subscript (r, 1), "ENGINES") == 0) {
737:
738: if (strcmp (mref_get_subscript (r, 2), "GLOBAL") == 0) {
739:
740: if ((strcmp (mref_get_subscript (r, 3), nsname) == 0) && (strcmp (mref_get_subscript (r, 3), "SYSTEM") != 0)) {
741: stcpy (tbuf, data);
742: stcnv_m2c (tbuf);
743:
744: global_set_engine ('u', tbuf);
745:
746: goto done;
747:
748: }
749: else if (strcmp (mref_get_subscript (r, 3), "SYSTEM") == 0) {
750:
751: stcpy (tbuf, data);
752: stcnv_m2c (tbuf);
753:
754: global_set_engine ('s', tbuf);
755:
756: goto done;
757:
758: }
759:
760: }
761:
762: merr_raise (M29);
763: goto done;
764:
765: }
766: else if (strcmp (mref_get_subscript (r, 1), "USER_ERRORS") == 0) {
767:
768: symtab_shm (set_sym, key, data);
769:
770: merr_clear ();
771: goto done;
772:
773: }
774: else if (strcmp (mref_get_subscript (r, 1), "SET_ALL_ECODES") == 0) {
775:
776: frm_throw_all_errors = atol (data);
777: symtab_shm (set_sym, key, data);
778:
779: merr_clear ();
780: goto done;
781:
782: }
783: else if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
784: symtab_shm (set_sym, key, data);
785:
786: merr_clear ();
787: goto done;
788: }
789: else if (strcmp (mref_get_subscript (r, 1), "CWD") == 0) {
790:
791: stcpy (tbuf, data);
792: stcnv_m2c (tbuf);
793:
794: if (chdir (tbuf) != 0) {
795: merr_raise (PROTECT);
796: goto done;
797: }
798: else {
799: strcpy (curdir, tbuf);
800: symtab_shm (set_sym, kbuf, data);
801:
802: merr_clear ();
803: goto done;
804: }
805:
806: }
807: else if (strcmp (mref_get_subscript (r, 1), "EVENT") == 0) {
808: symtab_shm (set_sym, kbuf, data);
809:
810: merr_clear ();
811: goto done;
812: }
813: else if (strcmp (mref_get_subscript (r, 1), "PRIORITY") == 0) {
814:
815: int new_pri;
816:
817: stcpy (tbuf, data);
818: stcnv_m2c (tbuf);
819:
820: new_pri = atoi (tbuf);
821:
822:
823: i = nice (40);
824: nice ((int) (new_pri - 40));
825:
826: symtab_shm (set_sym, kbuf, data);
827:
828: merr_clear ();
829: goto done;
830:
831: }
832: else if (strcmp (mref_get_subscript (r, 1), "IOPATH") == 0) {
833:
834: stcpy (oucpath, data);
835: symtab_shm (set_sym, kbuf, data);
836:
837: merr_clear ();
838: goto done;
839:
840: }
841: else if (strcmp (mref_get_subscript (r, 1), "REVSTR") == 0) {
842:
843: short tres = tvexpr (data);
844:
845: if (tres == TRUE) {
846: en_revstrf = 1;
847: }
848: else {
849: en_revstrf = 0;
850: }
851:
852: symtab_shm (set_sym, kbuf, data);
853:
854: merr_clear ();
855: goto done;
856:
857: }
858: else if (strcmp (mref_get_subscript (r, 1), "ZDATE_FORMAT") == 0) {
859: symtab_shm (set_sym, key, data);
860: merr_clear ();
861: goto done;
862:
863: }
864: else if (strcmp (mref_get_subscript (r, 1), "ZTIME_FORMAT") == 0) {
865: symtab_shm (set_sym, key, data);
866: merr_clear ();
867: goto done;
868:
869: }
870: else if (strcmp (mref_get_subscript (r, 1), "SYMTAB") == 0) {
871:
872: int itmp = atoi (data);
873:
874: if ((data[0] < '0') || (data[0] > '9')) {
875: merr_raise (INVEXPR);
876: goto done;
877: }
878:
879: if (itmp != 0 && itmp != 1) {
880: merr_raise (INVEXPR);
881: goto done;
882: }
883:
884: if (cur_symtab == itmp) {
885: merr_clear ();
886: goto done;
887: }
888:
889: if (cur_symtab == 0) {
890: cur_symtab = 1;
891: }
892: else {
893: cur_symtab = 0;
894: }
895:
896: if (apartition == NULL) {
897:
898: apartition = calloc ((unsigned) PSIZE + 1, 1);
899: asymlen = PSIZE;
900:
901: for (i = 0; i < 128; i++) aalphptr[i] = 0L;
902:
903: }
904:
905: {
906:
907: char *x;
908:
909: x = apartition;
910: apartition = partition;
911: partition = x;
912:
913: }
914:
915: ch = asymlen;
916: asymlen = symlen;
917: symlen = ch;
918:
919: for (i = 0; i < 128; i++) {
920: ch = aalphptr[i];
921: aalphptr[i] = alphptr[i];
922: alphptr[i] = ch;
923: }
924:
925: s = &partition[symlen] - 256; /* pointer to symlen_offset */
926: argptr = partition; /* pointer to beg of tmp-storage */
927:
928: symtab_shm (set_sym, key, data);
929:
930: merr_clear ();
931: goto done;
932:
933:
934: }
935: else if (strcmp (mref_get_subscript (r, 1), "MATH") == 0) {
936:
937: #if !defined(_AIX)
938: if (stcmp (data, "IEEE754\201") == 0) {
939:
940: fp_mode = 1;
941: symtab_shm (set_sym, kbuf, data);
942:
943: snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
944: zprecise = DBL_DIG;
945:
946: merr_clear ();
947: goto done;
948:
949: }
950: else if (stcmp (data, "FIXED\201") == 0) {
951:
952: fp_mode = 0;
953: symtab_shm (set_sym, kbuf, data);
954:
955: zprecise = 100;
956:
957: merr_clear ();
958: goto done;
959:
960: }
961: else {
962: merr_raise (M29);
963: goto done;
964: }
965: #endif
966:
967: }
968:
969: merr_raise (M29);
970: goto done;
971: }
972:
973: case get_sym:
974: if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
975: stcpy (data, l_o_val);
976: goto done;
977: }
978: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
979: stcpy (data, g_o_val);
980: goto done;
981: }
982: case fra_dat:
983: case fra_order:
984: case fra_query:
985: if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
986: merr_raise (M38);
987: goto done;
988: }
989: if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
990: merr_raise (M38);
991: goto done;
992: }
993: case bigquery:
994: case getnext:
995: case m_alias:
996: case zdata:
997:
998: if (action == get_sym) {
999:
1000: if (strcmp (mref_get_subscript (r, 1), "PROCESS_START") == 0) {
1001:
1002: unsigned long ilong;
1003: unsigned long ilong1;
1004:
1005: ilong1 = slot->start_time + tzoffset;
1006: ilong = ilong1 / 86400;
1007:
1008: lintstr (data, ilong + 47117);
1009: i = stlen (data);
1010:
1011: data[i++] = ',';
1012: ilong = ilong1 - (ilong * 86400);
1013:
1014: lintstr (&data[i], ilong);
1015:
1016: merr_clear ();
1017: goto done;
1018:
1019: }
1020:
1021: }
1022:
1023: symtab_shm (action, kbuf, data);
1024:
1025: /* here, we need to convert the data on the way out too */
1026: if ((action == fra_query) && (stlen (data) > 0)) {
1027: if (strncmp (data, "^$JOB", 5) != 0) {
1028: snprintf (kbuf, STRLEN - 1, "^$JOB%s\201", data);
1029: stcpy (data, kbuf);
1030: }
1031: }
1032:
1033: merr_clear ();
1034: goto done;
1035:
1036: case killone:
1037: case kill_sym:
1038:
1039: if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
1040:
1041: symtab_shm (action, key, data);
1042:
1043: goto done;
1044:
1045: }
1046: else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
1047: l_o_val[0] = '\201';
1048: merr_clear ();
1049: goto done;
1050: }
1051: else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
1052: g_o_val[0] = '\201';
1053: merr_clear ();
1054: goto done;
1055: }
1056: else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
1057: gvndefault[0] = '\201';
1058: symtab_shm (action, key, data);
1059: symtab_shm (set_sym, key, gvndefault);
1060: merr_clear ();
1061: goto done;
1062: }
1063: else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
1064: lvndefault[0] = '\201';
1065: symtab_shm (action, key, data);
1066: symtab_shm (set_sym, key, lvndefault);
1067: merr_clear ();
1068: goto done;
1069: }
1070: else {
1071: job_request_stop (t_pid);
1072: }
1073:
1074: goto done;
1075:
1076:
1077: default:
1078: merr_raise (INVREF);
1079: goto done;
1080:
1081: }
1082:
1083:
1084: done:
1085:
1086: free (r);
1087: free (kbuf);
1088: free (tbuf);
1089: free (key);
1090: return;
1091: }
1092:
1093: void frm_process_alias (char *key)
1094: {
1095: int ierr_sav;
1096: char *ptr;
1097: char name[256];
1098: char *subprt;
1099: register int i;
1100: register char ch;
1101:
1102: char *k_buf;
1103: char *d_buf;
1104: char *t_buf;
1105:
1106: k_buf = (char *) malloc (STRLEN * sizeof (char));
1107: NULLPTRCHK(k_buf,"frm_process_alias");
1108:
1109: d_buf = (char *) malloc (STRLEN * sizeof (char));
1110: NULLPTRCHK(d_buf,"frm_process_alias");
1111:
1112: t_buf = (char *) malloc (STRLEN * sizeof (char));
1113: NULLPTRCHK(t_buf,"frm_process_alias");
1114:
1115: ierr_sav = ierr;
1116: ptr = key;
1117: i = 0;
1118:
1119: while ((ch = *(ptr++)) != DELIM && ch != EOL && i < 256) {
1120: name[i++] = ch;
1121: }
1122:
1123: name[i] = '\0';
1124: subprt = key + i;
1125:
1126: snprintf (k_buf, STRLEN - 1, "^$JOB\202%ld\202ALIASES\202%s\201", (long) pid, name);
1127: symtab_shm (get_sym, k_buf, d_buf);
1128:
1129: stcnv_m2c (d_buf);
1130:
1131: if (merr () == OK) {
1132: snprintf (t_buf, STRLEN - 1, "%s%s\201", d_buf, subprt);
1133: stcpy (key, t_buf);
1134: }
1135:
1136: free (k_buf);
1137: free (d_buf);
1138: free (t_buf);
1139:
1140: merr_raise (ierr_sav);
1141:
1142: return;
1143:
1144: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>