#define LIBSSH2_DISABLE_QADRT_EXT
#include "libssh2_priv.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <string.h>
#include <alloca.h>
#include <netdb.h>
#include <qadrt.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#ifdef LIBSSH2_HAVE_ZLIB
# include <zlib.h>
#endif
#pragma convert(37)
static int
convert_sockaddr(struct sockaddr_storage *dstaddr,
const struct sockaddr *srcaddr, int srclen)
{
const struct sockaddr_un *srcu;
struct sockaddr_un *dstu;
unsigned int i;
unsigned int dstsize;
if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
sizeof(srcaddr->sa_family) || srclen > sizeof(*dstaddr)) {
errno = EINVAL;
return -1;
}
memcpy((char *) dstaddr, (char *) srcaddr, srclen);
switch(srcaddr->sa_family) {
case AF_UNIX:
srcu = (const struct sockaddr_un *) srcaddr;
dstu = (struct sockaddr_un *) dstaddr;
dstsize = sizeof(*dstaddr) - offsetof(struct sockaddr_un, sun_path);
srclen -= offsetof(struct sockaddr_un, sun_path);
i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path,
dstsize - 1, srclen);
dstu->sun_path[i] = '\0';
i += offsetof(struct sockaddr_un, sun_path);
srclen = i;
}
return srclen;
}
int
_libssh2_os400_connect(int sd, struct sockaddr *destaddr, int addrlen)
{
int i;
struct sockaddr_storage laddr;
i = convert_sockaddr(&laddr, destaddr, addrlen);
if(i < 0)
return -1;
return connect(sd, (struct sockaddr *) &laddr, i);
}
#ifdef LIBSSH2_HAVE_ZLIB
int
_libssh2_os400_inflateInit_(z_streamp strm,
const char *version, int stream_size)
{
char *ebcversion;
int i;
if(!version)
return Z_VERSION_ERROR;
i = strlen(version);
ebcversion = alloca(i + 1);
if(!ebcversion)
return Z_VERSION_ERROR;
i = QadrtConvertA2E(ebcversion, version, i, i - 1);
ebcversion[i] = '\0';
return inflateInit_(strm, ebcversion, stream_size);
}
int
_libssh2_os400_deflateInit_(z_streamp strm, int level,
const char *version, int stream_size)
{
char *ebcversion;
int i;
if(!version)
return Z_VERSION_ERROR;
i = strlen(version);
ebcversion = alloca(i + 1);
if(!ebcversion)
return Z_VERSION_ERROR;
i = QadrtConvertA2E(ebcversion, version, i, i - 1);
ebcversion[i] = '\0';
return deflateInit_(strm, level, ebcversion, stream_size);
}
#endif