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