touched up httpd code
This commit is contained in:
		| @ -58,6 +58,7 @@ | |||||||
|  |  | ||||||
| #elif defined(__DOS__) | #elif defined(__DOS__) | ||||||
| 	/* TODO */ | 	/* TODO */ | ||||||
|  | #	include <errno.h> | ||||||
|  |  | ||||||
| #else | #else | ||||||
| #	include "../cmn/syscall.h" | #	include "../cmn/syscall.h" | ||||||
| @ -261,6 +262,7 @@ static qse_httpd_errnum_t skerr_to_errnum (int e) | |||||||
| } | } | ||||||
|  |  | ||||||
| #define SKERR_TO_ERRNUM() skerr_to_errnum(errno) | #define SKERR_TO_ERRNUM() skerr_to_errnum(errno) | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -369,26 +371,43 @@ static qse_httpd_errnum_t direrr_to_errnum (qse_dir_errnum_t e) | |||||||
|  |  | ||||||
| #define MAX_SEND_SIZE 4096 | #define MAX_SEND_SIZE 4096 | ||||||
|  |  | ||||||
| static qse_ssize_t __send_file ( | static QSE_INLINE qse_ssize_t __send_file ( | ||||||
| 	int out_fd, qse_ubi_t in_fd, qse_foff_t* offset, qse_size_t count) | 	qse_httpd_t* httpd, int out_fd, qse_ubi_t in_fd,  | ||||||
|  | 	qse_foff_t* offset, qse_size_t count) | ||||||
| { | { | ||||||
| #if defined(HAVE_SENDFILE) && defined(HAVE_SENDFILE64) | 	/* TODO: os2 warp 4.5 has send_file. support it??? load it dynamically??? */ | ||||||
|  |  | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
|  | #elif defined(HAVE_SENDFILE) && defined(HAVE_SENDFILE64) | ||||||
|  |  | ||||||
|  | 	qse_ssize_t ret; | ||||||
| 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | ||||||
|  |  | ||||||
| 	#if !defined(_LP64) && (QSE_SIZEOF_VOID_P<8) && defined(HAVE_SENDFILE64) | 	#if !defined(_LP64) && (QSE_SIZEOF_VOID_P<8) && defined(HAVE_SENDFILE64) | ||||||
| 	return sendfile64 (out_fd, infd.i, offset, count); | 	ret =  sendfile64 (out_fd, infd.i, offset, count); | ||||||
| 	#else | 	#else | ||||||
| 	return sendfile (out_fd, infd.i, offset, count); | 	ret =  sendfile (out_fd, infd.i, offset, count); | ||||||
| 	#endif | 	#endif | ||||||
|  | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
|  | 	return ret; | ||||||
|  |  | ||||||
| #elif defined(HAVE_SENDFILE) | #elif defined(HAVE_SENDFILE) | ||||||
|  |  | ||||||
|  | 	qse_ssize_t ret; | ||||||
| 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | ||||||
| 	return sendfile (out_fd, infd.i, offset, count); | 	ret = sendfile (out_fd, infd.i, offset, count); | ||||||
|  | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
|  | 	return ret; | ||||||
|  |  | ||||||
| #elif defined(HAVE_SENDFILE64) | #elif defined(HAVE_SENDFILE64) | ||||||
|  | 	qse_ssize_t ret; | ||||||
| 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | 	qse_ubi_t infd = qse_fio_gethandleasubi (in_fd.ptr); | ||||||
| 	return sendfile64 (out_fd, in_fd.i, offset, count); | 	ret = sendfile64 (out_fd, in_fd.i, offset, count); | ||||||
|  | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
|  | 	return ret; | ||||||
|  |  | ||||||
| #elif defined(HAVE_SENDFILEV) || defined(HAVE_SENDFILEV64) | #elif defined(HAVE_SENDFILEV) || defined(HAVE_SENDFILEV64) | ||||||
|  |  | ||||||
| @ -398,7 +417,7 @@ static qse_ssize_t __send_file ( | |||||||
| 	struct sendfilevec vec; | 	struct sendfilevec vec; | ||||||
| 	#endif | 	#endif | ||||||
| 	size_t xfer; | 	size_t xfer; | ||||||
| 	ssize_t n; | 	ssize_t ret; | ||||||
|  |  | ||||||
| 	vec.sfv_fd = in_fd.i; | 	vec.sfv_fd = in_fd.i; | ||||||
| 	vec.sfv_flag = 0; | 	vec.sfv_flag = 0; | ||||||
| @ -414,77 +433,105 @@ static qse_ssize_t __send_file ( | |||||||
| 	vec.sfv_len = count; | 	vec.sfv_len = count; | ||||||
|  |  | ||||||
| 	#if !defined(_LP64) && (QSE_SIZEOF_VOID_P<8) && defined(HAVE_SENDFILE64) | 	#if !defined(_LP64) && (QSE_SIZEOF_VOID_P<8) && defined(HAVE_SENDFILE64) | ||||||
| 	n = sendfilev64 (out_fd, &vec, 1, &xfer); | 	ret = sendfilev64 (out_fd, &vec, 1, &xfer); | ||||||
| 	#else | 	#else | ||||||
| 	n = sendfilev (out_fd, &vec, 1, &xfer); | 	ret = sendfilev (out_fd, &vec, 1, &xfer); | ||||||
| 	#endif | 	#endif | ||||||
| 	if (offset) *offset = *offset + xfer; |  | ||||||
|  | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
|  | 	else if (offset) *offset = *offset + xfer; | ||||||
|  |  | ||||||
| /* TODO: xfer contains number of byte written even on failure | /* TODO: xfer contains number of byte written even on failure | ||||||
| on success xfer == n. | on success xfer == ret. | ||||||
| on failure xfer != n. | on failure xfer != ret. | ||||||
|  */ |  */ | ||||||
| 	return n; | 	return ret; | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| 	qse_mchar_t buf[MAX_SEND_SIZE]; | 	qse_mchar_t buf[MAX_SEND_SIZE]; | ||||||
| 	qse_ssize_t n; | 	qse_ssize_t ret; | ||||||
|  | 	qse_foff_t foff; | ||||||
|  |  | ||||||
| 	#if 0 | 	if (offset && (foff = qse_fio_seek (in_fd.ptr, *offset, QSE_FIO_BEGIN)) != *offset)   | ||||||
| 	if (offset && QSE_LSEEK (in_fd.i, *offset, SEEK_SET) != *offset)   | 	{ | ||||||
|  | 		if (foff == (qse_foff_t)-1) 	 | ||||||
|  | 			qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(in_fd.ptr)));	 | ||||||
|  | 		else | ||||||
|  | 			qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); | ||||||
| 		return (qse_ssize_t)-1; | 		return (qse_ssize_t)-1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); | 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); | ||||||
| 	n = QSE_READ (in_fd.i, buf, count); | 	ret = qse_fio_read (in_fd.ptr, buf, count); | ||||||
| 	if (n == (qse_ssize_t)-1 || n == 0) return n; | 	if (ret > 0) | ||||||
| 	#endif | 	{ | ||||||
|  | 		ret = send (out_fd, buf, ret, 0); | ||||||
|  | 		if (ret > 0) | ||||||
|  | 		{ | ||||||
|  | 			if (offset) *offset = *offset + ret; | ||||||
|  | 		} | ||||||
|  | 		else if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
|  | 	} | ||||||
|  | 	else if (ret <= -1) | ||||||
|  | 	{ | ||||||
|  | 		qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(in_fd.ptr)));	 | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (offset && qse_fio_seek (in_fd.ptr, *offset, QSE_FIO_BEGIN) != *offset)   | 	return ret; | ||||||
| 		return (qse_ssize_t)-1; |  | ||||||
|  |  | ||||||
| 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); |  | ||||||
| 	n = qse_fio_read (in_fd.ptr, buf, count); |  | ||||||
| 	if (n == (qse_ssize_t)-1 || n == 0) return n; |  | ||||||
|  |  | ||||||
| 	n = send (out_fd, buf, n, 0); |  | ||||||
| 	if (n > 0 && offset) *offset = *offset + n; |  | ||||||
|  |  | ||||||
| 	return n; |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ------------------------------------------------------------------- */ | /* ------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| #if defined(HAVE_SSL) | static QSE_INLINE qse_ssize_t __send_file_ssl ( | ||||||
| static qse_ssize_t __send_file_ssl ( | 	qse_httpd_t* httpd, void* xout, qse_ubi_t in_fd,  | ||||||
| 	SSL* out, qse_ubi_t in_fd, qse_foff_t* offset, qse_size_t count) | 	qse_foff_t* offset, qse_size_t count) | ||||||
| { | { | ||||||
|  | #if defined(HAVE_SSL) | ||||||
| 	qse_mchar_t buf[MAX_SEND_SIZE]; | 	qse_mchar_t buf[MAX_SEND_SIZE]; | ||||||
| 	qse_ssize_t n; | 	qse_ssize_t ret; | ||||||
|  | 	qse_foff_t foff; | ||||||
| #if 0 | 	SSL* out = (SSL*)xout; | ||||||
| 	if (offset && QSE_LSEEK (in_fd.i, *offset, SEEK_SET) != *offset)   | 	 | ||||||
|  | 	if (offset && (foff = qse_fio_seek (in_fd.ptr, *offset, QSE_FIO_BEGIN)) != *offset)   | ||||||
|  | 	{ | ||||||
|  | 		if (foff == (qse_foff_t)-1) 	 | ||||||
|  | 			qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(in_fd.ptr)));	 | ||||||
|  | 		else | ||||||
|  | 			qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); | ||||||
| 		return (qse_ssize_t)-1; | 		return (qse_ssize_t)-1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); | 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); | ||||||
| 	n = QSE_READ (in_fd.i, buf, count); | 	ret = qse_fio_read (in_fd.ptr, buf, count); | ||||||
| 	if (n == (qse_ssize_t)-1 || n == 0) return n; | 	if (ret > 0) | ||||||
|  | 	{ | ||||||
|  | 		ret = SSL_write (out, buf, count); | ||||||
|  | 		if (ret > 0) | ||||||
|  | 		{ | ||||||
|  | 			if (offset) *offset = *offset + ret; | ||||||
|  | 		} | ||||||
|  | 		else if (ret <= -1) | ||||||
|  | 		{ | ||||||
|  | 			if (SSL_get_error(out, ret) == SSL_ERROR_WANT_WRITE) | ||||||
|  | 				qse_httpd_seterrnum (httpd, QSE_HTTPD_EAGAIN); | ||||||
|  | 			else | ||||||
|  | 				qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else if (ret <= -1) | ||||||
|  | 	{ | ||||||
|  | 		qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(in_fd.ptr)));	 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | #else | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
| #endif | #endif | ||||||
| 	if (offset && qse_fio_seek (in_fd.ptr, *offset, QSE_FIO_BEGIN) != *offset)   |  | ||||||
| 		return (qse_ssize_t)-1; |  | ||||||
|  |  | ||||||
| 	if (count > QSE_COUNTOF(buf)) count = QSE_COUNTOF(buf); |  | ||||||
| 	n = qse_fio_read (in_fd.ptr, buf, count); |  | ||||||
| 	if (n == (qse_ssize_t)-1 || n == 0) return n; |  | ||||||
|  |  | ||||||
| 	n = SSL_write (out, buf, count); |  | ||||||
| 	if (n > 0 && offset) *offset = *offset + n; |  | ||||||
|  |  | ||||||
| 	return n; |  | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* ------------------------------------------------------------------- */ | /* ------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| @ -585,6 +632,10 @@ void* qse_httpd_getxtnstd (qse_httpd_t* httpd) | |||||||
|  |  | ||||||
| static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) | static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) | ||||||
| { | { | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  | #else | ||||||
| 	int fd = -1, flag; | 	int fd = -1, flag; | ||||||
| 	qse_skad_t addr; | 	qse_skad_t addr; | ||||||
| 	int addrsize; | 	int addrsize; | ||||||
| @ -599,53 +650,53 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) | |||||||
| 	fd = socket (qse_skadfamily(&addr), SOCK_STREAM, IPPROTO_TCP); | 	fd = socket (qse_skadfamily(&addr), SOCK_STREAM, IPPROTO_TCP); | ||||||
| 	if (fd <= -1) goto oops; | 	if (fd <= -1) goto oops; | ||||||
|  |  | ||||||
| #if defined(FD_CLOEXEC) | 	#if defined(FD_CLOEXEC) | ||||||
| 	flag = fcntl (fd, F_GETFD); | 	flag = fcntl (fd, F_GETFD); | ||||||
| 	if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); | 	if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| #if defined(SO_REUSEADDR) | 	#if defined(SO_REUSEADDR) | ||||||
| 	flag = 1; | 	flag = 1; | ||||||
| 	setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void*)&flag, QSE_SIZEOF(flag)); | 	setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void*)&flag, QSE_SIZEOF(flag)); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| /* TODO: linux. use capset() to set required capabilities just in case */ | /* TODO: linux. use capset() to set required capabilities just in case */ | ||||||
| #if defined(IP_TRANSPARENT) | 	#if defined(IP_TRANSPARENT) | ||||||
| 	/* remove the ip routing restriction that a packet can only | 	/* remove the ip routing restriction that a packet can only | ||||||
| 	 * be sent using a local ip address. this option is useful | 	 * be sent using a local ip address. this option is useful | ||||||
| 	 * if transparency is achieved with TPROXY */ | 	 * if transparency is achieved with TPROXY */ | ||||||
|  |  | ||||||
| /* | 	/* | ||||||
| ip rule add fwmark 0x1/0x1 lookup 100 | 	ip rule add fwmark 0x1/0x1 lookup 100 | ||||||
| ip route add local 0.0.0.0/0 dev lo table 100 | 	ip route add local 0.0.0.0/0 dev lo table 100 | ||||||
|  |  | ||||||
| iptables -t mangle -N DIVERT | 	iptables -t mangle -N DIVERT | ||||||
| iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT | 	iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT | ||||||
| iptables -t mangle -A DIVERT -j MARK --set-mark 0x1/0x1 | 	iptables -t mangle -A DIVERT -j MARK --set-mark 0x1/0x1 | ||||||
| iptables -t mangle -A DIVERT -j ACCEPT | 	iptables -t mangle -A DIVERT -j ACCEPT | ||||||
|  |  | ||||||
| iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 8000 | 	iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 8000 | ||||||
|  |  | ||||||
| ---------------------------------------------------------------------- | 	---------------------------------------------------------------------- | ||||||
|  |  | ||||||
| if the socket is bound to 99.99.99.99:8000, you may do... | 	if the socket is bound to 99.99.99.99:8000, you may do... | ||||||
| iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 99.99.99.99 --on-port 8000 | 	iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 99.99.99.99 --on-port 8000 | ||||||
|  |  | ||||||
| iptables -t mangle -A PREROUTING -p tcp  ! -s 127.0.0.0/255.0.0.0 --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 0.0.0.0 --on-port 8000 | 	iptables -t mangle -A PREROUTING -p tcp  ! -s 127.0.0.0/255.0.0.0 --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 0.0.0.0 --on-port 8000 | ||||||
|  |  | ||||||
| IP_TRANSPRENT is needed for: | 	IP_TRANSPRENT is needed for: | ||||||
| - accepting TPROXYed connections | 	- accepting TPROXYed connections | ||||||
| - binding to a non-local IP address (IP address the local system doesn't have) | 	- binding to a non-local IP address (IP address the local system doesn't have) | ||||||
| - using a non-local IP address as a source | 	- using a non-local IP address as a source | ||||||
| -  | 	-  | ||||||
|  */ | 	 */ | ||||||
| 	flag = 1; | 	flag = 1; | ||||||
| 	setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); | 	setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| 	if (server->flags & QSE_HTTPD_SERVER_BINDTONWIF) | 	if (server->flags & QSE_HTTPD_SERVER_BINDTONWIF) | ||||||
| 	{ | 	{ | ||||||
| #if defined(SO_BINDTODEVICE) | 	#if defined(SO_BINDTODEVICE) | ||||||
| 		qse_mchar_t tmp[64]; | 		qse_mchar_t tmp[64]; | ||||||
| 		qse_size_t len; | 		qse_size_t len; | ||||||
|  |  | ||||||
| @ -656,7 +707,7 @@ IP_TRANSPRENT is needed for: | |||||||
| 			/* TODO: logging ... */ | 			/* TODO: logging ... */ | ||||||
| 			goto oops; | 			goto oops; | ||||||
| 		} | 		} | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Solaris 8 returns EINVAL if QSE_SIZEOF(addr) is passed in as the | 	/* Solaris 8 returns EINVAL if QSE_SIZEOF(addr) is passed in as the | ||||||
| @ -664,7 +715,7 @@ IP_TRANSPRENT is needed for: | |||||||
| 	/*if (bind (s, (struct sockaddr*)&addr, QSE_SIZEOF(addr)) <= -1) goto oops_esocket;*/ | 	/*if (bind (s, (struct sockaddr*)&addr, QSE_SIZEOF(addr)) <= -1) goto oops_esocket;*/ | ||||||
| 	if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1) | 	if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1) | ||||||
| 	{ | 	{ | ||||||
| #if defined(IPV6_V6ONLY) && defined(EADDRINUSE) | 	#if defined(IPV6_V6ONLY) && defined(EADDRINUSE) | ||||||
| 		if (errno == EADDRINUSE && qse_skadfamily(&addr) == AF_INET6) | 		if (errno == EADDRINUSE && qse_skadfamily(&addr) == AF_INET6) | ||||||
| 		{ | 		{ | ||||||
| 			int on = 1; | 			int on = 1; | ||||||
| @ -672,34 +723,35 @@ IP_TRANSPRENT is needed for: | |||||||
| 			if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1)  goto oops; | 			if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1)  goto oops; | ||||||
| 		} | 		} | ||||||
| 		else goto oops; | 		else goto oops; | ||||||
| #else | 	#else | ||||||
| 		goto oops; | 		goto oops; | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if (listen (fd, 10) <= -1) goto oops; | 	if (listen (fd, 10) <= -1) goto oops; | ||||||
|  |  | ||||||
| #if defined(O_NONBLOCK) | 	#if defined(O_NONBLOCK) | ||||||
| 	flag = fcntl (fd, F_GETFL); | 	flag = fcntl (fd, F_GETFL); | ||||||
| 	if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); | 	if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| 	server->handle.i = fd; | 	server->handle.i = fd; | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
| oops: | oops: | ||||||
| 	qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | 	qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
| #if defined(_WIN32) | 	#if defined(_WIN32) | ||||||
| 	if (fd != INVALID_SOCKET) closesocket (fd); | 	if (fd != INVALID_SOCKET) closesocket (fd); | ||||||
| #elif defined(__OS2__) | 	#elif defined(__OS2__) | ||||||
| 	if (fd >= 0) soclose (fd); | 	if (fd >= 0) soclose (fd); | ||||||
| #elif defined(__DOS__) | 	#elif defined(__DOS__) | ||||||
| 	/* TODO: */ | 		/* TODO: */ | ||||||
| #else | 	#else | ||||||
| 	if (fd >= 0) QSE_CLOSE (fd); | 	if (fd >= 0) QSE_CLOSE (fd); | ||||||
| #endif | 	#endif | ||||||
| 	return -1; | 	return -1; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static void server_close (qse_httpd_t* httpd, qse_httpd_server_t* server) | static void server_close (qse_httpd_t* httpd, qse_httpd_server_t* server) | ||||||
| @ -718,13 +770,18 @@ static void server_close (qse_httpd_t* httpd, qse_httpd_server_t* server) | |||||||
| static int server_accept ( | static int server_accept ( | ||||||
| 	qse_httpd_t* httpd, qse_httpd_server_t* server, qse_httpd_client_t* client) | 	qse_httpd_t* httpd, qse_httpd_server_t* server, qse_httpd_client_t* client) | ||||||
| { | { | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
|  | #else | ||||||
| 	qse_skad_t addr; | 	qse_skad_t addr; | ||||||
|  |  | ||||||
| #if defined(HAVE_SOCKLEN_T) | 	#if defined(HAVE_SOCKLEN_T) | ||||||
| 	socklen_t addrlen; | 	socklen_t addrlen; | ||||||
| #else | 	#else | ||||||
| 	int addrlen; | 	int addrlen; | ||||||
| #endif | 	#endif | ||||||
| 	int fd, flag; | 	int fd, flag; | ||||||
|  |  | ||||||
| 	addrlen = QSE_SIZEOF(addr); | 	addrlen = QSE_SIZEOF(addr); | ||||||
| @ -735,7 +792,7 @@ static int server_accept ( | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #if 0 | 	#if 0 | ||||||
| 	if (fd >= FD_SETSIZE) | 	if (fd >= FD_SETSIZE) | ||||||
| 	{ | 	{ | ||||||
| qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); | qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); | ||||||
| @ -743,17 +800,17 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); | |||||||
| 		QSE_CLOSE (fd); | 		QSE_CLOSE (fd); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| #if defined(FD_CLOEXEC) | 	#if defined(FD_CLOEXEC) | ||||||
| 	flag = fcntl (fd, F_GETFD); | 	flag = fcntl (fd, F_GETFD); | ||||||
| 	if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); | 	if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| #if defined(O_NONBLOCK) | 	#if defined(O_NONBLOCK) | ||||||
| 	flag = fcntl (fd, F_GETFL); | 	flag = fcntl (fd, F_GETFL); | ||||||
| 	if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); | 	if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| 	if (qse_skadtonwad (&addr, &client->remote_addr) <= -1) | 	if (qse_skadtonwad (&addr, &client->remote_addr) <= -1) | ||||||
| 	{ | 	{ | ||||||
| @ -769,7 +826,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); | |||||||
| 		client->local_addr = server->nwad; | 		client->local_addr = server->nwad; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #if defined(SO_ORIGINAL_DST) | 	#if defined(SO_ORIGINAL_DST) | ||||||
| 	/* if REDIRECT is used, SO_ORIGINAL_DST returns the original | 	/* if REDIRECT is used, SO_ORIGINAL_DST returns the original | ||||||
| 	 * destination. If TPROXY is used, getsockname() above returns | 	 * destination. If TPROXY is used, getsockname() above returns | ||||||
| 	 * the original address. */ | 	 * the original address. */ | ||||||
| @ -780,28 +837,37 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); | |||||||
| 	{ | 	{ | ||||||
| 		client->orgdst_addr = client->local_addr; | 		client->orgdst_addr = client->local_addr; | ||||||
| 	} | 	} | ||||||
| #else | 	#else | ||||||
| 	client->orgdst_addr = client->local_addr; | 	client->orgdst_addr = client->local_addr; | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #if 0 | 	#if 0 | ||||||
| 	client->initial_ifindex = resolve_ifindex (fd, client->local_addr); | 	client->initial_ifindex = resolve_ifindex (fd, client->local_addr); | ||||||
| 	if (client->ifindex <= -1) | 	if (client->ifindex <= -1) | ||||||
| 	{ | 	{ | ||||||
| 		/* the local_address is not one of a local address. | 		/* the local_address is not one of a local address. | ||||||
| 		 * it's probably proxied. */ | 		 * it's probably proxied. */ | ||||||
| 	} | 	} | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| 	client->handle.i = fd; | 	client->handle.i = fd; | ||||||
| 	return 0; | 	return 0; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ------------------------------------------------------------------- */ | /* ------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | ||||||
| { | { | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |  | ||||||
|  | 	/* -------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| 	qse_skad_t connaddr, bindaddr; | 	qse_skad_t connaddr, bindaddr; | ||||||
| 	int connaddrsize, bindaddrsize; | 	int connaddrsize, bindaddrsize; | ||||||
| 	int connected = 1; | 	int connected = 1; | ||||||
| @ -810,7 +876,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
| 	unsigned long cmd; | 	unsigned long cmd; | ||||||
| #elif defined(__OS2__) | #elif defined(__OS2__) | ||||||
| 	int fd = -1;  | 	int fd = -1;  | ||||||
| 	int flag; | 	int cmd; | ||||||
| #elif defined(__DOS__) | #elif defined(__DOS__) | ||||||
| 	int fd = -1;  | 	int fd = -1;  | ||||||
| 	int flag; | 	int flag; | ||||||
| @ -830,10 +896,10 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
| 	fd = socket (qse_skadfamily(&connaddr), SOCK_STREAM, IPPROTO_TCP); | 	fd = socket (qse_skadfamily(&connaddr), SOCK_STREAM, IPPROTO_TCP); | ||||||
| 	if (fd <= -1) goto oops; | 	if (fd <= -1) goto oops; | ||||||
|  |  | ||||||
| #if defined(IP_TRANSPARENT) | 	#if defined(IP_TRANSPARENT) | ||||||
| 	flag = 1; | 	flag = 1; | ||||||
| 	setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); | 	setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); | ||||||
| #endif | 	#endif | ||||||
|  |  | ||||||
| 	if (bind (fd, (struct sockaddr*)&bindaddr, bindaddrsize) <= -1)  | 	if (bind (fd, (struct sockaddr*)&bindaddr, bindaddrsize) <= -1)  | ||||||
| 	{ | 	{ | ||||||
| @ -841,7 +907,6 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
| 		/* TODO: some logging for this failure though */ | 		/* TODO: some logging for this failure though */ | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	cmd = 1; | 	cmd = 1; | ||||||
| 	if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; | 	if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; | ||||||
| @ -854,11 +919,25 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
|  |  | ||||||
| 	cmd = 0; | 	cmd = 0; | ||||||
| 	if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; | 	if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; | ||||||
|  |  | ||||||
| #elif defined(__OS2__) | #elif defined(__OS2__) | ||||||
| 	/* TODO: */ |  | ||||||
|  | 	cmd = 1; | ||||||
|  | 	if (ioctl(fd, FIONBIO, &cmd, QSE_SIZEOF(cmd)) == -1) goto oops; | ||||||
|  |  | ||||||
|  | 	if (connect (fd, (struct sockaddr*)&connaddr, connaddrsize) == -1) | ||||||
|  | 	{ | ||||||
|  | 		if (sock_errno() != SOCEINPROGRESS) goto oops; | ||||||
|  | 		connected = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cmd = 0; | ||||||
|  | 	if (ioctl(fd, FIONBIO, &cmd, QSE_SIZEOF(cmd)) == -1) goto oops; | ||||||
|  |  | ||||||
| #elif defined(__DOS__) | #elif defined(__DOS__) | ||||||
|  |  | ||||||
| 	/* TODO: */ | 	/* TODO: */ | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| 	#if defined(FD_CLOEXEC) | 	#if defined(FD_CLOEXEC) | ||||||
| @ -877,6 +956,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
|  |  | ||||||
| 	/* restore flags */ | 	/* restore flags */ | ||||||
| 	if (fcntl (fd, F_SETFL, flag) <= -1) goto oops; | 	if (fcntl (fd, F_SETFL, flag) <= -1) goto oops; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	peer->handle.i = fd; | 	peer->handle.i = fd; | ||||||
| @ -894,6 +974,9 @@ oops: | |||||||
| 	if (fd >= 0) QSE_CLOSE (fd); | 	if (fd >= 0) QSE_CLOSE (fd); | ||||||
| #endif | #endif | ||||||
| 	return -1; | 	return -1; | ||||||
|  |  | ||||||
|  | 	/* -------------------------------------------------------------------- */ | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static void peer_close (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | static void peer_close (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | ||||||
| @ -932,13 +1015,32 @@ static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer) | |||||||
| 	return 1; /* connection completed */ | 	return 1; /* connection completed */ | ||||||
|  |  | ||||||
| #elif defined(__OS2__) | #elif defined(__OS2__) | ||||||
| 	/* TODO */ |  | ||||||
| 	httpd->errnum = QSE_HTTPD_ENOIMPL; | 	int len; | ||||||
| 	return -1; | 	int ret; | ||||||
|  |  | ||||||
|  | 	len = QSE_SIZEOF(ret); | ||||||
|  | 	if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, (char*)&ret, &len) == -1) | ||||||
|  | 	{ | ||||||
|  | 		qse_httpd_seterrnum (httpd, skerr_to_errnum (ret)); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (ret == SOCEINPROGRESS) return 0; | ||||||
|  | 	if (ret != 0) | ||||||
|  | 	{ | ||||||
|  | 		qse_httpd_seterrnum (httpd, skerr_to_errnum (ret)); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 1; /* connection completed */ | ||||||
|  |  | ||||||
| #elif defined(__DOS__) | #elif defined(__DOS__) | ||||||
|  |  | ||||||
| 	/* TODO */ | 	/* TODO */ | ||||||
| 	httpd->errnum = QSE_HTTPD_ENOIMPL; | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
| 	return -1; | 	return -1; | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| 	#if defined(HAVE_SOCKLEN_T) | 	#if defined(HAVE_SOCKLEN_T) | ||||||
| @ -970,18 +1072,28 @@ static qse_ssize_t peer_recv ( | |||||||
| 	qse_httpd_t* httpd, qse_httpd_peer_t* peer, | 	qse_httpd_t* httpd, qse_httpd_peer_t* peer, | ||||||
| 	qse_mchar_t* buf, qse_size_t bufsize) | 	qse_mchar_t* buf, qse_size_t bufsize) | ||||||
| { | { | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  | #else | ||||||
| 	qse_ssize_t ret = recv (peer->handle.i, buf, bufsize, 0); | 	qse_ssize_t ret = recv (peer->handle.i, buf, bufsize, 0); | ||||||
| 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
| 	return ret; | 	return ret; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static qse_ssize_t peer_send ( | static qse_ssize_t peer_send ( | ||||||
| 	qse_httpd_t* httpd, qse_httpd_peer_t* peer, | 	qse_httpd_t* httpd, qse_httpd_peer_t* peer, | ||||||
| 	const qse_mchar_t* buf, qse_size_t bufsize) | 	const qse_mchar_t* buf, qse_size_t bufsize) | ||||||
| { | { | ||||||
|  | #if defined(__DOS__) | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  | #else | ||||||
| 	qse_ssize_t ret = send (peer->handle.i, buf, bufsize, 0); | 	qse_ssize_t ret = send (peer->handle.i, buf, bufsize, 0); | ||||||
| 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
| 	return ret; | 	return ret; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ------------------------------------------------------------------- */ | /* ------------------------------------------------------------------- */ | ||||||
| @ -1076,6 +1188,12 @@ static int mux_readable (qse_httpd_t* httpd, qse_ubi_t handle, const qse_ntime_t | |||||||
|  |  | ||||||
| 	tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1; | 	tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1; | ||||||
| 	return os2_select (&handle.i, 1, 0, 0, tv); | 	return os2_select (&handle.i, 1, 0, 0, tv); | ||||||
|  |  | ||||||
|  | #elif defined(__DOS__) | ||||||
|  |  | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
| #else | #else | ||||||
| 	fd_set r; | 	fd_set r; | ||||||
| 	struct timeval tv, * tvp; | 	struct timeval tv, * tvp; | ||||||
| @ -1101,6 +1219,12 @@ static int mux_writable (qse_httpd_t* httpd, qse_ubi_t handle, const qse_ntime_t | |||||||
| 	long tv; | 	long tv; | ||||||
| 	tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1; | 	tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1; | ||||||
| 	return os2_select (&handle.i, 0, 1, 0, tv); | 	return os2_select (&handle.i, 0, 1, 0, tv); | ||||||
|  |  | ||||||
|  | #elif defined(__DOS__) | ||||||
|  |  | ||||||
|  | 	qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
| #else | #else | ||||||
| 	fd_set w; | 	fd_set w; | ||||||
| 	struct timeval tv, * tvp; | 	struct timeval tv, * tvp; | ||||||
| @ -1468,7 +1592,9 @@ static void client_close ( | |||||||
| static void client_shutdown ( | static void client_shutdown ( | ||||||
| 	qse_httpd_t* httpd, qse_httpd_client_t* client) | 	qse_httpd_t* httpd, qse_httpd_client_t* client) | ||||||
| { | { | ||||||
| #if defined(SHUT_RDWR) | #if defined(__DOS__) | ||||||
|  | 	/* TODO */ | ||||||
|  | #elif defined(SHUT_RDWR) | ||||||
| 	shutdown (client->handle.i, SHUT_RDWR); | 	shutdown (client->handle.i, SHUT_RDWR); | ||||||
| #else | #else | ||||||
| 	shutdown (client->handle.i, 2); | 	shutdown (client->handle.i, 2); | ||||||
| @ -1481,7 +1607,7 @@ static qse_ssize_t client_recv ( | |||||||
| { | { | ||||||
| 	if (client->status & CLIENT_SECURE) | 	if (client->status & CLIENT_SECURE) | ||||||
| 	{ | 	{ | ||||||
| #if defined(HAVE_SSL) | 	#if defined(HAVE_SSL) | ||||||
| 		int ret = SSL_read (client->handle2.ptr, buf, bufsize); | 		int ret = SSL_read (client->handle2.ptr, buf, bufsize); | ||||||
| 		if (ret <= -1) | 		if (ret <= -1) | ||||||
| 		{ | 		{ | ||||||
| @ -1497,16 +1623,22 @@ static qse_ssize_t client_recv ( | |||||||
| 			client->status &= ~CLIENT_PENDING; | 			client->status &= ~CLIENT_PENDING; | ||||||
|  |  | ||||||
| 		return ret; | 		return ret; | ||||||
| #else | 	#else | ||||||
|  | 		qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
| 		return -1; | 		return -1; | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
|  | 	#if defined(__DOS__) | ||||||
|  | 		qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 		return -1; | ||||||
|  | 	#else | ||||||
| 		qse_ssize_t ret; | 		qse_ssize_t ret; | ||||||
| 		ret = recv (client->handle.i, buf, bufsize, 0); | 		ret = recv (client->handle.i, buf, bufsize, 0); | ||||||
| 		if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | 		if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
| 		return ret; | 		return ret; | ||||||
|  | 	#endif | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -1516,7 +1648,7 @@ static qse_ssize_t client_send ( | |||||||
| { | { | ||||||
| 	if (client->status & CLIENT_SECURE) | 	if (client->status & CLIENT_SECURE) | ||||||
| 	{ | 	{ | ||||||
| #if defined(HAVE_SSL) | 	#if defined(HAVE_SSL) | ||||||
| 		int ret = SSL_write (client->handle2.ptr, buf, bufsize); | 		int ret = SSL_write (client->handle2.ptr, buf, bufsize); | ||||||
| 		if (ret <= -1) | 		if (ret <= -1) | ||||||
| 		{ | 		{ | ||||||
| @ -1526,15 +1658,21 @@ static qse_ssize_t client_send ( | |||||||
| 				qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); | 				qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); | ||||||
| 		} | 		} | ||||||
| 		return ret; | 		return ret; | ||||||
| #else | 	#else | ||||||
|  | 		qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
| 		return -1; | 		return -1; | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
|  | 	#if defined(__DOS__) | ||||||
|  | 		qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
|  | 		return -1; | ||||||
|  | 	#else | ||||||
| 		qse_ssize_t ret = send (client->handle.i, buf, bufsize, 0); | 		qse_ssize_t ret = send (client->handle.i, buf, bufsize, 0); | ||||||
| 		if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | 		if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||||
| 		return ret; | 		return ret; | ||||||
|  | 	#endif | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -1544,15 +1682,11 @@ static qse_ssize_t client_sendfile ( | |||||||
| { | { | ||||||
| 	if (client->status & CLIENT_SECURE) | 	if (client->status & CLIENT_SECURE) | ||||||
| 	{ | 	{ | ||||||
| #if defined(HAVE_SSL) | 		return __send_file_ssl (httpd, client->handle2.ptr, handle, offset, count); | ||||||
| 		return __send_file_ssl (client->handle2.ptr, handle, offset, count); |  | ||||||
| #else |  | ||||||
| 		return -1; |  | ||||||
| #endif |  | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		return __send_file (client->handle.i, handle, offset, count); | 		return __send_file (httpd, client->handle.i, handle, offset, count); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -1561,7 +1695,7 @@ static int client_accepted (qse_httpd_t* httpd, qse_httpd_client_t* client) | |||||||
|  |  | ||||||
| 	if (client->status & CLIENT_SECURE) | 	if (client->status & CLIENT_SECURE) | ||||||
| 	{ | 	{ | ||||||
| #if defined(HAVE_SSL) | 	#if defined(HAVE_SSL) | ||||||
| 		int ret; | 		int ret; | ||||||
| 		SSL* ssl; | 		SSL* ssl; | ||||||
| 		httpd_xtn_t* xtn; | 		httpd_xtn_t* xtn; | ||||||
| @ -1570,6 +1704,7 @@ static int client_accepted (qse_httpd_t* httpd, qse_httpd_client_t* client) | |||||||
| 		if (!xtn->ssl_ctx) | 		if (!xtn->ssl_ctx) | ||||||
| 		{ | 		{ | ||||||
| 			/* delayed initialization of ssl */ | 			/* delayed initialization of ssl */ | ||||||
|  | /* TODO: certificate from options */ | ||||||
| 			if (init_xtn_ssl (xtn, "http01.pem", "http01.key") <= -1)  | 			if (init_xtn_ssl (xtn, "http01.pem", "http01.key") <= -1)  | ||||||
| 			{ | 			{ | ||||||
| 				return -1; | 				return -1; | ||||||
| @ -1616,10 +1751,10 @@ qse_fflush (QSE_STDOUT); | |||||||
| 		} | 		} | ||||||
| qse_printf (QSE_T("SSL ACCEPTED %d\n"), client->handle.i); | qse_printf (QSE_T("SSL ACCEPTED %d\n"), client->handle.i); | ||||||
| qse_fflush (QSE_STDOUT); | qse_fflush (QSE_STDOUT); | ||||||
| #else | 	#else | ||||||
| 		qse_fprintf (QSE_STDERR, QSE_T("Error: NO SSL SUPPORT\n")); | 		qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); | ||||||
| 		return -1; | 		return -1; | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return 1; /* accept completed */ | 	return 1; /* accept completed */ | ||||||
| @ -1629,13 +1764,13 @@ static void client_closed (qse_httpd_t* httpd, qse_httpd_client_t* client) | |||||||
| { | { | ||||||
| 	if (client->status & CLIENT_SECURE) | 	if (client->status & CLIENT_SECURE) | ||||||
| 	{ | 	{ | ||||||
| #if defined(HAVE_SSL) | 	#if defined(HAVE_SSL) | ||||||
| 		if (client->handle2.ptr) | 		if (client->handle2.ptr) | ||||||
| 		{ | 		{ | ||||||
| 			SSL_shutdown ((SSL*)client->handle2.ptr); /* is this needed? */ | 			SSL_shutdown ((SSL*)client->handle2.ptr); /* is this needed? */ | ||||||
| 			SSL_free ((SSL*)client->handle2.ptr); | 			SSL_free ((SSL*)client->handle2.ptr); | ||||||
| 		} | 		} | ||||||
| #endif | 	#endif | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user