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>