fis-gtm/sr_unix/ojparams.c

261 lines
5.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2007 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "job.h"
#include "min_max.h"
/*
* ---------------------------------------------------------
* Parse job parameters
* ---------------------------------------------------------
*/
static readonly char definput[] = "/dev/null";
static readonly char deflogfile[] = "/dev/null";
static char *defoutbuf;
static char *deferrbuf;
MSTR_CONST(defoutext, ".mjo");
MSTR_CONST(deferrext, ".mje");
LITREF jp_datatype job_param_datatypes[];
/*
* ------------------------------------------------
* Parse the parameter buffer and extract all
* parameters for job command.
* Save them in job_params structure.
* ------------------------------------------------
*/
void ojparams (char *p, job_params_type *job_params)
{
unsigned char ch;
int4 status;
error_def (ERR_PARFILSPC);
/* Initializations */
job_params->baspri = 0;
job_params->input.len = 0;
job_params->output.len = 0;
job_params->error.len = 0;
job_params->gbldir.len = 0;
job_params->startup.len = 0;
job_params->logfile.addr = 0;
job_params->logfile.len = 0;
job_params->directory.len = 0;
job_params->directory.addr = 0;
/* Process parameter list */
while (*p != jp_eol)
{
switch (ch = *p++)
{
case jp_default:
if (*p != 0)
{
job_params->directory.len = *p;
job_params->directory.addr = (p + 1);
}
break;
case jp_error:
if (*p != 0)
{
job_params->error.len = *p;
job_params->error.addr = (p + 1);
}
break;
case jp_gbldir:
if (*p != 0)
{
job_params->gbldir.len = *p;
job_params->gbldir.addr = (p + 1);
}
break;
case jp_input:
if (*p != 0)
{
job_params->input.len = *p;
job_params->input.addr = p + 1;
}
break;
case jp_logfile:
if (*p != 0)
{
job_params->logfile.len = *p;
job_params->logfile.addr = p + 1;
}
break;
case jp_output:
if (*p != 0)
{
job_params->output.len = *p;
job_params->output.addr = p + 1;
}
break;
case jp_priority:
job_params->baspri = (int4)(*((int4 *)p));
break;
case jp_startup:
if (*p != 0)
{
job_params->startup.len = *p;
job_params->startup.addr = p + 1;
}
break;
case jp_account:
case jp_detached:
case jp_image:
case jp_noaccount:
case jp_nodetached:
case jp_noswapping:
case jp_process_name:
case jp_schedule:
case jp_swapping:
break;
default:
GTMASSERT;
}
switch (job_param_datatypes[ch])
{
case jpdt_nul:
break;
case jpdt_num:
p += sizeof (int4);
break;
case jpdt_str:
p += (unsigned)*p + 1;
break;
default:
GTMASSERT;
}
}
/* Defaults and Checks */
/*
* Input file
*/
if (job_params->input.len == 0)
{
job_params->input.len = STRLEN(definput);
job_params->input.addr = definput;
}
else
if (!(status = ojchkfs (job_params->input.addr,
job_params->input.len, TRUE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 5, "INPUT",
job_params->input.len, job_params->input.addr);
/*
* Output file
*/
if (job_params->output.len == 0)
{
if (!defoutbuf)
defoutbuf = malloc(MAX_FILSPC_LEN);
memcpy (&defoutbuf[0], job_params->routine.addr,
job_params->routine.len);
memcpy (&defoutbuf[job_params->routine.len],
defoutext.addr, defoutext.len);
if (*defoutbuf == '%')
*defoutbuf = '_';
job_params->output.len = job_params->routine.len
+ defoutext.len;
job_params->output.addr = &defoutbuf[0];
}
else
if (!(status = ojchkfs (job_params->output.addr,
job_params->output.len, FALSE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 6,
"OUTPUT", job_params->output.len,
job_params->output.addr);
/*
* Error file
*/
if (job_params->error.len == 0)
{
if (!deferrbuf)
deferrbuf = malloc(MAX_FILSPC_LEN);
memcpy (&deferrbuf[0], job_params->routine.addr,
job_params->routine.len);
memcpy (&deferrbuf[job_params->routine.len],
deferrext.addr, deferrext.len);
if (*deferrbuf == '%')
*deferrbuf = '_';
job_params->error.len = job_params->routine.len
+ deferrext.len;
job_params->error.addr = &deferrbuf[0];
}
else
if (!(status = ojchkfs (job_params->error.addr,
job_params->error.len, FALSE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 5, "ERROR",
job_params->error.len,
job_params->error.addr);
/*
* Global Directory
*/
if (job_params->gbldir.len)
if (!(status = ojchkfs (job_params->gbldir.addr,
job_params->gbldir.len, FALSE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 6, "GBLDIR",
job_params->gbldir.len, job_params->gbldir.addr);
/*
* Startup
*/
if (job_params->startup.len)
if (!(status = ojchkfs (job_params->startup.addr,
job_params->startup.len, TRUE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 7, "STARTUP",
job_params->startup.len, job_params->startup.addr);
/*
* Default Directory
*/
if (job_params->directory.len)
if (!(status = ojchkfs (job_params->directory.addr,
job_params->directory.len, FALSE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 7, "DEFAULT",
job_params->directory.len, job_params->directory.addr);
/*
* Logfile
*/
if (job_params->logfile.len == 0)
{
job_params->logfile.len = STRLEN(deflogfile);
job_params->logfile.addr = deflogfile;
}
else
if (!(status = ojchkfs (job_params->logfile.addr,
job_params->logfile.len, FALSE)))
rts_error(VARLSTCNT(6) ERR_PARFILSPC, 4, 7, "LOGFILE",
job_params->logfile.len, job_params->logfile.addr);
}