|
Packit |
db01ca |
/* -*- linux-c -*-
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP
|
|
Packit |
db01ca |
* (C) Copyright IBM Corp. 2007
|
|
Packit |
db01ca |
* (C) Copyright Ulrich Kleber 2011
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
db01ca |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
db01ca |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This
|
|
Packit |
db01ca |
* file and program are licensed under a BSD style license. See
|
|
Packit |
db01ca |
* the Copying file included with the OpenHPI distribution for
|
|
Packit |
db01ca |
* full licensing terms.
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* Author(s):
|
|
Packit |
db01ca |
* Shuah Khan <shuah.khan@hp.com>
|
|
Packit |
db01ca |
* Renier Morales <renier@openhpi.org>
|
|
Packit |
db01ca |
* Ulrich Kleber <ulikleber@users.sourceforge.net>
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* Changes:
|
|
Packit |
db01ca |
* 20/01/2011 ulikleber Refactoring to use glib for option parsing and
|
|
Packit |
db01ca |
* introduce common options for all clients
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
*/
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
#include "oh_clients.h"
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static gint optdid = SAHPI_UNSPECIFIED_DOMAIN_ID;
|
|
Packit |
db01ca |
static gboolean optdebug = FALSE;
|
|
Packit |
db01ca |
static gboolean optverbose = FALSE;
|
|
Packit |
db01ca |
static gchar *optep = NULL;
|
|
Packit |
db01ca |
static gchar *optdaemon = NULL;
|
|
Packit |
db01ca |
static gchar *optcfgfile = NULL;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry domain_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "domain", 'D', 0, G_OPTION_ARG_INT, &optdid, "Select domain id nn", "nn" },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry debug_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "debug", 'X', 0, G_OPTION_ARG_NONE, &optdebug, "Display debug messages", NULL },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry verbose_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "verbose", 'V', 0, G_OPTION_ARG_NONE, &optverbose, "Verbose mode", NULL },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry entity_path_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "entity-path", 'E', 0, G_OPTION_ARG_STRING, &optep, "Use entity path epath", "\"epath\"" },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry host_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "host", 'N', 0, G_OPTION_ARG_STRING, &optdaemon, "Open session to the domain served by the daemon\n"
|
|
Packit |
db01ca |
" at the specified URL (host:port)\n"
|
|
Packit |
db01ca |
" This option overrides the OPENHPI_DAEMON_HOST and\n"
|
|
Packit |
db01ca |
" OPENHPI_DAEMON_PORT environment variables.", "\"host<:port>\"" },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static GOptionEntry clientconf_option[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
{ "cfgfile", 'C', 0, G_OPTION_ARG_FILENAME, &optcfgfile, "Use passed file as client configuration file\n"
|
|
Packit |
db01ca |
" This option overrides the OPENHPICLIENT_CONF\n"
|
|
Packit |
db01ca |
" environment variable.", "\"file\"" },
|
|
Packit |
db01ca |
{ NULL }
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
#ifdef _WIN32
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
/* Function: setenv */
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
static int setenv(const char * var, const char * val, int overwrite)
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
static const size_t BUFSIZE = 1024;
|
|
Packit |
db01ca |
char buf[BUFSIZE];
|
|
Packit |
db01ca |
snprintf(buf, BUFSIZE, "%s=%s", var, val);
|
|
Packit |
db01ca |
return _putenv(buf);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
#endif /* _WIN32 */
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
/* ohc_domain_add_by_options */
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
static SaErrorT ohc_domain_add_by_options(oHpiCommonOptionsT *opt)
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
SaErrorT rv = SA_OK;
|
|
Packit |
db01ca |
SaHpiDomainIdT did_N = SAHPI_UNSPECIFIED_DOMAIN_ID;
|
|
Packit |
db01ca |
SaHpiEntityPathT entity_root;
|
|
Packit |
db01ca |
const char *envhoststr, *envportstr;
|
|
Packit |
db01ca |
unsigned short envport;
|
|
Packit |
db01ca |
SaHpiTextBufferT envhost;
|
|
Packit |
db01ca |
SaHpiDomainIdT did_env = SAHPI_UNSPECIFIED_DOMAIN_ID;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
oh_init_ep(&entity_root);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// Add a domain for the -N option
|
|
Packit |
db01ca |
if (opt->withdaemonhost) {// add a domain for that host
|
|
Packit |
db01ca |
if (opt->domainid == SAHPI_UNSPECIFIED_DOMAIN_ID) { // add with generated did
|
|
Packit |
db01ca |
rv = oHpiDomainAdd ( &opt->daemonhost, opt->daemonport, &entity_root, &did_N );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("Domain could not be created for given daemonhost");
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (opt->debug) DBG("Added domain %u for daemonhost", did_N);
|
|
Packit |
db01ca |
// use this did (thus -N option will override environment variables)
|
|
Packit |
db01ca |
opt->domainid = did_N;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
else { // add with given domain id
|
|
Packit |
db01ca |
rv = oHpiDomainAddById ( opt->domainid, &opt->daemonhost, opt->daemonport, &entity_root );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("Domain %u could not be created for given daemonhost", opt->domainid);
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (opt->debug) DBG("Added domain %u for daemonhost", opt->domainid);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// check always for the environment variables.
|
|
Packit |
db01ca |
envhoststr = getenv("OPENHPI_DAEMON_HOST");
|
|
Packit |
db01ca |
if (envhoststr != NULL) { // add a domain for this host
|
|
Packit |
db01ca |
oh_init_textbuffer(&envhost);
|
|
Packit |
db01ca |
rv = oh_append_textbuffer(&envhost, envhoststr);
|
|
Packit |
db01ca |
envportstr = getenv("OPENHPI_DAEMON_PORT");
|
|
Packit |
db01ca |
if (envportstr == NULL) envport = OPENHPI_DEFAULT_DAEMON_PORT;
|
|
Packit |
db01ca |
else envport = atoi(envportstr);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (opt->withdaemonhost) { // we will add the domain with a new did, but
|
|
Packit |
db01ca |
// we will not use it now.
|
|
Packit |
db01ca |
rv = oHpiDomainAdd ( &envhost, envport, &entity_root, &did_env );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("Domain could not be created for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
envhoststr, envport);
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
did_env, envhoststr, envport);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
else if (opt->domainid == SAHPI_UNSPECIFIED_DOMAIN_ID) {
|
|
Packit |
db01ca |
// add with generated did (here we don't have -N or -D options)
|
|
Packit |
db01ca |
rv = oHpiDomainAdd ( &envhost, envport, &entity_root, &did_env );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("Domain could not be created for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
envhoststr, envport);
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
did_env, envhoststr, envport);
|
|
Packit |
db01ca |
opt->domainid = did_env;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
else { // use the given did for OPENHPI_DAEMON_HOST
|
|
Packit |
db01ca |
rv = oHpiDomainAddById ( opt->domainid, &envhost, envport, &entity_root );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("Domain %u could not be created for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
opt->domainid, envhoststr, envport);
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (opt->debug) DBG("Added domain %u for OPENHPI_DAEMON_HOST %s:%u",
|
|
Packit |
db01ca |
opt->domainid, envhoststr, envport);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
/* oh_prog_version */
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
void oh_prog_version(const char *prog_name)
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
SaHpiUint32T ohpi_major = oHpiVersionGet() >> 48;
|
|
Packit |
db01ca |
SaHpiUint32T ohpi_minor = (oHpiVersionGet() << 16) >> 48;
|
|
Packit |
db01ca |
SaHpiUint32T ohpi_patch = (oHpiVersionGet() << 32) >> 48;
|
|
Packit |
db01ca |
SaHpiVersionT hpiver;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
printf("%s - This program came with OpenHPI %u.%u.%u\n",
|
|
Packit |
db01ca |
prog_name, ohpi_major, ohpi_minor, ohpi_patch);
|
|
Packit |
db01ca |
hpiver = saHpiVersionGet();
|
|
Packit |
db01ca |
printf("SAF HPI Version %c.0%d.0%d\n\n",
|
|
Packit |
db01ca |
(hpiver >> 16) + ('A' - 1),
|
|
Packit |
db01ca |
(hpiver & 0x0000FF00) >> 8,
|
|
Packit |
db01ca |
hpiver & 0x000000FF);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
/* ohc_option_parse */
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
gboolean ohc_option_parse(int *argc, char *argv[],
|
|
Packit |
db01ca |
GOptionContext *context,
|
|
Packit |
db01ca |
oHpiCommonOptionsT *common_options,
|
|
Packit |
db01ca |
SaHpiUint8T optionmask )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
GError *error = NULL;
|
|
Packit |
db01ca |
SaErrorT rv = SA_OK;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (!argc || !argv || !context || !common_options) {
|
|
Packit |
db01ca |
CRIT ("Internal error. Terminating.");
|
|
Packit |
db01ca |
return FALSE;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (optionmask & OHC_DOMAIN_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, domain_option, NULL);
|
|
Packit |
db01ca |
if (optionmask & OHC_DEBUG_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, debug_option, NULL);
|
|
Packit |
db01ca |
if (optionmask & OHC_VERBOSE_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, verbose_option, NULL);
|
|
Packit |
db01ca |
if (optionmask & OHC_ENTITY_PATH_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, entity_path_option, NULL);
|
|
Packit |
db01ca |
if (optionmask & OHC_HOST_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, host_option, NULL);
|
|
Packit |
db01ca |
if (optionmask & OHC_CLIENTCONF_OPTION)
|
|
Packit |
db01ca |
g_option_context_add_main_entries (context, clientconf_option, NULL);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (!g_option_context_parse (context, argc, &argv, &error)) {
|
|
Packit |
db01ca |
CRIT ("option parsing failed: %s\n",error->message);
|
|
Packit |
db01ca |
// CRIT ("\n%s", g_option_context_get_help (context, FALSE, NULL));
|
|
Packit |
db01ca |
// Needs glib-2.14
|
|
Packit |
db01ca |
return FALSE;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
common_options->withentitypath = (optep != NULL);
|
|
Packit |
db01ca |
common_options->withdaemonhost = (optdaemon != NULL);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (optdebug && optverbose) {
|
|
Packit |
db01ca |
DBG("Parsing of options completed. Common options:\n --debug --verbose");
|
|
Packit |
db01ca |
if (optdid >= 0) DBG(" --domain=%u ",optdid);
|
|
Packit |
db01ca |
if (common_options->withentitypath) DBG(" --entity-path=%s ",optep);
|
|
Packit |
db01ca |
if (common_options->withdaemonhost) DBG(" --daemon=%s ",optdaemon);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/* prepare output */
|
|
Packit |
db01ca |
common_options->debug = optdebug;
|
|
Packit |
db01ca |
common_options->verbose = optverbose;
|
|
Packit |
db01ca |
common_options->domainid = optdid;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
oh_init_ep(&common_options->entitypath);
|
|
Packit |
db01ca |
if (common_options->withentitypath) {
|
|
Packit |
db01ca |
rv = oh_encode_entitypath(optep, &common_options->entitypath);
|
|
Packit |
db01ca |
if (optdebug) DBG("oh_encode_entitypath returned %s", oh_lookup_error(rv));
|
|
Packit |
db01ca |
if (rv) {
|
|
Packit |
db01ca |
CRIT ("oh_encode_entitypath() returned %s", oh_lookup_error(rv));
|
|
Packit |
db01ca |
CRIT ("Invalid entity path: %s", optep);
|
|
Packit |
db01ca |
return FALSE;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (optdebug && optverbose) {
|
|
Packit |
db01ca |
DBG("Entity Path encoded successfully: ");
|
|
Packit |
db01ca |
oh_print_ep(&common_options->entitypath, 0);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
oh_init_textbuffer(&common_options->daemonhost);
|
|
Packit |
db01ca |
if (common_options->withdaemonhost) {
|
|
Packit |
db01ca |
char * hostbegin = NULL;
|
|
Packit |
db01ca |
char * hostend = NULL;
|
|
Packit |
db01ca |
char * portbegin = NULL;
|
|
Packit |
db01ca |
if ( *optdaemon == '[' ) {
|
|
Packit |
db01ca |
hostbegin = optdaemon + 1;
|
|
Packit |
db01ca |
hostend = strchr(hostbegin, ']');
|
|
Packit |
db01ca |
if (hostend==NULL) {
|
|
Packit |
db01ca |
CRIT("Ill-formed host: %s", optdaemon);
|
|
Packit |
db01ca |
return FALSE;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
} else {
|
|
Packit |
db01ca |
hostbegin = optdaemon;
|
|
Packit |
db01ca |
hostend = strchr(hostbegin, ':');
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (hostend) {
|
|
Packit |
db01ca |
portbegin = strchr(hostend, ':' );
|
|
Packit |
db01ca |
if (portbegin) {
|
|
Packit |
db01ca |
++portbegin;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
*hostend = '\0';
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
rv = oh_append_textbuffer(&common_options->daemonhost, hostbegin);
|
|
Packit |
db01ca |
if (portbegin) {
|
|
Packit |
db01ca |
common_options->daemonport = atoi(portbegin);
|
|
Packit |
db01ca |
} else {
|
|
Packit |
db01ca |
common_options->daemonport = OPENHPI_DEFAULT_DAEMON_PORT;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
if (optdebug && optverbose) {
|
|
Packit |
db01ca |
DBG("Daemon host:port scanned successfully: host=%s", hostbegin);
|
|
Packit |
db01ca |
DBG("Daemon host:port scanned successfully: port=%u", common_options->daemonport);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
oh_init_textbuffer(&common_options->clientconf);
|
|
Packit |
db01ca |
if (optcfgfile) {
|
|
Packit |
db01ca |
rv = oh_append_textbuffer(&common_options->clientconf, optcfgfile);
|
|
Packit |
db01ca |
setenv("OPENHPICLIENT_CONF", optcfgfile, 1); // -C option overrides environment var
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
g_free (optep);
|
|
Packit |
db01ca |
g_free (optdaemon);
|
|
Packit |
db01ca |
g_free (optcfgfile);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// add domains for -N option and environment variables
|
|
Packit |
db01ca |
ohc_domain_add_by_options ( common_options );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return TRUE;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
/* ohc_session_open_by_option */
|
|
Packit |
db01ca |
/*--------------------------------------------------------------------*/
|
|
Packit |
db01ca |
SaErrorT ohc_session_open_by_option (
|
|
Packit |
db01ca |
oHpiCommonOptionsT *opt,
|
|
Packit |
db01ca |
SaHpiSessionIdT *sessionid)
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
SaErrorT rv = SA_OK;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (opt->debug) {
|
|
Packit |
db01ca |
if (opt->domainid==SAHPI_UNSPECIFIED_DOMAIN_ID) DBG("saHpiSessionOpen");
|
|
Packit |
db01ca |
else DBG("saHpiSessionOpen to domain %u",opt->domainid);
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
rv = saHpiSessionOpen(opt->domainid, sessionid, NULL);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
CRIT("saHpiSessionOpen returns %s",oh_lookup_error(rv));
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (opt->debug)
|
|
Packit |
db01ca |
DBG("saHpiSessionOpen returns with SessionId %u", *sessionid);
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
/* end clients.c */
|