File:  [Coherent Logic Development] / freem / src / ssvn_system.c
Revision 1.7: download - view: text, annotated - select for diffs
Sun Apr 13 04:22:43 2025 UTC (3 months, 2 weeks ago) by snw
Branches: MAIN
CVS tags: HEAD
Fix snprintf calls

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>