|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Copyright (c) 1998,1999,2000
|
|
Packit Service |
392537 |
* Traakan, Inc., Los Altos, CA
|
|
Packit Service |
392537 |
* All rights reserved.
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
392537 |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
392537 |
* are met:
|
|
Packit Service |
392537 |
* 1. Redistributions of source code must retain the above copyright
|
|
Packit Service |
392537 |
* notice unmodified, this list of conditions, and the following
|
|
Packit Service |
392537 |
* disclaimer.
|
|
Packit Service |
392537 |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
392537 |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
392537 |
* documentation and/or other materials provided with the distribution.
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
Packit Service |
392537 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit Service |
392537 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit Service |
392537 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
Packit Service |
392537 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit Service |
392537 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
Packit Service |
392537 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
Packit Service |
392537 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
Packit Service |
392537 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
Packit Service |
392537 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
Packit Service |
392537 |
* SUCH DAMAGE.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Project: NDMJOB
|
|
Packit Service |
392537 |
* Ident: $Id: $
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* Description:
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#include "ndmjob.h"
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
char *help_text[] = {
|
|
Packit Service |
392537 |
"ndmjob -v -- print version and configuration info",
|
|
Packit Service |
392537 |
"ndmjob OPTIONS ... FILES ...",
|
|
Packit Service |
392537 |
" FILES can be FILEPATH or NEWFILEPATH=OLDFILEPATH with",
|
|
Packit Service |
392537 |
" '=' quoted by backslash.",
|
|
Packit Service |
392537 |
"Modes (exactly one required)",
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
" -c -- create a backup",
|
|
Packit Service |
392537 |
" -t -- list contents on a backup",
|
|
Packit Service |
392537 |
" -x -- extract from a backup",
|
|
Packit Service |
392537 |
" -l -- list media labels",
|
|
Packit Service |
392537 |
" -q -- query agent(s)",
|
|
Packit Service |
392537 |
" -Z -- clean up zee mess (put robot right)",
|
|
Packit Service |
392537 |
" -o init-labels -- init media labels",
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
#ifndef NDMOS_EFFECT_NO_SERVER_AGENTS
|
|
Packit Service |
392537 |
" -o daemon -- launch session for incoming connections",
|
|
Packit Service |
392537 |
" -o test-daemon -- launch session for incoming connections, exit when stdin is closed",
|
|
Packit Service |
392537 |
" -o tape-size=SIZE -- specify the length, in bytes of the simulated tape",
|
|
Packit Service |
392537 |
#endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
" -o rewind -- rewind tape in drive, need -T and -f",
|
|
Packit Service |
392537 |
" -o eject -- eject tape in drive, need -T and -f",
|
|
Packit Service |
392537 |
" -o move -- cmd ROBOT to move tape, need -o from/to-addr",
|
|
Packit Service |
392537 |
" -o import=ELEMADDR -- cmd ROBOT to import tape from door to slot",
|
|
Packit Service |
392537 |
" -o export=ELEMADDR -- cmd ROBOT to export tape from slot to door",
|
|
Packit Service |
392537 |
" -o load=ELEMADDR -- cmd ROBOT to load tape from slot to drive",
|
|
Packit Service |
392537 |
" -o unload[=ELEMADDR]-- cmd ROBOT to unload tape, sometimes auto",
|
|
Packit Service |
392537 |
" -o init-elem-status -- cmd ROBOT to rescan tape slots",
|
|
Packit Service |
392537 |
" -o test-tape -- test TAPE agent NDMP_TAPE functions",
|
|
Packit Service |
392537 |
" -o test-mover -- test TAPE agent NDMP_MOVER functions",
|
|
Packit Service |
392537 |
" -o test-data -- test DATA agent NDMP_DATA functions",
|
|
Packit Service |
392537 |
" -o time-limit=N",
|
|
Packit Service |
392537 |
" -- check for reply within specified seconds (default 360)",
|
|
Packit Service |
392537 |
" -o swap-connect -- perform DATA LISTEN & MOVER CONNECT",
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
" -p -- pass DATA->DATA (ndmpcopy)",
|
|
Packit Service |
392537 |
" -P -- pass TAPE->TAPE",
|
|
Packit Service |
392537 |
" -o c-partial -- partial backup",
|
|
Packit Service |
392537 |
" -o c-full -- full backup",
|
|
Packit Service |
392537 |
" -o x-restore -- extract restoring",
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
"General and Logging parameters",
|
|
Packit Service |
392537 |
" --MACRO -- expand MACRO from ndmjob-args file",
|
|
Packit Service |
392537 |
" -d N -- set debug level to N (default 0, max 9)",
|
|
Packit Service |
392537 |
" -L FILE -- set log file (default stderr, includes debug)",
|
|
Packit Service |
392537 |
" -n -- no-op, just show how args were handled",
|
|
Packit Service |
392537 |
" -v -- verbose, same messages as -d1 to standard out",
|
|
Packit Service |
392537 |
" -S -- Perform DATA listen and MOVER CONNECT",
|
|
Packit Service |
392537 |
" -p PORT -- NDMP port to listen on (for -o daemon)",
|
|
Packit Service |
392537 |
" -o no-time-stamps -- log w/o time stamps, makes diff(1)s easier",
|
|
Packit Service |
392537 |
" -o config-file=PATH",
|
|
Packit Service |
392537 |
" -- set config file ($NDMJOB_CONFIG, /usr/local/etc/ndmjob.conf)",
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
"CONTROL of DATA agent parameters",
|
|
Packit Service |
392537 |
" -D AGENT -- data agent (see AGENT below)",
|
|
Packit Service |
392537 |
" -B TYPE -- set backup format (default tar)",
|
|
Packit Service |
392537 |
" -C DIR -- change directory on data agent before operation",
|
|
Packit Service |
392537 |
" -e PATN -- exclude files matching pattern",
|
|
Packit Service |
392537 |
" -E NAME=VAL -- add to data agent environment",
|
|
Packit Service |
392537 |
" -F FILE -- add FILE arg (used to not confuse arg processing)",
|
|
Packit Service |
392537 |
" -o load-files=PATHNAME",
|
|
Packit Service |
392537 |
" -- load FILES from the specified PATHANME",
|
|
Packit Service |
392537 |
" -o import=ELEMADDR -- cmd ROBOT to import tape from door to slot",
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
" -I FILE -- set output index file, enable FILEHIST (default to log)",
|
|
Packit Service |
392537 |
" -J FILE -- set input index file (default none)",
|
|
Packit Service |
392537 |
" -U USER -- user rights to use on data agent",
|
|
Packit Service |
392537 |
" -o rules=RULES -- apply RULES to job (see RULES below)",
|
|
Packit Service |
392537 |
"CONTROL of TAPE agent parameters",
|
|
Packit Service |
392537 |
" -T AGENT -- tape agent if different than -D (see AGENT below)",
|
|
Packit Service |
392537 |
" -b N -- block size in 512-byte records (default 20)",
|
|
Packit Service |
392537 |
" -f TAPE -- tape drive device name",
|
|
Packit Service |
392537 |
" -o tape-timeout=SECONDS",
|
|
Packit Service |
392537 |
" -- how long to retry opening drive (await tape)",
|
|
Packit Service |
392537 |
" -o use-eject=N",
|
|
Packit Service |
392537 |
" -- use eject when unloading tapes (default 0)",
|
|
Packit Service |
392537 |
" -o tape-tcp=hostname:port -- send the data directly to that tcp port.",
|
|
Packit Service |
392537 |
" -o D-agent-fd=<fd> -- file descriptor to read the -D agent.",
|
|
Packit Service |
392537 |
"CONTROL of ROBOT agent parameters",
|
|
Packit Service |
392537 |
" -R AGENT -- robot agent if different than -T (see AGENT below)",
|
|
Packit Service |
392537 |
" -m MEDIA -- add entry to media table (see below)",
|
|
Packit Service |
392537 |
" -o tape-addr=ELEMADDR",
|
|
Packit Service |
392537 |
" -- robot element address of drive (default first)",
|
|
Packit Service |
392537 |
" -o tape-scsi=SCSI",
|
|
Packit Service |
392537 |
" -- tape drive SCSI target (see below)",
|
|
Packit Service |
392537 |
" -o robot-timeout=SECONDS",
|
|
Packit Service |
392537 |
" -- how long to retry moving tapes (await robot)",
|
|
Packit Service |
392537 |
" -r SCSI -- tape robot target (see below)",
|
|
Packit Service |
392537 |
"",
|
|
Packit Service |
392537 |
"Definitions:",
|
|
Packit Service |
392537 |
" AGENT HOST[:PORT][/FLAGS][,USERNAME,PASSWORD]",
|
|
Packit Service |
392537 |
" FLAGS [234][ntm] 2->v2 3->v3 4->v4 n->AUTH_NONE t->TEXT m->MD5",
|
|
Packit Service |
392537 |
" AGENT . (resident)",
|
|
Packit Service |
392537 |
" SCSI DEVICE[,[CNUM,]SID[,LUN]]",
|
|
Packit Service |
392537 |
" MEDIA [TAPE-LABEL][+SKIP-FILEMARKS][@ELEMADDR][/WINDOW-SIZE]",
|
|
Packit Service |
392537 |
"",
|
|
Packit Service |
392537 |
"RULES:",
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
0
|
|
Packit Service |
392537 |
};
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
process_args (int argc, char *argv[])
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
int c;
|
|
Packit Service |
392537 |
char options[100];
|
|
Packit Service |
392537 |
char ** pp;
|
|
Packit Service |
392537 |
char * p;
|
|
Packit Service |
392537 |
char * op;
|
|
Packit Service |
392537 |
char ** av;
|
|
Packit Service |
392537 |
int ac = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
progname = argv[0];
|
|
Packit Service |
392537 |
av = malloc((argc+1000) * sizeof(char *));
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (argc == 2 && strcmp (argv[1], "-help") == 0) {
|
|
Packit Service |
392537 |
help();
|
|
Packit Service |
392537 |
exit(0);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (argc == 2 && strcmp (argv[1], "-v") == 0) {
|
|
Packit Service |
392537 |
ndmjob_version_info ();
|
|
Packit Service |
392537 |
exit(0);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (argc < 2)
|
|
Packit Service |
392537 |
usage();
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
o_config_file = g_strdup_printf("%s/ndmjob.conf", amdatadir);
|
|
Packit Service |
392537 |
if ((p = getenv ("NDMJOB_CONF")) != 0) {
|
|
Packit Service |
392537 |
o_config_file = p;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
op = options;
|
|
Packit Service |
392537 |
for (pp = help_text; *pp; pp++) {
|
|
Packit Service |
392537 |
p = *pp;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (strncmp (p, " -", 3) != 0)
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
if (p[3] == 'o')
|
|
Packit Service |
392537 |
continue; /* don't include o: repeatedly */
|
|
Packit Service |
392537 |
*op++ = p[3];
|
|
Packit Service |
392537 |
if (p[5] != ' ')
|
|
Packit Service |
392537 |
*op++ = ':';
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
*op++ = 'o'; /* include o: once */
|
|
Packit Service |
392537 |
*op++ = ':';
|
|
Packit Service |
392537 |
*op = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ac = copy_args_expanding_macros (argc, argv, av, G_N_ELEMENTS(av));
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
while ((c = getopt (ac, av, options)) != EOF) {
|
|
Packit Service |
392537 |
switch (c) {
|
|
Packit Service |
392537 |
case 'o':
|
|
Packit Service |
392537 |
handle_long_option (optarg);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
case 'c': /* -c -- create a backup */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_BACKUP);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 't': /* -t -- list contents on a backup */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_TOC);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'x': /* -x -- extract from a backup */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_EXTRACT);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'l': /* -l -- list media labels */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_LIST_LABELS);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'q': /* -q -- query agent(s) */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_QUERY_AGENTS);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'Z': /* -Z -- clean up zee mess */
|
|
Packit Service |
392537 |
set_job_mode (NDM_JOB_OP_REMEDY_ROBOT);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'B': /* -B TYPE -- set backup format (default tar) */
|
|
Packit Service |
392537 |
if (B_bu_type) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -B");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
B_bu_type = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'b': /* -b N -- block size in 512-byte records (20) */
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
long b = strtol(optarg, NULL, 10);
|
|
Packit Service |
392537 |
if (b < 1 || b > 200 || (!b && EINVAL == errno)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -b option");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
b_bsize = (int) b;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'p': /* -p N -- port number for daemon mode (10000) */
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
long p = strtol(optarg, NULL, 10);
|
|
Packit Service |
392537 |
if (p < 1 || p > 65535 || (!p && EINVAL == errno)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -p option");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
p_ndmp_port = (int) p;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'C': /* -C DIR -- change directory on data agent */
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
/* allow second to override first. make recover easier */
|
|
Packit Service |
392537 |
if (C_chdir) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -C");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
C_chdir = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'D': /* -D AGENT -- data agent (see below) */
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(D_data_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -D");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ndmagent_from_str (&D_data_agent, optarg)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -D argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'd': /* -d N -- set debug level to N */
|
|
Packit Service |
392537 |
d_debug = atoi(optarg);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
case 'E': /* -E NAME=VAL -- add to data agent environment */
|
|
Packit Service |
392537 |
if (n_E_environment >= NDM_MAX_ENV) {
|
|
Packit Service |
392537 |
error_byebye ("too many of -E");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char * p;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
p = optarg;
|
|
Packit Service |
392537 |
E_environment[n_E_environment].name = p;
|
|
Packit Service |
392537 |
while (*p && *p != '=') p++;
|
|
Packit Service |
392537 |
if (*p != '=') {
|
|
Packit Service |
392537 |
error_byebye ("missing value in -E");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
*p++ = 0;
|
|
Packit Service |
392537 |
E_environment[n_E_environment].value = p;
|
|
Packit Service |
392537 |
n_E_environment++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'e': /* -e PATN -- exclude files matching pattern */
|
|
Packit Service |
392537 |
if (n_e_exclude_pattern >= MAX_EXCLUDE_PATTERN) {
|
|
Packit Service |
392537 |
error_byebye ("too many of -e");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
e_exclude_pattern[n_e_exclude_pattern++] = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'F': /* -F FILE -- add to list of files */
|
|
Packit Service |
392537 |
if (n_file_arg >= MAX_FILE_ARG) {
|
|
Packit Service |
392537 |
error_byebye ("too many FILE args");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (strchr(optarg, '=')) {
|
|
Packit Service |
392537 |
char *p = strchr(optarg, '=');
|
|
Packit Service |
392537 |
*p++ = 0;
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = p;
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = optarg;
|
|
Packit Service |
392537 |
n_file_arg++;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = optarg;
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = 0;
|
|
Packit Service |
392537 |
n_file_arg++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'f': /* -f TAPE -- tape drive device name */
|
|
Packit Service |
392537 |
if (f_tape_device) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -f");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
f_tape_device = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'I': /* -I FILE -- output index, enab FILEHIST */
|
|
Packit Service |
392537 |
if (I_index_file) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -I");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
I_index_file = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'J': /* -J FILE -- input index */
|
|
Packit Service |
392537 |
if (J_index_file) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -J");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
J_index_file = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'L': /* -L FILE -- set log file (def stderr, incl. dbg) */
|
|
Packit Service |
392537 |
if (L_log_file) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -L");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
L_log_file = optarg;
|
|
Packit Service |
392537 |
if (d_debug < 2) d_debug = 2;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'm': /* -m MEDIA -- add entry to media table (see below) */
|
|
Packit Service |
392537 |
if (n_m_media >= NDM_MAX_MEDIA) {
|
|
Packit Service |
392537 |
error_byebye ("too many of -m");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ndmmedia_from_str (&m_media[n_m_media], optarg)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -m argument: %s", optarg);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
n_m_media++;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'n': /* -n -- no-op, show how args were handled */
|
|
Packit Service |
392537 |
n_noop++;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
case 'R': /* -R AGENT -- robot agent if different than -T */
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(R_robot_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -R");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ndmagent_from_str (&R_robot_agent, optarg)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -R argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'r': /* -r SCSI -- tape robot target (see below) */
|
|
Packit Service |
392537 |
if (ROBOT_GIVEN()) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -r");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ndmscsi_target_from_str (&r_robot_target, optarg)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -r argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'T': /* -T AGENT -- tape agent if different than -D */
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(T_tape_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -T");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ndmagent_from_str (&T_tape_agent, optarg)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -T argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'U': /* -U USER -- user rights to use on data agent */
|
|
Packit Service |
392537 |
if (U_user) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -U");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
U_user = optarg;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'v': /* -v -- verbose */
|
|
Packit Service |
392537 |
v_verbose++;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
default:
|
|
Packit Service |
392537 |
usage();
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (n_noop && d_debug > 1) {
|
|
Packit Service |
392537 |
int i;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (i = 0; i < ac; i++) {
|
|
Packit Service |
392537 |
printf (" av[%d] = '%s'\n", i, av[i]);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!the_mode) {
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
printf ("must specify one of -[ctxlqZ] or other mode\n");
|
|
Packit Service |
392537 |
#else /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
printf ("must specify -o daemon\n");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
usage();
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
for (c = optind; c < ac; c++) {
|
|
Packit Service |
392537 |
if (n_file_arg >= MAX_FILE_ARG) {
|
|
Packit Service |
392537 |
error_byebye ("too many file args");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (strchr(av[c], '=')) {
|
|
Packit Service |
392537 |
char *p = strchr(av[c], '=');
|
|
Packit Service |
392537 |
*p++ = 0;
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = p;
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = av[c];
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = av[c];
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
n_file_arg++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (o_load_files_file) {
|
|
Packit Service |
392537 |
char buf[2048];
|
|
Packit Service |
392537 |
FILE *fp;
|
|
Packit Service |
392537 |
static struct load_file_entry {
|
|
Packit Service |
392537 |
struct load_file_entry *next;
|
|
Packit Service |
392537 |
char name[1];
|
|
Packit Service |
392537 |
} *load_files_list = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* clean up old load_files_list */
|
|
Packit Service |
392537 |
while (load_files_list) {
|
|
Packit Service |
392537 |
struct load_file_entry *p;
|
|
Packit Service |
392537 |
p = load_files_list;
|
|
Packit Service |
392537 |
load_files_list = p->next;
|
|
Packit Service |
392537 |
p->next = 0;
|
|
Packit Service |
392537 |
free(p);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
fp = fopen(o_load_files_file, "r");
|
|
Packit Service |
392537 |
if (!fp) {
|
|
Packit Service |
392537 |
perror (o_load_files_file);
|
|
Packit Service |
392537 |
error_byebye ("can't open load_files file %s",
|
|
Packit Service |
392537 |
o_load_files_file);
|
|
Packit Service |
392537 |
/* no return */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
while (fgets (buf, sizeof buf, fp) != NULL) {
|
|
Packit Service |
392537 |
char *bp = buf, *p, *ep;
|
|
Packit Service |
392537 |
int len, slen;
|
|
Packit Service |
392537 |
struct load_file_entry *lfe;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
bp = buf;
|
|
Packit Service |
392537 |
while (*bp && isspace(*bp))
|
|
Packit Service |
392537 |
bp++;
|
|
Packit Service |
392537 |
ep = bp;
|
|
Packit Service |
392537 |
while (*ep && (*ep != '\n') && (*ep != '\r'))
|
|
Packit Service |
392537 |
ep++;
|
|
Packit Service |
392537 |
*ep = 0;
|
|
Packit Service |
392537 |
if (bp >= ep)
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (n_file_arg >= MAX_FILE_ARG) {
|
|
Packit Service |
392537 |
error_byebye ("too many FILE args");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* allocate memory */
|
|
Packit Service |
392537 |
slen = (ep-bp)+2;
|
|
Packit Service |
392537 |
len = sizeof(struct load_file_entry)+(ep-bp)+1;
|
|
Packit Service |
392537 |
lfe = malloc(len);
|
|
Packit Service |
392537 |
if (lfe == 0) {
|
|
Packit Service |
392537 |
error_byebye ("can't allocate entry for load_files file line %s",
|
|
Packit Service |
392537 |
bp);
|
|
Packit Service |
392537 |
/* no return */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
lfe->next = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* see if we have destination */
|
|
Packit Service |
392537 |
if ((p = strchr(bp, '=')) != 0) {
|
|
Packit Service |
392537 |
int plen;
|
|
Packit Service |
392537 |
char ch = *p;
|
|
Packit Service |
392537 |
*p = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* double conversion -- assume the strings shrink */
|
|
Packit Service |
392537 |
plen = (p-bp);
|
|
Packit Service |
392537 |
ndmcstr_to_str(p, &lfe->name[plen+2], slen-plen-2);
|
|
Packit Service |
392537 |
ndmcstr_to_str(bp, lfe->name, plen+1);
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = &lfe->name[plen+2];
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = lfe->name;
|
|
Packit Service |
392537 |
*p = ch;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
/* simple conversion copy */
|
|
Packit Service |
392537 |
ndmcstr_to_str(bp, lfe->name, slen-1);
|
|
Packit Service |
392537 |
file_arg[n_file_arg] = lfe->name;
|
|
Packit Service |
392537 |
file_arg_new[n_file_arg] = 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
n_file_arg++;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* link into list */
|
|
Packit Service |
392537 |
lfe->next = load_files_list;
|
|
Packit Service |
392537 |
load_files_list = lfe;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
fclose (fp);
|
|
Packit Service |
392537 |
} /* end of load_files option */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!B_bu_type)
|
|
Packit Service |
392537 |
B_bu_type = "tar";
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* A quirk of the NDMP protocol is that the robot
|
|
Packit Service |
392537 |
* should be accessed over a different connection
|
|
Packit Service |
392537 |
* than the TAPE agent. (See the Workflow document).
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ROBOT_GIVEN()) {
|
|
Packit Service |
392537 |
if (!AGENT_GIVEN(R_robot_agent)) {
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(T_tape_agent))
|
|
Packit Service |
392537 |
R_robot_agent = T_tape_agent;
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
R_robot_agent = D_data_agent;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!AGENT_GIVEN(R_robot_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("-r given, can't determine -R");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (AGENT_GIVEN(R_robot_agent)) {
|
|
Packit Service |
392537 |
if (the_mode != NDM_JOB_OP_QUERY_AGENTS) {
|
|
Packit Service |
392537 |
error_byebye ("-R but no -r");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
struct ndmp_enum_str_table mode_long_name_table[] = {
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
{ "init-labels", NDM_JOB_OP_INIT_LABELS },
|
|
Packit Service |
392537 |
{ "test-tape", NDM_JOB_OP_TEST_TAPE },
|
|
Packit Service |
392537 |
{ "test-mover", NDM_JOB_OP_TEST_MOVER },
|
|
Packit Service |
392537 |
{ "test-data", NDM_JOB_OP_TEST_DATA },
|
|
Packit Service |
392537 |
{ "eject", NDM_JOB_OP_EJECT_TAPE },
|
|
Packit Service |
392537 |
{ "rewind", NDM_JOB_OP_REWIND_TAPE },
|
|
Packit Service |
392537 |
{ "move", NDM_JOB_OP_MOVE_TAPE },
|
|
Packit Service |
392537 |
{ "import", NDM_JOB_OP_IMPORT_TAPE },
|
|
Packit Service |
392537 |
{ "export", NDM_JOB_OP_EXPORT_TAPE },
|
|
Packit Service |
392537 |
{ "load", NDM_JOB_OP_LOAD_TAPE },
|
|
Packit Service |
392537 |
{ "unload", NDM_JOB_OP_UNLOAD_TAPE },
|
|
Packit Service |
392537 |
{ "init-elem-status", NDM_JOB_OP_INIT_ELEM_STATUS },
|
|
Packit Service |
392537 |
{ "-c", NDM_JOB_OP_BACKUP },
|
|
Packit Service |
392537 |
{ "-t", NDM_JOB_OP_TOC },
|
|
Packit Service |
392537 |
{ "-x", NDM_JOB_OP_EXTRACT },
|
|
Packit Service |
392537 |
{ "-l", NDM_JOB_OP_LIST_LABELS },
|
|
Packit Service |
392537 |
{ "-q", NDM_JOB_OP_QUERY_AGENTS },
|
|
Packit Service |
392537 |
{ "-Z", NDM_JOB_OP_REMEDY_ROBOT },
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
#ifndef NDMOS_EFFECT_NO_SERVER_AGENTS
|
|
Packit Service |
392537 |
{ "daemon", NDM_JOB_OP_DAEMON },
|
|
Packit Service |
392537 |
{ "test-daemon", NDM_JOB_OP_TEST_DAEMON },
|
|
Packit Service |
392537 |
#endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */
|
|
Packit Service |
392537 |
{ 0 }
|
|
Packit Service |
392537 |
};
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
handle_long_option (char *str)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char * name;
|
|
Packit Service |
392537 |
char * value;
|
|
Packit Service |
392537 |
int mode;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
name = str;
|
|
Packit Service |
392537 |
for (value = str; *value; value++)
|
|
Packit Service |
392537 |
if (*value == '=')
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
if (*value)
|
|
Packit Service |
392537 |
*value++ = 0;
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
value = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmp_enum_from_str (&mode, name, mode_long_name_table)) {
|
|
Packit Service |
392537 |
set_job_mode (mode);
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
if (value) {
|
|
Packit Service |
392537 |
switch (mode) {
|
|
Packit Service |
392537 |
default: /* value part ignored */
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case NDM_JOB_OP_LOAD_TAPE:
|
|
Packit Service |
392537 |
case NDM_JOB_OP_EXPORT_TAPE:
|
|
Packit Service |
392537 |
o_from_addr = atoi(value);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
case NDM_JOB_OP_UNLOAD_TAPE:
|
|
Packit Service |
392537 |
case NDM_JOB_OP_IMPORT_TAPE:
|
|
Packit Service |
392537 |
o_to_addr = atoi(value);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (strcmp (name, "swap-connect") == 0) {
|
|
Packit Service |
392537 |
/* value part ignored */
|
|
Packit Service |
392537 |
o_swap_connect++;
|
|
Packit Service |
392537 |
} else if (strcmp (name, "time-limit") == 0) {
|
|
Packit Service |
392537 |
if (!value) {
|
|
Packit Service |
392537 |
o_time_limit = 5*60;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
o_time_limit = atoi(value);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (strcmp (name, "use-eject") == 0) {
|
|
Packit Service |
392537 |
if (!value) {
|
|
Packit Service |
392537 |
o_use_eject = 1;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
o_use_eject = atoi(value);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (strcmp (name, "tape-addr") == 0 && value) {
|
|
Packit Service |
392537 |
o_tape_addr = atoi(value);
|
|
Packit Service |
392537 |
} else if (strcmp (name, "from-addr") == 0 && value) {
|
|
Packit Service |
392537 |
o_from_addr = atoi(value);
|
|
Packit Service |
392537 |
} else if (strcmp (name, "to-addr") == 0 && value) {
|
|
Packit Service |
392537 |
o_to_addr = atoi(value);
|
|
Packit Service |
392537 |
} else if (strcmp (name, "tape-timeout") == 0 && value) {
|
|
Packit Service |
392537 |
o_tape_timeout = atoi(value);
|
|
Packit Service |
392537 |
} else if (strcmp (name, "robot-timeout") == 0 && value) {
|
|
Packit Service |
392537 |
o_robot_timeout = atoi(value);
|
|
Packit Service |
392537 |
} else if (strcmp (name, "tape-scsi") == 0 && value) {
|
|
Packit Service |
392537 |
if (ndmscsi_target_from_str (&o_tape_scsi, value)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -otape-scsi argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (strcmp (name, "rules") == 0 && value) {
|
|
Packit Service |
392537 |
if (!value)
|
|
Packit Service |
392537 |
error_byebye ("missing RULES in -o rules");
|
|
Packit Service |
392537 |
o_rules = value;
|
|
Packit Service |
392537 |
} else if (strcmp (name, "load-files") == 0 && value) {
|
|
Packit Service |
392537 |
o_load_files_file = value;
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
} else if (strcmp (name, "no-time-stamps") == 0) {
|
|
Packit Service |
392537 |
/* value part ignored */
|
|
Packit Service |
392537 |
o_no_time_stamps++;
|
|
Packit Service |
392537 |
} else if (strcmp (name, "config-file") == 0 && value) {
|
|
Packit Service |
392537 |
o_config_file = value;
|
|
Packit Service |
392537 |
} else if (strcmp (name, "tape-tcp") == 0 && value) {
|
|
Packit Service |
392537 |
o_tape_tcp = value;
|
|
Packit Service |
392537 |
} else if (strcmp (name, "D-agent-fd") == 0 && value) {
|
|
Packit Service |
392537 |
char d_agent[1025];
|
|
Packit Service |
392537 |
int fd = atoi(value);
|
|
Packit Service |
392537 |
int size;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(D_data_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("more than one of -D or -D-agent-fd");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
size = full_read(fd, d_agent, 1024);
|
|
Packit Service |
392537 |
d_agent[size] = '\0';
|
|
Packit Service |
392537 |
if (size > 0 && d_agent[size-1] == '\n')
|
|
Packit Service |
392537 |
d_agent[size-1] = '\0';
|
|
Packit Service |
392537 |
close(fd);
|
|
Packit Service |
392537 |
if (ndmagent_from_str (&D_data_agent, d_agent)) {
|
|
Packit Service |
392537 |
error_byebye ("bad -D-agent-fd argument");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else if (strcmp (name, "tape-limit") == 0) {
|
|
Packit Service |
392537 |
if (!value) {
|
|
Packit Service |
392537 |
error_byebye ("tape-limit argument is required");
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
o_tape_limit = atoi(value);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
if (value) value[-1] = '=';
|
|
Packit Service |
392537 |
error_byebye ("unknown/bad long option -o%s", str);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (value) value[-1] = '=';
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
void
|
|
Packit Service |
392537 |
set_job_mode (int mode)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
if (the_mode) {
|
|
Packit Service |
392537 |
printf ("more than one -[ctxlqZ] or other mode");
|
|
Packit Service |
392537 |
usage();
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
the_mode = mode;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
void
|
|
Packit Service |
392537 |
usage (void)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
error_byebye ("bad usage, use -help");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
void
|
|
Packit Service |
392537 |
help (void)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char * p;
|
|
Packit Service |
392537 |
char ** pp;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (pp = help_text; *pp; pp++) {
|
|
Packit Service |
392537 |
p = *pp;
|
|
Packit Service |
392537 |
printf ("%s\n", p);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
help_rules();
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
void
|
|
Packit Service |
392537 |
ndmjob_version_info (void)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char vbuf[100];
|
|
Packit Service |
392537 |
char abuf[100];
|
|
Packit Service |
392537 |
char obuf[5];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
*vbuf = 0;
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_NDMP2
|
|
Packit Service |
392537 |
strcat (vbuf, " NDMPv2");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_NDMP2 */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_NDMP3
|
|
Packit Service |
392537 |
strcat (vbuf, " NDMPv3");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_NDMP3 */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_NDMP4
|
|
Packit Service |
392537 |
strcat (vbuf, " NDMPv4");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_NDMP4 */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
*abuf = 0;
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
strcat (abuf, " CONTROL");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_DATA_AGENT
|
|
Packit Service |
392537 |
strcat (abuf, " DATA");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_DATA_AGENT */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_TAPE_AGENT
|
|
Packit Service |
392537 |
strcat (abuf, " TAPE");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_ROBOT_AGENT
|
|
Packit Service |
392537 |
strcat (abuf, " ROBOT");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
obuf[0] = (char)(NDMOS_ID >> 24);
|
|
Packit Service |
392537 |
obuf[1] = (char)(NDMOS_ID >> 16);
|
|
Packit Service |
392537 |
obuf[2] = (char)(NDMOS_ID >> 8);
|
|
Packit Service |
392537 |
obuf[3] = (char)(NDMOS_ID >> 0);
|
|
Packit Service |
392537 |
obuf[4] = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("%s (%s)\n",
|
|
Packit Service |
392537 |
NDMOS_CONST_PRODUCT_NAME,
|
|
Packit Service |
392537 |
NDMOS_CONST_VENDOR_NAME);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf (" Rev %s LIB:%d.%d/%s OS:%s (%s)\n",
|
|
Packit Service |
392537 |
NDMOS_CONST_PRODUCT_REVISION,
|
|
Packit Service |
392537 |
NDMJOBLIB_VERSION, NDMJOBLIB_RELEASE,
|
|
Packit Service |
392537 |
NDMOS_CONST_NDMJOBLIB_REVISION,
|
|
Packit Service |
392537 |
NDMOS_CONST_NDMOS_REVISION,
|
|
Packit Service |
392537 |
obuf);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf (" Agents: %s\n", abuf);
|
|
Packit Service |
392537 |
printf (" Protocols:%s\n", vbuf);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
void
|
|
Packit Service |
392537 |
dump_settings (void)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
int i;
|
|
Packit Service |
392537 |
char buf[100];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
*buf = 0; /* shuts up -Wall */
|
|
Packit Service |
392537 |
i = 0; /* shuts up -Wall */
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
switch (the_mode) {
|
|
Packit Service |
392537 |
case 'x':
|
|
Packit Service |
392537 |
printf ("mode = x (extract)\n");
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'c':
|
|
Packit Service |
392537 |
printf ("mode = c (create)\n");
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 't':
|
|
Packit Service |
392537 |
printf ("mode = t (table-of-contents)\n");
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
case 'q':
|
|
Packit Service |
392537 |
printf ("mode = q (query-agents)\n");
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
default:
|
|
Packit Service |
392537 |
printf ("mode = %c (unknown)\n", the_mode);
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (v_verbose)
|
|
Packit Service |
392537 |
printf ("verbose %d\n", v_verbose);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
printf ("not verbose\n");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
printf ("blocksize = %d (%dkb, %db)\n",
|
|
Packit Service |
392537 |
b_bsize, b_bsize/2, b_bsize*512);
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (d_debug)
|
|
Packit Service |
392537 |
printf ("debug %d\n", d_debug);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
printf ("no debug\n");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
printf ("Data agent %s\n", D_data_agent.host);
|
|
Packit Service |
392537 |
if (AGENT_GIVEN(T_tape_agent))
|
|
Packit Service |
392537 |
printf ("Tape agent %s\n", T_tape_agent.host);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
printf ("Tape agent same as data agent\n");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("tape device %s\n", f_tape_device);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("tape format %s\n", B_bu_type);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (C_chdir)
|
|
Packit Service |
392537 |
printf ("Chdir %s\n", C_chdir);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
printf ("Chdir / (default)\n");
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (L_log_file)
|
|
Packit Service |
392537 |
printf ("Log to file %s\n", L_log_file);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
printf ("Log to stderr (default)\n");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
if (I_index_file) {
|
|
Packit Service |
392537 |
if (strcmp (I_index_file, "-") == 0) {
|
|
Packit Service |
392537 |
printf ("Index to log, enable FILEHIST\n");
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
printf ("Index to file %s, enable FILEHIST\n",
|
|
Packit Service |
392537 |
I_index_file);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
printf ("Index off (default), no FILEHIST\n");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("%d media entries\n", n_m_media);
|
|
Packit Service |
392537 |
for (i = 0; i < n_m_media; i++) {
|
|
Packit Service |
392537 |
ndmmedia_to_str (&m_media[i], buf);
|
|
Packit Service |
392537 |
printf (" %2d: %s\n", i, buf);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("%d excludes\n", n_e_exclude_pattern);
|
|
Packit Service |
392537 |
for (i = 0; i < n_e_exclude_pattern; i++) {
|
|
Packit Service |
392537 |
printf (" %2d: %s\n", i, e_exclude_pattern[i]);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("%d environment values\n", n_E_environment);
|
|
Packit Service |
392537 |
for (i = 0; i < n_E_environment; i++) {
|
|
Packit Service |
392537 |
printf (" %2d: %s=%s\n", i,
|
|
Packit Service |
392537 |
E_environment[i].name, E_environment[i].value);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
printf ("%d files\n", n_file_arg);
|
|
Packit Service |
392537 |
for (i = 0; i < n_file_arg; i++) {
|
|
Packit Service |
392537 |
printf (" %2d: @%-8lld %s\n", i,
|
|
Packit Service |
392537 |
nlist[i].fh_info.valid ? nlist[i].fh_info.value : NDMP9_INVALID_U_QUAD,
|
|
Packit Service |
392537 |
file_arg[i]);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
copy_args_expanding_macros (int argc, char *argv[], char *av[], int max_ac)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
int i, ac = 0, rc;
|
|
Packit Service |
392537 |
char * arg;
|
|
Packit Service |
392537 |
char * p;
|
|
Packit Service |
392537 |
char env_name[50];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* expand macros */
|
|
Packit Service |
392537 |
for (i = 0; i < argc; i++) {
|
|
Packit Service |
392537 |
arg = argv[i];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (strncmp (arg, "--", 2) != 0 || arg[2] == 0) {
|
|
Packit Service |
392537 |
av[ac++] = arg;
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
sprintf (env_name, "NDMJOB_%s", arg+2);
|
|
Packit Service |
392537 |
if ((p = getenv (env_name)) != 0) {
|
|
Packit Service |
392537 |
ac += snarf_macro (&av[ac], p);
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = lookup_and_snarf (&av[ac], arg+2);
|
|
Packit Service |
392537 |
if (rc < 0) {
|
|
Packit Service |
392537 |
error_byebye ("bad arg macro --%s", arg+2);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
ac += rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
av[ac] = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return ac;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
lookup_and_snarf (char *av[], char *name)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
FILE * fp;
|
|
Packit Service |
392537 |
char buf[512];
|
|
Packit Service |
392537 |
char * argfile;
|
|
Packit Service |
392537 |
int ac = 0;
|
|
Packit Service |
392537 |
int found = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
argfile = o_config_file;
|
|
Packit Service |
392537 |
assert (argfile);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
fp = fopen (argfile, "r");
|
|
Packit Service |
392537 |
if (!fp) {
|
|
Packit Service |
392537 |
perror (argfile);
|
|
Packit Service |
392537 |
error_byebye ("can't open config file %s", argfile);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
while (ndmstz_getstanza (fp, buf, sizeof buf) >= 0) {
|
|
Packit Service |
392537 |
if (buf[0] == '-' && buf[1] == '-'
|
|
Packit Service |
392537 |
&& strcmp (buf+2, name) == 0) {
|
|
Packit Service |
392537 |
found = 1;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (found) {
|
|
Packit Service |
392537 |
while (ndmstz_getline (fp, buf, sizeof buf) >= 0) {
|
|
Packit Service |
392537 |
if (*buf == 0)
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
ac += snarf_macro (&av[ac], buf);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
fclose (fp);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!found)
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return ac;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
snarf_macro (char *av[], char *val)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char * p;
|
|
Packit Service |
392537 |
int ac = 0;
|
|
Packit Service |
392537 |
char * tmp_av[100];
|
|
Packit Service |
392537 |
int tmp_ac = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
p = NDMOS_API_STRDUP (val);
|
|
Packit Service |
392537 |
if (!p) {
|
|
Packit Service |
392537 |
error_byebye ("bad strdup macro");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
for (;;) {
|
|
Packit Service |
392537 |
while (isspace((int)*p)) p++;
|
|
Packit Service |
392537 |
if (*p == 0) break;
|
|
Packit Service |
392537 |
tmp_av[tmp_ac++] = p;
|
|
Packit Service |
392537 |
while (*p && !isspace((int)*p)) p++;
|
|
Packit Service |
392537 |
if (*p) *p++ = 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ac = copy_args_expanding_macros (tmp_ac, tmp_av, av, 100);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return ac;
|
|
Packit Service |
392537 |
}
|