180 lines
5.2 KiB
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;
|
|
}
|