| /** |
| *** UTF-8/EBCDIC wrappers to system and C library procedures. |
| *** |
| *** See Copyright for the status of this software. |
| *** |
| *** Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A. |
| **/ |
| |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <arpa/inet.h> |
| #include <stdlib.h> |
| #include <dlfcn.h> |
| #include <netdb.h> |
| #include <errno.h> |
| |
| #include "config.h" |
| |
| #include "libxml/xmlmemory.h" |
| |
| #include "transcode.h" |
| |
| |
| static const char * lxdles = NULL; |
| |
| |
| int |
| _lx_getaddrinfo(const char * node, const char * service, |
| const struct addrinfo * hints, struct addrinfo * * res) |
| |
| { |
| xmlDictPtr d = NULL; |
| int i; |
| |
| i = getaddrinfo(xmlTranscodeResult(node, NULL, &d, NULL), |
| xmlTranscodeResult(service, NULL, &d, NULL), hints, res); |
| xmlZapDict(&d); |
| return i; |
| } |
| |
| |
| const char * |
| _lx_inet_ntop(int af, const void * src, char * dst, socklen_t size) |
| |
| { |
| const char * cp1 = inet_ntop(af, src, dst, size); |
| char const * cp2; |
| int i; |
| |
| if (!cp1) |
| return cp1; |
| |
| if (!(cp2 = xmlTranscodeString(cp1, NULL, NULL))) |
| return cp2; |
| |
| i = strlen(cp2); |
| |
| if (i >= size) { |
| xmlFree((char *) cp2); |
| errno = ENOSPC; |
| return (const char *) NULL; |
| } |
| |
| memcpy(dst, cp2, i + 1); |
| xmlFree((char *) cp2); |
| return dst; |
| } |
| |
| |
| void * |
| _lx_dlopen(const char * filename, int flag) |
| |
| { |
| xmlDictPtr d = NULL; |
| void * result; |
| |
| result = dlopen(xmlTranscodeResult(filename, NULL, &d, NULL), flag); |
| xmlZapDict(&d); |
| return result; |
| } |
| |
| |
| void * |
| _lx_dlsym(void * handle, const char * symbol) |
| |
| { |
| xmlDictPtr d = NULL; |
| void * result; |
| |
| result = dlsym(handle, xmlTranscodeResult(symbol, NULL, &d, NULL)); |
| xmlZapDict(&d); |
| return result; |
| } |
| |
| |
| char * |
| _lx_dlerror(void) |
| |
| { |
| char * cp1 = (char *) dlerror(); |
| |
| if (!cp1) |
| return cp1; |
| |
| if (lxdles) |
| xmlFree((char *) lxdles); |
| |
| lxdles = (const char *) xmlTranscodeString(cp1, NULL, NULL); |
| return (char *) lxdles; |
| } |
| |
| |
| #ifdef HAVE_ZLIB_H |
| #include <zlib.h> |
| |
| gzFile |
| _lx_gzopen(const char * path, const char * mode) |
| |
| { |
| xmlDictPtr d = NULL; |
| gzFile f; |
| |
| f = gzopen(xmlTranscodeResult(path, NULL, &d, NULL), |
| xmlTranscodeResult(mode, NULL, &d, NULL)); |
| xmlZapDict(&d); |
| return f; |
| } |
| |
| |
| gzFile |
| _lx_gzdopen(int fd, const char * mode) |
| |
| { |
| xmlDictPtr d = NULL; |
| gzFile f; |
| |
| f = gzdopen(fd, xmlTranscodeResult(mode, NULL, &d, NULL)); |
| xmlZapDict(&d); |
| return f; |
| } |
| |
| int |
| _lx_inflateInit2_(z_streamp strm, int windowBits, |
| const char * version, int stream_size) |
| |
| { |
| xmlDictPtr d = NULL; |
| int r; |
| |
| r = inflateInit2_(strm, windowBits, |
| xmlTranscodeResult(version, NULL, &d, NULL), stream_size); |
| xmlZapDict(&d); |
| return r; |
| } |
| |
| int |
| _lx_deflateInit2_(z_streamp strm, int level, int method, int windowBits, |
| int memLevel, int strategy, const char * version, int stream_size) |
| |
| { |
| xmlDictPtr d = NULL; |
| int r; |
| |
| r = deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
| xmlTranscodeResult(version, NULL, &d, NULL), stream_size); |
| xmlZapDict(&d); |
| return r; |
| } |
| |
| #endif |