Annotation of freem/src/ssvn_system.c, revision 1.1.1.1
1.1 snw 1: /*
2: * *
3: * * *
4: * * *
5: * ***************
6: * * * * *
7: * * MUMPS *
8: * * * * *
9: * ***************
10: * * *
11: * * *
12: * *
13: *
14: * ssvn_system.c
15: * ^$SYSTEM ssv
16: *
17: *
18: * Author: Serena Willis <jpw@coherent-logic.com>
19: * Copyright (C) 1998 MUG Deutschland
20: * Copyright (C) 2020 Coherent Logic Development LLC
21: *
22: *
23: * This file is part of FreeM.
24: *
25: * FreeM is free software: you can redistribute it and/or modify
26: * it under the terms of the GNU Affero Public License as published by
27: * the Free Software Foundation, either version 3 of the License, or
28: * (at your option) any later version.
29: *
30: * FreeM is distributed in the hope that it will be useful,
31: * but WITHOUT ANY WARRANTY; without even the implied warranty of
32: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33: * GNU Affero Public License for more details.
34: *
35: * You should have received a copy of the GNU Affero Public License
36: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
37: *
38: **/
39:
40: #include <inttypes.h>
41: #include <stdio.h>
42: #include <stdlib.h>
43: #include <string.h>
44: #if defined(HAVE_STDINT_H)
45: # include <stdint.h>
46: #endif
47: #include "mref.h"
48: #include "mpsdef.h"
49: #include "shmmgr.h"
50: #include "iniconf.h"
51:
52: void ssvn_system_set(char *sub)
53: {
54: char k_buf[255];
55: char d_buf[255];
56:
57: d_buf[0] = '\201';
58: d_buf[1] = '\201';
59: snprintf (k_buf, 254, "^$SYSTEM\202%s\201", sub);
60:
61: symtab_shm (set_sym, k_buf, d_buf);
62:
63: }
64:
65: void ssvn_system_update(void)
66: {
67: FILE *fp;
68: char line[255];
69: char line_ns[255];
70:
71: char k_buf[255];
72: char d_buf[255];
73:
74: ssvn_system_set ("MAPPINGS");
75: ssvn_system_set ("MAINTENANCE_MODE");
76: ssvn_system_set ("DAEMON_PID");
77: ssvn_system_set ("MWAPI");
78: ssvn_system_set ("EVENT");
79: ssvn_system_set ("ERRMSG");
80: ssvn_system_set ("NAME_LENGTH");
81: ssvn_system_set ("DEFPSIZE");
82: ssvn_system_set ("DEFUDFSVSIZ");
83: ssvn_system_set ("DEFNSIZE");
84: ssvn_system_set ("MAXNO_OF_RBUF");
85: ssvn_system_set ("DEFNO_OF_RBUF");
86: ssvn_system_set ("DEFPSIZE0");
87: ssvn_system_set ("NO_GLOBLS");
88: ssvn_system_set ("NO_OF_GBUF");
89: ssvn_system_set ("NESTLEVLS");
90: ssvn_system_set ("PARDEPTH");
91: ssvn_system_set ("PATDEPTH");
92: ssvn_system_set ("TRLIM");
93: ssvn_system_set ("ARGS_IN_ESC");
94: ssvn_system_set ("ZTLEN");
95: ssvn_system_set ("FUNLEN");
96: ssvn_system_set ("STRING_MAX");
97: ssvn_system_set ("$NEXTOK");
98: ssvn_system_set ("EOK");
99: ssvn_system_set ("OFFOK");
100: ssvn_system_set ("BIG_ENDIAN");
101: ssvn_system_set ("ZDATE_FORMAT");
102: ssvn_system_set ("ZTIME_FORMAT");
103:
104: fp = fopen (config_file, "r");
105:
106: while (fgets (line, 254, fp) != NULL) {
107:
108: if (line[0] == '[') {
109: strcpy (line_ns, line + 1);
110: line_ns[strlen (line_ns) - 2] = '\0';
111:
112: snprintf (k_buf, 254, "^$SYSTEM\202NAMESPACE\202%s\201", line_ns);
113: symtab_shm (set_sym, k_buf, "\201");
114: }
115:
116: }
117:
118: fclose (fp);
119:
120: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202TERMINAL\201");
121: snprintf (d_buf, 254, "0,0\201");
122: symtab_shm (set_sym, k_buf, d_buf);
123:
124: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202FILE\201");
125: snprintf (d_buf, 254, "1,%d\201", FIRSTSCK - 1);
126: symtab_shm (set_sym, k_buf, d_buf);
127:
128: snprintf (k_buf, 254, "^$SYSTEM\202CHANNELS\202SOCKET\201");
129: snprintf (d_buf, 254, "%d,%d\201", FIRSTSCK, MAXDEV - 1);
130: symtab_shm (set_sym, k_buf, d_buf);
131:
132: ssvn_job_update ();
133:
134: }
135:
136: void ssvn_system(short action, char *key, char *data)
137: {
138:
139: freem_ref_t *r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
140: NULLPTRCHK(r,"ssvn_system");
141:
142: mref_init (r, MREF_RT_SSV, "^$SYSTEM");
143: internal_to_mref (r, key);
144:
145: if ((r->subscript_count > 2) && (strcmp (r->subscripts[0], "EVENT") != 0) && (strcmp (r->subscripts[0], "MAPPINGS") != 0)) {
146: merr_raise (INVREF);
147: goto done;
148: }
149:
150: switch (action) {
151:
152: case get_sym:
153:
154: if (strcmp (r->subscripts[0], "NAMESPACE") == 0) {
155:
156: symtab_shm (action, key, data);
157: merr_clear ();
158: break;
159:
160: }
161: else if (strcmp (r->subscripts[0], "MAPPINGS") == 0) {
162:
163: if ((strcmp (r->subscripts[1], "GLOBAL") == 0) || (strcmp (r->subscripts[1], "ROUTINE") == 0)) {
164:
165: merr_clear ();
166: symtab_shm (action, key, data);
167:
168: break;
169:
170: }
171: else {
172:
173: merr_raise (M38);
174: break;
175:
176: }
177:
178: }
179: else if (strcmp (r->subscripts[0], "ENVIRONMENT") == 0) {
180: char varnam[255];
181: char res[255];
182: char *e;
183:
184: strcpy (varnam, r->subscripts[1]);
185:
186: e = getenv (varnam);
187:
188: if (e == NULL) {
189: sprintf (data, "\201");
190: break;
191: }
192: else {
193: strcpy (res, e);
194: stcnv_c2m (res);
195: stcpy (data, res);
196: }
197:
198: break;
199: }
200: else if (strcmp (r->subscripts[0], "MAINTENANCE_MODE") == 0) {
201:
202: snprintf (data, 511, "%d\201", shm_config->hdr->maintenance_mode);
203: merr_clear ();
204: break;
205:
206: }
207: else if (strcmp (r->subscripts[0], "DAEMON_PID") == 0) {
208:
209: snprintf (data, 511, "%d\201", shm_config->hdr->first_process);
210: merr_clear ();
211: break;
212:
213: }
214: else if (strcmp (r->subscripts[0], "MWAPI") == 0) {
215:
216: #if defined(MWAPI_GTK)
217: snprintf (data, 511, "1\201");
218: #else
219: snprintf (data, 511, "0\201");
220: #endif
221: merr_clear ();
222: break;
223:
224: }
225: else if (strcmp (r->subscripts[0], "EVENT") == 0) {
226:
227: symtab_shm (action, key, data);
228: merr_clear ();
229: break;
230:
231: }
232: else if (strcmp (r->subscripts[0], "ERRMSG") == 0) {
233:
234: int errnum;
235:
236: errnum = merr_code_to_num (r->subscripts[1]);
237:
238: if (errnum == -1) {
239: merr_raise (M38);
240: break;
241: }
242:
243: sprintf (data, errmes[errnum]);
244: merr_clear ();
245: break;
246:
247: }
248: else if (strcmp (r->subscripts[0], "NAME_LENGTH") == 0) {
249:
250: sprintf (data, "255\201");
251: merr_clear ();
252: break;
253:
254: }
255: else if (strcmp (r->subscripts[0], "DEFPSIZE") == 0) {
256: sprintf (data, "%ld\201", DEFPSIZE);
257: merr_clear ();
258: break;
259: }
260: else if (strcmp (r->subscripts[0], "DEFUDFSVSIZ") == 0) {
261: sprintf (data, "%ld\201", DEFUDFSVSIZ);
262: merr_clear ();
263: break;
264: }
265: else if (strcmp (r->subscripts[0], "DEFNSIZE") == 0) {
266: sprintf (data, "%ld\201", DEFNSIZE);
267: merr_clear ();
268: break;
269: }
270: else if (strcmp (r->subscripts[0], "MAXNO_OF_RBUF") == 0) {
271: sprintf (data, "%ld\201", MAXNO_OF_RBUF);
272: merr_clear ();
273: break;
274: }
275: else if (strcmp (r->subscripts[0], "DEFNO_OF_RBUF") == 0) {
276: sprintf (data, "%ld\201", DEFNO_OF_RBUF);
277: merr_clear ();
278: break;
279: }
280: else if (strcmp (r->subscripts[0], "DEFPSIZE0") == 0) {
281: sprintf (data, "%ld\201", DEFPSIZE0);
282: merr_clear ();
283: break;
284: }
285: else if (strcmp (r->subscripts[0], "NO_GLOBLS") == 0) {
286: sprintf (data, "%ld\201", NO_GLOBLS);
287: merr_clear ();
288: break;
289: }
290: else if (strcmp (r->subscripts[0], "NO_OF_GBUF") == 0) {
291: sprintf (data, "%ld\201", NO_OF_GBUF);
292: merr_clear ();
293: break;
294: }
295: else if (strcmp (r->subscripts[0], "NESTLEVLS") == 0) {
296: sprintf (data, "%ld\201", NESTLEVLS);
297: merr_clear ();
298: break;
299: }
300: else if (strcmp (r->subscripts[0], "PARDEPTH") == 0) {
301: sprintf (data, "%ld\201", PARDEPTH);
302: merr_clear ();
303: break;
304: }
305: else if (strcmp (r->subscripts[0], "PATDEPTH") == 0) {
306: sprintf (data, "%ld\201", PATDEPTH);
307: merr_clear ();
308: break;
309: }
310: else if (strcmp (r->subscripts[0], "TRLIM") == 0) {
311: sprintf (data, "%ld\201", TRLIM);
312: merr_clear ();
313: break;
314: }
315: else if (strcmp (r->subscripts[0], "ARGS_IN_ESC") == 0) {
316: sprintf (data, "%ld\201", ARGS_IN_ESC);
317: merr_clear ();
318: break;
319: }
320: else if (strcmp (r->subscripts[0], "ZTLEN") == 0) {
321: sprintf (data, "%ld\201", ZTLEN);
322: merr_clear ();
323: break;
324: }
325: else if (strcmp (r->subscripts[0], "FUNLEN") == 0) {
326: sprintf (data, "%ld\201", FUNLEN);
327: merr_clear ();
328: break;
329: }
330: else if (strcmp (r->subscripts[0], "STRING_MAX") == 0) {
331:
332: sprintf (data, "%ld\201", STRLEN);
333: merr_clear ();
334: break;
335:
336: }
337: else if (strcmp (r->subscripts[0], "$NEXTOK") == 0) {
338:
339: sprintf (data, "1\201");
340: merr_clear ();
341: break;
342:
343: }
344: else if (strcmp (r->subscripts[0], "EOK") == 0) {
345:
346: sprintf (data, "1\201");
347: merr_clear ();
348: break;
349:
350: }
351: else if (strcmp (r->subscripts[0], "OFFOK") == 0) {
352:
353: sprintf (data, "1\201");
354: merr_clear ();
355: break;
356:
357: }
358: else if (strcmp (r->subscripts[0], "BIG_ENDIAN") == 0) {
359:
360: #if defined(HAVE_STDINT_H)
361: volatile uint32_t i = 0x01234567;
362:
363: if ((*((uint8_t*)(&i)) == 0x67) == 0) {
364: sprintf (data, "1\201");
365: }
366: else {
367: sprintf (data, "0\201");
368: }
369:
370: merr_clear ();
371: break;
372: #else
373: merr_raise (M29);
374: goto done;
375: #endif
376: }
377: else if (strcmp (r->subscripts[0], "ZDATE_FORMAT") == 0) {
378: get_conf ("SYSTEM", "zdate_format", data);
379: stcnv_c2m (data);
380:
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:
440: case dat:
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>