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 HAVE_ZLIB_H 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