
/*
 * $Id: cimcclient.c,v 1.5 2008/12/15 23:54:25 mchasal Exp $
 *
 * © Copyright IBM Corp. 2007
 *
 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
 * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
 * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
 *
 * You can obtain a current copy of the Eclipse Public License from
 * http://www.opensource.org/licenses/eclipse-1.0.php
 *
 * Author:        Viktor Mihajlovski <mihajlov@de.ibm.com>
 *
 * Description:
 *
 * CIM C Client Loader Implementation
 *
 */

#include "cimc.h"

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

/*
 * Canonical CIM C API entry points
 */

#define LIBLEN 512
#define ENTLEN 256
#define ERRLEN 1024

/* Create new CIMCEnv

   id - the interface to use, either XML or SfcbLocal
   options - options passed to the given backend (ops in cimc.h)

 */
CIMCEnv* NewCIMCEnv(const char *id, unsigned int options, int *rc, char **msg)
{
   char         libName[LIBLEN+1];
   char         entry[ENTLEN+1];
   void        *library; 
   InitCimcEnv  init=NULL;
   CIMCEnv     *rv=NULL;
   struct      stat sbuf;
   
    libName[LIBLEN]=0;
    entry[ENTLEN]=0;

    if ((strcmp(id, "XML") != 0) && (strcmp(id, "SfcbLocal") != 0)) {
        *msg=calloc(1,ERRLEN+1);
        *rc=3;
        snprintf(*msg,ERRLEN,"Invalid connection type '%s'. Must be 'XML' or 'SfcbLocal'.",id);
    } else {
        if ((strcmp(id, "SfcbLocal") == 0) && 
	    (stat(SFCB_LIBDIR, &sbuf) == 0)) {
            snprintf(libName, LIBLEN, "%s/libcimcClient%s.so",SFCB_LIBDIR,id);
        } else {
            snprintf(libName, LIBLEN, "libcimcClient%s.so",id);
        }
        library = dlopen(libName, RTLD_NOW);
        if (library==NULL) {
            *msg=calloc(1,ERRLEN+1);
            *rc=1;
            snprintf(*msg,ERRLEN,"Unable to load %s library %s",libName,dlerror());
        } else {
            snprintf(entry, ENTLEN,"_Create_%s_Env", id);
            init = (InitCimcEnv)dlsym(library, entry);
            if (init==NULL) {
                *msg=calloc(1,ERRLEN+1);
                *rc=2;
                snprintf(*msg,ERRLEN,"Unable to locate entry %s in %s",entry,libName);
                dlclose(library);
            } else {
                *rc=0;
                *msg=NULL;
                rv = init(id,options,rc,msg); 
                rv->hdl=library;
            }
        }
    }
      
    return rv;
}

void ReleaseCIMCEnv(CIMCEnv *env)
{
   void *lib=NULL;
   if (env) {
     lib = env->hdl;
     env->ft->release(env);
     if (lib) {
       dlclose(lib);
     }
   }
}
