File:  [Coherent Logic Development] / freem / src / ssvn_job.c
Revision 1.10: download - view: text, annotated - select for diffs
Mon Apr 28 19:38:55 2025 UTC (11 months ago) by snw
Branches: MAIN
CVS tags: HEAD
Add trace mode

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

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