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