967
969
#endif /* CURL_DISABLE_LDAP */
973
convert_sockaddr(struct sockaddr_storage * dstaddr,
974
const struct sockaddr * srcaddr, int srclen)
977
const struct sockaddr_un * srcu;
978
struct sockaddr_un * dstu;
980
unsigned int dstsize;
982
/* Convert a socket address into job CCSID, if needed. */
984
if (!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
985
sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
990
memcpy((char *) dstaddr, (char *) srcaddr, srclen);
992
switch (srcaddr->sa_family) {
995
srcu = (const struct sockaddr_un *) srcaddr;
996
dstu = (struct sockaddr_un *) dstaddr;
997
dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);
998
srclen -= offsetof(struct sockaddr_un, sun_path);
999
i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);
1000
dstu->sun_path[i] = '\0';
1001
i += offsetof(struct sockaddr_un, sun_path);
1010
Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
1014
struct sockaddr_storage laddr;
1016
i = convert_sockaddr(&laddr, destaddr, addrlen);
1021
return connect(sd, (struct sockaddr *) &laddr, i);
1026
Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
1030
struct sockaddr_storage laddr;
1032
i = convert_sockaddr(&laddr, localaddr, addrlen);
1037
return bind(sd, (struct sockaddr *) &laddr, i);
1042
Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
1043
struct sockaddr * dstaddr, int addrlen)
1047
struct sockaddr_storage laddr;
1049
i = convert_sockaddr(&laddr, dstaddr, addrlen);
1054
return sendto(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, i);
1059
Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
1060
struct sockaddr * fromaddr, int * addrlen)
1066
const struct sockaddr_un * srcu;
1067
struct sockaddr_un * dstu;
1068
struct sockaddr_storage laddr;
1070
if (!fromaddr || !addrlen || *addrlen <= 0)
1071
return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
1073
laddrlen = sizeof laddr;
1074
laddr.ss_family = AF_UNSPEC; /* To detect if unused. */
1075
rcvlen = recvfrom(sd, buffer, buflen, flags,
1076
(struct sockaddr *) &laddr, &laddrlen);
1081
switch (laddr.ss_family) {
1084
srcu = (const struct sockaddr_un *) &laddr;
1085
dstu = (struct sockaddr_un *) fromaddr;
1086
i = *addrlen - offsetof(struct sockaddr_un, sun_path);
1087
laddrlen -= offsetof(struct sockaddr_un, sun_path);
1088
i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
1089
laddrlen = i + offsetof(struct sockaddr_un, sun_path);
1091
if (laddrlen < *addrlen)
1092
dstu->sun_path[i] = '\0';
1100
if (laddrlen > *addrlen)
1101
laddrlen = *addrlen;
1104
memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
1109
*addrlen = laddrlen;