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>