261 lines
5.8 KiB
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);
|
|
}
|
|
|