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