File:  [Coherent Logic Development] / freem / src / ssvn_job.c
Revision 1.5: download - view: text, annotated - select for diffs
Mon Mar 24 04:13:11 2025 UTC (6 months, 1 week ago) by snw
Branches: MAIN
CVS tags: v0-63-1-rc1, v0-63-0-rc1, v0-63-0, v0-62-3, HEAD
Replace action macro dat with fra_dat to avoid symbol conflict on OS/2

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

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