fixed a formatting bug in qse_strtonwad()

renamed qse_httpd_addserver() to qse_httpd_attachserver().
added qse_httpd_detachserver().
added the predetach field to qse_httpd_server_t.
added qse_httpd_cbstd_t and changed qse_htpd_loopstd() to accept this cbstd.
enhanced server uri parsing to include 'docroot'.
enhanced qse_httpd_entasktext() and added qse_httpd_entask_text() for internal use.
added nwif functions like qse_nwifindextombs().
added qse_env_insertmbsa()/qse_env_insertwcsa()/qse_env_inserta().
enhanced TPROXY handling
This commit is contained in:
2012-09-25 02:47:25 +00:00
parent fdba865863
commit cb34385ded
28 changed files with 1466 additions and 815 deletions

View File

@ -48,6 +48,7 @@ libqsecmn_la_SOURCES = \
mbwc-str.c \
mem.c \
nwad.c \
nwif.c \
nwio.c \
oht.c \
opt.c \

View File

@ -86,16 +86,17 @@ am_libqsecmn_la_OBJECTS = alg-rand.lo alg-search.lo alg-sort.lo \
assert.lo chr.lo cp949.lo cp950.lo dll.lo env.lo gdl.lo htb.lo \
fio.lo fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo glob.lo \
hton.lo ipad.lo lda.lo main.lo mbwc.lo mbwc-str.lo mem.lo \
nwad.lo nwio.lo oht.lo opt.lo path-basename.lo path-canon.lo \
pio.lo pma.lo rbt.lo rex.lo sio.lo sll.lo slmb.lo stdio.lo \
str-beg.lo str-cat.lo str-chr.lo str-cnv.lo str-cmp.lo \
str-cpy.lo str-del.lo str-dup.lo str-dynm.lo str-dynw.lo \
str-end.lo str-excl.lo str-fcpy.lo str-fnmat.lo str-incl.lo \
str-len.lo str-pac.lo str-pbrk.lo str-put.lo str-rev.lo \
str-rot.lo str-set.lo str-spl.lo str-spn.lo str-str.lo \
str-subst.lo str-tok.lo str-trm.lo str-word.lo time.lo tio.lo \
tre.lo tre-ast.lo tre-compile.lo tre-match-backtrack.lo \
tre-match-parallel.lo tre-parse.lo tre-stack.lo utf8.lo xma.lo
nwad.lo nwif.lo nwio.lo oht.lo opt.lo path-basename.lo \
path-canon.lo pio.lo pma.lo rbt.lo rex.lo sio.lo sll.lo \
slmb.lo stdio.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \
str-cmp.lo str-cpy.lo str-del.lo str-dup.lo str-dynm.lo \
str-dynw.lo str-end.lo str-excl.lo str-fcpy.lo str-fnmat.lo \
str-incl.lo str-len.lo str-pac.lo str-pbrk.lo str-put.lo \
str-rev.lo str-rot.lo str-set.lo str-spl.lo str-spn.lo \
str-str.lo str-subst.lo str-tok.lo str-trm.lo str-word.lo \
time.lo tio.lo tre.lo tre-ast.lo tre-compile.lo \
tre-match-backtrack.lo tre-match-parallel.lo tre-parse.lo \
tre-stack.lo utf8.lo xma.lo
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -337,6 +338,7 @@ libqsecmn_la_SOURCES = \
mbwc-str.c \
mem.c \
nwad.c \
nwif.c \
nwio.c \
oht.c \
opt.c \
@ -502,6 +504,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opt.Plo@am__quote@

View File

@ -160,13 +160,13 @@ static int expandstr (qse_env_t* env, qse_size_t inc)
}
#if defined(QSE_ENV_CHAR_IS_WCHAR)
static int insertw (qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value)
static int insertw (qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value[])
{
qse_size_t nl, vl, tl;
qse_size_t nl, vl, tl, i;
nl = qse_wcslen (name);
vl = qse_wcslen (value);
for (i = 0, vl = 0; value[i]; i++) vl += qse_wcslen(value[i]);
if (env->arr.len >= env->arr.capa &&
expandarr(env) <= -1) return -1;
@ -179,7 +179,8 @@ static int insertw (qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t*
env->str.len += qse_wcscpy (&env->str.ptr[env->str.len], name);
env->str.ptr[env->str.len++] = QSE_WT('=');
env->str.len += qse_wcscpy (&env->str.ptr[env->str.len], value);
for (i = 0; value[i]; i++)
env->str.len += qse_wcscpy (&env->str.ptr[env->str.len], value[i]);
env->str.ptr[++env->str.len] = QSE_WT('\0');
return 0;
@ -239,12 +240,12 @@ static int deletew (qse_env_t* env, const qse_wchar_t* name)
}
#else
static int insertm (qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value)
static int insertm (qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value[])
{
qse_size_t nl, vl, tl;
qse_size_t nl, vl, tl, i;
nl = qse_mbslen (name);
vl = qse_mbslen (value);
for (i = 0, vl = 0; value[i]; i++) vl += qse_mbslen(value[i]);
if (env->arr.len >= env->arr.capa &&
expandarr(env) <= -1) return -1;
@ -258,7 +259,8 @@ static int insertm (qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t*
env->str.len += qse_mbscpy (&env->str.ptr[env->str.len], name);
env->str.ptr[env->str.len++] = QSE_MT('=');
env->str.len += qse_mbscpy (&env->str.ptr[env->str.len], value);
for (i = 0; value[i]; i++)
env->str.len += qse_mbscpy (&env->str.ptr[env->str.len], value[i]);
env->str.ptr[++env->str.len] = QSE_MT('\0');
return 0;
@ -319,26 +321,27 @@ static int deletem (qse_env_t* env, const qse_mchar_t* name)
#endif
static QSE_INLINE int insert_wcs (
qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value)
qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value[])
{
#if defined(QSE_ENV_CHAR_IS_WCHAR)
/* no conversion -> wchar */
return insertw (env, name, value);
#else
/* convert wchar to mchar */
qse_mchar_t* namedup, * valuedup;
qse_mchar_t* namedup, * valuedup[2];
int n;
namedup = qse_wcstombsdup (name, env->mmgr); /* TODO: ignore mbwcerr */
if (namedup == QSE_NULL) return -1;
valuedup = qse_wcstombsdup (value, env->mmgr); /* TODO: ignore mbwcerr */
valuedup[0] = qse_wcsatombsdup (value, env->mmgr); /* TODO: ignore mbwcerr */
if (valuedup == QSE_NULL)
{
QSE_MMGR_FREE (env->mmgr, namedup);
return -1;
}
valuedup[1] = QSE_NULL;
n = insertm (env, namedup, valuedup);
QSE_MMGR_FREE (env->mmgr, valuedup);
QSE_MMGR_FREE (env->mmgr, valuedup[0]);
QSE_MMGR_FREE (env->mmgr, namedup);
return n;
@ -346,23 +349,24 @@ static QSE_INLINE int insert_wcs (
}
static QSE_INLINE int insert_mbs (
qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value)
qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value[])
{
#if defined(QSE_ENV_CHAR_IS_WCHAR)
/* convert mchar to wchar */
qse_wchar_t* namedup, * valuedup;
qse_wchar_t* namedup, * valuedup[2];
int n;
namedup = qse_mbstowcsalldup (name, env->mmgr);
if (namedup == QSE_NULL) return -1;
valuedup = qse_mbstowcsalldup (value, env->mmgr);
if (valuedup == QSE_NULL)
valuedup[0] = qse_mbsatowcsalldup (value, env->mmgr);
if (valuedup[0] == QSE_NULL)
{
QSE_MMGR_FREE (env->mmgr, namedup);
return -1;
}
valuedup[1] = QSE_NULL;
n = insertw (env, namedup, valuedup);
QSE_MMGR_FREE (env->mmgr, valuedup);
QSE_MMGR_FREE (env->mmgr, valuedup[0]);
QSE_MMGR_FREE (env->mmgr, namedup);
return n;
@ -473,15 +477,16 @@ static qse_mchar_t* get_env (qse_env_t* env, const qse_mchar_t* name, int* free)
static int insert_sys_wcs (qse_env_t* env, const qse_wchar_t* name)
{
#if defined(QSE_ENV_CHAR_IS_WCHAR)
qse_wchar_t* v;
qse_wchar_t* v[2];
int free;
int ret = -1;
v = get_env (env, name, &free);
if (v)
v[0] = get_env (env, name, &free);
if (v[0])
{
v[1] = QSE_NULL;
ret = insertw (env, name, v);
if (free) QSE_MMGR_FREE (env->mmgr, v);
if (free) QSE_MMGR_FREE (env->mmgr, v[0]);
}
return ret;
#else
@ -516,15 +521,16 @@ static int insert_sys_mbs (qse_env_t* env, const qse_mchar_t* name)
return ret;
#else
qse_mchar_t* v;
qse_mchar_t* v[2];
int free;
int ret = -1;
v = get_env (env, name, &free);
if (v)
v[0] = get_env (env, name, &free);
if (v[0])
{
v[1] = QSE_NULL;
ret = insertm (env, name, v);
if (free) QSE_MMGR_FREE (env->mmgr, v);
if (free) QSE_MMGR_FREE (env->mmgr, v[0]);
}
return ret;
#endif
@ -620,6 +626,19 @@ done:
int qse_env_insertwcs (
qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value)
{
if (value)
{
const qse_wchar_t* va[2];
va[0] = value;
va[1] = QSE_NULL;
return insert_wcs (env, name, va);
}
else return insert_sys_wcs (env, name);
}
int qse_env_insertwcsa (
qse_env_t* env, const qse_wchar_t* name, const qse_wchar_t* value[])
{
return value? insert_wcs (env, name, value): insert_sys_wcs (env, name);
}
@ -627,9 +646,21 @@ int qse_env_insertwcs (
int qse_env_insertmbs (
qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value)
{
return value? insert_mbs (env, name, value): insert_sys_mbs (env, name);
if (value)
{
const qse_mchar_t* va[2];
va[0] = value;
va[1] = QSE_NULL;
return insert_mbs (env, name, va);
}
else return insert_sys_mbs (env, name);
}
int qse_env_insertmbsa (
qse_env_t* env, const qse_mchar_t* name, const qse_mchar_t* value[])
{
return value? insert_mbs (env, name, value): insert_sys_mbs (env, name);
}
int qse_env_deletewcs (qse_env_t* env, const qse_wchar_t* name)
{

View File

@ -20,105 +20,11 @@
#include <qse/cmn/nwad.h>
#include <qse/cmn/hton.h>
#include <qse/cmn/nwif.h>
#include <qse/cmn/str.h>
#include <qse/cmn/fmt.h>
#include "mem.h"
#if defined(HAVE_NET_IF_H)
#include <net/if.h>
#include <qse/cmn/mbwc.h>
#if !defined(IF_NAMESIZE)
# define IF_NAMESIZE 63
#endif
#if defined(HAVE_IF_NAMETOINDEX)
static QSE_INLINE unsigned int mbsn_to_ifindex (const qse_mchar_t* ptr, qse_size_t len)
{
qse_mchar_t tmp[IF_NAMESIZE + 1];
if (qse_mbsxncpy (tmp, QSE_COUNTOF(tmp), ptr, len) < len)
{
/* name too long */
return 0;
}
return if_nametoindex (tmp);
}
static QSE_INLINE unsigned int wcsn_to_ifindex (const qse_wchar_t* ptr, qse_size_t len)
{
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t wl, ml;
wl = len; ml = QSE_COUNTOF(tmp) - 1;
if (qse_wcsntombsn (ptr, &wl, tmp, &ml) <= -1) return 0;
tmp[ml] = QSE_MT('\0');
return if_nametoindex (tmp);
}
#else
static QSE_INLINE unsigned int mbsn_to_ifindex (const qse_mchar_t* ptr, qse_size_t len)
{
return 0U;
}
static QSE_INLINE unsigned int wcsn_to_ifindex (const qse_wchar_t* ptr, qse_size_t len)
{
return 0U;
}
#endif /* HAVE_IF_NAMETOINDEX */
#if defined(HAVE_IF_INDEXTONAME)
static QSE_INLINE int ifindex_to_mbsn (unsigned int index, qse_mchar_t* buf, qse_size_t len)
{
qse_mchar_t tmp[IF_NAMESIZE + 1];
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
return qse_mbsxcpy (buf, len, tmp);
}
static QSE_INLINE int ifindex_to_wcsn (unsigned int index, qse_wchar_t* buf, qse_size_t len)
{
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t ml, wl;
int x;
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
wl = len;
x = qse_mbstowcs (tmp, &ml, buf, &wl);
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
else if (x != 0) return 0;
return wl;
}
#else
static QSE_INLINE int ifindex_to_mbsn (unsigned int index, qse_mchar_t* buf, qse_size_t len)
{
return 0;
}
static QSE_INLINE int ifindex_to_wcsn (unsigned int index, qse_wchar_t* buf, qse_size_t len)
{
return 0;
}
#endif /* HAVE_IF_INDEXTONAME */
#else /* HAVE_NET_IF_H */
static QSE_INLINE unsigned int mbsn_to_ifindex (const qse_mchar_t* ptr, qse_size_t len)
{
return 0U;
}
static QSE_INLINE unsigned int wcsn_to_ifindex (const qse_wchar_t* ptr, qse_size_t len)
{
return 0U;
}
static QSE_INLINE int ifindex_to_mbsn (unsigned int index, qse_mchar_t* buf, qse_size_t len)
{
return 0;
}
static QSE_INLINE int ifindex_to_wcsn (unsigned int index, qse_wchar_t* buf, qse_size_t len)
{
return 0;
}
#endif /* HAVE_NET_IF_H */
int qse_mbstonwad (const qse_mchar_t* str, qse_nwad_t* nwad)
{
return qse_mbsntonwad (str, qse_mbslen(str), nwad);
@ -178,7 +84,7 @@ int qse_mbsntonwad (const qse_mchar_t* str, qse_size_t len, qse_nwad_t* nwad)
/* interface name as a scope id? */
const qse_mchar_t* stmp = p;
do p++; while (p < end && *p != QSE_MT(']'));
tmpad.u.in6.scope = mbsn_to_ifindex (stmp, p - stmp);
tmpad.u.in6.scope = qse_nwifmbsntoindex (stmp, p - stmp);
if (tmpad.u.in6.scope <= 0) return -1;
}
@ -240,7 +146,7 @@ int qse_mbsntonwad (const qse_mchar_t* str, qse_size_t len, qse_nwad_t* nwad)
/* interface name as a scope id? */
const qse_mchar_t* stmp = p;
do p++; while (p < end);
tmpad.u.in6.scope = mbsn_to_ifindex (stmp, p - stmp);
tmpad.u.in6.scope = qse_nwifmbsntoindex (stmp, p - stmp);
if (tmpad.u.in6.scope <= 0) return -1;
}
}
@ -342,7 +248,7 @@ int qse_wcsntonwad (const qse_wchar_t* str, qse_size_t len, qse_nwad_t* nwad)
/* interface name as a scope id? */
const qse_wchar_t* stmp = p;
do p++; while (p < end && *p != QSE_WT(']'));
tmpad.u.in6.scope = wcsn_to_ifindex (stmp, p - stmp);
tmpad.u.in6.scope = qse_nwifwcsntoindex (stmp, p - stmp);
if (tmpad.u.in6.scope <= 0) return -1;
}
@ -404,7 +310,7 @@ int qse_wcsntonwad (const qse_wchar_t* str, qse_size_t len, qse_nwad_t* nwad)
/* interface name as a scope id? */
const qse_wchar_t* stmp = p;
do p++; while (p < end);
tmpad.u.in6.scope = wcsn_to_ifindex (stmp, p - stmp);
tmpad.u.in6.scope = qse_nwifwcsntoindex (stmp, p - stmp);
if (tmpad.u.in6.scope <= 0) return -1;
}
}
@ -489,8 +395,11 @@ qse_size_t qse_nwadtombs (
if (!(flags & QSE_NWADTOMBS_ADDR) ||
nwad->u.in6.port != 0)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_MT('[');
if (flags & QSE_NWADTOMBS_ADDR)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_MT('[');
}
}
}
@ -509,7 +418,7 @@ qse_size_t qse_nwadtombs (
if (xlen + 1 >= len) goto done;
tmp = ifindex_to_mbsn (nwad->u.in6.scope, &buf[xlen], len - xlen);
tmp = qse_nwifindextombs (nwad->u.in6.scope, &buf[xlen], len - xlen);
if (tmp <= 0)
{
xlen += qse_fmtuintmaxtombs (
@ -525,11 +434,11 @@ qse_size_t qse_nwadtombs (
if (!(flags & QSE_NWADTOMBS_ADDR) ||
nwad->u.in6.port != 0)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_MT(']');
if (flags & QSE_NWADTOMBS_ADDR)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_MT(']');
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_MT(':');
}
@ -594,8 +503,11 @@ qse_size_t qse_nwadtowcs (
if (!(flags & QSE_NWADTOMBS_ADDR) ||
nwad->u.in6.port != 0)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_WT('[');
if (flags & QSE_NWADTOMBS_ADDR)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_WT('[');
}
}
}
@ -613,7 +525,7 @@ qse_size_t qse_nwadtowcs (
if (xlen + 1 >= len) goto done;
tmp = ifindex_to_wcsn (nwad->u.in6.scope, &buf[xlen], len - xlen);
tmp = qse_nwifindextowcs (nwad->u.in6.scope, &buf[xlen], len - xlen);
if (tmp <= 0)
{
xlen += qse_fmtuintmaxtowcs (
@ -629,11 +541,11 @@ qse_size_t qse_nwadtowcs (
if (!(flags & QSE_NWADTOMBS_ADDR) ||
nwad->u.in6.port != 0)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_WT(']');
if (flags & QSE_NWADTOMBS_ADDR)
{
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_WT(']');
if (xlen + 1 >= len) goto done;
buf[xlen++] = QSE_WT(':');
}

296
qse/lib/cmn/nwif.c Normal file
View File

@ -0,0 +1,296 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/cmn/nwif.h>
#include <qse/cmn/str.h>
#include <qse/cmn/mbwc.h>
#include "mem.h"
#if defined(_WIN32)
/* TODO: */
#elif defined(__OS2__)
/* TODO: */
#elif defined(__DOS__)
/* TODO: */
#else
# include "syscall.h"
# include <sys/socket.h>
# if defined(HAVE_SYS_IOCTL_H)
# include <sys/ioctl.h>
# endif
# if defined(HAVE_NET_IF_H)
# include <net/if.h>
# endif
# if !defined(IF_NAMESIZE)
# define IF_NAMESIZE 63
# endif
#endif
unsigned int qse_nwifmbstoindex (const qse_mchar_t* ptr)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFINDEX)
int h, x;
qse_size_t len;
struct ifreq ifr;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
len = qse_mbsxcpy (ifr.ifr_name, QSE_COUNTOF(ifr.ifr_name), ptr);
if (ptr[len] != QSE_MT('\0')) return 0u; /* name too long */
x = ioctl (h, SIOCGIFINDEX, &ifr);
QSE_CLOSE (h);
return (x <= -1)? 0u: ifr.ifr_ifindex;
#elif defined(HAVE_IF_NAMETOINDEX)
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t len;
len = qse_mbsxcpy (tmp, QSE_COUNTOF(tmp), ptr);
if (ptr[len] != QSE_MT('\0')) return 0u; /* name too long */
return if_nametoindex (tmp);
#else
return 0u;
#endif
}
unsigned int qse_nwifmbsntoindex (const qse_mchar_t* ptr, qse_size_t len)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFINDEX)
int h, x;
struct ifreq ifr;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
if (qse_mbsxncpy (ifr.ifr_name, QSE_COUNTOF(ifr.ifr_name), ptr, len) < len) return 0u; /* name too long */
x = ioctl (h, SIOCGIFINDEX, &ifr);
QSE_CLOSE (h);
return (x <= -1)? 0u: ifr.ifr_ifindex;
#elif defined(HAVE_IF_NAMETOINDEX)
qse_mchar_t tmp[IF_NAMESIZE + 1];
if (qse_mbsxncpy (tmp, QSE_COUNTOF(tmp), ptr, len) < len) return 0u; /* name too long */
return if_nametoindex (tmp);
#else
return 0u;
#endif
}
unsigned int qse_nwifwcstoindex (const qse_wchar_t* ptr)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFINDEX)
int h, x;
struct ifreq ifr;
qse_size_t wl, ml;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
ml = QSE_COUNTOF(ifr.ifr_name);
if (qse_wcstombs (ptr, &wl, ifr.ifr_name, &ml) <= -1) return 0;
x = ioctl (h, SIOCGIFINDEX, &ifr);
QSE_CLOSE (h);
return (x <= -1)? 0u: ifr.ifr_ifindex;
#elif defined(HAVE_IF_NAMETOINDEX)
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t wl, ml;
ml = QSE_COUNTOF(tmp);
if (qse_wcstombs (ptr, &wl, tmp, &ml) <= -1) return 0;
return if_nametoindex (tmp);
#else
return 0u;
#endif
}
unsigned int qse_nwifwcsntoindex (const qse_wchar_t* ptr, qse_size_t len)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFINDEX)
int h, x;
struct ifreq ifr;
qse_size_t wl, ml;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
wl = len; ml = QSE_COUNTOF(ifr.ifr_name) - 1;
if (qse_wcsntombsn (ptr, &wl, ifr.ifr_name, &ml) <= -1) return 0;
ifr.ifr_name[ml] = QSE_MT('\0');
x = ioctl (h, SIOCGIFINDEX, &ifr);
QSE_CLOSE (h);
return (x <= -1)? 0u: ifr.ifr_ifindex;
#elif defined(HAVE_IF_NAMETOINDEX)
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t wl, ml;
wl = len; ml = QSE_COUNTOF(tmp) - 1;
if (qse_wcsntombsn (ptr, &wl, tmp, &ml) <= -1) return 0;
tmp[ml] = QSE_MT('\0');
return if_nametoindex (tmp);
#else
return 0u;
#endif
}
qse_size_t qse_nwifindextombs (unsigned int index, qse_mchar_t* buf, qse_size_t len)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFNAME)
int h, x;
struct ifreq ifr;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
ifr.ifr_ifindex = index;
x = ioctl (h, SIOCGIFNAME, &ifr);
QSE_CLOSE (h);
return (x <= -1)? 0: qse_mbsxcpy (buf, len, ifr.ifr_name);
#elif defined(HAVE_IF_INDEXTONAME)
qse_mchar_t tmp[IF_NAMESIZE + 1];
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
return qse_mbsxcpy (buf, len, tmp);
#else
return 0;
#endif
}
qse_size_t qse_nwifindextowcs (unsigned int index, qse_wchar_t* buf, qse_size_t len)
{
#if defined(_WIN32)
/* TODO: */
return 0u;
#elif defined(__OS2__)
/* TODO: */
return 0u;
#elif defined(__DOS__)
/* TODO: */
return 0u;
#elif defined(SIOCGIFNAME)
int h, x;
struct ifreq ifr;
qse_size_t wl, ml;
h = socket (AF_INET, SOCK_DGRAM, 0);
if (h <= -1) return 0u;
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
ifr.ifr_ifindex = index;
x = ioctl (h, SIOCGIFNAME, &ifr);
QSE_CLOSE (h);
if (x <= -1) return 0;
wl = len;
x = qse_mbstowcs (ifr.ifr_name, &ml, buf, &wl);
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
else if (x != 0) return 0;
return wl;
#elif defined(HAVE_IF_INDEXTONAME)
qse_mchar_t tmp[IF_NAMESIZE + 1];
qse_size_t ml, wl;
int x;
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
wl = len;
x = qse_mbstowcs (tmp, &ml, buf, &wl);
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
else if (x != 0) return 0;
return wl;
#else
return 0;
#endif
}