attempted to emulate socketpair() where it's unavailable
This commit is contained in:
parent
68ad99eca7
commit
270c9a434b
63
lib/std.c
63
lib/std.c
@ -82,6 +82,7 @@
|
|||||||
# define BSD_SELECT
|
# define BSD_SELECT
|
||||||
# if defined(TCPV40HDRS)
|
# if defined(TCPV40HDRS)
|
||||||
# include <sys/select.h>
|
# include <sys/select.h>
|
||||||
|
# include <sys/un.h> /* for sockaddr_un */
|
||||||
# else
|
# else
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# endif
|
# endif
|
||||||
@ -779,6 +780,8 @@ static hcl_errnum_t os2err_to_errnum (APIRET errcode)
|
|||||||
return HCL_ESYSERR;
|
return HCL_ESYSERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(TCPV40HDRS)
|
||||||
static hcl_errnum_t os2sockerr_to_errnum (int errcode)
|
static hcl_errnum_t os2sockerr_to_errnum (int errcode)
|
||||||
{
|
{
|
||||||
switch (errcode)
|
switch (errcode)
|
||||||
@ -790,9 +793,11 @@ static hcl_errnum_t os2sockerr_to_errnum (int errcode)
|
|||||||
case SOCEINVAL: return HCL_EINVAL;
|
case SOCEINVAL: return HCL_EINVAL;
|
||||||
case SOCENOMEM: return HCL_ESYSMEM;
|
case SOCENOMEM: return HCL_ESYSMEM;
|
||||||
case SOCEPIPE: return HCL_EPIPE;
|
case SOCEPIPE: return HCL_EPIPE;
|
||||||
|
default: return HCL_ESYSERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* TCPV40HDRS */
|
||||||
|
#endif /* __OS2__ */
|
||||||
|
|
||||||
#if defined(macintosh)
|
#if defined(macintosh)
|
||||||
static hcl_errnum_t macerr_to_errnum (int errcode)
|
static hcl_errnum_t macerr_to_errnum (int errcode)
|
||||||
@ -825,8 +830,19 @@ static hcl_errnum_t _syserrstrb (hcl_t* hcl, int syserr_type, int syserr_code, h
|
|||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
#if defined(__OS2__)
|
#if defined(__OS2__)
|
||||||
|
#if defined(TCPV40HDRS)
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
char tmp[64];
|
||||||
|
sprintf (tmp, "socket error %d\n", (int)syserr_code);
|
||||||
|
hcl_copy_bcstr (buf, len, tmp);
|
||||||
|
}
|
||||||
|
return HCL_ESYSERR;
|
||||||
|
#else
|
||||||
|
/* sock_strerror() available in tcpip32.dll only */
|
||||||
if (buf) hcl_copy_bcstr (buf, len, sock_strerror(syserr_code));
|
if (buf) hcl_copy_bcstr (buf, len, sock_strerror(syserr_code));
|
||||||
return os2sockerr_to_errnum(syserr_code);
|
return os2sockerr_to_errnum(syserr_code);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
/* fall thru for other platforms */
|
/* fall thru for other platforms */
|
||||||
|
|
||||||
@ -844,7 +860,6 @@ static hcl_errnum_t _syserrstrb (hcl_t* hcl, int syserr_type, int syserr_code, h
|
|||||||
}
|
}
|
||||||
return winerr_to_errnum(syserr_code);
|
return winerr_to_errnum(syserr_code);
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TODO: convert code to string */
|
|
||||||
if (buf)
|
if (buf)
|
||||||
{
|
{
|
||||||
char tmp[64];
|
char tmp[64];
|
||||||
@ -2753,6 +2768,39 @@ static void cb_opt_set (hcl_t* hcl, hcl_option_t id, const void* value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__OS2__) && defined(TCPV40HDRS)
|
||||||
|
static int os2_socket_pair (int p[2])
|
||||||
|
{
|
||||||
|
int x, y, z;
|
||||||
|
struct sockaddr_un sa;
|
||||||
|
|
||||||
|
x = socket(PF_OS2, SOCK_STREAM, 0);
|
||||||
|
y = socket(PF_OS2, SOCK_STREAM, 0);
|
||||||
|
if (x == -1 || y == -1) goto oops;
|
||||||
|
|
||||||
|
HCL_MEMSET (&sa, 0, HCL_SIZEOF(sa));
|
||||||
|
sa.sun_family = AF_OS2;
|
||||||
|
hcl_copy_bcstr (sa.sun_path, HCL_SIZEOF(sa.sun_path), "\\socket\\XXXXX"); /* TODO: make this address unique*/
|
||||||
|
|
||||||
|
if (bind(x, &sa, HCL_SIZEOF(sa)) == -1) goto oops;
|
||||||
|
if (listen(x, 1) == -1) goto oops;
|
||||||
|
|
||||||
|
if (connect(y, &sa, HCL_SIZEOF(sa)) == -1) goto oops;
|
||||||
|
z = accept(x, HCL_NULL, HCL_NULL);
|
||||||
|
if (z == -1) goto oops;
|
||||||
|
|
||||||
|
soclose (x);
|
||||||
|
p[0] = z;
|
||||||
|
p[1] = y;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
if (y >= 0) soclose (y);
|
||||||
|
if (x >= 0) soclose (x);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int open_pipes (hcl_t* hcl, int p[2])
|
static int open_pipes (hcl_t* hcl, int p[2])
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -2764,14 +2812,19 @@ static int open_pipes (hcl_t* hcl, int p[2])
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
if (_pipe(p, 256, _O_BINARY | _O_NOINHERIT) == -1)
|
if (_pipe(p, 256, _O_BINARY | _O_NOINHERIT) == -1)
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
|
#if defined(TCPV40HDRS)
|
||||||
|
/* neither pipe nor socketpair available */
|
||||||
|
if (os2_socket_pair(p) == -1)
|
||||||
|
#else
|
||||||
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, p) == -1)
|
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, p) == -1)
|
||||||
|
#endif
|
||||||
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
||||||
if (pipe2(p, O_CLOEXEC | O_NONBLOCK) == -1)
|
if (pipe2(p, O_CLOEXEC | O_NONBLOCK) == -1)
|
||||||
#else
|
#else
|
||||||
if (pipe(p) == -1)
|
if (pipe(p) == -1)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
hcl_seterrbfmtwithsyserr (hcl, 0, errno, "unable to create pipes for iothr management");
|
hcl_seterrbfmtwithsyserr (hcl, 0, errno, "unable to create pipes");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2781,8 +2834,8 @@ static int open_pipes (hcl_t* hcl, int p[2])
|
|||||||
ioctl (p[1], FIONBIO, &flags);
|
ioctl (p[1], FIONBIO, &flags);
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
flags = 1; /* don't block */
|
flags = 1; /* don't block */
|
||||||
ioctl (p[0], FIONBIO, &flags, HCL_SIZEOF(flags));
|
ioctl (p[0], FIONBIO, (char*)&flags, HCL_SIZEOF(flags));
|
||||||
ioctl (p[1], FIONBIO, &flags, HCL_SIZEOF(flags));
|
ioctl (p[1], FIONBIO, (char*)&flags, HCL_SIZEOF(flags));
|
||||||
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user