added QSE_NWAD_LOCAL
This commit is contained in:
		| @ -22,16 +22,16 @@ | ||||
| #include "mem.h" | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| #    include <winsock2.h> | ||||
| #    include <ws2tcpip.h> /* sockaddr_in6 */ | ||||
| #    include <windows.h> | ||||
| #	include <winsock2.h> | ||||
| #	include <ws2tcpip.h> /* sockaddr_in6 */ | ||||
| #	include <windows.h> | ||||
| #	if (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) | ||||
| 		/* the header files shipped with watcom 11 doesn't contain | ||||
| 		 * proper inet6 support. note using the compiler version | ||||
| 		 * in the contidional isn't that good idea since you  | ||||
| 		 * can use newer header files with this old compiler. | ||||
| 		 * never mind it for the time being. | ||||
|            */ | ||||
| 		 */ | ||||
| #		undef AF_INET6 | ||||
| #	endif | ||||
| #elif defined(__OS2__) | ||||
| @ -47,21 +47,30 @@ | ||||
| #else | ||||
| #	include <sys/socket.h> | ||||
| #	include <netinet/in.h> | ||||
| #	include <sys/un.h> | ||||
|  | ||||
| #	if defined(QSE_SIZEOF_STRUCT_SOCKADDR_IN6) && (QSE_SIZEOF_STRUCT_SOCKADDR_IN6 == 0) | ||||
| #	if defined(QSE_SIZEOF_STRUCT_SOCKADDR_IN6) && (QSE_SIZEOF_STRUCT_SOCKADDR_IN6 <= 0) | ||||
| #		undef AF_INET6 | ||||
| #	endif | ||||
|  | ||||
| #	if defined(QSE_SIZEOF_STRUCT_SOCKADDR_UN) && (QSE_SIZEOF_STRUCT_SOCKADDR_UN <= 0) | ||||
| #		undef AF_UNIX | ||||
| #	endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| union sockaddr_t | ||||
| { | ||||
| #if defined(AF_INET) || defined(AF_INET6) | ||||
| #if defined(AF_INET) || defined(AF_INET6) || defined(AF_UNIX) | ||||
| 	#if defined(AF_INET) | ||||
| 	struct sockaddr_in in4; | ||||
| 	#endif | ||||
| 	#if defined(AF_INET6) | ||||
| 	struct sockaddr_in6 in6; | ||||
| 	#endif | ||||
| 	#if defined(AF_UNIX) | ||||
| 	struct sockaddr_un un; | ||||
| 	#endif | ||||
| #else | ||||
| 	int dummy; | ||||
| #endif | ||||
| @ -73,6 +82,8 @@ typedef union sockaddr_t sockaddr_t; | ||||
| #	define FAMILY(x) (((struct sockaddr_in*)(x))->sin_family) | ||||
| #elif defined(AF_INET6) | ||||
| #	define FAMILY(x) (((struct sockaddr_in6*)(x))->sin6_family) | ||||
| #elif defined(AF_UNIX) | ||||
| #	define FAMILY(x) (((struct sockaddr_un*)(x))->sun_family) | ||||
| #else | ||||
| #	define FAMILY(x) (-1) | ||||
| #endif | ||||
| @ -116,6 +127,28 @@ static QSE_INLINE int skad_to_nwad (const sockaddr_t* skad, qse_nwad_t* nwad) | ||||
| 		} | ||||
| #endif | ||||
|  | ||||
| #if defined(AF_UNIX) | ||||
| 		case AF_UNIX: | ||||
| 		{ | ||||
| 			struct sockaddr_un* un; | ||||
| 			un = (struct sockaddr_un*)skad; | ||||
| 			addrsize = QSE_SIZEOF(*un); | ||||
|  | ||||
| 			QSE_MEMSET (nwad, 0, QSE_SIZEOF(*nwad)); | ||||
| 			nwad->type = QSE_NWAD_LOCAL; | ||||
| 		#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 			qse_mbsxcpy (nwad->u.local.path, QSE_COUNTOF(nwad->u.local.path), un->sun_path); | ||||
| 		#else | ||||
| 			{ | ||||
| 				qse_size_t wcslen, mbslen; | ||||
| 				mbslen = QSE_COUNTOF(nwad->u.local.path); | ||||
| 				qse_wcstombs (un->sun_path, &wcslen, nwad->u.local.path, &mbslen); | ||||
| 				/* don't care about conversion errors */ | ||||
| 			} | ||||
| 		#endif | ||||
| 			break; | ||||
| 		} | ||||
| #endif | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| @ -163,6 +196,33 @@ static QSE_INLINE int nwad_to_skad (const qse_nwad_t* nwad, sockaddr_t* skad) | ||||
| #endif | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 		{ | ||||
| #if defined(AF_UNIX) | ||||
| 			struct sockaddr_un* un; | ||||
|  | ||||
| 			un = (struct sockaddr_un*)skad; | ||||
| 			addrsize = QSE_SIZEOF(*un); | ||||
| 			QSE_MEMSET (un, 0, addrsize); | ||||
|  | ||||
| 			un->sun_family = AF_UNIX; | ||||
| 		#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 			qse_mbsxcpy (un->sun_path, QSE_COUNTOF(un->sun_path), nwad->u.local.path); | ||||
| 		#else | ||||
| 			{ | ||||
| 				qse_size_t wcslen, mbslen; | ||||
| 				mbslen = QSE_COUNTOF(un->sun_path); | ||||
| 				qse_wcstombs (nwad->u.local.path, &wcslen, un->sun_path, &mbslen); | ||||
| 				/* don't care about conversion errors */ | ||||
| 			} | ||||
|  | ||||
| 		#endif | ||||
| #endif | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	return addrsize; | ||||
|  | ||||
| @ -23,6 +23,7 @@ | ||||
| #include <qse/cmn/nwif.h> | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/fmt.h> | ||||
| #include <qse/cmn/mbwc.h> | ||||
| #include "mem.h" | ||||
|  | ||||
| int qse_nwadequal (const qse_nwad_t* x, const qse_nwad_t* y) | ||||
| @ -40,6 +41,9 @@ int qse_nwadequal (const qse_nwad_t* x, const qse_nwad_t* y) | ||||
| 			        x->u.in6.scope == y->u.in6.scope && | ||||
| 			        QSE_MEMCMP (&x->u.in6.addr, &y->u.in6.addr, QSE_SIZEOF(x->u.in6.addr)) == 0)? 1: 0; | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 			return qse_strcmp (x->u.local.path, y->u.local.path) == 0; | ||||
|  | ||||
| 		default:  | ||||
| 			/* can't compare */ | ||||
| 			return -1; | ||||
| @ -63,6 +67,10 @@ void qse_setnwadport (qse_nwad_t* nwad, qse_uint16_t port) | ||||
| 		case QSE_NWAD_IN6: | ||||
| 			nwad->u.in6.port = port; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 			/* no port for QSE_NWAD_LOCAL */ | ||||
| 			break; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -76,6 +84,7 @@ qse_uint16_t qse_getnwadport (qse_nwad_t* nwad) | ||||
| 		case QSE_NWAD_IN6: | ||||
| 			return nwad->u.in6.port; | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 		default: | ||||
| 			return 0; | ||||
| 	} | ||||
| @ -100,6 +109,22 @@ int qse_mbsntonwad (const qse_mchar_t* str, qse_size_t len, qse_nwad_t* nwad) | ||||
|  | ||||
| 	if (p >= end) return -1; | ||||
|  | ||||
| 	if (*p == QSE_MT('/')) | ||||
| 	{ | ||||
| 		/* support the absolute path only */ | ||||
| 	#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 		qse_mbsxncpy (tmpad.u.local.path, QSE_COUNTOF(tmpad.u.local.path), str, len); | ||||
| 	#else | ||||
| 		qse_size_t mbslen = len; | ||||
| 		qse_size_t wcslen = QSE_COUNTOF(tmpad.u.local.path) - 1; | ||||
| 		if (qse_mbsntowcsn (str, &mbslen, tmpad.u.local.path, &wcslen) <= -1) return -1; | ||||
| 		tmpad.u.local.path[wcslen] = QSE_WT('\0'); | ||||
| 	#endif | ||||
|  | ||||
| 		tmpad.type = QSE_NWAD_LOCAL; | ||||
| 		goto done; | ||||
| 	} | ||||
|  | ||||
| 	if (*p == QSE_MT('[')) | ||||
| 	{ | ||||
| 		/* IPv6 address */ | ||||
| @ -266,6 +291,23 @@ int qse_wcsntonwad (const qse_wchar_t* str, qse_size_t len, qse_nwad_t* nwad) | ||||
|  | ||||
| 	if (p >= end) return -1; | ||||
|  | ||||
| 	if (*p == QSE_WT('/')) | ||||
| 	{ | ||||
| 		/* support the absolute path only */ | ||||
| 	#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 		qse_size_t wcslen = len; | ||||
| 		qse_size_t mbslen = QSE_COUNTOF(tmpad.u.local.path) - 1; | ||||
| 		if (qse_wcsntombsn (str, &wcslen, tmpad.u.local.path, &mbslen) <= -1) return -1; | ||||
| 		tmpad.u.local.path[mbslen] = QSE_MT('\0'); | ||||
| 	#else | ||||
| 		qse_wcsxncpy (tmpad.u.local.path, QSE_COUNTOF(tmpad.u.local.path), str, len); | ||||
| 	#endif | ||||
|  | ||||
| 		tmpad.type = QSE_NWAD_LOCAL; | ||||
| 		qse_wcsxncpy (tmpad.u.local.path, QSE_COUNTOF(tmpad.u.local.path), str, len); | ||||
| 		goto done; | ||||
| 	} | ||||
|  | ||||
| 	if (*p == QSE_WT('[')) | ||||
| 	{ | ||||
| 		/* IPv6 address */ | ||||
| @ -497,7 +539,7 @@ qse_size_t qse_nwadtombs ( | ||||
| 					if (flags & QSE_NWADTOMBS_ADDR) | ||||
| 					{ | ||||
| 						if (xlen + 1 >= len) goto done; | ||||
| 						buf[xlen++] = QSE_MT(']');	 | ||||
| 						buf[xlen++] = QSE_MT(']'); | ||||
|  | ||||
| 						if (xlen + 1 >= len) goto done; | ||||
| 						buf[xlen++] = QSE_MT(':'); | ||||
| @ -513,6 +555,20 @@ qse_size_t qse_nwadtombs ( | ||||
|  | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 			if (flags & QSE_NWADTOMBS_ADDR) | ||||
| 			{ | ||||
| 			#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 				xlen = qse_mbsxcpy (buf, len, nwad->u.local.path) | ||||
| 			#else | ||||
| 				qse_size_t wcslen, mbslen = len; | ||||
| 				qse_wcstombs (nwad->u.local.path, &wcslen, buf, &mbslen); | ||||
| 				/* i don't care about conversion errors */ | ||||
| 				xlen = mbslen; | ||||
| 			#endif | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| done: | ||||
| @ -620,6 +676,18 @@ qse_size_t qse_nwadtowcs ( | ||||
|  | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_NWAD_LOCAL: | ||||
| 			if (flags & QSE_NWADTOMBS_ADDR) | ||||
| 			{ | ||||
| 			#if defined(QSE_CHAR_IS_MCHAR) | ||||
| 				qse_size_t wcslen = len, mbslen; | ||||
| 				qse_mbstowcs (nwad->u.local.path, &mbslen, buf, &wcslen); | ||||
| 				/* i don't care about conversion errors */ | ||||
| 				xlen = wcslen; | ||||
| 			#else | ||||
| 				xlen = qse_wcsxcpy (buf, len, nwad->u.local.path); | ||||
| 			#endif | ||||
| 			} | ||||
| 	} | ||||
|  | ||||
| done: | ||||
|  | ||||
| @ -107,6 +107,9 @@ | ||||
| #	include <openssl/engine.h> | ||||
| #endif | ||||
|  | ||||
| #if defined(__linux) && !defined(SO_REUSEPORT) | ||||
| #	define SO_REUSEPORT 15 | ||||
| #endif | ||||
|  | ||||
| #define HANDLE_TO_FIO(x) ((qse_fio_t*)(x)) | ||||
| #define FIO_TO_HANDLE(x) ((qse_httpd_hnd_t)(x)) | ||||
| @ -836,11 +839,18 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) | ||||
| 	flag = 1; | ||||
| 	setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void*)&flag, QSE_SIZEOF(flag)); | ||||
| 	#endif | ||||
| 	 | ||||
|  | ||||
| 	#if defined(SO_REUSEPORT) | ||||
| 	flag = 1; | ||||
| 	setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (void*)&flag, QSE_SIZEOF(flag)); | ||||
| 	if (setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, &flag, QSE_SIZEOF(flag)) <= -1) | ||||
| 	{ | ||||
| 		/* TODO: logging. warning only */ | ||||
| 		/* this is not a hard failure */ | ||||
| qse_printf (QSE_STDERR, QSE_T("Failed to enable SO_REUSEPORT\n")); | ||||
| 	} | ||||
| 	#endif | ||||
| 	 | ||||
|  | ||||
|  | ||||
| /* TODO: linux. use capset() to set required capabilities just in case */ | ||||
| 	#if defined(IP_TRANSPARENT) | ||||
| @ -876,6 +886,7 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) | ||||
| 	setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); | ||||
| 	#endif | ||||
|  | ||||
|  | ||||
| 	if (server->dope.flags & QSE_HTTPD_SERVER_BINDTONWIF) | ||||
| 	{ | ||||
| 	#if defined(SO_BINDTODEVICE) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user