Annotation of freem/src/ssvn_system.c, revision 1.6
1.1 snw 1: /*
1.6 ! snw 2: * $Id: ssvn_system.c,v 1.5 2025/03/24 04:13:11 snw Exp $
1.4 snw 3: * ^$SYSTEM 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_system.c,v $
1.6 ! snw 27: * Revision 1.5 2025/03/24 04:13:11 snw
! 28: * Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
! 29: *
1.5 snw 30: * Revision 1.4 2025/03/09 19:50:47 snw
31: * Second phase of REUSE compliance and header reformat
32: *
1.4 snw 33: *
34: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
35: * SPDX-License-Identifier: AGPL-3.0-or-later
1.1 snw 36: **/
37:
38: #include <inttypes.h>
39: #include <stdio.h>
40: #include <stdlib.h>
41: #include <string.h>
42: #if defined(HAVE_STDINT_H)
43: # include <stdint.h>
44: #endif
45: #include "mref.h"
46: #include "mpsdef.h"
47: #include "shmmgr.h"
48: #include "iniconf.h"
49:
50: void ssvn_system_set(char *sub)
51: {
52: char k_buf[255];
53: char d_buf[255];
54:
55: d_buf[0] = '\201';
56: d_buf[1] = '\201';
57: snprintf (k_buf, 254, "^$SYSTEM\202%s\201", sub);
58:
59: symtab_shm (set_sym, k_buf, d_buf);
60:
61: }
62:
63: void ssvn_system_update(void)
64: {
65: FILE *fp;
66: char line[255];
67: char line_ns[255];
68:
69: char k_buf[255];
70: char d_buf[255];
71:
72: ssvn_system_set ("MAPPINGS");
73: ssvn_system_set ("MAINTENANCE_MODE");
74: ssvn_system_set ("DAEMON_PID");
75: ssvn_system_set ("MWAPI");
76: ssvn_system_set ("EVENT");
77: ssvn_system_set ("ERRMSG");
78: ssvn_system_set ("NAME_LENGTH");
79: ssvn_system_set ("DEFPSIZE");
80: ssvn_system_set ("DEFUDFSVSIZ");
81: ssvn_system_set ("DEFNSIZE");
82: ssvn_system_set ("MAXNO_OF_RBUF");
83: ssvn_system_set ("DEFNO_OF_RBUF");
84: ssvn_system_set ("DEFPSIZE0");
85: ssvn_system_set ("NO_GLOBLS");
86: ssvn_system_set ("NO_OF_GBUF");
87: ssvn_system_set ("NESTLEVLS");
88: ssvn_system_set ("PARDEPTH");
89: ssvn_system_set ("PATDEPTH");
90: ssvn_system_set ("TRLIM");
91: ssvn_system_set ("ARGS_IN_ESC");
92: ssvn_system_set ("ZTLEN");
93: ssvn_system_set ("FUNLEN");
94: ssvn_system_set ("STRING_MAX");
95: ssvn_system_set ("$NEXTOK");
96: ssvn_system_set ("EOK");
97: ssvn_system_set ("OFFOK");
98: ssvn_system_set ("BIG_ENDIAN");
99: ssvn_system_set ("ZDATE_FORMAT");
100: ssvn_system_set ("ZTIME_FORMAT");
101:
102: fp = fopen (config_file, "r");
103:
104: while (fgets (line, 254, fp) != NULL) {
105:
106: if (line[0] == '[') {
107: strcpy (line_ns, line + 1);
108: line_ns[strlen (line_ns) - 2] = '\0';
109:
110: snprintf (k_buf, 254, "^$SYSTEM\202NAMESPACE\202%s\201", line_ns);
111: symtab_shm (set_sym, k_buf, "\201");
112: }
113:
114: }
115:
116: fclose (fp);
117:
118: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202TERMINAL\201");
119: snprintf (d_buf, 254, "0,0\201");
120: symtab_shm (set_sym, k_buf, d_buf);
121:
122: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202FILE\201");
123: snprintf (d_buf, 254, "1,%d\201", FIRSTSCK - 1);
124: symtab_shm (set_sym, k_buf, d_buf);
125:
126: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202SOCKET\201");
127: snprintf (d_buf, 254, "%d,%d\201", FIRSTSCK, MAXDEV - 1);
128: symtab_shm (set_sym, k_buf, d_buf);
129:
130: ssvn_job_update ();
131:
132: }
133:
134: void ssvn_system(short action, char *key, char *data)
135: {
136:
137: freem_ref_t *r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
138: NULLPTRCHK(r,"ssvn_system");
139:
140: mref_init (r, MREF_RT_SSV, "^$SYSTEM");
141: internal_to_mref (r, key);
142:
143: if ((r->subscript_count > 2) && (strcmp (r->subscripts[0], "EVENT") != 0) && (strcmp (r->subscripts[0], "MAPPINGS") != 0)) {
144: merr_raise (INVREF);
145: goto done;
146: }
147:
148: switch (action) {
149:
150: case get_sym:
151:
152: if (strcmp (r->subscripts[0], "NAMESPACE") == 0) {
153:
154: symtab_shm (action, key, data);
155: merr_clear ();
156: break;
157:
158: }
159: else if (strcmp (r->subscripts[0], "MAPPINGS") == 0) {
160:
161: if ((strcmp (r->subscripts[1], "GLOBAL") == 0) || (strcmp (r->subscripts[1], "ROUTINE") == 0)) {
162:
163: merr_clear ();
164: symtab_shm (action, key, data);
165:
166: break;
167:
168: }
169: else {
170:
171: merr_raise (M38);
172: break;
173:
174: }
175:
176: }
177: else if (strcmp (r->subscripts[0], "ENVIRONMENT") == 0) {
178: char varnam[255];
179: char res[255];
180: char *e;
181:
182: strcpy (varnam, r->subscripts[1]);
183:
184: e = getenv (varnam);
185:
186: if (e == NULL) {
187: sprintf (data, "\201");
188: break;
189: }
190: else {
191: strcpy (res, e);
192: stcnv_c2m (res);
193: stcpy (data, res);
194: }
195:
196: break;
197: }
198: else if (strcmp (r->subscripts[0], "MAINTENANCE_MODE") == 0) {
199:
200: snprintf (data, 511, "%d\201", shm_config->hdr->maintenance_mode);
201: merr_clear ();
202: break;
203:
204: }
205: else if (strcmp (r->subscripts[0], "DAEMON_PID") == 0) {
206:
207: snprintf (data, 511, "%d\201", shm_config->hdr->first_process);
208: merr_clear ();
209: break;
210:
211: }
212: else if (strcmp (r->subscripts[0], "MWAPI") == 0) {
213:
214: #if defined(MWAPI_GTK)
215: snprintf (data, 511, "1\201");
216: #else
217: snprintf (data, 511, "0\201");
218: #endif
219: merr_clear ();
220: break;
221:
222: }
223: else if (strcmp (r->subscripts[0], "EVENT") == 0) {
224:
225: symtab_shm (action, key, data);
226: merr_clear ();
227: break;
228:
229: }
230: else if (strcmp (r->subscripts[0], "ERRMSG") == 0) {
231:
232: int errnum;
233:
234: errnum = merr_code_to_num (r->subscripts[1]);
235:
236: if (errnum == -1) {
237: merr_raise (M38);
238: break;
239: }
240:
1.2 snw 241: sprintf (data, "%s", errmes[errnum]);
1.1 snw 242: merr_clear ();
243: break;
244:
245: }
246: else if (strcmp (r->subscripts[0], "NAME_LENGTH") == 0) {
247:
248: sprintf (data, "255\201");
249: merr_clear ();
250: break;
251:
252: }
253: else if (strcmp (r->subscripts[0], "DEFPSIZE") == 0) {
254: sprintf (data, "%ld\201", DEFPSIZE);
255: merr_clear ();
256: break;
257: }
258: else if (strcmp (r->subscripts[0], "DEFUDFSVSIZ") == 0) {
1.2 snw 259: sprintf (data, "%ld\201", (long) DEFUDFSVSIZ);
1.1 snw 260: merr_clear ();
261: break;
262: }
263: else if (strcmp (r->subscripts[0], "DEFNSIZE") == 0) {
1.2 snw 264: sprintf (data, "%ld\201", (long) DEFNSIZE);
1.1 snw 265: merr_clear ();
266: break;
267: }
268: else if (strcmp (r->subscripts[0], "MAXNO_OF_RBUF") == 0) {
1.2 snw 269: sprintf (data, "%d\201", MAXNO_OF_RBUF);
1.1 snw 270: merr_clear ();
271: break;
272: }
273: else if (strcmp (r->subscripts[0], "DEFNO_OF_RBUF") == 0) {
1.2 snw 274: sprintf (data, "%ld\201", (long) DEFNO_OF_RBUF);
1.1 snw 275: merr_clear ();
276: break;
277: }
278: else if (strcmp (r->subscripts[0], "DEFPSIZE0") == 0) {
1.2 snw 279: sprintf (data, "%d\201", DEFPSIZE0);
1.1 snw 280: merr_clear ();
281: break;
282: }
283: else if (strcmp (r->subscripts[0], "NO_GLOBLS") == 0) {
1.2 snw 284: sprintf (data, "%d\201", NO_GLOBLS);
1.1 snw 285: merr_clear ();
286: break;
287: }
288: else if (strcmp (r->subscripts[0], "NO_OF_GBUF") == 0) {
1.2 snw 289: sprintf (data, "%d\201", NO_OF_GBUF);
1.1 snw 290: merr_clear ();
291: break;
292: }
293: else if (strcmp (r->subscripts[0], "NESTLEVLS") == 0) {
1.2 snw 294: sprintf (data, "%d\201", NESTLEVLS);
1.1 snw 295: merr_clear ();
296: break;
297: }
298: else if (strcmp (r->subscripts[0], "PARDEPTH") == 0) {
1.2 snw 299: sprintf (data, "%d\201", PARDEPTH);
1.1 snw 300: merr_clear ();
301: break;
302: }
303: else if (strcmp (r->subscripts[0], "PATDEPTH") == 0) {
1.2 snw 304: sprintf (data, "%d\201", PATDEPTH);
1.1 snw 305: merr_clear ();
306: break;
307: }
308: else if (strcmp (r->subscripts[0], "TRLIM") == 0) {
1.2 snw 309: sprintf (data, "%d\201", TRLIM);
1.1 snw 310: merr_clear ();
311: break;
312: }
313: else if (strcmp (r->subscripts[0], "ARGS_IN_ESC") == 0) {
1.2 snw 314: sprintf (data, "%d\201", ARGS_IN_ESC);
1.1 snw 315: merr_clear ();
316: break;
317: }
318: else if (strcmp (r->subscripts[0], "ZTLEN") == 0) {
1.2 snw 319: sprintf (data, "%d\201", ZTLEN);
1.1 snw 320: merr_clear ();
321: break;
322: }
323: else if (strcmp (r->subscripts[0], "FUNLEN") == 0) {
1.2 snw 324: sprintf (data, "%d\201", FUNLEN);
1.1 snw 325: merr_clear ();
326: break;
327: }
328: else if (strcmp (r->subscripts[0], "STRING_MAX") == 0) {
329:
1.2 snw 330: sprintf (data, "%d\201", STRLEN);
1.1 snw 331: merr_clear ();
332: break;
333:
334: }
335: else if (strcmp (r->subscripts[0], "$NEXTOK") == 0) {
336:
337: sprintf (data, "1\201");
338: merr_clear ();
339: break;
340:
341: }
342: else if (strcmp (r->subscripts[0], "EOK") == 0) {
343:
344: sprintf (data, "1\201");
345: merr_clear ();
346: break;
347:
348: }
349: else if (strcmp (r->subscripts[0], "OFFOK") == 0) {
350:
351: sprintf (data, "1\201");
352: merr_clear ();
353: break;
354:
355: }
356: else if (strcmp (r->subscripts[0], "BIG_ENDIAN") == 0) {
357:
358: #if defined(HAVE_STDINT_H)
359: volatile uint32_t i = 0x01234567;
360:
361: if ((*((uint8_t*)(&i)) == 0x67) == 0) {
362: sprintf (data, "1\201");
363: }
364: else {
365: sprintf (data, "0\201");
366: }
367:
368: merr_clear ();
369: break;
370: #else
371: merr_raise (M29);
372: goto done;
373: #endif
374: }
375: else if (strcmp (r->subscripts[0], "ZDATE_FORMAT") == 0) {
376: get_conf ("SYSTEM", "zdate_format", data);
1.6 ! snw 377: stcnv_c2m (data);
1.1 snw 378:
379: break;
380: }
381: else if (strcmp (r->subscripts[0], "ZTIME_FORMAT") == 0) {
382: get_conf ("SYSTEM", "ztime_format", data);
383: stcnv_c2m (data);
384:
385: break;
386: }
387: else if (strcmp (r->subscripts[0], "CHANNELS") == 0) {
388: symtab_shm (action, key, data);
389: break;
390: }
391: /*
392: else {
393: symtab_shm (action, key, data);
394: break;
395: }
396: */
397:
398: merr_raise (M29);
399: goto done;
400:
401: case bigquery:
402: case fra_query:
403: case fra_order:
404: /*
405: if (strcmp (r->subscripts[0], "NAMESPACE") != 0) {
406: merr_raise (M29);
407: goto done;
408: }
409: */
410:
411: symtab_shm (action, key, data);
412: merr_clear ();
413: goto done;
414:
415: case kill_sym:
416: case set_sym:
417: if ((strcmp (r->subscripts[0], "MAINTENANCE_MODE") == 0) && (action == set_sym)) {
418: shm_config->hdr->maintenance_mode = tvexpr (data);
419: merr_clear ();
420: goto done;
421: }
422:
423: if ((strcmp (r->subscripts[0], "EVENT") != 0) && (strcmp (r->subscripts[0], "MAPPINGS") != 0)) {
424: merr_raise (M29);
425: goto done;
426: }
427:
428: if ((strcmp (r->subscripts[0], "MAPPINGS") == 0) && ((strcmp (r->subscripts[1], "GLOBAL") != 0) && (strcmp (r->subscripts[1], "ROUTINE") != 0))) {
429: merr_raise (M38);
430: goto done;
431: }
432:
433: symtab_shm (action, key, data);
434: merr_clear ();
435: goto done;
436:
1.5 snw 437: case fra_dat:
1.1 snw 438: symtab_shm (action, key, data);
439: merr_clear ();
440: goto done;
441:
442: default:
443: merr_raise (INVREF);
444: break;
445:
446: }
447:
448: done:
449:
450: free (r);
451:
452: return;
453: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>