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