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