Blame clients/clients.c

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