isdn4k-utils/capi20/capidyn.c

402 lines
9.7 KiB
C

/*
* $Id: capidyn.c,v 1.2 2001/03/01 14:59:11 paul Exp $
*
* $Log: capidyn.c,v $
* Revision 1.2 2001/03/01 14:59:11 paul
* Various patches to fix errors when using the newest glibc,
* replaced use of insecure tempnam() function
* and to remove warnings etc.
*
* Revision 1.1 2000/05/18 15:21:37 calle
* static CAPI2.0 library that loads libcapi20.so dynamicly.
*
*/
#include <sys/types.h>
#include <linux/capi.h>
#include <string.h>
#include "capi20.h"
#include <dlfcn.h>
#define LIBCAPI "libcapi20.so"
static int loadlib(void);
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_isinstalled)(void);
unsigned capi20_isinstalled (void)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_isinstalled();
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_register)(unsigned, unsigned, unsigned, unsigned *);
unsigned capi20_register (unsigned MaxB3Connection,
unsigned MaxB3Blks,
unsigned MaxSizeB3,
unsigned *ApplID)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_register(MaxB3Connection,
MaxB3Blks, MaxSizeB3, ApplID);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_release)(unsigned);
unsigned
capi20_release (unsigned ApplID)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_release(ApplID);
}
/* ---------------------------------------------------------------------- */
static unsigned (*fptr_capi20_put_message)(unsigned, unsigned char *);
unsigned
capi20_put_message (unsigned ApplID, unsigned char *Msg)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_put_message(ApplID, Msg);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_get_message)(unsigned, unsigned char **);
unsigned
capi20_get_message (unsigned ApplID, unsigned char **Buf)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_get_message(ApplID, Buf);
}
/* ---------------------------------------------------------------------- */
static unsigned char *
(*fptr_capi20_get_manufacturer)(unsigned, unsigned char *);
unsigned char *
capi20_get_manufacturer(unsigned Ctrl, unsigned char *Buf)
{
if (loadlib() < 0)
return "";
return fptr_capi20_get_manufacturer(Ctrl, Buf);
}
/* ---------------------------------------------------------------------- */
static unsigned char *
(*fptr_capi20_get_version)(unsigned, unsigned char *);
unsigned char *
capi20_get_version(unsigned Ctrl, unsigned char *Buf)
{
if (loadlib() < 0)
return "";
return fptr_capi20_get_version(Ctrl, Buf);
}
/* ---------------------------------------------------------------------- */
static unsigned char *
(*fptr_capi20_get_serial_number)(unsigned, unsigned char *);
unsigned char *
capi20_get_serial_number(unsigned Ctrl, unsigned char *Buf)
{
if (loadlib() < 0)
return "";
return fptr_capi20_get_serial_number(Ctrl, Buf);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_get_profile)(unsigned, unsigned char *);
unsigned
capi20_get_profile(unsigned Ctrl, unsigned char *Buf)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_get_profile(Ctrl, Buf);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi20_waitformessage)(unsigned, struct timeval *);
unsigned
capi20_waitformessage(unsigned ApplID, struct timeval *TimeOut)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi20_waitformessage(ApplID, TimeOut);
}
/* ---------------------------------------------------------------------- */
static int
(*fptr_capi20_fileno)(unsigned);
int
capi20_fileno(unsigned ApplID)
{
if (loadlib() < 0)
return -1;
return fptr_capi20_fileno(ApplID);
}
/* ---------------------------------------------------------------------- */
static int
(*fptr_capi20ext_get_flags)(unsigned, unsigned *);
int
capi20ext_get_flags(unsigned ApplID, unsigned *flagsptr)
{
if (loadlib() < 0)
return -1;
return fptr_capi20ext_get_flags(ApplID, flagsptr);
}
/* ---------------------------------------------------------------------- */
static int
(*fptr_capi20ext_set_flags)(unsigned, unsigned);
int
capi20ext_set_flags(unsigned ApplID, unsigned flags)
{
if (loadlib() < 0)
return -1;
return fptr_capi20ext_set_flags(ApplID, flags);
}
/* ---------------------------------------------------------------------- */
static int
(*fptr_capi20ext_clr_flags)(unsigned, unsigned);
int
capi20ext_clr_flags(unsigned ApplID, unsigned flags)
{
if (loadlib() < 0)
return -1;
return fptr_capi20ext_clr_flags(ApplID, flags);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi20ext_get_tty_devname)(unsigned, unsigned, char *, size_t);
char *
capi20ext_get_tty_devname(unsigned applid, unsigned ncci, char *buf, size_t size)
{
if (loadlib() < 0)
return 0;
return fptr_capi20ext_get_tty_devname(applid, ncci, buf, size);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi20ext_get_raw_devname)(unsigned, unsigned, char *, size_t);
char *
capi20ext_get_raw_devname(unsigned applid, unsigned ncci, char *buf, size_t size)
{
if (loadlib() < 0)
return 0;
return fptr_capi20ext_get_raw_devname(applid, ncci, buf, size);
}
/* ---------------------------------------------------------------------- */
static int
(*fptr_capi20ext_ncci_opencount)(unsigned, unsigned);
int
capi20ext_ncci_opencount(unsigned applid, unsigned ncci)
{
if (loadlib() < 0)
return 0;
return fptr_capi20ext_ncci_opencount(applid, ncci);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi_info2str)(_cword);
char *
capi_info2str(_cword reason)
{
if (loadlib() < 0)
return 0;
return fptr_capi_info2str(reason);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi_cmsg2message)(_cmsg *, _cbyte *);
unsigned
capi_cmsg2message(_cmsg * cmsg, _cbyte * msg)
{
if (loadlib() < 0)
return 0;
return fptr_capi_cmsg2message(cmsg, msg);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi_message2cmsg)(_cmsg *, _cbyte *);
unsigned
capi_message2cmsg(_cmsg * cmsg, _cbyte * msg)
{
if (loadlib() < 0)
return 0;
return fptr_capi_message2cmsg(cmsg, msg);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi_cmsg_header)(_cmsg *, unsigned, _cbyte, _cbyte, _cword, _cdword);
unsigned
capi_cmsg_header (_cmsg *cmsg, unsigned _ApplId,
_cbyte _Command, _cbyte _Subcommand,
_cword _Messagenumber, _cdword _Controller)
{
if (loadlib() < 0)
return 0;
return fptr_capi_cmsg_header(cmsg, _ApplId,
_Command, _Subcommand,
_Messagenumber, _Controller);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi_put_cmsg)(_cmsg *);
unsigned
capi_put_cmsg (_cmsg *cmsg)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi_put_cmsg(cmsg);
}
/* ---------------------------------------------------------------------- */
static unsigned
(*fptr_capi_get_cmsg)(_cmsg *, unsigned);
unsigned
capi_get_cmsg (_cmsg *cmsg, unsigned applid)
{
if (loadlib() < 0)
return CapiRegNotInstalled;
return fptr_capi_get_cmsg(cmsg, applid);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi_cmd2str)(_cbyte, _cbyte);
char *
capi_cmd2str(_cbyte cmd, _cbyte subcmd)
{
if (loadlib() < 0)
return "";
return fptr_capi_cmd2str(cmd, subcmd);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi_message2str)(_cbyte *);
char *
capi_message2str(_cbyte * msg)
{
if (loadlib() < 0)
return "";
return fptr_capi_message2str(msg);
}
/* ---------------------------------------------------------------------- */
static char *
(*fptr_capi_cmsg2str)(_cmsg *);
char *
capi_cmsg2str(_cmsg * cmsg)
{
if (loadlib() < 0)
return "";
return fptr_capi_cmsg2str(cmsg);
}
/* ---------------------------------------------------------------------- */
static void *handle;
#define resolv_sym(x) \
if ((fptr_##x = dlsym(handle, #x)) == 0) { \
write(2, "Can't resolv " #x, sizeof("Can't resolv " #x)-1); \
dlclose(handle); \
handle = 0; \
return -1; \
} else
static char emsg[] = "Couldn't load shared library ";
static int loadlib(void)
{
const char *err;
if (handle)
return 0;
handle = dlopen(LIBCAPI, RTLD_GLOBAL | RTLD_NOW);
if (handle == 0) {
err = dlerror();
write(2, emsg, sizeof(emsg)-1);
write(2, LIBCAPI, sizeof(LIBCAPI)-1);
write(2, "\n", 1);
if (err) {
write(2, err, strlen(err));
write(2, "\n", 1);
}
return -1;
}
resolv_sym(capi20_isinstalled);
resolv_sym(capi20_register);
resolv_sym(capi20_release);
resolv_sym(capi20_put_message);
resolv_sym(capi20_get_message);
resolv_sym(capi20_get_manufacturer);
resolv_sym(capi20_get_version);
resolv_sym(capi20_get_serial_number);
resolv_sym(capi20_get_profile);
resolv_sym(capi20_waitformessage);
resolv_sym(capi20_fileno);
resolv_sym(capi20ext_get_flags);
resolv_sym(capi20ext_set_flags);
resolv_sym(capi20ext_clr_flags);
resolv_sym(capi20ext_get_tty_devname);
resolv_sym(capi20ext_get_raw_devname);
resolv_sym(capi20ext_ncci_opencount);
resolv_sym(capi_info2str);
resolv_sym(capi_cmsg2message);
resolv_sym(capi_message2cmsg);
resolv_sym(capi_cmsg_header);
resolv_sym(capi_put_cmsg);
resolv_sym(capi_get_cmsg);
resolv_sym(capi_cmd2str);
resolv_sym(capi_message2str);
resolv_sym(capi_cmsg2str);
return 0;
}
#undef resolv_sym(x)