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:
@ -48,6 +48,7 @@ libqsecmn_la_SOURCES = \
|
||||
mbwc-str.c \
|
||||
mem.c \
|
||||
nwad.c \
|
||||
nwif.c \
|
||||
nwio.c \
|
||||
oht.c \
|
||||
opt.c \
|
||||
|
@ -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@
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
296
qse/lib/cmn/nwif.c
Normal 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
|
||||
}
|
Reference in New Issue
Block a user