fis-gtm/sr_unix/ojchildparms.c

208 lines
5.6 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
/*
* ---------------------------------------------------------
* Parse job parameters
* ---------------------------------------------------------
*/
#include "mdef.h"
#include "gtm_string.h"
#include "gtm_stdlib.h"
#include "job.h"
#include "compiler.h"
#include "gcall.h"
#include "stringpool.h"
#include "op.h" /* for op_nullexp() */
GBLREF spdesc stringpool;
/*
* ------------------------------------------------
* Get parameters from environment variables into
* parameter structure
* ------------------------------------------------
*/
void ojchildparms(job_params_type *jparms, gcall_args *g_args, mval *arglst)
{
char *sp, *parmbuf;
char parm_string[8];
int4 argcnt, i;
error_def(ERR_STRINGOFLOW);
/* getenv() may use static buffer so for any parms we fetch a value for, rebuffer them so they
don't go away. We use malloc'd space because the stringpool garbage collector does not know
about these private (to this routine) structures and we can't use "temp stringpool space" as
is used in other modules since we will be putting the parms in the stringpool below. The
storage allocated here will be released in jobchild_init() when it is done with it.
*/
if (jparms->directory.addr = GETENV(CWD_ENV))
{
jparms->directory.len = STRLEN(jparms->directory.addr);
if (0 != jparms->directory.len)
{
parmbuf = malloc(jparms->directory.len+1);
memcpy(parmbuf, jparms->directory.addr, jparms->directory.len+1);
jparms->directory.addr = parmbuf;
}
} else
jparms->directory.len = 0;
if (jparms->gbldir.addr = GETENV(GBLDIR_ENV))
{
jparms->gbldir.len = STRLEN(jparms->gbldir.addr);
if (0 != jparms->gbldir.len)
{
parmbuf = malloc(jparms->gbldir.len+1);
memcpy(parmbuf, jparms->gbldir.addr, jparms->gbldir.len+1);
jparms->gbldir.addr = parmbuf;
}
} else
jparms->gbldir.len = 0;
if (jparms->startup.addr = GETENV(STARTUP_ENV))
{
jparms->startup.len = STRLEN(jparms->startup.addr);
if (0 != jparms->startup.len)
{
parmbuf = malloc(jparms->startup.len+1);
memcpy(parmbuf, jparms->startup.addr, jparms->startup.len+1);
jparms->startup.addr = parmbuf;
}
} else
jparms->startup.len = 0;
if (jparms->input.addr = GETENV(IN_FILE_ENV))
{
jparms->input.len = STRLEN(jparms->input.addr);
if (0 != jparms->input.len)
{
parmbuf = malloc(jparms->input.len+1);
memcpy(parmbuf, jparms->input.addr, jparms->input.len+1);
jparms->input.addr = parmbuf;
}
} else
jparms->input.len = 0;
if (jparms->output.addr = GETENV(OUT_FILE_ENV))
{
jparms->output.len = STRLEN(jparms->output.addr);
if (0 != jparms->output.len)
{
parmbuf = malloc(jparms->output.len+1);
memcpy(parmbuf, jparms->output.addr, jparms->output.len+1);
jparms->output.addr = parmbuf;
}
} else
jparms->output.len = 0;
if (jparms->error.addr = GETENV(ERR_FILE_ENV))
{
jparms->error.len = STRLEN(jparms->error.addr);
if (0 != jparms->error.len)
{
parmbuf = malloc(jparms->error.len+1);
memcpy(parmbuf, jparms->error.addr, jparms->error.len+1);
jparms->error.addr = parmbuf;
}
} else
jparms->error.len = 0;
if (jparms->routine.addr = GETENV(ROUTINE_ENV))
{
jparms->routine.len = STRLEN(jparms->routine.addr);
if (0 != jparms->routine.len)
{
parmbuf = malloc(jparms->routine.len+1);
memcpy(parmbuf, jparms->routine.addr, jparms->routine.len+1);
jparms->routine.addr = parmbuf;
}
} else
jparms->routine.len = 0;
if (jparms->label.addr = GETENV(LABEL_ENV))
{
jparms->label.len = STRLEN(jparms->label.addr);
if (0 != jparms->label.len)
{
parmbuf = malloc(jparms->label.len+1);
memcpy(parmbuf, jparms->label.addr, jparms->label.len+1);
jparms->label.addr = parmbuf;
}
} else
jparms->label.len = 0;
if (jparms->logfile.addr = GETENV(LOG_FILE_ENV))
{
jparms->logfile.len = STRLEN(jparms->logfile.addr);
if (0 != jparms->logfile.len)
{
parmbuf = malloc(jparms->logfile.len+1);
memcpy(parmbuf, jparms->logfile.addr, jparms->logfile.len+1);
jparms->logfile.addr = parmbuf;
}
} else
jparms->logfile.len = 0;
if (sp = GETENV(OFFSET_ENV))
jparms->offset = (int)(ATOL(sp));
else
jparms->offset = 0;
if (sp = GETENV(PRIORITY_ENV))
jparms->baspri = (int)(ATOL(sp));
else
jparms->baspri = 0;
if (!(sp = GETENV(GTMJCNT_ENV)))
GTMASSERT;
if (argcnt = (int)(ATOL(sp)))
{
ENSURE_STP_FREE_SPACE(argcnt * MAX_TRANS_NAME_LEN);
g_args->callargs = argcnt + 4;
g_args->truth = 1;
g_args->retval = 0;
g_args->mask = 0;
g_args->argcnt = argcnt;
memcpy(parm_string,"gtmj000",8);
for (i = 0; i < argcnt; i++)
{
if (sp = GETENV(parm_string))
{
if (!IS_STP_SPACE_AVAILABLE_PRO(STRLEN(sp)))
rts_error(VARLSTCNT(1) (ERR_STRINGOFLOW));
arglst[i].str.len = STRLEN(sp);
arglst[i].str.addr = (char *)stringpool.free;
memcpy(stringpool.free, sp, arglst[i].str.len);
stringpool.free += arglst[i].str.len;
arglst[i].mvtype = MV_STR;
} else
op_nullexp(&arglst[i]);
g_args->argval[i] = &arglst[i];
if (parm_string[6] == '9')
{
if (parm_string[5] == '9')
{
parm_string[4] = parm_string[4] + 1;
parm_string[5] = '0';
} else
parm_string[5] = parm_string[5] + 1;
parm_string[6] = '0';
} else
parm_string[6] = parm_string[6] + 1;
}
} else
g_args->callargs = 0;
}