Annotation of freem/src/namespace.c, revision 1.1.1.1

1.1       snw         1: /*
                      2:  *                            *
                      3:  *                           * *
                      4:  *                          *   *
                      5:  *                     ***************
                      6:  *                      * *       * *
                      7:  *                       *  MUMPS  *
                      8:  *                      * *       * *
                      9:  *                     ***************
                     10:  *                          *   *
                     11:  *                           * *
                     12:  *                            *
                     13:  *
                     14:  *   namespace.c
                     15:  *    Namespace support
                     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 <stddef.h>
                     41: #include <stdio.h>
                     42: #include <string.h>
                     43: #include <unistd.h>
                     44: #include <stdlib.h>
                     45: 
                     46: #include "mpsdef.h"
                     47: #include "iniconf.h"
                     48: #include "journal.h"
                     49: #include "init.h"
                     50: #include "namespace.h"
                     51: 
                     52: #include <limits.h>
                     53: 
                     54: #if !defined(PATH_MAX) && defined(_SCO_DS)
                     55: # define PATH_MAX 4096
                     56: #endif
                     57: 
                     58: #if !defined(PATH_MAX) && defined(__gnu_hurd__)
                     59: # define PATH_MAX 1024
                     60: #endif
                     61: 
                     62: #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
                     63: # include <sys/syslimits.h>
                     64: #endif
                     65: 
                     66: #define LOCK        'l'
                     67: #define ZDEALLOCATE 'D'
                     68: 
                     69: void ns_error(char *ns, char *e)
                     70: {
                     71:     char msg_buf[256];
                     72: 
                     73:     snprintf(msg_buf, 256, "error switching to namespace '%s': %s (possibly a configuration error?)\r\n\201", ns, e);
                     74:     write_m(msg_buf);
                     75: 
                     76:     return;
                     77: }
                     78: 
                     79: void set_namespace(char *ns, int verbose)
                     80: {
                     81:     register int i;
                     82:     
                     83:     char tmps[256];
                     84: 
                     85:     char notif[256];
                     86:     char ns_m[256];
                     87:     char ns_buf[PATH_MAX];
                     88: 
                     89:     char jour_file[PATH_MAX];
                     90: 
                     91:     unsigned long cut_threshold = 1073741824; /* default journal cut threshold of 1GiB */
                     92:         
                     93:     strncpy (ns_m, ns, 256 - 1);
                     94:     stcnv_c2m (ns_m);
                     95: 
                     96:  
                     97:     /* get the root directory of the namespace */
                     98:     get_conf (ns, "root", nsroot);
                     99: 
                    100:     if(!file_exists (config_file)) {
                    101:         snprintf (tmps, 256, "configuration file '%s' does not exist.\n", config_file);
                    102:         ns_error (ns, tmps);
                    103: 
                    104:         cleanup ();
                    105: 
                    106:         exit (1);
                    107:     }
                    108: 
                    109: 
                    110:     /* turn off all the old so-called "journal" implementation */
                    111:     ug_buf[HOME][0] = EOL;
                    112:     jour_flag = 0;
                    113:     jourfile[0] = NUL;
                    114: 
                    115:     /* the real journal file */
                    116:     jour_file[0] = NUL;
                    117: 
                    118: 
                    119:     /* only read journal config for SYSTEM namespace, as journaling
                    120:        is across all namespaces */
                    121:    
                    122:     /* clear private buffer */
                    123:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    124: 
                    125:     if(get_conf("SYSTEM", "journal_file", ns_buf) == TRUE) {
                    126:         strncpy (jour_file, ns_buf, PATH_MAX);
                    127:     }
                    128: 
                    129:     if(get_conf("SYSTEM", "journal_host_id", ns_buf) == TRUE) {
                    130:         strncpy (jour_hostid, ns_buf, 255);
                    131:     }
                    132:     else {
                    133:         strncpy (jour_hostid, "DEFAULT", 255);
                    134:     }
                    135: 
                    136:     if(get_conf("SYSTEM", "journal_cut_threshold", ns_buf) == TRUE) {
                    137:         cut_threshold = (unsigned long) strtol (ns_buf, NULL, 0);
                    138:     }
                    139: 
                    140:     /* clear private buffer */
                    141:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    142: 
                    143:     if(get_conf("SYSTEM", "journal_mode", ns_buf) == TRUE) {
                    144: 
                    145:         if(strcmp(ns_buf, "off") == 0) {            
                    146:             /* journaling is disabled */    
                    147:         }
                    148:         else if(strcmp(ns_buf, "on") == 0) {
                    149:             
                    150:             if (jour_file[0] == NUL) {
                    151:                 ns_error ("SYSTEM", "journal file undefined while trying to set journal mode");
                    152:                 goto jour_end;
                    153:             }
                    154: 
                    155:             jnl_init (jour_file, jour_hostid, cut_threshold, 0);
                    156: 
                    157:         }
                    158:         else {
                    159:             snprintf (tmps, 256, "invalid journal_mode '%s'", ns_buf);
                    160:             ns_error ("SYSTEM", tmps);
                    161: 
                    162:             goto jour_end;
                    163:         }
                    164: 
                    165:     }
                    166:     
                    167: 
                    168: jour_end:
                    169: 
                    170: 
                    171:     /* clear private buffer */
                    172:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    173: 
                    174:     /* set up percent routines -- always in SYSTEM */
                    175:     if(get_conf("SYSTEM", "routines_path", ns_buf) != TRUE) {
                    176:         ns_error("SYSTEM", "could not get routines_path"); 
                    177:     }
                    178:     else {   
                    179:         stcnv_c2m(ns_buf);
                    180:         stcpy(rou0plib, ns_buf); /* Set DO-GOTO-JOB % routine access path */
                    181:         stcpy(rou1plib, ns_buf); /* Set ZLOAD-ZSAVE % routine access path */
                    182: 
                    183:         /* clear %-routine buffer */
                    184:         for (i = 0; i < NO_OF_RBUF; i++) { 
                    185:             
                    186:             if (pgms[i][0] == '%') {
                    187:                 
                    188:                 if (rouptr != (buff + (i * PSIZE0))) { 
                    189:                     pgms[i][0] = EOL;
                    190:                     ages[i] = 0L;
                    191:                 }
                    192:             
                    193:                 path[i][0] = EOL;
                    194:             }   
                    195: 
                    196:         }
                    197:     } 
                    198: 
                    199:     /* clear private buffer */
                    200:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    201: 
                    202:     /* set up percent globals -- always in SYSTEM */
                    203:     if(get_conf("SYSTEM", "globals_path", ns_buf) != TRUE) {
                    204:         ns_error("SYSTEM", "could not get globals_path");
                    205:     }
                    206:     else {
                    207:         stcnv_c2m(ns_buf);
                    208:         stcpy(gloplib, ns_buf); /* Set % globals path */
                    209: 
                    210:         /* close % globals */
                    211:         for (i = 0; i < NO_GLOBLS; i++) {
                    212:          
                    213:             if (oldfil[i][0] == '%') {
                    214:                 
                    215:                 close (olddes[i]);
                    216:                 
                    217:                 usage[i] = 0;
                    218:                 olddes[i] = 0;
                    219:                 oldfil[i][0] = NUL;
                    220:             }
                    221:         
                    222:         }
                    223:     }
                    224: 
                    225: 
                    226:     /* set up global engines */
                    227:     /* SYSTEM */
                    228:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    229: 
                    230:     if(get_conf("SYSTEM", "global_engine", ns_buf) == TRUE) {
                    231:         global_set_engine ('s', ns_buf);
                    232:     }
                    233:     else {
                    234:         global_set_engine ('s', "BUILTIN");
                    235:     }
                    236: 
                    237:     /* primary namespace */
                    238:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    239: 
                    240:     if(get_conf(ns, "global_engine", ns_buf) == TRUE) {
                    241:         global_set_engine ('u', ns_buf);
                    242:     }
                    243:     else {
                    244:         global_set_engine ('u', "BUILTIN");
                    245:     }
                    246:     
                    247:     /* set up local engine */
                    248:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    249: 
                    250:     if(get_conf(ns, "local_engine", ns_buf) == TRUE) {
                    251:         sprintf(loc_engine, "%s", ns_buf);
                    252:     }
                    253:     else {
                    254:         sprintf(loc_engine, "BUILTIN");
                    255:     }
                    256: 
                    257:     
                    258:     /* clear private buffer */
                    259:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    260:     
                    261:     /* set up regular routines */
                    262:     if(get_conf(ns, "routines_path", ns_buf) != TRUE) {
                    263:         if (verbose) {
                    264:             ns_error(ns, "could not get routines_path");
                    265:         }
                    266:         else {
                    267:             merr_raise (M26);
                    268:             return;
                    269:         }
                    270:     }
                    271:     else {
                    272:         stcnv_c2m(ns_buf);
                    273:         stcpy(rou0path, ns_buf); /* Set DO-GOTO-JOB routine access path */
                    274:         stcpy(rou1path, ns_buf); /* Set ZLOAD-ZSAVE routine access path */
                    275: 
                    276:         /* clear routine buffer */
                    277:         for (i = 0; i < NO_OF_RBUF; i++) { 
                    278:             
                    279:             if (pgms[i][0] != '%') {
                    280:                 
                    281:                 if (rouptr != (buff + (i * PSIZE0))) { 
                    282:                     pgms[i][0] = EOL;
                    283:                     ages[i] = 0L;
                    284:                 }
                    285:             
                    286:                 path[i][0] = EOL;
                    287:             }   
                    288: 
                    289:         }
                    290:     }
                    291: 
                    292:     /* clear private buffer */
                    293:     for(i = 0; i < 256; i++) ns_buf[i] = NUL;
                    294: 
                    295:     /* set up regular globals */
                    296:     if (get_conf (ns, "globals_path", ns_buf) != TRUE) {
                    297:         if (verbose) {
                    298:             ns_error (ns, "could not get globals_path");
                    299:         }
                    300:         else {
                    301:             merr_raise (M26);
                    302:             return;
                    303:         }
                    304:     }
                    305:     else {
                    306:         stcnv_c2m (ns_buf);
                    307:         stcpy (glopath, ns_buf); /* Set globals path */ 
                    308: 
                    309:         /* close regular globals 
                    310:         for (i = 0; i < NO_GLOBLS; i++) {
                    311:          
                    312:             if (oldfil[i][0] != '%') {
                    313:                 
                    314:                 close (olddes[i]);
                    315:                 
                    316:                 usage[i] = 0;
                    317:                 olddes[i] = 0;
                    318:                 oldfil[i][0] = NUL;
                    319:             }
                    320:         
                    321:         }
                    322:         */
                    323:     }
                    324: 
                    325:     strcpy (nsname, ns);
                    326: 
                    327:     if (verbose == TRUE) {
                    328:         snprintf (notif, 256, "Namespace set to '%s'\r\n\201", ns);
                    329:         write_m (notif);
                    330:     }
                    331: 
                    332: }
                    333: 
                    334: short validate_namespace (char *nsn_v)
                    335: {
                    336:     char scratch[256];
                    337: 
                    338:     if (get_conf (nsn_v, "routines_path", scratch) == FALSE) return FALSE;
                    339:     if (get_conf (nsn_v, "globals_path", scratch) == FALSE) return FALSE;
                    340: 
                    341:     return TRUE;
                    342:     
                    343: }

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