fis-gtm/sr_unix/mu_getlst.c

180 lines
5.2 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gtm_limits.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "mupipbckup.h"
#include "gdscc.h"
#include "gdskill.h"
#include "jnl.h"
#include "buddy_list.h"
#include "hashtab_int4.h" /* needed for tp.h */
#include "tp.h"
#include "util.h"
#include "cli.h"
#include "mupip_exit.h"
#include "str_match.h"
#include "mu_getlst.h"
GBLDEF mstr directory;
GBLDEF bool is_directory;
GBLREF bool error_mupip;
GBLREF bool in_backup;
GBLREF gd_addr *gd_header;
GBLREF tp_region *grlist;
GBLREF boolean_t mu_star_specified;
GBLREF backup_reg_list *mu_repl_inst_reg_list;
error_def(ERR_MUBCKNODIR);
error_def(ERR_MUNOACTION);
error_def(ERR_MUNODBNAME);
error_def(ERR_MUPCLIERR);
error_def(ERR_TEXT);
#define CHECK_IF_NOT_ABSENT(QUALIFIER) \
{ \
if (CLI_ABSENT != cli_present(QUALIFIER)) \
{ \
util_out_print(QUALIFIER " cannot be specified without specifying a backup region", TRUE); \
mupip_exit(ERR_MUPCLIERR); \
} \
}
void mu_getlst(char *name, int4 size)
{
char *c1, *c2, *c3, *c4, rbuff[GTM_PATH_MAX], fbuff[GTM_PATH_MAX];
unsigned short rlen, flen, i;
gd_region *reg;
tp_region *list;
boolean_t matched;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
mu_star_specified = FALSE;
assert(size > 0);
rlen = SIZEOF(rbuff);
flen = SIZEOF(fbuff);
is_directory = FALSE;
if (!in_backup)
{
if (!cli_get_str(name, rbuff, &rlen))
mupip_exit(ERR_MUNODBNAME);
} else
{
if (CLI_PRESENT == cli_present("REPLINSTANCE"))
{ /* Region corresponding to the replication instance file has been specified. */
if (0 == TREF(parms_cnt))
{ /* No REG_NAME or SAVE_DIR parameter specified in command line. Disable other backup qualifiers. */
CHECK_IF_NOT_ABSENT("BKUPDBJNL");
CHECK_IF_NOT_ABSENT("BYTESTREAM");
CHECK_IF_NOT_ABSENT("COMPREHENSIVE");
CHECK_IF_NOT_ABSENT("DATABASE");
CHECK_IF_NOT_ABSENT("DBG");
CHECK_IF_NOT_ABSENT("INCREMENTAL");
CHECK_IF_NOT_ABSENT("JOURNAL");
CHECK_IF_NOT_ABSENT("NETTIMEOUT");
CHECK_IF_NOT_ABSENT("NEWJNLFILES");
CHECK_IF_NOT_ABSENT("ONLINE");
CHECK_IF_NOT_ABSENT("RECORD");
CHECK_IF_NOT_ABSENT("REPLICATION");
CHECK_IF_NOT_ABSENT("SINCE");
CHECK_IF_NOT_ABSENT("TRANSACTION");
}
assert(NULL == mu_repl_inst_reg_list);
if (NULL == mu_repl_inst_reg_list)
mu_repl_inst_reg_list = malloc(SIZEOF(backup_reg_list));
if ((!cli_get_str("REPLINSTANCE", fbuff, &flen)) || (0 == flen))
{
util_out_print("Error parsing REPLINSTANCE qualifier", TRUE);
mupip_exit(ERR_MUPCLIERR);
}
if (FALSE == mubgetfil(mu_repl_inst_reg_list, fbuff, flen))
return;
/* Do not let the db region backup destination list be affected if -replinstance had directory specified */
is_directory = FALSE;
}
if ((0 == TREF(parms_cnt)) && mu_repl_inst_reg_list)
{ /* -REPLINSTANCE was specified and no other parameters were specified. Do not bother prompting
* the user to enter values for REG_NAME and SAVE_DIR parameters. */
return;
}
if (!cli_get_str(name, rbuff, &rlen))
mupip_exit(ERR_MUNODBNAME);
flen = SIZEOF(fbuff); /* reset max_buflen to original before call to "cli_get_str" */
if ((!cli_get_str("SAVE_DIR", fbuff, &flen)) || (0 == flen))
mupip_exit(ERR_MUBCKNODIR);
}
for (c1 = c2 = rbuff, c3 = c4 = fbuff;;)
{
for (; *c2 && (*c2 != ','); c2++) /* locate a reg spec */
;
if (c2 - c1 > MAX_RN_LEN)
{
error_mupip = TRUE;
util_out_print("!UL exceeds maximum REGION name length of !UL characters.", TRUE, c2 - c1, MAX_RN_LEN);
} else
{ /* handle the reg spec here */
if ('*' == *c1 && (1 == c2 - c1))
mu_star_specified = TRUE;
matched = FALSE;
for (i = 0, reg = gd_header->regions; i < gd_header->n_regions; i++, reg++)
{
if (TRUE == str_match((char *)REG_STR_LEN(reg), c1, c2 - c1))
{
matched = TRUE;
if (NULL == (list = insert_region(reg, &(grlist), NULL, size)))
{
error_mupip = TRUE;
rts_error(VARLSTCNT(4) ERR_TEXT, 2, RTS_ERROR_STRING("Region not found"));
continue;
}
if ((FALSE == in_backup) || (0 != ((backup_reg_list *)list)->backup_file.len))
continue;
if (TRUE == is_directory)
mubexpfilnam(directory.addr, directory.len, (backup_reg_list *)list);
else
{
for (; *c4 && (*c4 != ','); c4++) /* locate a file spec */
;
if (FALSE == mubgetfil((backup_reg_list *)list, c3, c4 - c3))
break;
if (*c4)
c3 = ++c4;
else if (FALSE == is_directory)
break;
}
}
}
if (!matched)
{
util_out_print("REGION !AD not found", TRUE, c2 - c1, c1);
mupip_exit(ERR_MUNOACTION);
}
}
if (!*c2)
break;
else
c1 = ++c2;
}
return;
}