Home | History | Annotate | Download | only in os400
      1 /**
      2 ***     UTF-8/EBCDIC wrappers to system and C library procedures.
      3 ***
      4 ***     See Copyright for the status of this software.
      5 ***
      6 ***     Author: Patrick Monnerat <pm (at) datasphere.ch>, DATASPHERE S.A.
      7 **/
      8 
      9 #include <sys/types.h>
     10 #include <sys/socket.h>
     11 #include <arpa/inet.h>
     12 #include <stdlib.h>
     13 #include <dlfcn.h>
     14 #include <netdb.h>
     15 #include <errno.h>
     16 
     17 #include "config.h"
     18 
     19 #include "libxml/xmlmemory.h"
     20 
     21 #include "transcode.h"
     22 
     23 
     24 static const char *     lxdles = NULL;
     25 
     26 
     27 int
     28 _lx_getaddrinfo(const char * node, const char * service,
     29         const struct addrinfo * hints, struct addrinfo * * res)
     30 
     31 {
     32         xmlDictPtr d = NULL;
     33         int i;
     34 
     35         i = getaddrinfo(xmlTranscodeResult(node, NULL, &d, NULL),
     36             xmlTranscodeResult(service, NULL, &d, NULL), hints, res);
     37         xmlZapDict(&d);
     38         return i;
     39 }
     40 
     41 
     42 const char *
     43 _lx_inet_ntop(int af, const void * src, char * dst, socklen_t size)
     44 
     45 {
     46         const char * cp1 = inet_ntop(af, src, dst, size);
     47         char const * cp2;
     48         int i;
     49 
     50         if (!cp1)
     51                 return cp1;
     52 
     53         if (!(cp2 = xmlTranscodeString(cp1, NULL, NULL)))
     54                 return cp2;
     55 
     56         i = strlen(cp2);
     57 
     58         if (i >= size) {
     59                 xmlFree((char *) cp2);
     60                 errno = ENOSPC;
     61                 return (const char *) NULL;
     62                 }
     63 
     64         memcpy(dst, cp2, i + 1);
     65         xmlFree((char *) cp2);
     66         return dst;
     67 }
     68 
     69 
     70 void *
     71 _lx_dlopen(const char * filename, int flag)
     72 
     73 {
     74         xmlDictPtr d = NULL;
     75         void * result;
     76 
     77         result = dlopen(xmlTranscodeResult(filename, NULL, &d, NULL), flag);
     78         xmlZapDict(&d);
     79         return result;
     80 }
     81 
     82 
     83 void *
     84 _lx_dlsym(void * handle, const char * symbol)
     85 
     86 {
     87         xmlDictPtr d = NULL;
     88         void * result;
     89 
     90         result = dlsym(handle, xmlTranscodeResult(symbol, NULL, &d, NULL));
     91         xmlZapDict(&d);
     92         return result;
     93 }
     94 
     95 
     96 char *
     97 _lx_dlerror(void)
     98 
     99 {
    100         char * cp1 = (char *) dlerror();
    101 
    102         if (!cp1)
    103                 return cp1;
    104 
    105         if (lxdles)
    106                 xmlFree((char *) lxdles);
    107 
    108         lxdles = (const char *) xmlTranscodeString(cp1, NULL, NULL);
    109         return (char *) lxdles;
    110 }
    111 
    112 
    113 #ifdef LIBXML_ZLIB_ENABLED
    114 #include <zlib.h>
    115 
    116 gzFile
    117 _lx_gzopen(const char * path, const char * mode)
    118 
    119 {
    120         xmlDictPtr d = NULL;
    121         gzFile f;
    122 
    123         f = gzopen(xmlTranscodeResult(path, NULL, &d, NULL),
    124             xmlTranscodeResult(mode, NULL, &d, NULL));
    125         xmlZapDict(&d);
    126         return f;
    127 }
    128 
    129 
    130 gzFile
    131 _lx_gzdopen(int fd, const char * mode)
    132 
    133 {
    134         xmlDictPtr d = NULL;
    135         gzFile f;
    136 
    137         f = gzdopen(fd, xmlTranscodeResult(mode, NULL, &d, NULL));
    138         xmlZapDict(&d);
    139         return f;
    140 }
    141 
    142 int
    143 _lx_inflateInit2_(z_streamp strm, int windowBits,
    144                                         const char * version, int stream_size)
    145 
    146 {
    147         xmlDictPtr d = NULL;
    148         int r;
    149 
    150         r = inflateInit2_(strm, windowBits,
    151             xmlTranscodeResult(version, NULL, &d, NULL), stream_size);
    152         xmlZapDict(&d);
    153         return r;
    154 }
    155 
    156 int
    157 _lx_deflateInit2_(z_streamp strm, int level, int method, int windowBits,
    158         int memLevel, int strategy, const char * version, int stream_size)
    159 
    160 {
    161         xmlDictPtr d = NULL;
    162         int r;
    163 
    164         r = deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
    165             xmlTranscodeResult(version, NULL, &d, NULL), stream_size);
    166         xmlZapDict(&d);
    167         return r;
    168 }
    169 
    170 #endif
    171