File:  [Coherent Logic Development] / freem / src / ssvn_job.c
Revision 1.11: download - view: text, annotated - select for diffs
Mon Jun 23 20:53:30 2025 UTC (5 weeks, 5 days ago) by snw
Branches: MAIN
CVS tags: HEAD
Documentation updates

    1: /*
    2:  *   $Id: ssvn_job.c,v 1.11 2025/06/23 20:53:30 snw Exp $
    3:  *    ^$JOB 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_job.c,v $
   27:  *   Revision 1.11  2025/06/23 20:53:30  snw
   28:  *   Documentation updates
   29:  *
   30:  *   Revision 1.10  2025/04/28 19:38:55  snw
   31:  *   Add trace mode
   32:  *
   33:  *   Revision 1.9  2025/04/13 04:22:43  snw
   34:  *   Fix snprintf calls
   35:  *
   36:  *   Revision 1.8  2025/04/11 23:27:04  snw
   37:  *   Fix overflow bugs in ssvn_job.c
   38:  *
   39:  *   Revision 1.7  2025/04/10 17:21:54  snw
   40:  *   Remove traces of BDB global handler
   41:  *
   42:  *   Revision 1.6  2025/04/09 19:52:02  snw
   43:  *   Eliminate as many warnings as possible while building with -Wall
   44:  *
   45:  *   Revision 1.5  2025/03/24 04:13:11  snw
   46:  *   Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
   47:  *
   48:  *   Revision 1.4  2025/03/09 19:50:47  snw
   49:  *   Second phase of REUSE compliance and header reformat
   50:  *
   51:  *
   52:  * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
   53:  * SPDX-License-Identifier: AGPL-3.0-or-later
   54:  **/
   55: 
   56: #include <stdio.h>
   57: #include <string.h>
   58: #include <stdlib.h>
   59: #include <signal.h>
   60: #include <sys/types.h>
   61: #include <unistd.h>
   62: #include <errno.h>
   63: #include <sys/time.h>
   64: #include <sys/resource.h>
   65: #include <ctype.h>
   66: #include <time.h>
   67: 
   68: #include "config.h"
   69: #include "mpsdef.h"
   70: #include "transact.h"
   71: #include "namespace.h"
   72: #include "freem.h"
   73: #include "mref.h"
   74: #include "jobtab.h"
   75: #include "shmmgr.h"
   76: 
   77: short cur_symtab = 0;
   78: 
   79: void ssvn_job_add_device(int channel, char *device)
   80: {
   81:     char *k_buf;
   82:     char *d_buf;
   83:     
   84:     k_buf = (char *) malloc (STRLEN * sizeof (char));
   85:     NULLPTRCHK(k_buf,"ssvn_job_add_device");
   86: 
   87:     d_buf = (char *) malloc (STRLEN * sizeof (char));
   88:     NULLPTRCHK(k_buf,"ssvn_job_add_device");
   89: 
   90:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
   91:     snprintf (d_buf, STRLEN - 1, "%s\201", device);
   92: 
   93:     symtab_shm (set_sym, k_buf, d_buf);
   94:     
   95:     free (k_buf);
   96:     free (d_buf);
   97: 
   98:     return;
   99: }
  100: 
  101: void ssvn_job_remove_device(int channel)
  102: {
  103:     char *k_buf;
  104:     char *d_buf;
  105:     
  106:     k_buf = (char *) malloc (STRLEN * sizeof (char));
  107:     NULLPTRCHK(k_buf,"ssvn_job_add_device");
  108: 
  109:     d_buf = (char *) malloc (STRLEN * sizeof (char));
  110:     NULLPTRCHK(k_buf,"ssvn_job_add_device");
  111: 
  112:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
  113:     snprintf (d_buf, STRLEN - 1, "\201");
  114: 
  115:     symtab_shm (kill_sym, k_buf, d_buf);
  116:     
  117:     free (k_buf);
  118:     free (d_buf);
  119: 
  120:     return;
  121: 
  122: }
  123: 
  124: void ssvn_job_update(void)
  125: {
  126: 
  127:     char k_buf[STRLEN];
  128:     char d_buf[STRLEN];
  129: 
  130:     char tk_buf[STRLEN];
  131:     char td_buf[STRLEN];
  132:     
  133: #ifndef AMIGA68K
  134:     uid_t uid;
  135:     gid_t gid;
  136: #else
  137:     int uid;
  138:     int gid;
  139: #endif
  140: 
  141:     int ierr_sav;
  142:     int tf;
  143:     
  144: #if !defined(AMIGA68K)
  145:     uid = getuid ();
  146:     gid = getgid ();
  147: #else
  148:     uid = 0;
  149:     gid = 0;
  150: #endif
  151: 
  152:     ierr_sav = ierr;
  153:     
  154:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202PIPE_GLVN\201", pid);
  155:     snprintf (d_buf, STRLEN - 1, "%%\201");
  156:     symtab_shm (set_sym, k_buf, d_buf);
  157: 
  158:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202TRACE\201", pid);
  159:     snprintf (d_buf, STRLEN - 1, "%d\201", trace_mode);
  160:     symtab_shm (set_sym, k_buf, d_buf);
  161:     
  162:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZCOMMANDS\201", pid);
  163:     stcpy (d_buf, zcommds);
  164:     symtab_shm (set_sym, k_buf, d_buf);
  165: 
  166:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZFUNCTIONS\201", pid);
  167:     stcpy (d_buf, zfunctions);
  168:     symtab_shm (set_sym, k_buf, d_buf);
  169: 
  170:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZSVS\201", pid);
  171:     stcpy (d_buf, zsvn);
  172:     symtab_shm (set_sym, k_buf, d_buf);
  173: 
  174:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202BREAK_HANDLER\201", pid);
  175:     stcpy (d_buf, brkaction);
  176:     symtab_shm (set_sym, k_buf, d_buf);
  177: 
  178:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ROUTINE_BUFFER_SIZE\201", pid);
  179:     snprintf (d_buf, STRLEN - 1, "%ld\201", PSIZE0 - 1);
  180:     symtab_shm (set_sym, k_buf, d_buf);
  181: 
  182:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ROUTINE_BUFFER_COUNT\201", pid);
  183:     snprintf (d_buf, STRLEN - 1, "%ld\201", NO_OF_RBUF);
  184:     symtab_shm (set_sym, k_buf, d_buf);
  185: 
  186:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ROUTINE_BUFFER_AUTO_ADJUST\201", pid);
  187:     snprintf (d_buf, STRLEN - 1, "%d\201", autorsize);
  188:     symtab_shm (set_sym, k_buf, d_buf);
  189: 
  190:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202SYMBOL_TABLE_SIZE\201", pid);
  191:     snprintf (d_buf, STRLEN - 1, "%ld\201", PSIZE);
  192:     symtab_shm (set_sym, k_buf, d_buf);
  193: 
  194:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202SYMBOL_TABLE_AUTO_ADJUST\201", pid);
  195:     snprintf (d_buf, STRLEN - 1, "%d\201", autopsize);
  196:     symtab_shm (set_sym, k_buf, d_buf);
  197: 
  198:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_SIZE\201", pid);
  199:     snprintf (d_buf, STRLEN - 1, "%ld\201", UDFSVSIZ);
  200:     symtab_shm (set_sym, k_buf, d_buf);
  201: 
  202:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_AUTO_ADJUST\201", pid);
  203:     snprintf (d_buf, STRLEN - 1, "%d\201", autousize);
  204:     symtab_shm (set_sym, k_buf, d_buf);
  205: 
  206:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GVN_UNIQUE_CHARS\201", pid);
  207:     snprintf (d_buf, STRLEN - 1, "%d\201", (glvnflag.one[0] == 0) ? 255 : glvnflag.one[0]);
  208:     symtab_shm (set_sym, k_buf, d_buf);
  209: 
  210:     tf = UNSIGN (glvnflag.one[1]);
  211:     toggle (tf);
  212:     
  213:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GVN_CASE_SENSITIVE\201", pid);
  214:     snprintf (d_buf, STRLEN - 1, "%d\201", tf);
  215:     symtab_shm (set_sym, k_buf, d_buf);
  216:     
  217:     tf = UNSIGN (glvnflag.one[2]);
  218:     if (tf == 0) tf = 255;
  219:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GVN_NAME_SUB_LENGTH\201", pid);
  220:     snprintf (d_buf, STRLEN - 1, "%d\201", tf);
  221:     symtab_shm (set_sym, k_buf, d_buf);
  222: 
  223:     tf = UNSIGN (glvnflag.one[3]);
  224:     if (tf == 0) tf = 255;
  225:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GVN_SUB_LENGTH\201", pid);
  226:     snprintf (d_buf, STRLEN - 1, "%d\201", tf);    
  227:     symtab_shm (set_sym, k_buf, d_buf);
  228:     
  229:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202SINGLE_USER\201", pid);
  230:     snprintf (d_buf, STRLEN - 1, "%d\201", lonelyflag);
  231:     symtab_shm (set_sym, k_buf, d_buf);
  232: 
  233:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202LOWERCASE_EVERYWHERE\201", pid);
  234:     snprintf (d_buf, STRLEN - 1, "%d\201", lowerflag);
  235:     symtab_shm (set_sym, k_buf, d_buf);
  236: 
  237:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZCOMMAND_ARGUMENT_NAME\201", pid);
  238:     stcpy (d_buf, zargdefname);
  239:     symtab_shm (set_sym, k_buf, d_buf);
  240: 
  241:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202TIMEZONE_OFFSET\201", pid);
  242:     lintstr (d_buf, tzoffset);
  243:     symtab_shm (set_sym, k_buf, d_buf);
  244:     
  245:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202%s\201", pid, nsname);
  246:     snprintf (d_buf, STRLEN - 1, "%s\201", gbl_u_engine);
  247:     symtab_shm (set_sym, k_buf, d_buf);
  248: 
  249:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202SYSTEM\201", pid);
  250:     snprintf (d_buf, STRLEN - 1, "%s\201", gbl_s_engine);
  251:     symtab_shm (set_sym, k_buf, d_buf);
  252: 
  253:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ENGINES\202LOCAL\201", pid);
  254:     snprintf (d_buf, STRLEN - 1, "%s\201", loc_engine);
  255:     symtab_shm (set_sym, k_buf, d_buf);    
  256:     
  257:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202CHARACTER\201", pid);
  258:     symtab_shm (set_sym, k_buf, "M\201");
  259: 
  260:     snprintf (d_buf, STRLEN - 1, "%s\201", curdir);
  261:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202CWD\201", pid);
  262:     symtab_shm (set_sym, k_buf, d_buf);
  263:     
  264:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GLOBAL\201", pid);
  265:     symtab_shm (set_sym, k_buf, " \201");
  266: 
  267:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202LOCK\201", pid);
  268:     symtab_shm (set_sym, k_buf, " \201");
  269: 
  270:     snprintf (d_buf, STRLEN - 1, "%s\201", oucpath);
  271:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202IOPATH\201", pid);
  272:     symtab_shm (set_sym, k_buf, d_buf);
  273: 
  274: #if !defined(MSDOS)    
  275:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202PRIORITY\201", pid);
  276:     snprintf (d_buf, STRLEN - 1, "%d\201", getpriority (PRIO_PROCESS, pid));
  277:     symtab_shm (set_sym, k_buf, d_buf);
  278: #endif
  279:     
  280:     snprintf (d_buf, STRLEN - 1, "%s\201", rou_name);
  281:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ROUTINE\201", pid);
  282:     symtab_shm (set_sym, k_buf, d_buf);
  283: 
  284:     snprintf (d_buf, STRLEN - 1, "0:\"%s\"\201", dev[HOME]);
  285:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202$PRINCIPAL\201", pid);
  286:     symtab_shm (set_sym, k_buf, d_buf);
  287: 
  288:     snprintf (d_buf, STRLEN - 1, "%d\201", tp_level);
  289:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202$TLEVEL\201", pid);
  290:     symtab_shm (set_sym, k_buf, d_buf);
  291: 
  292:     snprintf (d_buf, STRLEN - 1, "0:\"%s\"\201", dev[HOME]);
  293:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202$IO\201", pid);
  294:     symtab_shm (set_sym, k_buf, d_buf);
  295: 
  296:     snprintf (d_buf, STRLEN - 1, "%s\201", gvndefault);
  297:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GVNDEFAULT\201", pid);
  298:     symtab_shm (set_sym, k_buf, d_buf);
  299: 
  300:     snprintf (d_buf, STRLEN -1, "%s\201", lvndefault);
  301:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202LVNDEFAULT\201", pid);
  302:     symtab_shm (set_sym, k_buf, d_buf);
  303:     
  304:     ssvn_job_add_device (HOME, dev[HOME]);
  305:     
  306:     snprintf (d_buf, STRLEN - 1, "%d\201", uid);
  307:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202USER\201", pid);
  308:     symtab_shm (set_sym, k_buf, d_buf);
  309: 
  310:     snprintf (d_buf, STRLEN - 1, "%d\201", gid);
  311:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202GROUP\201", pid);
  312:     symtab_shm (set_sym, k_buf, d_buf);
  313: 
  314:     snprintf (d_buf, STRLEN - 1, "%s\201", nsname);
  315:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
  316:     symtab_shm (set_sym, k_buf, d_buf);
  317: 
  318:     snprintf (d_buf, STRLEN - 1, "%d\201", cur_symtab);
  319:     snprintf (k_buf, STRLEN - 1, "^$JOB\202\%d\202SYMTAB\201", pid);
  320:     symtab_shm (set_sym, k_buf, d_buf);
  321:     
  322:     snprintf (d_buf, STRLEN - 1, "%d\201", pid);
  323:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202PID\201", pid);
  324:     symtab_shm (set_sym, k_buf, d_buf);
  325: 
  326:     snprintf (d_buf, STRLEN - 1, "%d\201", frm_throw_all_errors);
  327:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202SET_ALL_ECODES\201", pid);
  328:     symtab_shm (set_sym, k_buf, d_buf);    
  329:     
  330:     snprintf (tk_buf, STRLEN - 1, "^$SYSTEM\202ZDATE_FORMAT\201");
  331:     ssvn (get_sym, tk_buf, td_buf);
  332:     
  333:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZDATE_FORMAT\201", pid);
  334:     symtab_shm (set_sym, k_buf, td_buf);
  335:     
  336:     snprintf (tk_buf, STRLEN - 1, "^$SYSTEM\202ZTIME_FORMAT\201");
  337:     ssvn (get_sym, tk_buf, td_buf);
  338: 
  339:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ZTIME_FORMAT\201", pid);
  340:     symtab_shm (set_sym, k_buf, td_buf);
  341: 
  342:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202ENVIRONMENT\201", pid);
  343:     snprintf (d_buf, STRLEN - 1, "%s\201", shm_env);
  344:     symtab_shm (set_sym, k_buf, d_buf);
  345:     
  346:     switch (fp_mode) {
  347:         
  348:         case 0:
  349: 
  350:             snprintf (d_buf, STRLEN - 1, "FIXED\201");
  351:             break;
  352: 
  353:         default:
  354: 
  355:             snprintf (d_buf, STRLEN - 1, "IEEE754\201");
  356:             snprintf (fp_conversion, sizeof (fp_conversion) - 1, "%%.%df\201", DBL_DIG);
  357:             zprecise = DBL_DIG;
  358:             
  359:             break;
  360: 
  361:     }
  362: 
  363:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202MATH\201", pid);
  364:     symtab_shm (set_sym, k_buf, d_buf);
  365: 
  366:     snprintf (d_buf, STRLEN - 1, "%d\201", en_revstrf);
  367:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%d\202REVSTR\201", pid);
  368:     symtab_shm (set_sym, k_buf, d_buf);
  369:     
  370:     stcpy (d_buf, rou_name);
  371:     stcnv_m2c (d_buf);
  372: 
  373:     merr_raise (ierr_sav);
  374:     
  375: }
  376: 
  377: 
  378: void ssvn_job(short action, char *key, char *data)
  379: {
  380:     pid_t t_pid;
  381:     int i;
  382:     char ch;
  383:     job_slot_t *slot;
  384:     freem_ref_t *r;
  385:     char *kbuf;
  386:     char *tbuf;
  387:     
  388:     r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
  389:     NULLPTRCHK(r,"ssvn_job");
  390:     
  391:     kbuf = (char *) malloc (STRLEN * sizeof(char));
  392:     NULLPTRCHK(kbuf,"ssvn_job");
  393:     
  394:     tbuf = (char *) malloc (STRLEN * sizeof(char));
  395:     NULLPTRCHK(tbuf,"ssvn_job");
  396:     
  397:     stcpy (kbuf, key);
  398: 
  399:     mref_init (r, MREF_RT_SSVN, "^$JOB");
  400:     internal_to_mref (r, kbuf);
  401: 
  402:     if (r->subscript_count > 0) {
  403:         t_pid = atol (mref_get_subscript (r, 0));
  404:     }
  405:     else {
  406:         t_pid = shm_config->hdr->first_process;
  407:     }
  408: 
  409:     slot = job_get (t_pid);
  410:     
  411:     if (r->subscript_count > 1) {
  412:         for (i = 0; i < strlen (r->subscripts[1]); i++) {
  413:             r->subscripts[1][i] = toupper (r->subscripts[1][i]);
  414:         }
  415:     }
  416: 
  417:     key = mref_to_internal (r);
  418:     stcpy (kbuf, key);
  419: 
  420:     switch (action) {
  421:     
  422:         case set_sym:
  423: 
  424:             {
  425:                 char cbuf[STRLEN];
  426: 
  427:                 snprintf (cbuf, STRLEN - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
  428: 
  429:                 if (stcmp (kbuf, cbuf) == 0) {
  430:                     
  431:                     stcpy (tbuf, data);
  432:                     stcnv_m2c (tbuf);
  433: 
  434:                     if (validate_namespace (tbuf) == FALSE) {
  435:                         merr_raise (M26);
  436:                     }
  437:                     else {                    
  438:                         set_namespace (tbuf, FALSE);
  439:                     }
  440: 
  441:                     goto done;
  442: 
  443:                 }                
  444:                
  445:                 
  446:                 if (strcmp (mref_get_subscript (r, 1), "ZCOMMANDS") == 0) {
  447: 
  448:                     m_tolower (data);
  449:                     
  450:                     stcpy (zcommds, data);
  451:                     symtab_shm (action, key, data);
  452: 
  453:                     merr_clear ();
  454:                     goto done;
  455: 
  456:                 }
  457:                 else if (strcmp (mref_get_subscript (r, 1), "TRACE") == 0) {
  458:                     trace_mode = tvexpr (data);
  459:                     goto done;
  460:                 }
  461:                 else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
  462:                     stcpy (l_o_val, data);
  463: 
  464:                     merr_clear ();
  465:                     goto done;
  466:                 }
  467:                 else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
  468:                     stcpy (l_o_val, data);
  469: 
  470:                     merr_clear ();
  471:                     goto done;
  472:                 }
  473:                 else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
  474: 
  475:                     stcpy (gvndefault, data);
  476: 
  477:                     merr_clear ();
  478:                     goto done;
  479:                 }
  480:                 else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
  481: 
  482:                     stcpy (lvndefault, data);
  483: 
  484:                     merr_clear ();
  485:                     goto done;
  486:                 }
  487:                 else if (strcmp (mref_get_subscript (r, 1), "PIPE_GLVN") == 0) {
  488: 
  489:                     symtab_shm (action, key, data);
  490: 
  491:                     merr_clear ();
  492:                     goto done;
  493:                     
  494:                 }
  495:                 else if (strcmp (mref_get_subscript (r, 1), "ZFUNCTIONS") == 0) {
  496: 
  497:                     m_tolower (data);
  498:                     
  499:                     stcpy (zfunctions, data);
  500:                     symtab_shm (action, key, data);
  501: 
  502:                     merr_clear ();
  503:                     goto done;
  504: 
  505:                 }
  506:                 else if (strcmp (mref_get_subscript (r, 1), "ZSVS") == 0) {
  507: 
  508:                     m_tolower (data);
  509:                     
  510:                     stcpy (zsvn, data);
  511:                     symtab_shm (action, key, data);
  512: 
  513:                     merr_clear ();
  514:                     goto done;
  515:                     
  516:                 }
  517:                 else if (strcmp (mref_get_subscript (r, 1), "LOWERCASE_EVERYWHERE") == 0) {
  518:                     
  519:                     int tf = tvexpr (data);
  520: 
  521:                     lowerflag = tf;
  522:                     snprintf (data, STRLEN - 1, "%d\n", tf);
  523: 
  524:                     symtab_shm (action, key, data);
  525: 
  526:                     merr_clear ();
  527:                     goto done;
  528:                     
  529:                 }
  530:                 else if (strcmp (mref_get_subscript (r, 1), "ZCOMMAND_ARGUMENT_NAME") == 0) {
  531: 
  532:                     stcpy (zargdefname, data);
  533:                     symtab_shm (action, key, data);
  534: 
  535:                     merr_clear ();
  536:                     goto done;
  537:                     
  538:                 }
  539:                 else if (strcmp (mref_get_subscript (r, 1), "BREAK_HANDLER") == 0) {
  540: 
  541:                     stcpy (brkaction, data);
  542:                     symtab_shm (action, key, data);
  543: 
  544:                     merr_clear ();
  545:                     goto done;
  546: 
  547:                 }
  548:                 else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_SIZE") == 0) {
  549: 
  550:                     if (intexpr (data) <= 0) {
  551:                         merr_raise (ARGER);
  552:                         goto done;
  553:                     }
  554: 
  555:                     newrsize (intexpr (data) + 1, NO_OF_RBUF);
  556:                     symtab_shm (action, key, data);
  557: 
  558:                     merr_clear ();
  559:                     goto done;
  560:                     
  561:                 }
  562:                 else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_COUNT") == 0) {
  563:                     
  564:                     if (intexpr (data) <= 0) {
  565:                         merr_raise (ARGER);
  566:                         goto done;
  567:                     }
  568: 
  569:                     newrsize (PSIZE0, intexpr (data));
  570:                     symtab_shm (action, key, data);
  571: 
  572:                     merr_clear ();
  573:                     goto done;
  574:                     
  575:                 }
  576:                 else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_AUTO_ADJUST") == 0) {
  577: 
  578:                     autorsize = tvexpr (data);
  579:                     snprintf (data, STRLEN - 1, "%d\201", tvexpr (data));
  580: 
  581:                     symtab_shm (action, key, data);
  582: 
  583:                     merr_clear ();
  584:                     goto done;                    
  585:                     
  586:                 }
  587:                 else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_SIZE") == 0) {
  588: 
  589:                     if (intexpr (data) <= 0) {
  590:                         merr_raise (ARGER);
  591:                         goto done;
  592:                     }
  593: 
  594:                     newpsize (intexpr (data));
  595: 
  596:                     symtab_shm (action, key, data);
  597: 
  598:                     merr_clear ();
  599:                     goto done;
  600:                     
  601:                 }
  602:                 else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_AUTO_ADJUST") == 0) {
  603: 
  604:                     autopsize = tvexpr (data);
  605:                     snprintf (data, STRLEN - 1, "%d\201", tvexpr (data));
  606: 
  607:                     symtab_shm (action, key, data);
  608: 
  609:                     merr_clear ();
  610:                     goto done;
  611:                     
  612:                 }
  613:                 else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_SIZE") == 0) {
  614: 
  615:                     if (intexpr (data) <= 0) {
  616:                         merr_raise (ARGER);
  617:                         goto done;
  618:                     }
  619: 
  620:                     newusize (intexpr (data));
  621: 
  622:                     symtab_shm (action, key, data);
  623: 
  624:                     merr_clear ();
  625:                     goto done;
  626: 
  627:                 }
  628:                 else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_AUTO_ADJUST") == 0) {
  629:                     autousize = tvexpr (data);
  630:                     snprintf (data, STRLEN - 1, "%d\201", tvexpr (data));
  631: 
  632:                     symtab_shm (action, key, data);
  633: 
  634:                     merr_clear ();
  635:                     goto done;
  636:                 }
  637:                 else if (strcmp (mref_get_subscript (r, 1), "GVN_UNIQUE_CHARS") == 0) {
  638: 
  639:                     int t = intexpr (data) & 0377;
  640: 
  641:                     if (t == 255) t = 0;
  642: 
  643:                     if (merr () != MXNUM) {
  644: 
  645:                         glvnflag.one[0] = (char) t;
  646: 
  647:                         snprintf (data, STRLEN - 1, "%d\201", t);
  648:                         symtab_shm (action, key, data);
  649:                         
  650:                         merr_clear ();
  651: 
  652:                     }
  653:                     else {
  654:                         merr_raise (ARGER);
  655:                     }
  656: 
  657:                     goto done;                    
  658:                     
  659:                 }
  660:                 else if (strcmp (mref_get_subscript (r, 1), "GVN_CASE_SENSITIVE") == 0) {
  661:                     int t = tvexpr (data);
  662:                     toggle (t);
  663: 
  664:                     if (merr () != MXNUM) {
  665: 
  666:                         glvnflag.one[1] = t;
  667: 
  668:                         snprintf (data, STRLEN - 1, "%d\201", t);
  669:                         symtab_shm (action, key, data);
  670: 
  671:                         merr_clear ();
  672: 
  673:                     }
  674:                     else {
  675:                         merr_raise (ARGER);
  676:                     }
  677: 
  678:                     goto done;
  679:                     
  680:                 }
  681:                 else if (strcmp (mref_get_subscript (r, 1), "GVN_NAME_SUB_LENGTH") == 0) {
  682:                     int t = intexpr (data) & 0377;
  683: 
  684:                     if (t == 255) t = 0;
  685: 
  686:                     if (merr () != MXNUM) {
  687:                         glvnflag.one[2] = (char) t;
  688: 
  689:                         snprintf (data, STRLEN - 1, "%d\201", t);
  690:                         symtab_shm (action, key, data);
  691: 
  692:                         merr_clear ();
  693:                     }
  694:                     else {
  695:                         merr_raise (ARGER);
  696:                     }
  697: 
  698:                     goto done;
  699:                         
  700:                 }
  701:                 else if (strcmp (mref_get_subscript (r, 1), "GVN_SUB_LENGTH") == 0) {
  702:                     int t = intexpr (data) & 0377;
  703: 
  704:                     if (t == 255) t = 0;
  705: 
  706:                     if (merr () != MXNUM) {
  707:                         glvnflag.one[3] = (char) t;
  708: 
  709:                         snprintf (data, STRLEN - 1, "%d\201", t);
  710:                         symtab_shm (action, key, data);
  711: 
  712:                         merr_clear ();
  713:                     }
  714:                     else {
  715:                         merr_raise (ARGER);
  716:                     }
  717: 
  718:                     goto done;
  719:                     
  720:                 }
  721:                 else if (strcmp (mref_get_subscript (r, 1), "SINGLE_USER") == 0) {
  722:                     int tf = tvexpr (data);
  723:                     close_all_globals ();
  724: 
  725:                     snprintf (data, STRLEN - 1, "%d\201", tf);
  726:                     symtab_shm (action, key, data);
  727: 
  728:                     merr_clear ();
  729:                     goto done;                    
  730:                 }
  731:                 else if (stcmp (mref_get_subscript (r, 1), "TIMEZONE_OFFSET") == 0) {
  732:                     long tzo = intexpr (data);
  733:                     long tzj;
  734:                     
  735:                     if (merr () > OK) goto done;
  736: 
  737:                     tzj = time (0L);
  738: 
  739:                     if ((tzoffset > 0 && ((tzj + 86400 + tzoffset) < 0 || (tzj + tzoffset) < 0)) ||
  740:                         (tzoffset < 0 && ((tzj + 86400 + tzoffset ) > (tzj + 86400) ||
  741:                                           (tzj + tzoffset) > tzj))) {
  742:                         merr_raise (ARGER);
  743:                         goto done;
  744:                     }
  745: 
  746:                     tzoffset = tzo;
  747: 
  748:                     snprintf (data, STRLEN - 1, "%ld\201", tzoffset);
  749:                     symtab_shm (action, key, data);
  750: 
  751:                     goto done;
  752:                 }                    
  753:                 else if (strcmp (mref_get_subscript (r, 1), "USER_ERRORS") == 0) {
  754: 
  755:                     symtab_shm (set_sym, key, data);
  756: 
  757:                     merr_clear ();
  758:                     goto done;
  759:                     
  760:                 }
  761:                 else if (strcmp (mref_get_subscript (r, 1), "SET_ALL_ECODES") == 0) {
  762: 
  763:                     frm_throw_all_errors = atol (data);
  764:                     symtab_shm (set_sym, key, data);
  765: 
  766:                     merr_clear ();
  767:                     goto done;
  768:                     
  769:                 }
  770:                 else if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
  771:                     symtab_shm (set_sym, key, data);
  772: 
  773:                     merr_clear ();
  774:                     goto done;
  775:                 }
  776:                 else if (strcmp (mref_get_subscript (r, 1), "CWD") == 0) {
  777: 
  778:                     stcpy (tbuf, data);
  779:                     stcnv_m2c (tbuf);
  780: 
  781:                     if (chdir (tbuf) != 0) {
  782:                         merr_raise (PROTECT);
  783:                         goto done;
  784:                     }
  785:                     else {
  786:                         strcpy (curdir, tbuf);
  787:                         symtab_shm (set_sym, kbuf, data);
  788: 
  789:                         merr_clear ();
  790:                         goto done;
  791:                     }
  792: 
  793:                 }
  794:                 else if (strcmp (mref_get_subscript (r, 1), "EVENT") == 0) {
  795:                     symtab_shm (set_sym, kbuf, data);
  796: 
  797:                     merr_clear ();
  798:                     goto done;
  799:                 } 
  800:                 else if (strcmp (mref_get_subscript (r, 1), "PRIORITY") == 0) {
  801: 
  802:                     int new_pri;                   
  803:                     
  804:                     stcpy (tbuf, data);
  805:                     stcnv_m2c (tbuf);
  806: 
  807:                     new_pri = atoi (tbuf);
  808: 
  809:                     
  810:                     i = nice (40);
  811:                     nice ((int) (new_pri - 40));
  812: 
  813:                     symtab_shm (set_sym, kbuf, data);
  814: 
  815:                     merr_clear ();
  816:                     goto done;
  817: 
  818:                 }
  819:                 else if (strcmp (mref_get_subscript (r, 1), "IOPATH") == 0) {
  820: 
  821:                     stcpy (oucpath, data);
  822:                     symtab_shm (set_sym, kbuf, data);
  823: 
  824:                     merr_clear ();
  825:                     goto done;
  826:                     
  827:                 }
  828:                 else if (strcmp (mref_get_subscript (r, 1), "REVSTR") == 0) {
  829: 
  830:                     short tres = tvexpr (data);
  831: 
  832:                     if (tres == TRUE) {
  833:                         en_revstrf = 1;
  834:                     }
  835:                     else {
  836:                         en_revstrf = 0;
  837:                     }                                        
  838:                     
  839:                     symtab_shm (set_sym, kbuf, data);
  840: 
  841:                     merr_clear ();
  842:                     goto done;
  843:                     
  844:                 }
  845:                 else if (strcmp (mref_get_subscript (r, 1), "ZDATE_FORMAT") == 0) {
  846:                     symtab_shm (set_sym, key, data);
  847:                     merr_clear ();
  848:                     goto done;
  849: 
  850:                 }
  851:                 else if (strcmp (mref_get_subscript (r, 1), "ZTIME_FORMAT") == 0) {
  852:                     symtab_shm (set_sym, key, data);
  853:                     merr_clear ();
  854:                     goto done;
  855: 
  856:                 }
  857: 		else if (strcmp (mref_get_subscript (r, 1), "SYMTAB") == 0) {
  858: 
  859: 		    int itmp = atoi (data); 
  860: 
  861: 		    if ((data[0] < '0') || (data[0] > '9')) {
  862: 			merr_raise (INVEXPR);
  863: 			goto done;
  864: 		    }
  865: 		    
  866: 		    if (itmp != 0 && itmp != 1) {
  867: 			merr_raise (INVEXPR);
  868: 			goto done;
  869: 		    }
  870: 		    
  871: 		    if (cur_symtab == itmp) {
  872: 			merr_clear ();
  873: 			goto done;
  874: 		    }
  875: 		    
  876: 		    if (cur_symtab == 0) {
  877: 			cur_symtab = 1;
  878: 		    }
  879: 		    else {
  880: 			cur_symtab = 0;
  881: 		    }
  882: 
  883: 		    if (apartition == NULL) {
  884: 			
  885: 			apartition = calloc ((unsigned) PSIZE + 1, 1);
  886: 			asymlen = PSIZE;
  887: 			
  888: 			for (i = 0; i < 128; i++) aalphptr[i] = 0L;
  889: 			
  890: 		    } 
  891: 		    
  892: 		    {
  893: 			
  894: 			char   *x;
  895: 			
  896: 			x = apartition;
  897: 			apartition = partition;
  898: 			partition = x;
  899: 			
  900: 		    }
  901: 		    
  902: 		    ch = asymlen;
  903: 		    asymlen = symlen;
  904: 		    symlen = ch;
  905: 		    
  906: 		    for (i = 0; i < 128; i++) {
  907: 			ch = aalphptr[i];
  908: 			aalphptr[i] = alphptr[i];
  909: 			alphptr[i] = ch;
  910: 		    }
  911: 		    
  912: 		    s = &partition[symlen] - 256;	/* pointer to symlen_offset        */
  913: 		    argptr = partition;		/* pointer to beg of tmp-storage   */
  914: 
  915: 		    symtab_shm (set_sym, key, data);
  916: 		    
  917: 		    merr_clear ();
  918: 		    goto done;
  919: 		    
  920: 		    
  921: 		}
  922:                 else if (strcmp (mref_get_subscript (r, 1), "MATH") == 0) {
  923: 
  924: #if !defined(_AIX)		    
  925:                     if (stcmp (data, "IEEE754\201") == 0) {
  926: 
  927:                         fp_mode = 1;
  928:                         symtab_shm (set_sym, kbuf, data);
  929: 
  930:                         snprintf (fp_conversion, sizeof (fp_conversion) - 1, "%%.%df\201", DBL_DIG);
  931:                         zprecise = DBL_DIG;
  932: 
  933:                         merr_clear ();
  934:                         goto done;
  935:                         
  936:                     }
  937:                     else if (stcmp (data, "FIXED\201") == 0) {
  938: 
  939:                         fp_mode = 0;
  940:                         symtab_shm (set_sym, kbuf, data);
  941:                         
  942:                         zprecise = 100;
  943:                         
  944:                         merr_clear ();
  945:                         goto done;
  946:                         
  947:                     }
  948:                     else {
  949:                         merr_raise (M29);
  950:                         goto done;
  951:                     }
  952: #endif		    
  953:                     
  954:                 }                
  955: 
  956:                 merr_raise (M29);
  957:                 goto done;
  958:             }
  959: 
  960:     	case get_sym:            
  961:             if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
  962:                 stcpy (data, l_o_val);
  963:                 goto done;
  964:             }
  965:             else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
  966:                 stcpy (data, g_o_val);
  967:                 goto done;
  968:             }
  969:             else if (strcmp (mref_get_subscript (r, 1), "TRACE") == 0) {
  970:                 snprintf (data, STRLEN - 1, "%d\201", trace_mode);
  971:                 goto done;
  972:             }
  973:     	case fra_dat:
  974:     	case fra_order:
  975:     	case fra_query:
  976:             if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
  977:                 merr_raise (M38);
  978:                 goto done;
  979:             }
  980:             if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
  981:                 merr_raise (M38);
  982:                 goto done;
  983:             }
  984:     	case bigquery:
  985:     	case getnext:
  986:     	case m_alias:
  987:     	case zdata:
  988: 
  989:             if (action == get_sym) {
  990: 
  991:                 if (strcmp (mref_get_subscript (r, 1), "PROCESS_START") == 0) {                    
  992:                     
  993:                     unsigned long ilong;
  994:                     unsigned long ilong1;
  995: 
  996:                     ilong1 = slot->start_time + tzoffset;
  997:                     ilong = ilong1 / 86400;
  998: 
  999:                     lintstr (data, ilong + 47117);
 1000:                     i = stlen (data);
 1001: 
 1002:                     data[i++] = ',';
 1003:                     ilong = ilong1 - (ilong * 86400);
 1004: 
 1005:                     lintstr (&data[i], ilong);
 1006: 
 1007:                     merr_clear ();
 1008:                     goto done;
 1009:                     
 1010:                 }
 1011:                 
 1012:             }
 1013:             
 1014:             symtab_shm (action, kbuf, data);
 1015:             
 1016:             /* here, we need to convert the data on the way out too */                                    
 1017:             if ((action == fra_query) && (stlen (data) > 0)) {
 1018:                 if (strncmp (data, "^$JOB", 5) != 0) {
 1019:                     snprintf (kbuf, STRLEN - 1, "^$JOB%s\201", data);
 1020:                     stcpy (data, kbuf);
 1021:                 }
 1022:             }
 1023:             
 1024:             merr_clear ();
 1025:             goto done;
 1026:     	
 1027:         case killone:
 1028:     	case kill_sym:            
 1029:             
 1030:             if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
 1031: 
 1032:                 symtab_shm (action, key, data);
 1033: 
 1034:                 goto done;
 1035:                 
 1036:             }
 1037:             else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
 1038:                 l_o_val[0] = '\201';
 1039:                 merr_clear ();
 1040:                 goto done;
 1041:             }
 1042:             else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
 1043:                 g_o_val[0] = '\201';
 1044:                 merr_clear ();
 1045:                 goto done;
 1046:             }
 1047:             else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
 1048:                 gvndefault[0] = '\201';
 1049:                 symtab_shm (action, key, data);
 1050:                 symtab_shm (set_sym, key, gvndefault);
 1051:                 merr_clear ();
 1052:                 goto done;
 1053:             }
 1054:             else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
 1055:                 lvndefault[0] = '\201';
 1056:                 symtab_shm (action, key, data);
 1057:                 symtab_shm (set_sym, key, lvndefault);
 1058:                 merr_clear ();
 1059:                 goto done;
 1060:             }
 1061:             else {
 1062:                 job_request_stop (t_pid);
 1063:             }
 1064: 
 1065:             goto done;
 1066: 
 1067: 
 1068:     	default:
 1069:     		merr_raise (INVREF);
 1070:     		goto done;
 1071: 
 1072:     }
 1073: 
 1074: 
 1075: done:
 1076: 
 1077:     free (r);
 1078:     free (kbuf);
 1079:     free (tbuf);
 1080:     free (key);
 1081:     return;
 1082: }
 1083: 
 1084: void frm_process_alias (char *key)
 1085: {
 1086:     int ierr_sav;
 1087:     char *ptr;
 1088:     char name[256];
 1089:     char *subprt;
 1090:     register int i;
 1091:     register char ch;
 1092: 
 1093:     char *k_buf;
 1094:     char *d_buf;
 1095:     char *t_buf;
 1096:     
 1097:     k_buf = (char *) malloc (STRLEN * sizeof (char));
 1098:     NULLPTRCHK(k_buf,"frm_process_alias");
 1099: 
 1100:     d_buf = (char *) malloc (STRLEN * sizeof (char));
 1101:     NULLPTRCHK(d_buf,"frm_process_alias");
 1102: 
 1103:     t_buf = (char *) malloc (STRLEN * sizeof (char));
 1104:     NULLPTRCHK(t_buf,"frm_process_alias");
 1105: 
 1106:     ierr_sav = ierr;
 1107:     ptr = key;
 1108:     i = 0;
 1109:     
 1110:     while ((ch = *(ptr++)) != DELIM && ch != EOL && i < 256) {
 1111:         name[i++] = ch;
 1112:     }
 1113: 
 1114:     name[i] = '\0';
 1115:     subprt = key + i;
 1116: 
 1117:     snprintf (k_buf, STRLEN - 1, "^$JOB\202%ld\202ALIASES\202%s\201", (long) pid, name);
 1118:     symtab_shm (get_sym, k_buf, d_buf);
 1119: 
 1120:     stcnv_m2c (d_buf);
 1121: 
 1122:     if (merr () == OK) {
 1123:         snprintf (t_buf, STRLEN - 1, "%s%s\201", d_buf, subprt);
 1124:         stcpy (key, t_buf);
 1125:     }
 1126: 
 1127:     free (k_buf);
 1128:     free (d_buf);
 1129:     free (t_buf);
 1130: 
 1131:     merr_raise (ierr_sav);
 1132: 
 1133:     return;
 1134:     
 1135: }

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