/*
* $Id: ssvn_job.c,v 1.5 2025/03/24 04:13:11 snw Exp $
* ^$JOB ssvn
*
*
* Author: Serena Willis <snw@coherent-logic.com>
* Copyright (C) 1998 MUG Deutschland
* Copyright (C) 2020, 2025 Coherent Logic Development LLC
*
*
* This file is part of FreeM.
*
* FreeM is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FreeM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero Public License for more details.
*
* You should have received a copy of the GNU Affero Public License
* along with FreeM. If not, see <https://www.gnu.org/licenses/>.
*
* $Log: ssvn_job.c,v $
* Revision 1.5 2025/03/24 04:13:11 snw
* Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
*
* Revision 1.4 2025/03/09 19:50:47 snw
* Second phase of REUSE compliance and header reformat
*
*
* SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
* SPDX-License-Identifier: AGPL-3.0-or-later
**/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <ctype.h>
#include <time.h>
#include "config.h"
#include "mpsdef.h"
#include "transact.h"
#include "namespace.h"
#include "freem.h"
#include "mref.h"
#include "jobtab.h"
short cur_symtab = 0;
void ssvn_job_add_device(int channel, char *device)
{
char *k_buf;
char *d_buf;
k_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(k_buf,"ssvn_job_add_device");
d_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(k_buf,"ssvn_job_add_device");
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
snprintf (d_buf, 512 - 1, "%s\201", device);
symtab_shm (set_sym, k_buf, d_buf);
free (k_buf);
free (d_buf);
return;
}
void ssvn_job_remove_device(int channel)
{
char *k_buf;
char *d_buf;
k_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(k_buf,"ssvn_job_add_device");
d_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(k_buf,"ssvn_job_add_device");
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202OPEN\202%d\201", pid, channel);
snprintf (d_buf, 512 - 1, "\201");
symtab_shm (kill_sym, k_buf, d_buf);
free (k_buf);
free (d_buf);
return;
}
void ssvn_job_update(void)
{
char k_buf[512];
char d_buf[512];
char tk_buf[512];
char td_buf[512];
#ifndef AMIGA68K
uid_t uid;
gid_t gid;
#else
int uid;
int gid;
#endif
int ierr_sav;
int tf;
#if !defined(AMIGA68K)
uid = getuid ();
gid = getgid ();
#else
uid = 0;
gid = 0;
#endif
ierr_sav = ierr;
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PIPE_GLVN\201", pid);
snprintf (d_buf, 5, "%%\201");
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZCOMMANDS\201", pid);
stcpy (d_buf, zcommds);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZFUNCTIONS\201", pid);
stcpy (d_buf, zfunctions);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZSVS\201", pid);
stcpy (d_buf, zsvn);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202BREAK_HANDLER\201", pid);
stcpy (d_buf, brkaction);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_SIZE\201", pid);
snprintf (d_buf, 512 - 1, "%ld\201", PSIZE0 - 1);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_COUNT\201", pid);
snprintf (d_buf, 512 - 1, "%ld\201", NO_OF_RBUF);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE_BUFFER_AUTO_ADJUST\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", autorsize);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SYMBOL_TABLE_SIZE\201", pid);
snprintf (d_buf, 512 - 1, "%ld\201", PSIZE);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SYMBOL_TABLE_AUTO_ADJUST\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", autopsize);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_SIZE\201", pid);
snprintf (d_buf, 512 - 1, "%ld\201", UDFSVSIZ);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER_DEFINED_ISV_TABLE_AUTO_ADJUST\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", autousize);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_UNIQUE_CHARS\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", (glvnflag.one[0] == 0) ? 255 : glvnflag.one[0]);
symtab_shm (set_sym, k_buf, d_buf);
tf = UNSIGN (glvnflag.one[1]);
toggle (tf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_CASE_SENSITIVE\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", tf);
symtab_shm (set_sym, k_buf, d_buf);
tf = UNSIGN (glvnflag.one[2]);
if (tf == 0) tf = 255;
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_NAME_SUB_LENGTH\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", tf);
symtab_shm (set_sym, k_buf, d_buf);
tf = UNSIGN (glvnflag.one[3]);
if (tf == 0) tf = 255;
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVN_SUB_LENGTH\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", tf);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SINGLE_USER\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", lonelyflag);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LOWERCASE_EVERYWHERE\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", lowerflag);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZCOMMAND_ARGUMENT_NAME\201", pid);
stcpy (d_buf, zargdefname);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202TIMEZONE_OFFSET\201", pid);
lintstr (d_buf, tzoffset);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202%s\201", pid, nsname);
snprintf (d_buf, 512 - 1, "%s\201", gbl_u_engine);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202GLOBAL\202SYSTEM\201", pid);
snprintf (d_buf, 512 - 1, "%s\201", gbl_s_engine);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENGINES\202LOCAL\201", pid);
snprintf (d_buf, 512 - 1, "%s\201", loc_engine);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202CHARACTER\201", pid);
symtab_shm (set_sym, k_buf, "M\201");
snprintf (d_buf, 512 - 1, "%s\201", curdir);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202CWD\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GLOBAL\201", pid);
symtab_shm (set_sym, k_buf, " \201");
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LOCK\201", pid);
symtab_shm (set_sym, k_buf, " \201");
snprintf (d_buf, 512 - 1, "%s\201", oucpath);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202IOPATH\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
#if !defined(MSDOS)
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PRIORITY\201", pid);
snprintf (d_buf, 512 - 1, "%d\201", getpriority (PRIO_PROCESS, pid));
symtab_shm (set_sym, k_buf, d_buf);
#endif
snprintf (d_buf, 512 - 1, "%s\201", rou_name);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ROUTINE\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "0:\"%s\"\201", dev[HOME]);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$PRINCIPAL\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", tp_level);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$TLEVEL\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "0:\"%s\"\201", dev[HOME]);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202$IO\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 -1, "%s\201", gvndefault);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GVNDEFAULT\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 -1, "%s\201", lvndefault);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202LVNDEFAULT\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
ssvn_job_add_device (HOME, dev[HOME]);
snprintf (d_buf, 512 - 1, "%d\201", uid);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202USER\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", gid);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202GROUP\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%s\201", nsname);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", cur_symtab);
snprintf (k_buf, 512 - 1, "^$JOB\202\%d\202SYMTAB\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", pid);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202PID\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", frm_throw_all_errors);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202SET_ALL_ECODES\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (tk_buf, 512 - 1, "^$SYSTEM\202ZDATE_FORMAT\201");
ssvn (get_sym, tk_buf, td_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZDATE_FORMAT\201", pid);
symtab_shm (set_sym, k_buf, td_buf);
snprintf (tk_buf, 512 - 1, "^$SYSTEM\202ZTIME_FORMAT\201");
ssvn (get_sym, tk_buf, td_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ZTIME_FORMAT\201", pid);
symtab_shm (set_sym, k_buf, td_buf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202ENVIRONMENT\201", pid);
snprintf (d_buf, 512 - 1, "%s\201", shm_env);
symtab_shm (set_sym, k_buf, d_buf);
switch (fp_mode) {
case 0:
snprintf (d_buf, 512 - 1, "FIXED\201");
break;
default:
snprintf (d_buf, 512 - 1, "IEEE754\201");
snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
zprecise = DBL_DIG;
break;
}
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202MATH\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
snprintf (d_buf, 512 - 1, "%d\201", en_revstrf);
snprintf (k_buf, 512 - 1, "^$JOB\202%d\202REVSTR\201", pid);
symtab_shm (set_sym, k_buf, d_buf);
stcpy (d_buf, rou_name);
stcnv_m2c (d_buf);
#if !defined(__FreeBSD__)
if (run_daemon == FALSE) {
sprintf (k_buf, " freem: namespace %s routine %s", nsname, d_buf);
}
else {
sprintf (k_buf, " freem: %s environment daemon", shm_env);
}
if (!libflag) {
strcpy (m_argv[0], k_buf);
}
#endif
merr_raise (ierr_sav);
}
void ssvn_job(short action, char *key, char *data)
{
int errsav;
pid_t t_pid;
int i;
char ch;
job_slot_t *slot;
freem_ref_t *r;
char *kbuf;
char *tbuf;
r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
NULLPTRCHK(r,"ssvn_job");
kbuf = (char *) malloc (STRLEN * sizeof(char));
NULLPTRCHK(kbuf,"ssvn_job");
tbuf = (char *) malloc (STRLEN * sizeof(char));
NULLPTRCHK(tbuf,"ssvn_job");
stcpy (kbuf, key);
mref_init (r, MREF_RT_SSVN, "^$JOB");
internal_to_mref (r, kbuf);
t_pid = atol (mref_get_subscript (r, 0));
slot = job_get (t_pid);
if (r->subscript_count > 1) {
for (i = 0; i < strlen (r->subscripts[1]); i++) {
r->subscripts[1][i] = toupper (r->subscripts[1][i]);
}
}
key = mref_to_internal (r);
stcpy (kbuf, key);
switch (action) {
case set_sym:
{
char cbuf[STRLEN];
snprintf (cbuf, STRLEN - 1, "^$JOB\202%d\202NAMESPACE\201", pid);
if (stcmp (kbuf, cbuf) == 0) {
stcpy (tbuf, data);
stcnv_m2c (tbuf);
if (validate_namespace (tbuf) == FALSE) {
merr_raise (M26);
}
else {
set_namespace (tbuf, FALSE);
}
goto done;
}
if (strcmp (mref_get_subscript (r, 1), "ZCOMMANDS") == 0) {
m_tolower (data);
stcpy (zcommds, data);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
stcpy (l_o_val, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
stcpy (l_o_val, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
stcpy (gvndefault, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
stcpy (lvndefault, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "PIPE_GLVN") == 0) {
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ZFUNCTIONS") == 0) {
m_tolower (data);
stcpy (zfunctions, data);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ZSVS") == 0) {
m_tolower (data);
stcpy (zsvn, data);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "LOWERCASE_EVERYWHERE") == 0) {
int tf = tvexpr (data);
lowerflag = tf;
snprintf (data, 512 - 1, "%d\n", tf);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ZCOMMAND_ARGUMENT_NAME") == 0) {
stcpy (zargdefname, data);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "BREAK_HANDLER") == 0) {
stcpy (brkaction, data);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_SIZE") == 0) {
if (intexpr (data) <= 0) {
merr_raise (ARGER);
goto done;
}
newrsize (intexpr (data) + 1, NO_OF_RBUF);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_COUNT") == 0) {
if (intexpr (data) <= 0) {
merr_raise (ARGER);
goto done;
}
newrsize (PSIZE0, intexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ROUTINE_BUFFER_AUTO_ADJUST") == 0) {
autorsize = tvexpr (data);
snprintf (data, 512 - 1, "%d\201", tvexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_SIZE") == 0) {
if (intexpr (data) <= 0) {
merr_raise (ARGER);
goto done;
}
newpsize (intexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "SYMBOL_TABLE_AUTO_ADJUST") == 0) {
autopsize = tvexpr (data);
snprintf (data, 512 - 1, "%d\201", tvexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_SIZE") == 0) {
if (intexpr (data) <= 0) {
merr_raise (ARGER);
goto done;
}
newusize (intexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "USER_DEFINED_ISV_TABLE_AUTO_ADJUST") == 0) {
autousize = tvexpr (data);
snprintf (data, 512 - 1, "%d\201", tvexpr (data));
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVN_UNIQUE_CHARS") == 0) {
int t = intexpr (data) & 0377;
if (t == 255) t = 0;
if (merr () != MXNUM) {
glvnflag.one[0] = (char) t;
snprintf (data, 512 - 1, "%d\201", t);
symtab_shm (action, key, data);
merr_clear ();
}
else {
merr_raise (ARGER);
}
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVN_CASE_SENSITIVE") == 0) {
int t = tvexpr (data);
toggle (t);
if (merr () != MXNUM) {
glvnflag.one[1] = t;
snprintf (data, 512 - 1, "%d\201", t);
symtab_shm (action, key, data);
merr_clear ();
}
else {
merr_raise (ARGER);
}
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVN_NAME_SUB_LENGTH") == 0) {
int t = intexpr (data) & 0377;
if (t == 255) t = 0;
if (merr () != MXNUM) {
glvnflag.one[2] = (char) t;
snprintf (data, 512 - 1, "%d\201", t);
symtab_shm (action, key, data);
merr_clear ();
}
else {
merr_raise (ARGER);
}
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVN_SUB_LENGTH") == 0) {
int t = intexpr (data) & 0377;
if (t == 255) t = 0;
if (merr () != MXNUM) {
glvnflag.one[3] = (char) t;
snprintf (data, 512 - 1, "%d\201", t);
symtab_shm (action, key, data);
merr_clear ();
}
else {
merr_raise (ARGER);
}
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "SINGLE_USER") == 0) {
int tf = tvexpr (data);
close_all_globals ();
snprintf (data, 512 - 1, "%d\201", tf);
symtab_shm (action, key, data);
merr_clear ();
goto done;
}
else if (stcmp (mref_get_subscript (r, 1), "TIMEZONE_OFFSET") == 0) {
long tzo = intexpr (data);
long tzj;
if (merr () > OK) goto done;
tzj = time (0L);
if ((tzoffset > 0 && ((tzj + 86400 + tzoffset) < 0 || (tzj + tzoffset) < 0)) ||
(tzoffset < 0 && ((tzj + 86400 + tzoffset ) > (tzj + 86400) ||
(tzj + tzoffset) > tzj))) {
merr_raise (ARGER);
goto done;
}
tzoffset = tzo;
snprintf (data, 512 - 1, "%ld\201", tzoffset);
symtab_shm (action, key, data);
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ENGINES") == 0) {
if (strcmp (mref_get_subscript (r, 2), "GLOBAL") == 0) {
if ((strcmp (mref_get_subscript (r, 3), nsname) == 0) && (strcmp (mref_get_subscript (r, 3), "SYSTEM") != 0)) {
stcpy (tbuf, data);
stcnv_m2c (tbuf);
global_set_engine ('u', tbuf);
goto done;
}
else if (strcmp (mref_get_subscript (r, 3), "SYSTEM") == 0) {
stcpy (tbuf, data);
stcnv_m2c (tbuf);
global_set_engine ('s', tbuf);
goto done;
}
}
merr_raise (M29);
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "USER_ERRORS") == 0) {
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "SET_ALL_ECODES") == 0) {
frm_throw_all_errors = atol (data);
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "CWD") == 0) {
stcpy (tbuf, data);
stcnv_m2c (tbuf);
if (chdir (tbuf) != 0) {
merr_raise (PROTECT);
goto done;
}
else {
strcpy (curdir, tbuf);
symtab_shm (set_sym, kbuf, data);
merr_clear ();
goto done;
}
}
else if (strcmp (mref_get_subscript (r, 1), "EVENT") == 0) {
symtab_shm (set_sym, kbuf, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "PRIORITY") == 0) {
int new_pri;
stcpy (tbuf, data);
stcnv_m2c (tbuf);
new_pri = atoi (tbuf);
i = nice (40);
nice ((int) (new_pri - 40));
symtab_shm (set_sym, kbuf, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "IOPATH") == 0) {
stcpy (oucpath, data);
symtab_shm (set_sym, kbuf, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "REVSTR") == 0) {
short tres = tvexpr (data);
if (tres == TRUE) {
en_revstrf = 1;
}
else {
en_revstrf = 0;
}
symtab_shm (set_sym, kbuf, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ZDATE_FORMAT") == 0) {
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "ZTIME_FORMAT") == 0) {
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "SYMTAB") == 0) {
int itmp = atoi (data);
if ((data[0] < '0') || (data[0] > '9')) {
merr_raise (INVEXPR);
goto done;
}
if (itmp != 0 && itmp != 1) {
merr_raise (INVEXPR);
goto done;
}
if (cur_symtab == itmp) {
merr_clear ();
goto done;
}
if (cur_symtab == 0) {
cur_symtab = 1;
}
else {
cur_symtab = 0;
}
if (apartition == NULL) {
apartition = calloc ((unsigned) PSIZE + 1, 1);
asymlen = PSIZE;
for (i = 0; i < 128; i++) aalphptr[i] = 0L;
}
{
char *x;
x = apartition;
apartition = partition;
partition = x;
}
ch = asymlen;
asymlen = symlen;
symlen = ch;
for (i = 0; i < 128; i++) {
ch = aalphptr[i];
aalphptr[i] = alphptr[i];
alphptr[i] = ch;
}
s = &partition[symlen] - 256; /* pointer to symlen_offset */
argptr = partition; /* pointer to beg of tmp-storage */
symtab_shm (set_sym, key, data);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "MATH") == 0) {
#if !defined(_AIX)
if (stcmp (data, "IEEE754\201") == 0) {
fp_mode = 1;
symtab_shm (set_sym, kbuf, data);
snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
zprecise = DBL_DIG;
merr_clear ();
goto done;
}
else if (stcmp (data, "FIXED\201") == 0) {
fp_mode = 0;
symtab_shm (set_sym, kbuf, data);
zprecise = 100;
merr_clear ();
goto done;
}
else {
merr_raise (M29);
goto done;
}
#endif
}
merr_raise (M29);
goto done;
}
case get_sym:
if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
stcpy (data, l_o_val);
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
stcpy (data, g_o_val);
goto done;
}
case fra_dat:
case fra_order:
case fra_query:
if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
merr_raise (M38);
goto done;
}
if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
merr_raise (M38);
goto done;
}
case bigquery:
case getnext:
case m_alias:
case zdata:
if (action == get_sym) {
if (strcmp (mref_get_subscript (r, 1), "PROCESS_START") == 0) {
unsigned long ilong;
unsigned long ilong1;
ilong1 = slot->start_time + tzoffset;
ilong = ilong1 / 86400;
lintstr (data, ilong + 47117);
i = stlen (data);
data[i++] = ',';
ilong = ilong1 - (ilong * 86400);
lintstr (&data[i], ilong);
merr_clear ();
goto done;
}
}
symtab_shm (action, kbuf, data);
/* here, we need to convert the data on the way out too */
if ((action == fra_query) && (stlen (data) > 0)) {
if (strncmp (data, "^$JOB", 5) != 0) {
snprintf (kbuf, STRLEN - 1, "^$JOB%s\201", data);
stcpy (data, kbuf);
}
}
merr_clear ();
goto done;
case killone:
case kill_sym:
if (strcmp (mref_get_subscript (r, 1), "ALIASES") == 0) {
symtab_shm (action, key, data);
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "LVNQOVAL") == 0) {
l_o_val[0] = '\201';
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVNQOVAL") == 0) {
g_o_val[0] = '\201';
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "GVNDEFAULT") == 0) {
gvndefault[0] = '\201';
symtab_shm (action, key, data);
symtab_shm (set_sym, key, gvndefault);
merr_clear ();
goto done;
}
else if (strcmp (mref_get_subscript (r, 1), "LVNDEFAULT") == 0) {
lvndefault[0] = '\201';
symtab_shm (action, key, data);
symtab_shm (set_sym, key, lvndefault);
merr_clear ();
goto done;
}
else {
job_request_stop (t_pid);
}
goto done;
default:
merr_raise (INVREF);
goto done;
}
done:
free (r);
free (kbuf);
free (tbuf);
free (key);
return;
}
void frm_process_alias (char *key)
{
int ierr_sav;
char *ptr;
char name[256];
char *subprt;
register int i;
register char ch;
char *k_buf;
char *d_buf;
char *t_buf;
k_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(k_buf,"frm_process_alias");
d_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(d_buf,"frm_process_alias");
t_buf = (char *) malloc (STRLEN * sizeof (char));
NULLPTRCHK(t_buf,"frm_process_alias");
ierr_sav = ierr;
ptr = key;
i = 0;
while ((ch = *(ptr++)) != DELIM && ch != EOL && i < 256) {
name[i++] = ch;
}
name[i] = '\0';
subprt = key + i;
snprintf (k_buf, STRLEN - 1, "^$JOB\202%ld\202ALIASES\202%s\201", (long) pid, name);
symtab_shm (get_sym, k_buf, d_buf);
stcnv_m2c (d_buf);
if (merr () == OK) {
snprintf (t_buf, STRLEN - 1, "%s%s\201", d_buf, subprt);
stcpy (key, t_buf);
}
free (k_buf);
free (d_buf);
free (t_buf);
merr_raise (ierr_sav);
return;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>