Blame ndmp-src/ndml_config.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 "ndmlib.h"
Packit Service 392537
Packit Service 392537
#define CFG_BUF_SIZE	512
Packit Service 392537
#define CFG_MAX_SV	32
Packit Service 392537
Packit Service 392537
/* control block */
Packit Service 392537
struct cfg_cb {
Packit Service 392537
	FILE *			fp;
Packit Service 392537
	ndmp9_config_info *	config_info;
Packit Service 392537
	char			buf[CFG_BUF_SIZE];
Packit Service 392537
	char *			sv[CFG_MAX_SV];
Packit Service 392537
	int			sc;
Packit Service 392537
	int			n_error;
Packit Service 392537
};
Packit Service 392537
Packit Service 392537
Packit Service 392537
static int	cfg_butype (struct cfg_cb *cb);
Packit Service 392537
static int	cfg_fs (struct cfg_cb *cb);
Packit Service 392537
static int	cfg_tape (struct cfg_cb *cb);
Packit Service 392537
static int	cfg_scsi (struct cfg_cb *cb);
Packit Service 392537
static int	cfg_device (struct cfg_cb *cb, u_int *n_device,
Packit Service 392537
			ndmp9_device_info **pp);
Packit Service 392537
static int	cfg_add_env (struct cfg_cb *cb, u_int *n_env,
Packit Service 392537
			ndmp9_pval **pp, char *name, char *value);
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmcfg_load (char *filename, ndmp9_config_info *config_info)
Packit Service 392537
{
Packit Service 392537
	FILE *		fp;
Packit Service 392537
	int		rc;
Packit Service 392537
Packit Service 392537
	fp = fopen (filename, "r");
Packit Service 392537
	if (!fp)
Packit Service 392537
		return -1;
Packit Service 392537
Packit Service 392537
	rc = ndmcfg_loadfp (fp, config_info);
Packit Service 392537
Packit Service 392537
	fclose (fp);
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmcfg_loadfp (FILE *fp, ndmp9_config_info *config_info)
Packit Service 392537
{
Packit Service 392537
	struct cfg_cb	_cb, *cb = &_cb;
Packit Service 392537
	int		rc;
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL(cb);
Packit Service 392537
Packit Service 392537
	cb->fp = fp;
Packit Service 392537
	cb->config_info = config_info;
Packit Service 392537
Packit Service 392537
	for (;;) {
Packit Service 392537
		rc = ndmstz_getstanza (cb->fp, cb->buf, sizeof cb->buf);
Packit Service 392537
		if (rc == EOF) {
Packit Service 392537
			break;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		cb->sc = ndmstz_parse (cb->buf, cb->sv, CFG_MAX_SV);
Packit Service 392537
		if (cb->sc < 1) {
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "butype") == 0 && cb->sc == 2) {
Packit Service 392537
			cfg_butype (cb);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "fs") == 0 && cb->sc == 2) {
Packit Service 392537
			cfg_fs (cb);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "tape") == 0 && cb->sc == 2) {
Packit Service 392537
			cfg_tape (cb);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "scsi") == 0 && cb->sc == 2) {
Packit Service 392537
			cfg_scsi (cb);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Unrecognized stanzas are deemed for other purposes
Packit Service 392537
		 * and tolerated.
Packit Service 392537
		 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return cb->n_error;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * [butype BUTYPE]
Packit Service 392537
 *	v2attr	0xATTR
Packit Service 392537
 *	v3attr	0xATTR
Packit Service 392537
 *	v4attr	0xATTR
Packit Service 392537
 *	default_env NAME VALUE
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_butype (struct cfg_cb *cb)
Packit Service 392537
{
Packit Service 392537
	ndmp9_config_info *	cfg = cb->config_info;
Packit Service 392537
	ndmp9_butype_info *	ent = cfg->butype_info.butype_info_val;
Packit Service 392537
	int			n_ent = cfg->butype_info.butype_info_len;
Packit Service 392537
	int			i, rc;
Packit Service 392537
Packit Service 392537
	if (!ent)
Packit Service 392537
		n_ent = 0;
Packit Service 392537
Packit Service 392537
	ent = NDMOS_MACRO_NEWN(ndmp9_butype_info, n_ent+1);
Packit Service 392537
	if (!ent) {
Packit Service 392537
		cb->n_error++;
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < n_ent; i++) {
Packit Service 392537
		ent[i] = cfg->butype_info.butype_info_val[i];
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (cfg->butype_info.butype_info_val) {
Packit Service 392537
		NDMOS_API_FREE (cfg->butype_info.butype_info_val);
Packit Service 392537
	}
Packit Service 392537
	cfg->butype_info.butype_info_val = ent;
Packit Service 392537
	cfg->butype_info.butype_info_len = n_ent+1;
Packit Service 392537
	ent += n_ent;
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL (ent);
Packit Service 392537
Packit Service 392537
	ent->butype_name = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
Packit Service 392537
	for (;;) {
Packit Service 392537
		rc = ndmstz_getline (cb->fp, cb->buf, CFG_BUF_SIZE);
Packit Service 392537
		if (rc < 0)
Packit Service 392537
			break;
Packit Service 392537
Packit Service 392537
		cb->sc = ndmstz_parse (cb->buf, cb->sv, CFG_MAX_SV);
Packit Service 392537
		if (cb->sc < 1) {
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "v2attr") == 0 && cb->sc == 2) {
Packit Service 392537
			ent->v2attr.valid = NDMP9_VALIDITY_VALID;
Packit Service 392537
			ent->v2attr.value = strtol (cb->sv[1], 0, 0);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "v3attr") == 0 && cb->sc == 2) {
Packit Service 392537
			ent->v3attr.valid = NDMP9_VALIDITY_VALID;
Packit Service 392537
			ent->v3attr.value = strtol (cb->sv[1], 0, 0);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "v4attr") == 0 && cb->sc == 2) {
Packit Service 392537
			ent->v4attr.valid = NDMP9_VALIDITY_VALID;
Packit Service 392537
			ent->v4attr.value = strtol (cb->sv[1], 0, 0);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "default_env") == 0 && cb->sc == 3) {
Packit Service 392537
			cfg_add_env (cb, &ent->default_env.default_env_len,
Packit Service 392537
				&ent->default_env.default_env_val,
Packit Service 392537
				cb->sv[1], cb->sv[2]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Unrecognized lines are deemed version differences
Packit Service 392537
		 * and tolerated.
Packit Service 392537
		 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * [fs MOUNTPOINT]
Packit Service 392537
 *	fs_type TYPE
Packit Service 392537
 *	fs_physical_device DEVICEPATH
Packit Service 392537
 *	fs_status "COMMENT"
Packit Service 392537
 *	fs_env NAME VALUE
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_fs (struct cfg_cb *cb)
Packit Service 392537
{
Packit Service 392537
	ndmp9_config_info *	cfg = cb->config_info;
Packit Service 392537
	ndmp9_fs_info *		ent = cfg->fs_info.fs_info_val;
Packit Service 392537
	int			n_ent = cfg->fs_info.fs_info_len;
Packit Service 392537
	int			i, rc;
Packit Service 392537
Packit Service 392537
	if (!ent)
Packit Service 392537
		n_ent = 0;
Packit Service 392537
Packit Service 392537
	ent = NDMOS_MACRO_NEWN(ndmp9_fs_info, n_ent+1);
Packit Service 392537
	if (!ent) {
Packit Service 392537
		cb->n_error++;
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < n_ent; i++) {
Packit Service 392537
		ent[i] = cfg->fs_info.fs_info_val[i];
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (cfg->fs_info.fs_info_val) {
Packit Service 392537
		NDMOS_API_FREE (cfg->fs_info.fs_info_val);
Packit Service 392537
	}
Packit Service 392537
	cfg->fs_info.fs_info_val = ent;
Packit Service 392537
	cfg->fs_info.fs_info_len = n_ent+1;
Packit Service 392537
	ent += n_ent;
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL (ent);
Packit Service 392537
Packit Service 392537
	ent->fs_logical_device = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
Packit Service 392537
	for (;;) {
Packit Service 392537
		rc = ndmstz_getline (cb->fp, cb->buf, CFG_BUF_SIZE);
Packit Service 392537
		if (rc < 0)
Packit Service 392537
			break;
Packit Service 392537
Packit Service 392537
		cb->sc = ndmstz_parse (cb->buf, cb->sv, CFG_MAX_SV);
Packit Service 392537
		if (cb->sc < 1) {
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "fs_type") == 0 && cb->sc == 2) {
Packit Service 392537
			ent->fs_type = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "fs_physical_device") == 0
Packit Service 392537
		 && cb->sc == 2) {
Packit Service 392537
			ent->fs_physical_device = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "fs_status") == 0 && cb->sc == 2) {
Packit Service 392537
			ent->fs_status = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "fs_env") == 0 && cb->sc == 3) {
Packit Service 392537
			cfg_add_env (cb, &ent->fs_env.fs_env_len,
Packit Service 392537
				&ent->fs_env.fs_env_val,
Packit Service 392537
				cb->sv[1], cb->sv[2]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Unrecognized lines are deemed version differences
Packit Service 392537
		 * and tolerated.
Packit Service 392537
		 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_tape (struct cfg_cb *cb)
Packit Service 392537
{
Packit Service 392537
	ndmp9_config_info *	cfg = cb->config_info;
Packit Service 392537
Packit Service 392537
	return cfg_device (cb, &cfg->tape_info.tape_info_len,
Packit Service 392537
				&cfg->tape_info.tape_info_val);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_scsi (struct cfg_cb *cb)
Packit Service 392537
{
Packit Service 392537
	ndmp9_config_info *	cfg = cb->config_info;
Packit Service 392537
Packit Service 392537
	return cfg_device (cb, &cfg->scsi_info.scsi_info_len,
Packit Service 392537
				&cfg->scsi_info.scsi_info_val);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * [tape IDENT]  or  [scsi IDENT]
Packit Service 392537
 *	device DEVICEPATH
Packit Service 392537
 *	v3attr 0xATTR
Packit Service 392537
 *	v4attr 0xATTR
Packit Service 392537
 *	capability NAME VALUE
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_device (struct cfg_cb *cb, u_int *n_device, ndmp9_device_info **pp)
Packit Service 392537
{
Packit Service 392537
	ndmp9_device_info *	ent = *pp;
Packit Service 392537
	ndmp9_device_capability *dcap;
Packit Service 392537
	int			rc;
Packit Service 392537
	unsigned int		i, n_ent = *n_device;
Packit Service 392537
Packit Service 392537
	if (!ent)
Packit Service 392537
		n_ent = 0;
Packit Service 392537
Packit Service 392537
	for (i = 0; i < n_ent; i++) {
Packit Service 392537
		if (strcmp(ent[i].model, (*pp)[i].model) == 0) {
Packit Service 392537
			ent += i;
Packit Service 392537
			goto got_model;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ent = NDMOS_MACRO_NEWN(ndmp9_device_info, n_ent+1);
Packit Service 392537
	if (!ent) {
Packit Service 392537
		cb->n_error++;
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < n_ent; i++) {
Packit Service 392537
		ent[i] = (*pp)[i];
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (*pp) {
Packit Service 392537
		NDMOS_API_FREE (*pp);
Packit Service 392537
	}
Packit Service 392537
	*pp = ent;
Packit Service 392537
	*n_device = n_ent+1;
Packit Service 392537
	ent += n_ent;
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL (ent);
Packit Service 392537
	ent->model = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
Packit Service 392537
  got_model:
Packit Service 392537
	dcap = NDMOS_MACRO_NEWN (ndmp9_device_capability,
Packit Service 392537
			ent->caplist.caplist_len+1);
Packit Service 392537
	if (!dcap) {
Packit Service 392537
		cb->n_error++;
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < ent->caplist.caplist_len; i++) {
Packit Service 392537
		dcap[i] = ent->caplist.caplist_val[i];
Packit Service 392537
	}
Packit Service 392537
	if (ent->caplist.caplist_val) {
Packit Service 392537
		NDMOS_API_FREE (ent->caplist.caplist_val);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ent->caplist.caplist_val = dcap;
Packit Service 392537
	dcap += ent->caplist.caplist_len++;
Packit Service 392537
	NDMOS_MACRO_ZEROFILL(dcap);
Packit Service 392537
Packit Service 392537
	for (;;) {
Packit Service 392537
		rc = ndmstz_getline (cb->fp, cb->buf, CFG_BUF_SIZE);
Packit Service 392537
		if (rc < 0)
Packit Service 392537
			break;
Packit Service 392537
Packit Service 392537
		cb->sc = ndmstz_parse (cb->buf, cb->sv, CFG_MAX_SV);
Packit Service 392537
		if (cb->sc < 1) {
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "device") == 0 && cb->sc == 2) {
Packit Service 392537
			dcap->device = NDMOS_API_STRDUP (cb->sv[1]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "v3attr") == 0 && cb->sc == 2) {
Packit Service 392537
			dcap->v3attr.valid = NDMP9_VALIDITY_VALID;
Packit Service 392537
			dcap->v3attr.value = strtol (cb->sv[1], 0, 0);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "v4attr") == 0 && cb->sc == 2) {
Packit Service 392537
			dcap->v4attr.valid = NDMP9_VALIDITY_VALID;
Packit Service 392537
			dcap->v4attr.value = strtol (cb->sv[1], 0, 0);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (strcmp (cb->sv[0], "capability") == 0 && cb->sc == 3) {
Packit Service 392537
			cfg_add_env (cb, &dcap->capability.capability_len,
Packit Service 392537
				&dcap->capability.capability_val,
Packit Service 392537
				cb->sv[1], cb->sv[2]);
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Unrecognized lines are deemed version differences
Packit Service 392537
		 * and tolerated.
Packit Service 392537
		 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
static int
Packit Service 392537
cfg_add_env (struct cfg_cb *cb, u_int *n_env,
Packit Service 392537
  ndmp9_pval **pp, char *name, char *value)
Packit Service 392537
{
Packit Service 392537
	ndmp9_pval *		ent = *pp;
Packit Service 392537
	int			n_ent = *n_env;
Packit Service 392537
	int			i;
Packit Service 392537
Packit Service 392537
	if (!ent)
Packit Service 392537
		n_ent = 0;
Packit Service 392537
Packit Service 392537
	ent = NDMOS_MACRO_NEWN(ndmp9_pval, n_ent+1);
Packit Service 392537
	if (!ent) {
Packit Service 392537
		cb->n_error++;
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < n_ent; i++) {
Packit Service 392537
		ent[i] = (*pp)[i];
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (*pp) {
Packit Service 392537
		NDMOS_API_FREE (*pp);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	*pp = ent;
Packit Service 392537
	*n_env = n_ent+1;
Packit Service 392537
	ent += n_ent;
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL (ent);
Packit Service 392537
	ent->name = NDMOS_API_STRDUP (name);
Packit Service 392537
	ent->value = NDMOS_API_STRDUP (value);
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
#ifdef SELF_TEST
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
main (int argc, char *argv[])
Packit Service 392537
{
Packit Service 392537
	ndmp9_config_info	config_info;
Packit Service 392537
	int			rc, i, j, k;
Packit Service 392537
Packit Service 392537
	if (argc != 2) {
Packit Service 392537
		printf ("usage: %s FILE\n", argv[0]);
Packit Service 392537
		return 1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	NDMOS_MACRO_ZEROFILL (&config_info);
Packit Service 392537
Packit Service 392537
	rc = ndmcfg_load (argv[1], &config_info);
Packit Service 392537
	printf ("%d errors\n", rc);
Packit Service 392537
Packit Service 392537
	for (i = 0; i < config_info.butype_info.butype_info_len; i++) {
Packit Service 392537
		ndmp9_butype_info *	bu;
Packit Service 392537
Packit Service 392537
		bu = &config_info.butype_info.butype_info_val[i];
Packit Service 392537
		printf ("butype[%d] name='%s'\n", i, bu->butype_name);
Packit Service 392537
		if (bu->v2attr.valid) {
Packit Service 392537
			printf ("  v2attr 0x%x\n", bu->v2attr.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  v2attr -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (bu->v3attr.valid) {
Packit Service 392537
			printf ("  v3attr 0x%x\n", bu->v3attr.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  v3attr -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (bu->v4attr.valid) {
Packit Service 392537
			printf ("  v4attr 0x%x\n", bu->v4attr.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  v4attr -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		for (j = 0; j < bu->default_env.default_env_len; j++) {
Packit Service 392537
			ndmp9_pval *	env;
Packit Service 392537
Packit Service 392537
			env = &bu->default_env.default_env_val[j];
Packit Service 392537
			printf ("  default_env[%d] '%s'='%s'\n",
Packit Service 392537
				j, env->name, env->value);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < config_info.fs_info.fs_info_len; i++) {
Packit Service 392537
		ndmp9_fs_info *	fs;
Packit Service 392537
Packit Service 392537
		fs = &config_info.fs_info.fs_info_val[i];
Packit Service 392537
		printf ("fs[%d] fs_logical_device='%s'\n",
Packit Service 392537
			 i, fs->fs_logical_device);
Packit Service 392537
		if (fs->fs_physical_device) {
Packit Service 392537
			printf ("  fs_physical_device '%s'\n",
Packit Service 392537
				fs->fs_physical_device);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  fs_physical_device -null-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->fs_type) {
Packit Service 392537
			printf ("  fs_type '%s'\n", fs->fs_type);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  fs_type -null-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->fs_status) {
Packit Service 392537
			printf ("  fs_status '%s'\n", fs->fs_status);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  fs_status -null-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->total_size.valid) {
Packit Service 392537
			printf ("  total_size %llu\n", fs->total_size.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  total_size -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->used_size.valid) {
Packit Service 392537
			printf ("  used_size %llu\n", fs->used_size.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  used_size -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->avail_size.valid) {
Packit Service 392537
			printf ("  avail_size %llu\n", fs->avail_size.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  avail_size -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->total_inodes.valid) {
Packit Service 392537
			printf ("  total_inodes %llu\n",
Packit Service 392537
				fs->total_inodes.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  total_inodes -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
		if (fs->used_inodes.valid) {
Packit Service 392537
			printf ("  used_inodes %llu\n", fs->used_inodes.value);
Packit Service 392537
		} else {
Packit Service 392537
			printf ("  used_inodes -invalid-\n");
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		for (j = 0; j < fs->fs_env.fs_env_len; j++) {
Packit Service 392537
			ndmp9_pval *	env;
Packit Service 392537
Packit Service 392537
			env = &fs->fs_env.fs_env_val[j];
Packit Service 392537
			printf ("  fs_env[%d] '%s'='%s'\n",
Packit Service 392537
				j, env->name, env->value);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < config_info.tape_info.tape_info_len; i++) {
Packit Service 392537
		ndmp9_device_info *	dev;
Packit Service 392537
Packit Service 392537
		dev = &config_info.tape_info.tape_info_val[i];
Packit Service 392537
		printf ("tape[%d] model='%s'\n", i, dev->model);
Packit Service 392537
Packit Service 392537
		for (j = 0; j < dev->caplist.caplist_len; j++) {
Packit Service 392537
			struct ndmp9_device_capability *dcap;
Packit Service 392537
Packit Service 392537
			dcap = &dev->caplist.caplist_val[j];
Packit Service 392537
			printf (" capability %d\n", j);
Packit Service 392537
Packit Service 392537
			if (dcap->device) {
Packit Service 392537
				printf ("  device '%s'\n", dcap->device);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  device -null-\n");
Packit Service 392537
			}
Packit Service 392537
			if (dcap->v3attr.valid) {
Packit Service 392537
				printf ("  v3attr 0x%x\n", dcap->v3attr.value);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  v3attr -invalid-\n");
Packit Service 392537
			}
Packit Service 392537
			if (dcap->v4attr.valid) {
Packit Service 392537
				printf ("  v4attr 0x%x\n", dcap->v4attr.value);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  v4attr -invalid-\n");
Packit Service 392537
			}
Packit Service 392537
			k = 0;
Packit Service 392537
			for (; k < dcap->capability.capability_len; k++) {
Packit Service 392537
				ndmp9_pval *env;
Packit Service 392537
				env = &dcap->capability.capability_val[k];
Packit Service 392537
				printf ("  capability[%d] '%s'='%s'\n",
Packit Service 392537
					k, env->name, env->value);
Packit Service 392537
			}
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < config_info.scsi_info.scsi_info_len; i++) {
Packit Service 392537
		ndmp9_device_info *	dev;
Packit Service 392537
Packit Service 392537
		dev = &config_info.scsi_info.scsi_info_val[i];
Packit Service 392537
		printf ("scsi[%d] model='%s'\n", i, dev->model);
Packit Service 392537
Packit Service 392537
		for (j = 0; j < dev->caplist.caplist_len; j++) {
Packit Service 392537
			struct ndmp9_device_capability *dcap;
Packit Service 392537
Packit Service 392537
			dcap = &dev->caplist.caplist_val[j];
Packit Service 392537
			printf (" capability %d\n", j);
Packit Service 392537
Packit Service 392537
			if (dcap->device) {
Packit Service 392537
				printf ("  device '%s'\n", dcap->device);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  device -null-\n");
Packit Service 392537
			}
Packit Service 392537
			if (dcap->v3attr.valid) {
Packit Service 392537
				printf ("  v3attr 0x%x\n", dcap->v3attr.value);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  v3attr -invalid-\n");
Packit Service 392537
			}
Packit Service 392537
			if (dcap->v4attr.valid) {
Packit Service 392537
				printf ("  v4attr 0x%x\n", dcap->v4attr.value);
Packit Service 392537
			} else {
Packit Service 392537
				printf ("  v4attr -invalid-\n");
Packit Service 392537
			}
Packit Service 392537
			k = 0;
Packit Service 392537
			for (; k < dcap->capability.capability_len; k++) {
Packit Service 392537
				ndmp9_pval *env;
Packit Service 392537
				env = &dcap->capability.capability_val[k];
Packit Service 392537
				printf ("  capability[%d] '%s'='%s'\n",
Packit Service 392537
					k, env->name, env->value);
Packit Service 392537
			}
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
#endif /* SELF_TEST */