fixed more code for watt-32

This commit is contained in:
hyung-hwan 2014-10-20 04:58:15 +00:00
parent 552bb7cc20
commit 5e94b7d9b2
7 changed files with 206 additions and 41 deletions

View File

@ -52,6 +52,7 @@
# include <os2.h> # include <os2.h>
#elif defined(__DOS__) #elif defined(__DOS__)
# include <dos.h> # include <dos.h>
# include <tcp.h> /* watt-32 */
#else #else
# include <unistd.h> # include <unistd.h>
# include <errno.h> # include <errno.h>
@ -1238,6 +1239,9 @@ int qse_main (int argc, qse_achar_t* argv[])
char locale[100]; char locale[100];
UINT codepage; UINT codepage;
WSADATA wsadata; WSADATA wsadata;
#elif defined(__DOS__)
extern BOOL _watt_do_exit;
int sock_inited = 0;
#else #else
/* nothing special */ /* nothing special */
#endif #endif
@ -1259,29 +1263,42 @@ int qse_main (int argc, qse_achar_t* argv[])
qse_setdflcmgrbyid (QSE_CMGR_SLMB); qse_setdflcmgrbyid (QSE_CMGR_SLMB);
} }
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
{
print_error (QSE_T("Failed to start up winsock\n"));
return -1;
}
#else #else
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
qse_setdflcmgrbyid (QSE_CMGR_SLMB); qse_setdflcmgrbyid (QSE_CMGR_SLMB);
#endif #endif
open_mpi (&mpi, argc, argv);
qse_openstdsios (); qse_openstdsios ();
#if defined(_WIN32)
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
{
print_error (QSE_T("Failed to start up winsock\n"));
ret = -1;
goto oops;
}
#elif defined(__DOS__)
/* TODO: add an option to skip watt-32 */
_watt_do_exit = 0; /* prevent sock_init from exiting upon failure */
if (sock_init() != 0)
print_error (QSE_T("Failed to initialize watt-32\n"));
else sock_inited = 1;
#endif
open_mpi (&mpi, argc, argv);
ret = qse_runmain (argc, argv, awk_main); ret = qse_runmain (argc, argv, awk_main);
qse_closestdsios ();
close_mpi (&mpi); close_mpi (&mpi);
#if defined(_WIN32) #if defined(_WIN32)
WSACleanup (); WSACleanup ();
#elif defined(__DOS__)
if (sock_inited) sock_exit ();
#endif #endif
oops:
qse_closestdsios ();
return ret; return ret;
} }

View File

@ -29,6 +29,7 @@
# include <os2.h> # include <os2.h>
#elif defined(__DOS__) #elif defined(__DOS__)
# include <dos.h> # include <dos.h>
# include <tcp.h> /* watt-32 */
#else #else
# include <unistd.h> # include <unistd.h>
# include <errno.h> # include <errno.h>
@ -2715,6 +2716,8 @@ int qse_main (int argc, qse_achar_t* argv[])
char locale[100]; char locale[100];
UINT codepage; UINT codepage;
WSADATA wsadata; WSADATA wsadata;
#elif defined(__DOS__)
extern BOOL _watt_do_exit;
#else #else
/* nothing */ /* nothing */
#endif #endif
@ -2736,25 +2739,36 @@ int qse_main (int argc, qse_achar_t* argv[])
qse_setdflcmgrbyid (QSE_CMGR_SLMB); qse_setdflcmgrbyid (QSE_CMGR_SLMB);
} }
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
{
qse_fprintf (QSE_STDERR, QSE_T("Failed to start up winsock\n"));
return -1;
}
#else #else
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
qse_setdflcmgrbyid (QSE_CMGR_SLMB); qse_setdflcmgrbyid (QSE_CMGR_SLMB);
#endif #endif
qse_openstdsios ();
#if defined(_WIN32)
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
{
qse_fprintf (QSE_STDERR, QSE_T("Failed to start up winsock\n"));
ret = -1;
goto oops;
}
#elif defined(__DOS__)
_watt_do_exit = 0; /* prevent sock_init from exiting upon failure */
if (sock_init () != 0)
{
qse_fprintf (QSE_STDERR, QSE_T("Failed to initialize watt-32\n"));
ret = -1;
goto oops;
}
#endif
#if defined(HAVE_SSL) #if defined(HAVE_SSL)
SSL_load_error_strings (); SSL_load_error_strings ();
SSL_library_init (); SSL_library_init ();
#endif #endif
qse_openstdsios ();
ret = qse_runmain (argc, argv, httpd_main); ret = qse_runmain (argc, argv, httpd_main);
qse_closestdsios ();
#if defined(HAVE_SSL) #if defined(HAVE_SSL)
/* ERR_remove_state() should be called for each thread if the application is thread */ /* ERR_remove_state() should be called for each thread if the application is thread */
@ -2767,7 +2781,11 @@ int qse_main (int argc, qse_achar_t* argv[])
#if defined(_WIN32) #if defined(_WIN32)
WSACleanup (); WSACleanup ();
#elif defined(__DOS__)
sock_exit ();
#endif #endif
oops:
qse_closestdsios ();
return ret; return ret;
} }

View File

@ -771,7 +771,7 @@ success and -1 on failure.
+ codepage: *cp949*, *cp950*, *utf8*, *slmb*, *mb8* + codepage: *cp949*, *cp950*, *utf8*, *slmb*, *mb8*
+ ctimeout, atimeout, rtimeout, wtimeout: the number of seconds. effective + ctimeout, atimeout, rtimeout, wtimeout: the number of seconds. effective
on socket based streams only. you may use a floating-point number for on socket based streams only. you may use a floating-point number for
lower resoluation than a second. a negative value turns off timeout. lower resolution than a second. a negative value turns off timeout.
See this sample that prints the contents of a document encoded in cp949. See this sample that prints the contents of a document encoded in cp949.

View File

@ -45,7 +45,8 @@
# undef AF_UNIX # undef AF_UNIX
# pragma library("tcpip32.lib") # pragma library("tcpip32.lib")
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: consider watt-32 */ # include <tcp.h> /* watt-32 */
# undef AF_UNIX
#else #else
# include <sys/socket.h> # include <sys/socket.h>
# include <netinet/in.h> # include <netinet/in.h>

View File

@ -43,7 +43,14 @@
# include <unistd.h> # include <unistd.h>
# endif # endif
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: consider watt-32 */ # include <tcp.h>
# include <sys/ioctl.h>
# define memset QSE_MEMSET /* FD_SET hardcodes memset() */
# define select select_s
# define USE_SELECT
/* SO_RCVTIMEO doesn't work or i don't know how to get it to work. */
# undef SO_RCVTIMEO
# undef SO_SNDTIMEO
#else #else
# include "syscall.h" # include "syscall.h"
# include <sys/socket.h> # include <sys/socket.h>
@ -137,12 +144,12 @@ static qse_nwio_errnum_t skerr_to_errnum (int e)
} }
} }
#elif defined(__DOS__) /*#elif defined(__DOS__)
static qse_nwio_errnum_t skerr_to_errnum (int e) static qse_nwio_errnum_t skerr_to_errnum (int e)
{ {
/* TODO: */
return QSE_NWIO_ESYSERR; return QSE_NWIO_ESYSERR;
} }*/
#else #else
static qse_nwio_errnum_t skerr_to_errnum (int e) static qse_nwio_errnum_t skerr_to_errnum (int e)
{ {
@ -239,12 +246,12 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
#else #else
if (xret <= -1) if (xret <= -1)
#endif #endif
{ {
#if defined(_WIN32) #if defined(_WIN32)
nwio->errnum = skerr_to_errnum (WSAGetLastError()); nwio->errnum = skerr_to_errnum (WSAGetLastError());
#elif defined(__OS2__) #elif defined(__OS2__)
nwio->errnum = skerr_to_errnum (sock_errno()); nwio->errnum = skerr_to_errnum (sock_errno());
#else #else
nwio->errnum = skerr_to_errnum (errno); nwio->errnum = skerr_to_errnum (errno);
#endif #endif
return -1; return -1;
@ -265,7 +272,7 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
tmout_msecs = QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec); tmout_msecs = QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec);
xret = os2_select (&nwio->handle, count[0], count[1], 0, tmout_msecs); xret = os2_select (&nwio->handle, count[0], count[1], 0, tmout_msecs);
if (xret <= -1) if (xret <= -1)
{ {
nwio->errnum = skerr_to_errnum (sock_errno()); nwio->errnum = skerr_to_errnum (sock_errno());
return -1; return -1;
} }
@ -640,8 +647,120 @@ int qse_nwio_init (
} }
#elif defined(__DOS__) #elif defined(__DOS__)
nwio->errnum = QSE_NWIO_ENOIMPL;
return -1; nwio->handle = socket (family, type, 0);
if (nwio->handle <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
if ((flags & QSE_NWIO_TCP) && (flags & QSE_NWIO_KEEPALIVE))
{
int optval = 1;
setsockopt (nwio->handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, QSE_SIZEOF(optval));
}
if (flags & QSE_NWIO_PASSIVE)
{
qse_nwio_hnd_t handle;
#if defined(SO_REUSEADDR)
if (flags & QSE_NWIO_REUSEADDR)
{
int optval = 1;
setsockopt (nwio->handle, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, QSE_SIZEOF(optval));
}
#endif
if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
if (flags & QSE_NWIO_TCP)
{
if (listen (nwio->handle, 10) <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
if (TMOUT_ENABLED(nwio->tmout.a) &&
wait_for_data (nwio, &nwio->tmout.a, 0) <= -1) goto oops;
handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen);
if (handle <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
close_s (nwio->handle);
nwio->handle = handle;
}
else if (flags & QSE_NWIO_UDP)
{
nwio->status |= STATUS_UDP_CONNECT;
}
}
else
{
int xret;
if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP))
{
int cmd = 1;
if (ioctlsocket(nwio->handle, FIONBIO, (char*)&cmd) == SOCKET_ERROR)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
}
xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen);
if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP))
{
int cmd = 0;
if ((xret == SOCKET_ERROR && errno != EWOULDBLOCK) ||
ioctlsocket (nwio->handle, FIONBIO, (char*)&cmd) == SOCKET_ERROR)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
if (wait_for_data (nwio, &nwio->tmout.c, 1) <= -1) goto oops;
else
{
int xlen, xerr;
xlen = QSE_SIZEOF(xerr);
if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
else if (xerr != 0)
{
nwio->errnum = skerr_to_errnum (xerr);
goto oops;
}
}
}
else
{
if (xret <= -1)
{
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
}
}
#else #else
#if defined(SOCK_CLOEXEC) #if defined(SOCK_CLOEXEC)
@ -721,8 +840,7 @@ int qse_nwio_init (
int orgfl; int orgfl;
orgfl = fcntl (nwio->handle, F_GETFL, 0); orgfl = fcntl (nwio->handle, F_GETFL, 0);
if (orgfl <= -1 || if (orgfl <= -1 || fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1)
fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1)
{ {
nwio->errnum = skerr_to_errnum (errno); nwio->errnum = skerr_to_errnum (errno);
goto oops; goto oops;
@ -974,10 +1092,10 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
return n; return n;
#elif defined(__DOS__) /*#elif defined(__DOS__)
nwio->errnum = QSE_NWIO_ENOIMPL; nwio->errnum = QSE_NWIO_ENOIMPL;
return -1; return -1; */
#else #else
@ -1109,10 +1227,10 @@ static qse_ssize_t nwio_write (qse_nwio_t* nwio, const void* data, qse_size_t si
if (n <= -1) nwio->errnum = skerr_to_errnum (sock_errno()); if (n <= -1) nwio->errnum = skerr_to_errnum (sock_errno());
return n; return n;
#elif defined(__DOS__) /*#elif defined(__DOS__)
nwio->errnum = QSE_NWIO_ENOIMPL; nwio->errnum = QSE_NWIO_ENOIMPL;
return -1; return -1;*/
#else #else

View File

@ -40,7 +40,7 @@
# include <unistd.h> # include <unistd.h>
# endif # endif
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: consider watt-32 */ # include <tcp.h> /* watt-32 */
#else #else
# include "syscall.h" # include "syscall.h"
# include <sys/socket.h> # include <sys/socket.h>
@ -72,8 +72,9 @@ QSE_INLINE int qse_isvalidsckhnd (qse_sck_hnd_t handle)
return handle >= 0; return handle >= 0;
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: */
return 0; return handle >= 0;
#else #else
return handle >= 0; return handle >= 0;
#endif #endif
@ -86,7 +87,7 @@ QSE_INLINE void qse_closesckhnd (qse_sck_hnd_t handle)
#elif defined(__OS2__) #elif defined(__OS2__)
soclose (handle); soclose (handle);
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: */ close_s (handle);
#else #else
QSE_CLOSE (handle); QSE_CLOSE (handle);
#endif #endif
@ -101,7 +102,7 @@ QSE_INLINE void qse_shutsckhnd (qse_sck_hnd_t handle, qse_shutsckhnd_how_t how)
#elif defined(__OS2__) #elif defined(__OS2__)
shutdown (handle, how_v[how]); shutdown (handle, how_v[how]);
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: */ shutdown (handle, how_v[how]);
#else #else
shutdown (handle, how_v[how]); shutdown (handle, how_v[how]);
#endif #endif
@ -211,7 +212,7 @@ void qse_sck_fini (qse_sck_t* sck)
#elif defined(__OS2__) #elif defined(__OS2__)
soclose (sck->handle); soclose (sck->handle);
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: */ close_s (sck->handle)
#else #else
QSE_CLOSE (sck->handle); QSE_CLOSE (sck->handle);
#endif #endif

View File

@ -75,6 +75,7 @@
# include <errno.h> # include <errno.h>
# include <tcp.h> /* watt-32 */ # include <tcp.h> /* watt-32 */
# include <sys/ioctl.h> /* watt-32 */
# define select select_s /* TODO: is this correct? */ # define select select_s /* TODO: is this correct? */
# undef AF_UNIX # undef AF_UNIX
@ -791,6 +792,16 @@ static int set_socket_nonblock (qse_httpd_t* httpd, qse_sck_hnd_t fd, int enable
} }
return 0; return 0;
#elif defined(__DOS__)
if (ioctlsocket (fd, FIONBIO, (char*)&enabled) == SOCKET_ERROR)
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return -1;
}
return 0;
#elif defined(O_NONBLOCK) #elif defined(O_NONBLOCK)
int flag = fcntl (fd, F_GETFL); int flag = fcntl (fd, F_GETFL);
@ -970,7 +981,6 @@ qse_fprintf (QSE_STDERR, QSE_T("Failed to enable SO_REUSEPORT\n"));
setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag));
#endif #endif
if (server->dope.flags & QSE_HTTPD_SERVER_BINDTONWIF) if (server->dope.flags & QSE_HTTPD_SERVER_BINDTONWIF)
{ {
#if defined(SO_BINDTODEVICE) #if defined(SO_BINDTODEVICE)