|
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 */
|