Adapting last changes to OS400:

_ Updated packages/OS400/curl.inc.in with new definitions.
_ New connect/bind/sendto/recvfrom wrappers to support AF_UNIX sockets.
_ Include files line length shortened below 100 chars.
_ Const parameter in lib/qssl.[ch].
_ Typos in packages/OS400/initscript.sh.
This commit is contained in:
Patrick Monnerat
2008-05-20 10:21:50 +00:00
parent 862049c490
commit 24bf52bc69
11 changed files with 230 additions and 28 deletions

View File

@@ -382,6 +382,8 @@
d c 79
d CURLE_SSL_SHUTDOWN_FAILED...
d c 80
d CURLE_AGAIN...
d c 81
*
d curlioerr s 10i 0 based(######ptr######) Enum
d CURLIOE_OK c 0
@@ -872,15 +874,17 @@
d CURLINFO_OS_ERRNO... CURLINFO_LONG + 25
d c X'00200019'
d CURLINFO_NUM_CONNECTS... CURLINFO_LONG + 26
d c X'00200020'
d c X'0020001A'
d CURLINFO_SSL_ENGINES... CURLINFO_SLIST + 27
d c X'00400021'
d c X'0040001B'
d CURLINFO_COOKIELIST... CURLINFO_SLIST + 28
d c X'00400022'
d c X'0040001C'
d CURLINFO_LASTSOCKET... CURLINFO_LONG + 29
d c X'00200023'
d c X'0020001D'
d CURLINFO_FTP_ENTRY_PATH... CURLINFO_STRING + 30
d c X'00100024'
d c X'0010001E'
d CURLINFO_REDIRECT_URL... CURLINFO_STRING + 31
d c X'0010001F'
d CURLINFO_HTTP_CODE... Old ...RESPONSE_CODE
d c X'00200002'
*
@@ -1111,6 +1115,9 @@
d s * based(######ptr######) procptr
*
d curl_read_callback...
d s * based(######ptr######) procptr
*
d curl_write_callback...
d s * based(######ptr######) procptr
*
d curl_seek_callback...
@@ -1164,7 +1171,7 @@
d curl_strnequal pr 10i 0 extproc('curl_strnequal')
d s1 * value options(*string)
d s2 * value options(*string)
d n 10i 0 value
d n 10u 0 value
*
d curl_formget pr 10i 0 extproc('curl_formget')
d form * value curl_httppost *
@@ -1359,6 +1366,22 @@
d pr extproc('curl_easy_reset')
d curl * value CURL *
*
d curl_easy_recv...
d pr extproc('curl_easy_recv')
d like(CURLcode)
d curl * value CURL *
d buffer * value void *
d buflen 10u 0 value size_t
d n 10u 0 size_t *
*
d curl_easy_send...
d pr extproc('curl_easy_send')
d like(CURLcode)
d curl * value CURL *
d buffer * value const void *
d buflen 10u 0 value size_t
d n 10u 0 size_t *
*
d curl_easy_pause...
d pr extproc('curl_easy_pause')
d curl * value CURL *

View File

@@ -40,10 +40,10 @@ SRVPGM="CURL.${SONAME}" # Service program.
TGTCCSID='500' # Target CCSID of objects
DEBUG='*ALL' # Debug level
OPTIMIZE='10' # Optimisation level
OUTPUT='*NONE' # Compilation output option.
OUTPUT='*NONE' # Compilation output option.
TGTRLS='V5R2M0' # Target OS release
export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM TGTCCSID DEBUG OPTIMIZE OUTPUTC
export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM TGTCCSID DEBUG OPTIMIZE OUTPUT
export TGTRLS

View File

@@ -24,12 +24,14 @@
/* OS/400 additional support. */
#include "config-os400.h" /* Not setup.h: we only need some defines. */
#include "config-os400.h" /* Not setup.h: we only need some defines. */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <pthread.h>
#include <netdb.h>
@@ -965,3 +967,145 @@ Curl_ldap_next_attribute_a(void * ld,
}
#endif /* CURL_DISABLE_LDAP */
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;
/* Convert a socket address into job CCSID, if needed. */
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
Curl_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);
}
int
Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
{
int i;
struct sockaddr_storage laddr;
i = convert_sockaddr(&laddr, localaddr, addrlen);
if (i < 0)
return -1;
return bind(sd, (struct sockaddr *) &laddr, i);
}
int
Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
struct sockaddr * dstaddr, int addrlen)
{
int i;
struct sockaddr_storage laddr;
i = convert_sockaddr(&laddr, dstaddr, addrlen);
if (i < 0)
return -1;
return sendto(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, i);
}
int
Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
struct sockaddr * fromaddr, int * addrlen)
{
int i;
int rcvlen;
int laddrlen;
const struct sockaddr_un * srcu;
struct sockaddr_un * dstu;
struct sockaddr_storage laddr;
if (!fromaddr || !addrlen || *addrlen <= 0)
return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
laddrlen = sizeof laddr;
laddr.ss_family = AF_UNSPEC; /* To detect if unused. */
rcvlen = recvfrom(sd, buffer, buflen, flags,
(struct sockaddr *) &laddr, &laddrlen);
if (rcvlen < 0)
return rcvlen;
switch (laddr.ss_family) {
case AF_UNIX:
srcu = (const struct sockaddr_un *) &laddr;
dstu = (struct sockaddr_un *) fromaddr;
i = *addrlen - offsetof(struct sockaddr_un, sun_path);
laddrlen -= offsetof(struct sockaddr_un, sun_path);
i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
laddrlen = i + offsetof(struct sockaddr_un, sun_path);
if (laddrlen < *addrlen)
dstu->sun_path[i] = '\0';
break;
case AF_UNSPEC:
break;
default:
if (laddrlen > *addrlen)
laddrlen = *addrlen;
if (laddrlen)
memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
break;
}
*addrlen = laddrlen;
return rcvlen;
}