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