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