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