Blame ndmp-src/ndmjob_args.c

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
}