added QSE_GLOB_TOLERANT
enhanced check for __int128_t added qse_getnwifcfg() added qse_skad_t, qse_skadtonwad(), qse_nwadtoskad() added more checks to configure.ac
This commit is contained in:
parent
b94dd042c5
commit
034d3e9c04
@ -489,6 +489,7 @@ static int expand_wildcard (int argc, qse_char_t* argv[], int glob, xarg_t* xarg
|
|||||||
if (glob)
|
if (glob)
|
||||||
{
|
{
|
||||||
x = qse_glob (argv[i], collect_into_xarg, xarg,
|
x = qse_glob (argv[i], collect_into_xarg, xarg,
|
||||||
|
QSE_GLOB_TOLERANT |
|
||||||
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
||||||
QSE_GLOB_NOESCAPE | QSE_GLOB_PERIOD | QSE_GLOB_IGNORECASE,
|
QSE_GLOB_NOESCAPE | QSE_GLOB_PERIOD | QSE_GLOB_IGNORECASE,
|
||||||
#else
|
#else
|
||||||
@ -816,7 +817,7 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
|
|||||||
/* the remaining arguments are input console file names */
|
/* the remaining arguments are input console file names */
|
||||||
if (expand_wildcard (argc - opt.ind, &argv[opt.ind], do_glob, &arg->icf) <= -1)
|
if (expand_wildcard (argc - opt.ind, &argv[opt.ind], do_glob, &arg->icf) <= -1)
|
||||||
{
|
{
|
||||||
print_error (QSE_T("out of memory\n"));
|
print_error (QSE_T("failed to expand wildcard\n"));
|
||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -653,7 +653,12 @@ static int expand_wildcards (int argc, qse_char_t* argv[], int glob, xarg_t* xar
|
|||||||
if (glob)
|
if (glob)
|
||||||
{
|
{
|
||||||
x = qse_glob (argv[i], collect_into_xarg, xarg,
|
x = qse_glob (argv[i], collect_into_xarg, xarg,
|
||||||
|
QSE_GLOB_TOLERANT |
|
||||||
|
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
||||||
QSE_GLOB_NOESCAPE | QSE_GLOB_PERIOD | QSE_GLOB_IGNORECASE,
|
QSE_GLOB_NOESCAPE | QSE_GLOB_PERIOD | QSE_GLOB_IGNORECASE,
|
||||||
|
#else
|
||||||
|
QSE_GLOB_PERIOD,
|
||||||
|
#endif
|
||||||
xarg->mmgr
|
xarg->mmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
271
qse/configure
vendored
271
qse/configure
vendored
@ -17307,7 +17307,7 @@ fi
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
for ac_header in sys/resource.h sys/wait.h sys/syscall.h sys/sendfile.h sys/epoll.h
|
for ac_header in sys/resource.h sys/wait.h sys/syscall.h sys/sendfile.h sys/epoll.h sys/ioctl.h
|
||||||
do :
|
do :
|
||||||
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
||||||
@ -17320,7 +17320,7 @@ fi
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
for ac_header in sys/ioctl.h net/if.h
|
for ac_header in sys/socket.h sys/sockio.h ifaddrs.h
|
||||||
do :
|
do :
|
||||||
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
||||||
@ -17333,6 +17333,32 @@ fi
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
for ac_header in net/if.h
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "#include <sys/socket.h>
|
||||||
|
"
|
||||||
|
if test "x$ac_cv_header_net_if_h" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_NET_IF_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
for ac_header in net/if_dl.h
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_header_compile "$LINENO" "net/if_dl.h" "ac_cv_header_net_if_dl_h" "#include <sys/socket.h>
|
||||||
|
"
|
||||||
|
if test "x$ac_cv_header_net_if_dl_h" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_NET_IF_DL_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
for ac_header in uci.h
|
for ac_header in uci.h
|
||||||
do :
|
do :
|
||||||
ac_fn_c_check_header_mongrel "$LINENO" "uci.h" "ac_cv_header_uci_h" "$ac_includes_default"
|
ac_fn_c_check_header_mongrel "$LINENO" "uci.h" "ac_cv_header_uci_h" "$ac_includes_default"
|
||||||
@ -17508,18 +17534,6 @@ _ACEOF
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
for ac_func in if_nametoindex if_indextoname
|
|
||||||
do :
|
|
||||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
|
||||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
|
||||||
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
OLDLIBS="$LIBS"
|
OLDLIBS="$LIBS"
|
||||||
LIBS="$LIBM $LIBS"
|
LIBS="$LIBM $LIBS"
|
||||||
@ -17673,6 +17687,22 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
OLDLIBS="$LIBS"
|
||||||
|
LIBS="$SOCKET_LIBS $LIBS"
|
||||||
|
for ac_func in if_nametoindex if_indextoname getifaddrs
|
||||||
|
do :
|
||||||
|
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
|
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||||
|
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
LIBS="$OLDLIBS"
|
||||||
|
|
||||||
for ac_func in sendfile sendfile64 sendfilev sendfilev64
|
for ac_func in sendfile sendfile64 sendfilev sendfilev64
|
||||||
do :
|
do :
|
||||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
@ -18598,6 +18628,37 @@ _ACEOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
ac_fn_c_check_member "$LINENO" "struct ifreq" "ifr_ifindex" "ac_cv_member_struct_ifreq_ifr_ifindex" "#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif
|
||||||
|
"
|
||||||
|
if test "x$ac_cv_member_struct_ifreq_ifr_ifindex" = xyes; then :
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_STRUCT_IFREQ_IFR_IFINDEX 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
ac_fn_c_check_member "$LINENO" "struct ifreq" "ifr_mtu" "ac_cv_member_struct_ifreq_ifr_mtu" "#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif
|
||||||
|
"
|
||||||
|
if test "x$ac_cv_member_struct_ifreq_ifr_mtu" = xyes; then :
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_STRUCT_IFREQ_IFR_MTU 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# The cast to long int works around a bug in the HP C Compiler
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
@ -19441,6 +19502,177 @@ _ACEOF
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if test "${platform_win32}" == "yes"
|
||||||
|
then
|
||||||
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
|
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
# This bug is HP SR number 8606223364.
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct sockaddr_in" >&5
|
||||||
|
$as_echo_n "checking size of struct sockaddr_in... " >&6; }
|
||||||
|
if ${ac_cv_sizeof_struct_sockaddr_in+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in))" "ac_cv_sizeof_struct_sockaddr_in" "
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
"; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
if test "$ac_cv_type_struct_sockaddr_in" = yes; then
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error 77 "cannot compute sizeof (struct sockaddr_in)
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
ac_cv_sizeof_struct_sockaddr_in=0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_sockaddr_in" >&5
|
||||||
|
$as_echo "$ac_cv_sizeof_struct_sockaddr_in" >&6; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SIZEOF_STRUCT_SOCKADDR_IN $ac_cv_sizeof_struct_sockaddr_in
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
|
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
# This bug is HP SR number 8606223364.
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct sockaddr_in6" >&5
|
||||||
|
$as_echo_n "checking size of struct sockaddr_in6... " >&6; }
|
||||||
|
if ${ac_cv_sizeof_struct_sockaddr_in6+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in6))" "ac_cv_sizeof_struct_sockaddr_in6" "
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
"; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
if test "$ac_cv_type_struct_sockaddr_in6" = yes; then
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error 77 "cannot compute sizeof (struct sockaddr_in6)
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
ac_cv_sizeof_struct_sockaddr_in6=0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_sockaddr_in6" >&5
|
||||||
|
$as_echo "$ac_cv_sizeof_struct_sockaddr_in6" >&6; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SIZEOF_STRUCT_SOCKADDR_IN6 $ac_cv_sizeof_struct_sockaddr_in6
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
|
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
# This bug is HP SR number 8606223364.
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct sockaddr_in" >&5
|
||||||
|
$as_echo_n "checking size of struct sockaddr_in... " >&6; }
|
||||||
|
if ${ac_cv_sizeof_struct_sockaddr_in+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in))" "ac_cv_sizeof_struct_sockaddr_in" "
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
"; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
if test "$ac_cv_type_struct_sockaddr_in" = yes; then
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error 77 "cannot compute sizeof (struct sockaddr_in)
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
ac_cv_sizeof_struct_sockaddr_in=0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_sockaddr_in" >&5
|
||||||
|
$as_echo "$ac_cv_sizeof_struct_sockaddr_in" >&6; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SIZEOF_STRUCT_SOCKADDR_IN $ac_cv_sizeof_struct_sockaddr_in
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
# The cast to long int works around a bug in the HP C Compiler
|
||||||
|
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||||
|
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||||
|
# This bug is HP SR number 8606223364.
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct sockaddr_in6" >&5
|
||||||
|
$as_echo_n "checking size of struct sockaddr_in6... " >&6; }
|
||||||
|
if ${ac_cv_sizeof_struct_sockaddr_in6+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in6))" "ac_cv_sizeof_struct_sockaddr_in6" "
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
"; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
if test "$ac_cv_type_struct_sockaddr_in6" = yes; then
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error 77 "cannot compute sizeof (struct sockaddr_in6)
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
else
|
||||||
|
ac_cv_sizeof_struct_sockaddr_in6=0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_sockaddr_in6" >&5
|
||||||
|
$as_echo "$ac_cv_sizeof_struct_sockaddr_in6" >&6; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SIZEOF_STRUCT_SOCKADDR_IN6 $ac_cv_sizeof_struct_sockaddr_in6
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test ${ac_cv_sizeof___int128_t} -gt 0
|
||||||
|
then
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
__int128_t x = 0; x %= 10;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
ac_cv_sizeof___int128_t=0
|
||||||
|
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
#define QSE_SIZEOF_CHAR ${ac_cv_sizeof_char}
|
#define QSE_SIZEOF_CHAR ${ac_cv_sizeof_char}
|
||||||
@ -19549,6 +19781,17 @@ cat >>confdefs.h <<_ACEOF
|
|||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define QSE_SIZEOF_STRUCT_SOCKADDR_IN ${ac_cv_sizeof_struct_sockaddr_in}
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define QSE_SIZEOF_STRUCT_SOCKADDR_IN6 ${ac_cv_sizeof_struct_sockaddr_in6}
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
qse_package_version_major="`echo ${PACKAGE_VERSION} | cut -d. -f1`"
|
qse_package_version_major="`echo ${PACKAGE_VERSION} | cut -d. -f1`"
|
||||||
qse_package_version_minor="`echo ${PACKAGE_VERSION} | cut -d. -f2`"
|
qse_package_version_minor="`echo ${PACKAGE_VERSION} | cut -d. -f2`"
|
||||||
qse_package_version_patch="`echo ${PACKAGE_VERSION} | cut -d. -f3`"
|
qse_package_version_patch="`echo ${PACKAGE_VERSION} | cut -d. -f3`"
|
||||||
|
@ -101,8 +101,10 @@ dnl check header files.
|
|||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h fcntl.h dirent.h])
|
AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h fcntl.h dirent.h])
|
||||||
AC_CHECK_HEADERS([time.h sys/time.h utime.h spawn.h execinfo.h ucontext.h])
|
AC_CHECK_HEADERS([time.h sys/time.h utime.h spawn.h execinfo.h ucontext.h])
|
||||||
AC_CHECK_HEADERS([sys/resource.h sys/wait.h sys/syscall.h sys/sendfile.h sys/epoll.h])
|
AC_CHECK_HEADERS([sys/resource.h sys/wait.h sys/syscall.h sys/sendfile.h sys/epoll.h sys/ioctl.h])
|
||||||
AC_CHECK_HEADERS([sys/ioctl.h net/if.h])
|
AC_CHECK_HEADERS([sys/socket.h sys/sockio.h ifaddrs.h])
|
||||||
|
AC_CHECK_HEADERS([net/if.h], [], [], [#include <sys/socket.h>])
|
||||||
|
AC_CHECK_HEADERS([net/if_dl.h], [], [], [#include <sys/socket.h>])
|
||||||
AC_CHECK_HEADERS([uci.h])
|
AC_CHECK_HEADERS([uci.h])
|
||||||
|
|
||||||
dnl check data types
|
dnl check data types
|
||||||
@ -126,7 +128,6 @@ AC_CHECK_FUNCS([backtrace backtrace_symbols])
|
|||||||
AC_CHECK_FUNCS([fdopendir])
|
AC_CHECK_FUNCS([fdopendir])
|
||||||
AC_CHECK_FUNCS([fork vfork posix_spawn gettid nanosleep select])
|
AC_CHECK_FUNCS([fork vfork posix_spawn gettid nanosleep select])
|
||||||
AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext])
|
AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext])
|
||||||
AC_CHECK_FUNCS([if_nametoindex if_indextoname])
|
|
||||||
|
|
||||||
OLDLIBS="$LIBS"
|
OLDLIBS="$LIBS"
|
||||||
LIBS="$LIBM $LIBS"
|
LIBS="$LIBM $LIBS"
|
||||||
@ -164,6 +165,11 @@ then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST(SOCKET_LIBS)
|
AC_SUBST(SOCKET_LIBS)
|
||||||
|
|
||||||
|
OLDLIBS="$LIBS"
|
||||||
|
LIBS="$SOCKET_LIBS $LIBS"
|
||||||
|
AC_CHECK_FUNCS([if_nametoindex if_indextoname getifaddrs])
|
||||||
|
LIBS="$OLDLIBS"
|
||||||
|
|
||||||
dnl check if sendfile and its variants exist in the standard c library
|
dnl check if sendfile and its variants exist in the standard c library
|
||||||
dnl it inspects the existence of each missing function in the sendfile library.
|
dnl it inspects the existence of each missing function in the sendfile library.
|
||||||
AC_CHECK_FUNCS([sendfile sendfile64 sendfilev sendfilev64])
|
AC_CHECK_FUNCS([sendfile sendfile64 sendfilev sendfilev64])
|
||||||
@ -247,6 +253,19 @@ AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec])
|
|||||||
AC_CHECK_MEMBERS([struct stat.st_mtimespec.tv_nsec])
|
AC_CHECK_MEMBERS([struct stat.st_mtimespec.tv_nsec])
|
||||||
AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec])
|
AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec])
|
||||||
|
|
||||||
|
AC_CHECK_MEMBERS([struct ifreq.ifr_ifindex], [], [],
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif])
|
||||||
|
AC_CHECK_MEMBERS([struct ifreq.ifr_mtu], [], [],
|
||||||
|
[#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif])
|
||||||
|
|
||||||
dnl check the size of primitive data types
|
dnl check the size of primitive data types
|
||||||
AC_CHECK_SIZEOF(char,,[[]])
|
AC_CHECK_SIZEOF(char,,[[]])
|
||||||
AC_CHECK_SIZEOF(short,,[[]])
|
AC_CHECK_SIZEOF(short,,[[]])
|
||||||
@ -277,6 +296,42 @@ AC_CHECK_SIZEOF(off64_t)
|
|||||||
AC_CHECK_SIZEOF(mbstate_t,,[#include <wchar.h>])
|
AC_CHECK_SIZEOF(mbstate_t,,[#include <wchar.h>])
|
||||||
AX_CHECK_NUMVALOF(MB_LEN_MAX,[32],[#include <limits.h>])
|
AX_CHECK_NUMVALOF(MB_LEN_MAX,[32],[#include <limits.h>])
|
||||||
|
|
||||||
|
if test "${platform_win32}" == "yes"
|
||||||
|
then
|
||||||
|
AC_CHECK_SIZEOF(struct sockaddr_in,,[
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>])
|
||||||
|
AC_CHECK_SIZEOF(struct sockaddr_in6,, [
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>])
|
||||||
|
else
|
||||||
|
AC_CHECK_SIZEOF(struct sockaddr_in,,[
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>])
|
||||||
|
AC_CHECK_SIZEOF(struct sockaddr_in6,, [
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl gcc 3.4.3 on opensolaris x86 gave this warning without -msse or
|
||||||
|
dnl something similar.
|
||||||
|
dnl SSE vector argument without SSE enabled changes the ABI
|
||||||
|
dnl it also ended with an internal compiler error while compiling
|
||||||
|
dnl some expressions like 'v % base' where v is of the __int128_t type.
|
||||||
|
dnl so i've added this check to determine if the compiler has
|
||||||
|
dnl proper support for __int128_t.
|
||||||
|
dnl
|
||||||
|
dnl Changing ac_cv_sizeof___int128_t here doesn't corret SIZEOF___INT128_T
|
||||||
|
dnl since it's already generated. It only affects QSE_SIZEOF___INT128_T below.
|
||||||
|
if test ${ac_cv_sizeof___int128_t} -gt 0
|
||||||
|
then
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([], [__int128_t x = 0; x %= 10;])],
|
||||||
|
[],
|
||||||
|
[ac_cv_sizeof___int128_t=0]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(QSE_SIZEOF_CHAR, ${ac_cv_sizeof_char}, [sizeof(char)])
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_CHAR, ${ac_cv_sizeof_char}, [sizeof(char)])
|
||||||
AC_DEFINE_UNQUOTED(QSE_SIZEOF_SHORT, ${ac_cv_sizeof_short}, [sizeof(short)])
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_SHORT, ${ac_cv_sizeof_short}, [sizeof(short)])
|
||||||
AC_DEFINE_UNQUOTED(QSE_SIZEOF_INT, ${ac_cv_sizeof_int}, [sizeof(int)])
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_INT, ${ac_cv_sizeof_int}, [sizeof(int)])
|
||||||
@ -301,6 +356,9 @@ AC_DEFINE_UNQUOTED(QSE_SIZEOF_OFF64_T, ${ac_cv_sizeof_off64_t}, [sizeof(off64_t)
|
|||||||
AC_DEFINE_UNQUOTED(QSE_SIZEOF_MBSTATE_T, ${ac_cv_sizeof_mbstate_t}, [sizeof(mbstate_t)])
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_MBSTATE_T, ${ac_cv_sizeof_mbstate_t}, [sizeof(mbstate_t)])
|
||||||
AC_DEFINE_UNQUOTED(QSE_MBLEN_MAX, ${ax_cv_numvalof_MB_LEN_MAX}, [MB_LEN_MAX])
|
AC_DEFINE_UNQUOTED(QSE_MBLEN_MAX, ${ax_cv_numvalof_MB_LEN_MAX}, [MB_LEN_MAX])
|
||||||
|
|
||||||
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_STRUCT_SOCKADDR_IN, ${ac_cv_sizeof_struct_sockaddr_in}, [sizeof(struct sockaddr_in)])
|
||||||
|
AC_DEFINE_UNQUOTED(QSE_SIZEOF_STRUCT_SOCKADDR_IN6, ${ac_cv_sizeof_struct_sockaddr_in6}, [sizeof(struct sockaddr_in6)])
|
||||||
|
|
||||||
qse_package_version_major="`echo ${PACKAGE_VERSION} | cut -d. -f1`"
|
qse_package_version_major="`echo ${PACKAGE_VERSION} | cut -d. -f1`"
|
||||||
qse_package_version_minor="`echo ${PACKAGE_VERSION} | cut -d. -f2`"
|
qse_package_version_minor="`echo ${PACKAGE_VERSION} | cut -d. -f2`"
|
||||||
qse_package_version_patch="`echo ${PACKAGE_VERSION} | cut -d. -f3`"
|
qse_package_version_patch="`echo ${PACKAGE_VERSION} | cut -d. -f3`"
|
||||||
|
@ -45,7 +45,10 @@ enum qse_glob_flags_t
|
|||||||
|
|
||||||
/** Perform case-insensitive matching.
|
/** Perform case-insensitive matching.
|
||||||
* This option is always on in Win32/OS2/DOS. */
|
* This option is always on in Win32/OS2/DOS. */
|
||||||
QSE_GLOB_IGNORECASE = (1 << 2)
|
QSE_GLOB_IGNORECASE = (1 << 2),
|
||||||
|
|
||||||
|
/** Make the function to be more fault-resistent */
|
||||||
|
QSE_GLOB_TOLERANT = (1 << 3)
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -37,7 +37,6 @@ typedef struct qse_nwad_t qse_nwad_t;
|
|||||||
struct qse_nwad_t
|
struct qse_nwad_t
|
||||||
{
|
{
|
||||||
qse_nwad_type_t type;
|
qse_nwad_type_t type;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
@ -70,6 +69,21 @@ enum qse_nwadtostr_flag_t
|
|||||||
#define QSE_NWADTOWCS_ALL QSE_NWADTOSTR_ALL
|
#define QSE_NWADTOWCS_ALL QSE_NWADTOSTR_ALL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct qse_skad_t qse_skad_t;
|
||||||
|
|
||||||
|
struct qse_skad_t
|
||||||
|
{
|
||||||
|
#if (QSE_SIZEOF_STRUCT_SOCKADDR_IN > 0) && \
|
||||||
|
(QSE_SIZEOF_STRUCT_SOCKADDR_IN >= QSE_SIZEOF_STRUCT_SOCKADDR_IN6)
|
||||||
|
qse_uint8_t data[QSE_SIZEOF_STRUCT_SOCKADDR_IN];
|
||||||
|
#elif (QSE_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) && \
|
||||||
|
(QSE_SIZEOF_STRUCT_SOCKADDR_IN6 >= QSE_SIZEOF_STRUCT_SOCKADDR_IN)
|
||||||
|
qse_uint8_t data[QSE_SIZEOF_STRUCT_SOCKADDR_IN6];
|
||||||
|
#else
|
||||||
|
/* no sockaddr_xxx is available */
|
||||||
|
qse_uint8_t data[QSE_SIZEOF(qse_nwad_t)];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -126,6 +140,20 @@ qse_size_t qse_nwadtowcs (
|
|||||||
# define qse_nwadtostr(nwad,ptr,len,flags) qse_nwadtowcs(nwad,ptr,len,flags)
|
# define qse_nwadtostr(nwad,ptr,len,flags) qse_nwadtowcs(nwad,ptr,len,flags)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int qse_skadtonwad (
|
||||||
|
const qse_skad_t* skad,
|
||||||
|
qse_nwad_t* nwad
|
||||||
|
);
|
||||||
|
|
||||||
|
int qse_nwadtoskad (
|
||||||
|
const qse_nwad_t* nwad,
|
||||||
|
qse_skad_t* skad
|
||||||
|
);
|
||||||
|
|
||||||
|
int qse_skadfamily (
|
||||||
|
const qse_skad_t* skad
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,6 +23,40 @@
|
|||||||
|
|
||||||
#include <qse/types.h>
|
#include <qse/types.h>
|
||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
|
#include <qse/cmn/nwad.h>
|
||||||
|
|
||||||
|
typedef struct qse_nwifcfg_t qse_nwifcfg_t;
|
||||||
|
|
||||||
|
enum qse_nwifcfg_flag_t
|
||||||
|
{
|
||||||
|
QSE_NWIFCFG_UP = (1 << 0),
|
||||||
|
QSE_NWIFCFG_RUNNING = (1 << 1),
|
||||||
|
QSE_NWIFCFG_BCAST = (1 << 2),
|
||||||
|
QSE_NWIFCFG_PTOP = (1 << 3)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum qse_nwifcfg_type_t
|
||||||
|
{
|
||||||
|
QSE_NWIFCFG_IN4,
|
||||||
|
QSE_NWIFCFG_IN6
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum qse_nwifcfg_type_t qse_nwifcfg_type_t;
|
||||||
|
struct qse_nwifcfg_t
|
||||||
|
{
|
||||||
|
qse_nwifcfg_type_t type;
|
||||||
|
qse_char_t name[64];
|
||||||
|
|
||||||
|
/* TODO: add hwaddr?? */
|
||||||
|
|
||||||
|
int flags;
|
||||||
|
unsigned int index;
|
||||||
|
qse_nwad_t addr;
|
||||||
|
qse_nwad_t mask;
|
||||||
|
qse_nwad_t ptop;
|
||||||
|
qse_nwad_t bcast;
|
||||||
|
int mtu;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -46,13 +80,13 @@ unsigned int qse_nwifwcsntoindex (
|
|||||||
qse_size_t len
|
qse_size_t len
|
||||||
);
|
);
|
||||||
|
|
||||||
qse_size_t qse_nwifindextombs (
|
int qse_nwifindextombs (
|
||||||
unsigned int index,
|
unsigned int index,
|
||||||
qse_mchar_t* buf,
|
qse_mchar_t* buf,
|
||||||
qse_size_t len
|
qse_size_t len
|
||||||
);
|
);
|
||||||
|
|
||||||
qse_size_t qse_nwifindextowcs (
|
int qse_nwifindextowcs (
|
||||||
unsigned int index,
|
unsigned int index,
|
||||||
qse_wchar_t* buf,
|
qse_wchar_t* buf,
|
||||||
qse_size_t len
|
qse_size_t len
|
||||||
|
@ -82,6 +82,10 @@
|
|||||||
# define QSE_MBLEN_MAX 8
|
# define QSE_MBLEN_MAX 8
|
||||||
#
|
#
|
||||||
# define QSE_CHAR_IS_WCHAR
|
# define QSE_CHAR_IS_WCHAR
|
||||||
|
#
|
||||||
|
# /* these two have only to be large enough */
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN 32
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN6 64
|
||||||
#else
|
#else
|
||||||
# error Define the size of various data types.
|
# error Define the size of various data types.
|
||||||
#endif
|
#endif
|
||||||
|
@ -138,6 +138,10 @@ _M_X64 x64 platform
|
|||||||
# define QSE_MBLEN_MAX 8
|
# define QSE_MBLEN_MAX 8
|
||||||
#
|
#
|
||||||
# define QSE_CHAR_IS_WCHAR
|
# define QSE_CHAR_IS_WCHAR
|
||||||
|
#
|
||||||
|
# /* these two have only to be large enough */
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN 32
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN6 64
|
||||||
#else
|
#else
|
||||||
# error Define the size of various data types.
|
# error Define the size of various data types.
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,6 +59,10 @@
|
|||||||
# define QSE_MBLEN_MAX 8
|
# define QSE_MBLEN_MAX 8
|
||||||
#
|
#
|
||||||
# define QSE_CHAR_IS_WCHAR
|
# define QSE_CHAR_IS_WCHAR
|
||||||
|
#
|
||||||
|
# /* these two have only to be large enough */
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN 32
|
||||||
|
# define QSE_SIZEOF_STRUCT_SOCKADDR_IN6 64
|
||||||
#else
|
#else
|
||||||
# error Define the size of various data types.
|
# error Define the size of various data types.
|
||||||
#endif
|
#endif
|
||||||
|
@ -167,9 +167,15 @@
|
|||||||
/* Define to 1 if you have the `gethostbyname' function. */
|
/* Define to 1 if you have the `gethostbyname' function. */
|
||||||
#undef HAVE_GETHOSTBYNAME
|
#undef HAVE_GETHOSTBYNAME
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `getifaddrs' function. */
|
||||||
|
#undef HAVE_GETIFADDRS
|
||||||
|
|
||||||
/* Define to 1 if you have the `gettid' function. */
|
/* Define to 1 if you have the `gettid' function. */
|
||||||
#undef HAVE_GETTID
|
#undef HAVE_GETTID
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <ifaddrs.h> header file. */
|
||||||
|
#undef HAVE_IFADDRS_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `if_indextoname' function. */
|
/* Define to 1 if you have the `if_indextoname' function. */
|
||||||
#undef HAVE_IF_INDEXTONAME
|
#undef HAVE_IF_INDEXTONAME
|
||||||
|
|
||||||
@ -254,6 +260,9 @@
|
|||||||
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
|
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
|
||||||
#undef HAVE_NDIR_H
|
#undef HAVE_NDIR_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <net/if_dl.h> header file. */
|
||||||
|
#undef HAVE_NET_IF_DL_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/if.h> header file. */
|
/* Define to 1 if you have the <net/if.h> header file. */
|
||||||
#undef HAVE_NET_IF_H
|
#undef HAVE_NET_IF_H
|
||||||
|
|
||||||
@ -377,6 +386,12 @@
|
|||||||
/* Define to 1 if `d_type' is a member of `struct dirent'. */
|
/* Define to 1 if `d_type' is a member of `struct dirent'. */
|
||||||
#undef HAVE_STRUCT_DIRENT_D_TYPE
|
#undef HAVE_STRUCT_DIRENT_D_TYPE
|
||||||
|
|
||||||
|
/* Define to 1 if `ifr_ifindex' is a member of `struct ifreq'. */
|
||||||
|
#undef HAVE_STRUCT_IFREQ_IFR_IFINDEX
|
||||||
|
|
||||||
|
/* Define to 1 if `ifr_mtu' is a member of `struct ifreq'. */
|
||||||
|
#undef HAVE_STRUCT_IFREQ_IFR_MTU
|
||||||
|
|
||||||
/* Define to 1 if `st_birthtime' is a member of `struct stat'. */
|
/* Define to 1 if `st_birthtime' is a member of `struct stat'. */
|
||||||
#undef HAVE_STRUCT_STAT_ST_BIRTHTIME
|
#undef HAVE_STRUCT_STAT_ST_BIRTHTIME
|
||||||
|
|
||||||
@ -421,6 +436,12 @@
|
|||||||
/* Define to 1 if you have the <sys/sendfile.h> header file. */
|
/* Define to 1 if you have the <sys/sendfile.h> header file. */
|
||||||
#undef HAVE_SYS_SENDFILE_H
|
#undef HAVE_SYS_SENDFILE_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||||
|
#undef HAVE_SYS_SOCKET_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/sockio.h> header file. */
|
||||||
|
#undef HAVE_SYS_SOCKIO_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
@ -643,6 +664,12 @@
|
|||||||
/* sizeof(short) */
|
/* sizeof(short) */
|
||||||
#undef QSE_SIZEOF_SHORT
|
#undef QSE_SIZEOF_SHORT
|
||||||
|
|
||||||
|
/* sizeof(struct sockaddr_in) */
|
||||||
|
#undef QSE_SIZEOF_STRUCT_SOCKADDR_IN
|
||||||
|
|
||||||
|
/* sizeof(struct sockaddr_in6) */
|
||||||
|
#undef QSE_SIZEOF_STRUCT_SOCKADDR_IN6
|
||||||
|
|
||||||
/* sizeof(void*) */
|
/* sizeof(void*) */
|
||||||
#undef QSE_SIZEOF_VOID_P
|
#undef QSE_SIZEOF_VOID_P
|
||||||
|
|
||||||
@ -706,6 +733,12 @@
|
|||||||
/* The size of `short', as computed by sizeof. */
|
/* The size of `short', as computed by sizeof. */
|
||||||
#undef SIZEOF_SHORT
|
#undef SIZEOF_SHORT
|
||||||
|
|
||||||
|
/* The size of `struct sockaddr_in', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_STRUCT_SOCKADDR_IN
|
||||||
|
|
||||||
|
/* The size of `struct sockaddr_in6', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_STRUCT_SOCKADDR_IN6
|
||||||
|
|
||||||
/* The size of `void *', as computed by sizeof. */
|
/* The size of `void *', as computed by sizeof. */
|
||||||
#undef SIZEOF_VOID_P
|
#undef SIZEOF_VOID_P
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ typedef enum qse_tri_t qse_tri_t;
|
|||||||
# define QSE_HAVE_UINT128_T
|
# define QSE_HAVE_UINT128_T
|
||||||
typedef __int128 qse_int128_t;
|
typedef __int128 qse_int128_t;
|
||||||
typedef unsigned __int128 qse_uint128_t;
|
typedef unsigned __int128 qse_uint128_t;
|
||||||
#elif QSE_SIZEOF___INT128_T == 16
|
#elif (QSE_SIZEOF___INT128_T == 16)
|
||||||
# define QSE_HAVE_INT128_T
|
# define QSE_HAVE_INT128_T
|
||||||
# define QSE_HAVE_UINT128_T
|
# define QSE_HAVE_UINT128_T
|
||||||
typedef __int128_t qse_int128_t;
|
typedef __int128_t qse_int128_t;
|
||||||
|
@ -49,7 +49,9 @@ libqsecmn_la_SOURCES = \
|
|||||||
mem.c \
|
mem.c \
|
||||||
mux.c \
|
mux.c \
|
||||||
nwad.c \
|
nwad.c \
|
||||||
|
nwad-skad.c \
|
||||||
nwif.c \
|
nwif.c \
|
||||||
|
nwif-cfg.c \
|
||||||
nwio.c \
|
nwio.c \
|
||||||
oht.c \
|
oht.c \
|
||||||
opt.c \
|
opt.c \
|
||||||
|
@ -90,33 +90,34 @@ libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
|||||||
am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
|
am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
|
||||||
alg-sort.c assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c \
|
alg-sort.c assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c \
|
||||||
fma.c fmt.c fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c \
|
fma.c fmt.c fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c \
|
||||||
main.c mbwc.c mbwc-str.c mem.c mux.c nwad.c nwif.c nwio.c \
|
main.c mbwc.c mbwc-str.c mem.c mux.c nwad.c nwad-skad.c nwif.c \
|
||||||
oht.c opt.c path-basename.c path-canon.c pio.c pma.c rbt.c \
|
nwif-cfg.c nwio.c oht.c opt.c path-basename.c path-canon.c \
|
||||||
rex.c sio.c sll.c slmb.c stdio.c str-beg.c str-cat.c str-chr.c \
|
pio.c pma.c rbt.c rex.c sio.c sll.c slmb.c stdio.c str-beg.c \
|
||||||
str-cnv.c str-cmp.c str-cpy.c str-del.c str-dup.c str-dynm.c \
|
str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c str-del.c \
|
||||||
str-dynw.c str-end.c str-excl.c str-fcpy.c str-fnmat.c \
|
str-dup.c str-dynm.c str-dynw.c str-end.c str-excl.c \
|
||||||
str-incl.c str-len.c str-pac.c str-pbrk.c str-put.c str-rev.c \
|
str-fcpy.c str-fnmat.c str-incl.c str-len.c str-pac.c \
|
||||||
str-rot.c str-set.c str-spl.c str-spn.c str-str.c str-subst.c \
|
str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c str-spl.c \
|
||||||
str-tok.c str-trm.c str-word.c task.c time.c tio.c tre.c \
|
str-spn.c str-str.c str-subst.c str-tok.c str-trm.c str-word.c \
|
||||||
tre-ast.c tre-compile.c tre-match-backtrack.c \
|
task.c time.c tio.c tre.c tre-ast.c tre-compile.c \
|
||||||
tre-match-parallel.c tre-parse.c tre-stack.c uri.c utf8.c \
|
tre-match-backtrack.c tre-match-parallel.c tre-parse.c \
|
||||||
xma.c cp949.c cp950.c
|
tre-stack.c uri.c utf8.c xma.c cp949.c cp950.c
|
||||||
@INCLUDE_MORE_CMGRS_TRUE@am__objects_1 = cp949.lo cp950.lo
|
@INCLUDE_MORE_CMGRS_TRUE@am__objects_1 = cp949.lo cp950.lo
|
||||||
am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \
|
am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \
|
||||||
alg-sort.lo assert.lo chr.lo dir.lo dll.lo env.lo gdl.lo \
|
alg-sort.lo assert.lo chr.lo dir.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 \
|
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 \
|
hton.lo ipad.lo lda.lo main.lo mbwc.lo mbwc-str.lo mem.lo \
|
||||||
mux.lo nwad.lo nwif.lo nwio.lo oht.lo opt.lo path-basename.lo \
|
mux.lo nwad.lo nwad-skad.lo nwif.lo nwif-cfg.lo nwio.lo oht.lo \
|
||||||
path-canon.lo pio.lo pma.lo rbt.lo rex.lo sio.lo sll.lo \
|
opt.lo path-basename.lo path-canon.lo pio.lo pma.lo rbt.lo \
|
||||||
slmb.lo stdio.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \
|
rex.lo sio.lo sll.lo slmb.lo stdio.lo str-beg.lo str-cat.lo \
|
||||||
str-cmp.lo str-cpy.lo str-del.lo str-dup.lo str-dynm.lo \
|
str-chr.lo str-cnv.lo str-cmp.lo str-cpy.lo str-del.lo \
|
||||||
str-dynw.lo str-end.lo str-excl.lo str-fcpy.lo str-fnmat.lo \
|
str-dup.lo str-dynm.lo str-dynw.lo str-end.lo str-excl.lo \
|
||||||
str-incl.lo str-len.lo str-pac.lo str-pbrk.lo str-put.lo \
|
str-fcpy.lo str-fnmat.lo str-incl.lo str-len.lo str-pac.lo \
|
||||||
str-rev.lo str-rot.lo str-set.lo str-spl.lo str-spn.lo \
|
str-pbrk.lo str-put.lo str-rev.lo str-rot.lo str-set.lo \
|
||||||
str-str.lo str-subst.lo str-tok.lo str-trm.lo str-word.lo \
|
str-spl.lo str-spn.lo str-str.lo str-subst.lo str-tok.lo \
|
||||||
task.lo time.lo tio.lo tre.lo tre-ast.lo tre-compile.lo \
|
str-trm.lo str-word.lo task.lo time.lo tio.lo tre.lo \
|
||||||
tre-match-backtrack.lo tre-match-parallel.lo tre-parse.lo \
|
tre-ast.lo tre-compile.lo tre-match-backtrack.lo \
|
||||||
tre-stack.lo uri.lo utf8.lo xma.lo $(am__objects_1)
|
tre-match-parallel.lo tre-parse.lo tre-stack.lo uri.lo utf8.lo \
|
||||||
|
xma.lo $(am__objects_1)
|
||||||
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
|
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
|
||||||
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
@ -352,16 +353,17 @@ noinst_HEADERS = \
|
|||||||
libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \
|
libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \
|
||||||
assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c fma.c fmt.c \
|
assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c fma.c fmt.c \
|
||||||
fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c main.c \
|
fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c main.c \
|
||||||
mbwc.c mbwc-str.c mem.c mux.c nwad.c nwif.c nwio.c oht.c opt.c \
|
mbwc.c mbwc-str.c mem.c mux.c nwad.c nwad-skad.c nwif.c \
|
||||||
path-basename.c path-canon.c pio.c pma.c rbt.c rex.c sio.c \
|
nwif-cfg.c nwio.c oht.c opt.c path-basename.c path-canon.c \
|
||||||
sll.c slmb.c stdio.c str-beg.c str-cat.c str-chr.c str-cnv.c \
|
pio.c pma.c rbt.c rex.c sio.c sll.c slmb.c stdio.c str-beg.c \
|
||||||
str-cmp.c str-cpy.c str-del.c str-dup.c str-dynm.c str-dynw.c \
|
str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c str-del.c \
|
||||||
str-end.c str-excl.c str-fcpy.c str-fnmat.c str-incl.c \
|
str-dup.c str-dynm.c str-dynw.c str-end.c str-excl.c \
|
||||||
str-len.c str-pac.c str-pbrk.c str-put.c str-rev.c str-rot.c \
|
str-fcpy.c str-fnmat.c str-incl.c str-len.c str-pac.c \
|
||||||
str-set.c str-spl.c str-spn.c str-str.c str-subst.c str-tok.c \
|
str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c str-spl.c \
|
||||||
str-trm.c str-word.c task.c time.c tio.c tre.c tre-ast.c \
|
str-spn.c str-str.c str-subst.c str-tok.c str-trm.c str-word.c \
|
||||||
tre-compile.c tre-match-backtrack.c tre-match-parallel.c \
|
task.c time.c tio.c tre.c tre-ast.c tre-compile.c \
|
||||||
tre-parse.c tre-stack.c uri.c utf8.c xma.c $(am__append_1)
|
tre-match-backtrack.c tre-match-parallel.c tre-parse.c \
|
||||||
|
tre-stack.c uri.c utf8.c xma.c $(am__append_1)
|
||||||
libqsecmn_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
libqsecmn_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||||
libqsecmn_la_LIBADD = $(SOCKET_LIBS)
|
libqsecmn_la_LIBADD = $(SOCKET_LIBS)
|
||||||
@ENABLE_CXX_TRUE@libqsecmnxx_la_SOURCES = \
|
@ENABLE_CXX_TRUE@libqsecmnxx_la_SOURCES = \
|
||||||
@ -475,7 +477,9 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc.Plo@am__quote@
|
@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)/mem.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mux.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mux.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad-skad.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif-cfg.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif.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)/nwio.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Plo@am__quote@
|
||||||
|
@ -74,6 +74,7 @@ struct glob_t
|
|||||||
void* cbctx;
|
void* cbctx;
|
||||||
|
|
||||||
qse_mmgr_t* mmgr;
|
qse_mmgr_t* mmgr;
|
||||||
|
int flags;
|
||||||
|
|
||||||
qse_str_t path;
|
qse_str_t path;
|
||||||
qse_str_t tbuf; /* temporary buffer */
|
qse_str_t tbuf; /* temporary buffer */
|
||||||
@ -417,7 +418,11 @@ entry:
|
|||||||
qse_str_setlen (&g->path, tmp2);
|
qse_str_setlen (&g->path, tmp2);
|
||||||
|
|
||||||
x = qse_dir_read (dp, &ent);
|
x = qse_dir_read (dp, &ent);
|
||||||
if (x <= -1) goto oops;
|
if (x <= -1)
|
||||||
|
{
|
||||||
|
if (g->flags & QSE_GLOB_TOLERANT) break;
|
||||||
|
else goto oops;
|
||||||
|
}
|
||||||
if (x == 0) break;
|
if (x == 0) break;
|
||||||
|
|
||||||
if (qse_str_cat (&g->path, ent.name) == (qse_size_t)-1) goto oops;
|
if (qse_str_cat (&g->path, ent.name) == (qse_size_t)-1) goto oops;
|
||||||
@ -545,6 +550,7 @@ int qse_glob (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* cbctx,
|
|||||||
g.cbimpl = cbimpl;
|
g.cbimpl = cbimpl;
|
||||||
g.cbctx = cbctx;
|
g.cbctx = cbctx;
|
||||||
g.mmgr = mmgr;
|
g.mmgr = mmgr;
|
||||||
|
g.flags = flags;
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
||||||
g.fnmat_flags |= QSE_STRFNMAT_IGNORECASE;
|
g.fnmat_flags |= QSE_STRFNMAT_IGNORECASE;
|
||||||
|
167
qse/lib/cmn/nwad-skad.c
Normal file
167
qse/lib/cmn/nwad-skad.c
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
/*
|
||||||
|
* $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/nwad.h>
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
# include <winsock2.h>
|
||||||
|
# include <ws2tcpip.h> /* sockaddr_in6 */
|
||||||
|
# include <windows.h>
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
# include <types.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# pragma library("tcpip32.lib")
|
||||||
|
#elif defined(__DOS__)
|
||||||
|
/* TODO: consider watt-32 */
|
||||||
|
#else
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
union sockaddr_t
|
||||||
|
{
|
||||||
|
#if defined(AF_INET) || defined(AF_INET6)
|
||||||
|
#if defined(AF_INET)
|
||||||
|
struct sockaddr_in in4;
|
||||||
|
#endif
|
||||||
|
#if defined(AF_INET6)
|
||||||
|
struct sockaddr_in6 in6;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
int dummy;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union sockaddr_t sockaddr_t;
|
||||||
|
|
||||||
|
#if defined(AF_INET)
|
||||||
|
# define FAMILY(x) (((struct sockaddr_in*)(x))->sin_family)
|
||||||
|
#elif defined(AF_INET6)
|
||||||
|
# define FAMILY(x) (((struct sockaddr_in6*)(x))->sin6_family)
|
||||||
|
#else
|
||||||
|
# define FAMILY(x) (-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static QSE_INLINE int skad_to_nwad (const sockaddr_t* skad, qse_nwad_t* nwad)
|
||||||
|
{
|
||||||
|
int addrsize = -1;
|
||||||
|
|
||||||
|
switch (FAMILY(skad))
|
||||||
|
{
|
||||||
|
#if defined(AF_INET)
|
||||||
|
case AF_INET:
|
||||||
|
{
|
||||||
|
struct sockaddr_in* in;
|
||||||
|
in = (struct sockaddr_in*)skad;
|
||||||
|
addrsize = QSE_SIZEOF(*in);
|
||||||
|
|
||||||
|
QSE_MEMSET (nwad, 0, QSE_SIZEOF(*nwad));
|
||||||
|
nwad->type = QSE_NWAD_IN4;
|
||||||
|
nwad->u.in4.addr.value = in->sin_addr.s_addr;
|
||||||
|
nwad->u.in4.port = in->sin_port;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(AF_INET6)
|
||||||
|
case AF_INET6:
|
||||||
|
{
|
||||||
|
struct sockaddr_in6* in;
|
||||||
|
in = (struct sockaddr_in6*)skad;
|
||||||
|
addrsize = QSE_SIZEOF(*in);
|
||||||
|
|
||||||
|
QSE_MEMSET (nwad, 0, QSE_SIZEOF(*nwad));
|
||||||
|
nwad->type = QSE_NWAD_IN6;
|
||||||
|
QSE_MEMCPY (&nwad->u.in6.addr, &in->sin6_addr, QSE_SIZEOF(nwad->u.in6.addr));
|
||||||
|
nwad->u.in6.scope = in->sin6_scope_id;
|
||||||
|
nwad->u.in6.port = in->sin6_port;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return addrsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE int nwad_to_skad (const qse_nwad_t* nwad, sockaddr_t* skad)
|
||||||
|
{
|
||||||
|
int addrsize = -1;
|
||||||
|
|
||||||
|
switch (nwad->type)
|
||||||
|
{
|
||||||
|
case QSE_NWAD_IN4:
|
||||||
|
{
|
||||||
|
#if defined(AF_INET)
|
||||||
|
struct sockaddr_in* in;
|
||||||
|
|
||||||
|
in = (struct sockaddr_in*)skad;
|
||||||
|
addrsize = QSE_SIZEOF(*in);
|
||||||
|
QSE_MEMSET (in, 0, addrsize);
|
||||||
|
|
||||||
|
in->sin_family = AF_INET;
|
||||||
|
in->sin_addr.s_addr = nwad->u.in4.addr.value;
|
||||||
|
in->sin_port = nwad->u.in4.port;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case QSE_NWAD_IN6:
|
||||||
|
{
|
||||||
|
#if defined(AF_INET6)
|
||||||
|
struct sockaddr_in6* in;
|
||||||
|
|
||||||
|
in = (struct sockaddr_in6*)skad;
|
||||||
|
addrsize = QSE_SIZEOF(*in);
|
||||||
|
QSE_MEMSET (in, 0, addrsize);
|
||||||
|
|
||||||
|
in->sin6_family = AF_INET6;
|
||||||
|
QSE_MEMCPY (&in->sin6_addr, &nwad->u.in6.addr, QSE_SIZEOF(nwad->u.in6.addr));
|
||||||
|
in->sin6_scope_id = nwad->u.in6.scope;
|
||||||
|
in->sin6_port = nwad->u.in6.port;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addrsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_skadtonwad (const qse_skad_t* skad, qse_nwad_t* nwad)
|
||||||
|
{
|
||||||
|
QSE_ASSERT (QSE_SIZEOF(*skad) >= QSE_SIZEOF(sockaddr_t));
|
||||||
|
return skad_to_nwad ((const sockaddr_t*)skad, nwad);
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_nwadtoskad (const qse_nwad_t* nwad, qse_skad_t* skad)
|
||||||
|
{
|
||||||
|
QSE_ASSERT (QSE_SIZEOF(*skad) >= QSE_SIZEOF(sockaddr_t));
|
||||||
|
return nwad_to_skad (nwad, (sockaddr_t*)skad);
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_skadfamily (const qse_skad_t* skad)
|
||||||
|
{
|
||||||
|
QSE_ASSERT (QSE_SIZEOF(*skad) >= QSE_SIZEOF(sockaddr_t));
|
||||||
|
return FAMILY(skad);
|
||||||
|
}
|
@ -440,7 +440,7 @@ qse_size_t qse_nwadtombs (
|
|||||||
if (xlen + 1 >= len) goto done;
|
if (xlen + 1 >= len) goto done;
|
||||||
|
|
||||||
tmp = qse_nwifindextombs (nwad->u.in6.scope, &buf[xlen], len - xlen);
|
tmp = qse_nwifindextombs (nwad->u.in6.scope, &buf[xlen], len - xlen);
|
||||||
if (tmp <= 0)
|
if (tmp <= -1)
|
||||||
{
|
{
|
||||||
xlen += qse_fmtuintmaxtombs (
|
xlen += qse_fmtuintmaxtombs (
|
||||||
&buf[xlen], len - xlen,
|
&buf[xlen], len - xlen,
|
||||||
@ -547,7 +547,7 @@ qse_size_t qse_nwadtowcs (
|
|||||||
if (xlen + 1 >= len) goto done;
|
if (xlen + 1 >= len) goto done;
|
||||||
|
|
||||||
tmp = qse_nwifindextowcs (nwad->u.in6.scope, &buf[xlen], len - xlen);
|
tmp = qse_nwifindextowcs (nwad->u.in6.scope, &buf[xlen], len - xlen);
|
||||||
if (tmp <= 0)
|
if (tmp <= -1)
|
||||||
{
|
{
|
||||||
xlen += qse_fmtuintmaxtowcs (
|
xlen += qse_fmtuintmaxtowcs (
|
||||||
&buf[xlen], len - xlen,
|
&buf[xlen], len - xlen,
|
||||||
|
390
qse/lib/cmn/nwif-cfg.c
Normal file
390
qse/lib/cmn/nwif-cfg.c
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
/*
|
||||||
|
* $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 uheadr 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)
|
||||||
|
# include <winsock2.h>
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
# include <iphlpapi.h>
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
# include <types.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# include <tcpustd.h>
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <nerrno.h>
|
||||||
|
# pragma library("tcpip32.lib")
|
||||||
|
#elif defined(__DOS__)
|
||||||
|
/* TODO: */
|
||||||
|
#else
|
||||||
|
# include "syscall.h"
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <netinet/in.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(HAVE_SYS_SOCKIO_H)
|
||||||
|
# include <sys/sockio.h>
|
||||||
|
# endif
|
||||||
|
# if defined(HAVE_IFADDRS_H)
|
||||||
|
# include <ifaddrs.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
#if defined(HAVE_NET_IF_DL_H)
|
||||||
|
# include <net/if_dl.h>
|
||||||
|
#endif
|
||||||
|
#ifndef SIOCGLIFHWADDR
|
||||||
|
#define SIOCGLIFHWADDR _IOWR('i', 192, struct lifreq)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct lifreq lif;
|
||||||
|
|
||||||
|
memset(&lif, 0, sizeof(lif));
|
||||||
|
strlcpy(lif.lifr_name, ifname, sizeof(lif.lifr_name));
|
||||||
|
|
||||||
|
if (ioctl(sock, SIOCGLIFHWADDR, &lif) != -1) {
|
||||||
|
struct sockaddr_dl *sp;
|
||||||
|
sp = (struct sockaddr_dl *)&lif.lifr_addr;
|
||||||
|
memcpy(buf, &sp->sdl_data[0], sp->sdl_alen);
|
||||||
|
return sp->sdl_alen;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SIOCGLIFCONF)
|
||||||
|
static int get_nwifs (qse_mmgr_t* mmgr, int s, int f, qse_xptl_t* nwifs)
|
||||||
|
{
|
||||||
|
struct lifnum ifn;
|
||||||
|
struct lifconf ifc;
|
||||||
|
qse_xptl_t b;
|
||||||
|
qse_size_t ifcount;
|
||||||
|
|
||||||
|
ifcount = 0;
|
||||||
|
|
||||||
|
b.ptr = QSE_NULL;
|
||||||
|
b.len = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ifn.lifn_family = f;
|
||||||
|
ifn.lifn_flags = 0;
|
||||||
|
if (ioctl (s, SIOCGLIFNUM, &ifn) <= -1) goto oops;
|
||||||
|
|
||||||
|
if (b.ptr)
|
||||||
|
{
|
||||||
|
/* b.ptr won't be QSE_NULL when retrying */
|
||||||
|
if (ifn.lifn_count <= ifcount) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* +1 for extra space to leave empty
|
||||||
|
* if SIOCGLIFCONF returns the same number of
|
||||||
|
* intefaces as SIOCLIFNUM */
|
||||||
|
b.len = (ifn.lifn_count + 1) * QSE_SIZEOF(struct lifreq);
|
||||||
|
b.ptr = QSE_MMGR_ALLOC (mmgr, b.len);
|
||||||
|
if (b.ptr == QSE_NULL) goto oops;
|
||||||
|
|
||||||
|
ifc.lifc_family = f;
|
||||||
|
ifc.lifc_flags = 0;
|
||||||
|
ifc.lifc_len = b.len;
|
||||||
|
ifc.lifc_buf = b.ptr;
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFCONF, &ifc) <= -1) goto oops;
|
||||||
|
|
||||||
|
ifcount = ifc.lifc_len / QSE_SIZEOF(struct lifreq);
|
||||||
|
}
|
||||||
|
while (ifcount > ifn.lifn_count);
|
||||||
|
/* the while condition above is for checking if
|
||||||
|
* the buffer got full. when it's full, there is a chance
|
||||||
|
* that there are more interfaces. */
|
||||||
|
|
||||||
|
nwifs->ptr = b.ptr;
|
||||||
|
nwifs->len = ifcount;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
if (b.ptr) QSE_MMGR_FREE (mmgr, b.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static void free_nwifcfg (qse_mmgr_t* mmgr, qse_nwifcfg_node_t* cfg)
|
||||||
|
{
|
||||||
|
qse_nwifcfg_node_t* cur;
|
||||||
|
|
||||||
|
while (cfg)
|
||||||
|
{
|
||||||
|
cur = cfg;
|
||||||
|
cfg = cur->next;
|
||||||
|
if (cur->name) QSE_MMGR_FREE (mmgr, cur->name);
|
||||||
|
QSE_MMGR_FREE (mmgr, cur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_getnwifcfg (qse_nwifcfg_t* cfg)
|
||||||
|
{
|
||||||
|
#if defined(SIOCGLIFCONF)
|
||||||
|
struct lifreq* ifr, ifrbuf;
|
||||||
|
qse_size_t i;
|
||||||
|
int s, f;
|
||||||
|
int s4 = -1;
|
||||||
|
int s6 = -1;
|
||||||
|
qse_xptl_t nwifs = { QSE_NULL, 0 };
|
||||||
|
qse_nwifcfg_node_t* head = QSE_NULL;
|
||||||
|
qse_nwifcfg_node_t* tmp;
|
||||||
|
|
||||||
|
QSE_ASSERT (cfg->mmgr != QSE_NULL);
|
||||||
|
|
||||||
|
#if defined(AF_INET) || defined(AF_INET6)
|
||||||
|
#if defined(AF_INET)
|
||||||
|
s4 = socket (AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (s4 <= -1) goto oops;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(AF_INET6)
|
||||||
|
s6 = socket (AF_INET6, SOCK_DGRAM, 0);
|
||||||
|
if (s6 <= -1) goto oops;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* no implementation */
|
||||||
|
goto oops;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (get_nwifs (cfg->mmgr, s4, AF_UNSPEC, &nwifs) <= -1) goto oops;
|
||||||
|
|
||||||
|
ifr = nwifs.ptr;
|
||||||
|
for (i = 0; i < nwifs.len; i++, ifr++)
|
||||||
|
{
|
||||||
|
f = ifr->lifr_addr.ss_family;
|
||||||
|
|
||||||
|
if (f == AF_INET) s = s4;
|
||||||
|
else if (f == AF_INET6) s = s6;
|
||||||
|
else continue;
|
||||||
|
|
||||||
|
tmp = QSE_MMGR_ALLOC (cfg->mmgr, QSE_SIZEOF(*tmp));
|
||||||
|
if (tmp == QSE_NULL) goto oops;
|
||||||
|
|
||||||
|
QSE_MEMSET (tmp, 0, QSE_SIZEOF(*tmp));
|
||||||
|
tmp->next = head;
|
||||||
|
head = tmp;
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
head->name = qse_mbsdup (ifr->lifr_name, cfg->mmgr);
|
||||||
|
#else
|
||||||
|
head->name = qse_mbstowcsdup (ifr->lifr_name, QSE_NULL, cfg->mmgr);
|
||||||
|
#endif
|
||||||
|
if (head->name == QSE_NULL) goto oops;
|
||||||
|
|
||||||
|
qse_skadtonwad (&ifr->lifr_addr, &head->addr);
|
||||||
|
|
||||||
|
qse_mbsxcpy (ifrbuf.lifr_name, QSE_SIZEOF(ifrbuf.lifr_name), ifr->lifr_name);
|
||||||
|
if (ioctl (s, SIOCGLIFFLAGS, &ifrbuf) <= -1) goto oops;
|
||||||
|
if (ifrbuf.lifr_flags & IFF_UP) head->flags |= QSE_NWIFCFG_UP;
|
||||||
|
if (ifrbuf.lifr_flags & IFF_BROADCAST)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGLIFBRDADDR, &ifrbuf) <= -1) goto oops;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_addr, &head->bcast);
|
||||||
|
head->flags |= QSE_NWIFCFG_BCAST;
|
||||||
|
}
|
||||||
|
if (ifrbuf.lifr_flags & IFF_POINTOPOINT)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGLIFDSTADDR, &ifrbuf) <= -1) goto oops;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_addr, &head->ptop);
|
||||||
|
head->flags |= QSE_NWIFCFG_PTOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) goto oops;
|
||||||
|
head->index = ifrbuf.lifr_index;
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFNETMASK, &ifrbuf) <= -1) goto oops;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_addr, &head->mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_MMGR_FREE (cfg->mmgr, nwifs.ptr);
|
||||||
|
close (s6);
|
||||||
|
close (s4);
|
||||||
|
|
||||||
|
cfg->list = head;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
if (head) free_nwifcfg (cfg->mmgr, head);
|
||||||
|
if (nwifs.ptr) QSE_MMGR_FREE (cfg->mmgr, nwifs.ptr);
|
||||||
|
if (s6 >= 0) close (s6);
|
||||||
|
if (s4 >= 0) close (s4);
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* TODO */
|
||||||
|
return QSE_NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void qse_freenwifcfg (qse_nwifcfg_t* cfg)
|
||||||
|
{
|
||||||
|
free_nwifcfg (cfg->mmgr, cfg->list);
|
||||||
|
cfg->list = QSE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int get_nwifcfg (int s, qse_nwifcfg_t* cfg)
|
||||||
|
{
|
||||||
|
#if defined(SIOCGLIFADDR)
|
||||||
|
struct lifreq ifrbuf;
|
||||||
|
qse_size_t ml, wl;
|
||||||
|
|
||||||
|
QSE_MEMSET (&ifrbuf, 0, QSE_SIZEOF(ifrbuf));
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxcpy (ifrbuf.lifr_name, QSE_SIZEOF(ifrbuf.lifr_name), cfg->name);
|
||||||
|
#else
|
||||||
|
ml = QSE_COUNTOF(ifrbuf.lifr_name);
|
||||||
|
if (qse_wcstombs (cfg->name, &wl, ifrbuf.lifr_name, &ml) <= -1) return -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) return -1;
|
||||||
|
cfg->index = ifrbuf.lifr_index;
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_addr, &cfg->addr);
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFNETMASK, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_addr, &cfg->mask);
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFMTU, &ifrbuf) <= -1) return -1;
|
||||||
|
cfg->mtu = ifrbuf.lifr_mtu;
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGLIFFLAGS, &ifrbuf) <= -1) return -1;
|
||||||
|
if (ifrbuf.lifr_flags & IFF_UP) cfg->flags |= QSE_NWIFCFG_UP;
|
||||||
|
if (ifrbuf.lifr_flags & IFF_RUNNING) cfg->flags |= QSE_NWIFCFG_RUNNING;
|
||||||
|
if (ifrbuf.lifr_flags & IFF_BROADCAST)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGLIFBRDADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_broadaddr, &cfg->bcast);
|
||||||
|
cfg->flags |= QSE_NWIFCFG_BCAST;
|
||||||
|
}
|
||||||
|
if (ifrbuf.lifr_flags & IFF_POINTOPOINT)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGLIFDSTADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.lifr_dstaddr, &cfg->ptop);
|
||||||
|
cfg->flags |= QSE_NWIFCFG_PTOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFADDR)
|
||||||
|
struct ifreq ifrbuf;
|
||||||
|
qse_size_t ml, wl;
|
||||||
|
|
||||||
|
QSE_MEMSET (&ifrbuf, 0, QSE_SIZEOF(ifrbuf));
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxcpy (ifrbuf.ifr_name, QSE_SIZEOF(ifrbuf.ifr_name), cfg->name);
|
||||||
|
#else
|
||||||
|
ml = QSE_COUNTOF(ifrbuf.ifr_name);
|
||||||
|
if (qse_wcstombs (cfg->name, &wl, ifrbuf.ifr_name, &ml) <= -1) return -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SIOCGIFINDEX)
|
||||||
|
if (ioctl (s, SIOCGIFINDEX, &ifrbuf) <= -1) return -1;
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
|
cfg->index = ifrbuf.ifr_ifindex;
|
||||||
|
#else
|
||||||
|
cfg->index = ifrbuf.ifr_index;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
cfg->index = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGIFADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.ifr_addr, &cfg->addr);
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGIFNETMASK, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.ifr_addr, &cfg->mask);
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGIFMTU, &ifrbuf) <= -1) return -1;
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_MTU)
|
||||||
|
cfg->mtu = ifrbuf.ifr_mtu;
|
||||||
|
#else
|
||||||
|
/* well, this is a bit dirty. but since all these are unions,
|
||||||
|
* the name must not really matter. some OSes just omitts defining
|
||||||
|
* the MTU field */
|
||||||
|
cfg->mtu = ifrbuf.ifr_metric;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ioctl (s, SIOCGIFFLAGS, &ifrbuf) <= -1) return -1;
|
||||||
|
if (ifrbuf.ifr_flags & IFF_UP) cfg->flags |= QSE_NWIFCFG_UP;
|
||||||
|
if (ifrbuf.ifr_flags & IFF_RUNNING) cfg->flags |= QSE_NWIFCFG_RUNNING;
|
||||||
|
if (ifrbuf.ifr_flags & IFF_BROADCAST)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGIFBRDADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.ifr_broadaddr, &cfg->bcast);
|
||||||
|
cfg->flags |= QSE_NWIFCFG_BCAST;
|
||||||
|
}
|
||||||
|
else QSE_MEMSET (&cfg->bcast, 0, QSE_SIZEOF(cfg->bcast));
|
||||||
|
if (ifrbuf.ifr_flags & IFF_POINTOPOINT)
|
||||||
|
{
|
||||||
|
if (ioctl (s, SIOCGIFDSTADDR, &ifrbuf) <= -1) return -1;
|
||||||
|
qse_skadtonwad (&ifrbuf.ifr_dstaddr, &cfg->ptop);
|
||||||
|
cfg->flags |= QSE_NWIFCFG_PTOP;
|
||||||
|
}
|
||||||
|
else QSE_MEMSET (&cfg->ptop, 0, QSE_SIZEOF(cfg->ptop));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* TODO */
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_getnwifcfg (qse_nwifcfg_t* cfg)
|
||||||
|
{
|
||||||
|
int s = -1;
|
||||||
|
|
||||||
|
if (cfg->type == QSE_NWIFCFG_IN4)
|
||||||
|
{
|
||||||
|
#if defined(AF_INET)
|
||||||
|
s = socket (AF_INET, SOCK_DGRAM, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (cfg->type == QSE_NWIFCFG_IN6)
|
||||||
|
{
|
||||||
|
#if defined(AF_INET6)
|
||||||
|
s = socket (AF_INET6, SOCK_DGRAM, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (s <= -1) return -1;
|
||||||
|
|
||||||
|
return get_nwifcfg (s, cfg);
|
||||||
|
}
|
@ -38,11 +38,65 @@
|
|||||||
# if defined(HAVE_NET_IF_H)
|
# if defined(HAVE_NET_IF_H)
|
||||||
# include <net/if.h>
|
# include <net/if.h>
|
||||||
# endif
|
# endif
|
||||||
|
# if defined(HAVE_SYS_SOCKIO_H)
|
||||||
|
# include <sys/sockio.h>
|
||||||
|
# endif
|
||||||
# if !defined(IF_NAMESIZE)
|
# if !defined(IF_NAMESIZE)
|
||||||
# define IF_NAMESIZE 63
|
# define IF_NAMESIZE 63
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(SIOCGIFINDEX) && !defined(SIOCGIFNAME) && \
|
||||||
|
!defined(HAVE_IF_NAMETOINDEX) && !defined(HAVE_IF_INDEXTONAME) && \
|
||||||
|
defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
static int get_sco_ifconf (struct ifconf* ifc)
|
||||||
|
{
|
||||||
|
/* SCO doesn't have have any IFINDEX thing.
|
||||||
|
* i emultate it using IFCONF */
|
||||||
|
int h, num;
|
||||||
|
struct ifreq* ifr;
|
||||||
|
|
||||||
|
h = socket (AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (h <= -1) return -1;
|
||||||
|
|
||||||
|
ifc->ifc_len = 0;
|
||||||
|
ifc->ifc_buf = QSE_NULL;
|
||||||
|
|
||||||
|
#if defined(SIOCGIFANUM)
|
||||||
|
if (ioctl (h, SIOCGIFANUM, &num) <= -1) goto oops;
|
||||||
|
#else
|
||||||
|
if (ioctl (h, SIOCGIFNUM, &num) <= -1) goto oops;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* sco needs reboot when you add an network interface.
|
||||||
|
* it should be safe not to consider the case when the interface
|
||||||
|
* is added after SIOCGIFANUM above.
|
||||||
|
* another thing to note is that SIOCGIFCONF ends with segfault
|
||||||
|
* if the buffer is not large enough unlike some other OSes
|
||||||
|
* like opensolaris which truncates the configuration. */
|
||||||
|
|
||||||
|
ifc->ifc_len = num * QSE_SIZEOF(*ifr);
|
||||||
|
ifc->ifc_buf = QSE_MMGR_ALLOC (QSE_MMGR_GETDFL(), ifc->ifc_len);
|
||||||
|
if (ifc->ifc_buf == QSE_NULL) goto oops;
|
||||||
|
|
||||||
|
if (ioctl (h, SIOCGIFCONF, ifc) <= -1) goto oops;
|
||||||
|
QSE_CLOSE (h); h = -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
if (ifc->ifc_buf) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), ifc->ifc_buf);
|
||||||
|
if (h >= 0) QSE_CLOSE (h);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE void free_sco_ifconf (struct ifconf* ifc)
|
||||||
|
{
|
||||||
|
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), ifc->ifc_buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
unsigned int qse_nwifmbstoindex (const qse_mchar_t* ptr)
|
unsigned int qse_nwifmbstoindex (const qse_mchar_t* ptr)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -70,7 +124,11 @@ unsigned int qse_nwifmbstoindex (const qse_mchar_t* ptr)
|
|||||||
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
||||||
|
#else
|
||||||
|
return (x <= -1)? 0u: ifr.ifr_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(HAVE_IF_NAMETOINDEX)
|
#elif defined(HAVE_IF_NAMETOINDEX)
|
||||||
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
||||||
@ -80,6 +138,26 @@ unsigned int qse_nwifmbstoindex (const qse_mchar_t* ptr)
|
|||||||
if (ptr[len] != QSE_MT('\0')) return 0u; /* name too long */
|
if (ptr[len] != QSE_MT('\0')) return 0u; /* name too long */
|
||||||
return if_nametoindex (tmp);
|
return if_nametoindex (tmp);
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
|
||||||
|
struct ifconf ifc;
|
||||||
|
int num, i;
|
||||||
|
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return 0u;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
if (qse_mbscmp (ptr, ifc.ifc_req[i].ifr_name) == 0)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return 0u;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
return 0u;
|
return 0u;
|
||||||
#endif
|
#endif
|
||||||
@ -110,13 +188,37 @@ unsigned int qse_nwifmbsntoindex (const qse_mchar_t* ptr, qse_size_t len)
|
|||||||
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
||||||
|
#else
|
||||||
|
return (x <= -1)? 0u: ifr.ifr_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(HAVE_IF_NAMETOINDEX)
|
#elif defined(HAVE_IF_NAMETOINDEX)
|
||||||
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
||||||
if (qse_mbsxncpy (tmp, QSE_COUNTOF(tmp), ptr, len) < len) return 0u; /* name too long */
|
if (qse_mbsxncpy (tmp, QSE_COUNTOF(tmp), ptr, len) < len) return 0u; /* name too long */
|
||||||
return if_nametoindex (tmp);
|
return if_nametoindex (tmp);
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
|
||||||
|
struct ifconf ifc;
|
||||||
|
int num, i;
|
||||||
|
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return 0u;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
if (qse_mbsxcmp (ptr, len, ifc.ifc_req[i].ifr_name) == 0)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return 0u;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
return 0u;
|
return 0u;
|
||||||
#endif
|
#endif
|
||||||
@ -143,22 +245,51 @@ unsigned int qse_nwifwcstoindex (const qse_wchar_t* ptr)
|
|||||||
if (h <= -1) return 0u;
|
if (h <= -1) return 0u;
|
||||||
|
|
||||||
ml = QSE_COUNTOF(ifr.ifr_name);
|
ml = QSE_COUNTOF(ifr.ifr_name);
|
||||||
if (qse_wcstombs (ptr, &wl, ifr.ifr_name, &ml) <= -1) return 0;
|
if (qse_wcstombs (ptr, &wl, ifr.ifr_name, &ml) <= -1) return 0u;
|
||||||
|
|
||||||
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
||||||
|
#else
|
||||||
|
return (x <= -1)? 0u: ifr.ifr_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(HAVE_IF_NAMETOINDEX)
|
#elif defined(HAVE_IF_NAMETOINDEX)
|
||||||
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
||||||
qse_size_t wl, ml;
|
qse_size_t wl, ml;
|
||||||
|
|
||||||
ml = QSE_COUNTOF(tmp);
|
ml = QSE_COUNTOF(tmp);
|
||||||
if (qse_wcstombs (ptr, &wl, tmp, &ml) <= -1) return 0;
|
if (qse_wcstombs (ptr, &wl, tmp, &ml) <= -1) return 0u;
|
||||||
|
|
||||||
return if_nametoindex (tmp);
|
return if_nametoindex (tmp);
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
|
||||||
|
struct ifconf ifc;
|
||||||
|
int num, i;
|
||||||
|
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 0u;
|
||||||
|
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return 0u;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
if (qse_mbscmp (tmp, ifc.ifc_req[i].ifr_name) == 0)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return 0u;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
return 0u;
|
return 0u;
|
||||||
#endif
|
#endif
|
||||||
@ -191,33 +322,63 @@ unsigned int qse_nwifwcsntoindex (const qse_wchar_t* ptr, qse_size_t len)
|
|||||||
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
x = ioctl (h, SIOCGIFINDEX, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
return (x <= -1)? 0u: ifr.ifr_ifindex;
|
||||||
|
#else
|
||||||
|
return (x <= -1)? 0u: ifr.ifr_index;
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(HAVE_IF_NAMETOINDEX)
|
#elif defined(HAVE_IF_NAMETOINDEX)
|
||||||
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
||||||
qse_size_t wl, ml;
|
qse_size_t wl, ml;
|
||||||
|
|
||||||
wl = len; ml = QSE_COUNTOF(tmp) - 1;
|
wl = len; ml = QSE_COUNTOF(tmp) - 1;
|
||||||
if (qse_wcsntombsn (ptr, &wl, tmp, &ml) <= -1) return 0;
|
if (qse_wcsntombsn (ptr, &wl, tmp, &ml) <= -1) return 0u;
|
||||||
tmp[ml] = QSE_MT('\0');
|
tmp[ml] = QSE_MT('\0');
|
||||||
return if_nametoindex (tmp);
|
return if_nametoindex (tmp);
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
struct ifconf ifc;
|
||||||
|
int num, i;
|
||||||
|
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 0u;
|
||||||
|
tmp[ml] = QSE_MT('\0');
|
||||||
|
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return -1;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
if (qse_mbscmp (tmp, ifc.ifc_req[i].ifr_name) == 0)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return 0u;
|
||||||
#else
|
#else
|
||||||
return 0u;
|
return 0u;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_size_t qse_nwifindextombs (unsigned int index, qse_mchar_t* buf, qse_size_t len)
|
/* ---------------------------------------------------------- */
|
||||||
|
|
||||||
|
int qse_nwifindextombs (unsigned int index, qse_mchar_t* buf, qse_size_t len)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
|
|
||||||
#elif defined(SIOCGIFNAME)
|
#elif defined(SIOCGIFNAME)
|
||||||
|
|
||||||
@ -225,36 +386,61 @@ qse_size_t qse_nwifindextombs (unsigned int index, qse_mchar_t* buf, qse_size_t
|
|||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
|
||||||
h = socket (AF_INET, SOCK_DGRAM, 0);
|
h = socket (AF_INET, SOCK_DGRAM, 0);
|
||||||
if (h <= -1) return 0u;
|
if (h <= -1) return -1;
|
||||||
|
|
||||||
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
|
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
ifr.ifr_ifindex = index;
|
ifr.ifr_ifindex = index;
|
||||||
|
#else
|
||||||
|
ifr.ifr_index = index;
|
||||||
|
#endif
|
||||||
|
|
||||||
x = ioctl (h, SIOCGIFNAME, &ifr);
|
x = ioctl (h, SIOCGIFNAME, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
return (x <= -1)? 0: qse_mbsxcpy (buf, len, ifr.ifr_name);
|
return (x <= -1)? -1: qse_mbsxcpy (buf, len, ifr.ifr_name);
|
||||||
|
|
||||||
#elif defined(HAVE_IF_INDEXTONAME)
|
#elif defined(HAVE_IF_INDEXTONAME)
|
||||||
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
qse_mchar_t tmp[IF_NAMESIZE + 1];
|
||||||
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
|
if (if_indextoname (index, tmp) == QSE_NULL) return -1;
|
||||||
return qse_mbsxcpy (buf, len, tmp);
|
return qse_mbsxcpy (buf, len, tmp);
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
|
||||||
|
struct ifconf ifc;
|
||||||
|
qse_size_t ml;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
if (index <= 0) return -1;
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return -1;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
if (index > num)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ml = qse_mbsxcpy (buf, len, ifc.ifc_req[index - 1].ifr_name);
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return ml;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
return 0;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_size_t qse_nwifindextowcs (unsigned int index, qse_wchar_t* buf, qse_size_t len)
|
int qse_nwifindextowcs (unsigned int index, qse_wchar_t* buf, qse_size_t len)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
return 0u;
|
return -1;
|
||||||
|
|
||||||
#elif defined(SIOCGIFNAME)
|
#elif defined(SIOCGIFNAME)
|
||||||
|
|
||||||
@ -263,20 +449,24 @@ qse_size_t qse_nwifindextowcs (unsigned int index, qse_wchar_t* buf, qse_size_t
|
|||||||
qse_size_t wl, ml;
|
qse_size_t wl, ml;
|
||||||
|
|
||||||
h = socket (AF_INET, SOCK_DGRAM, 0);
|
h = socket (AF_INET, SOCK_DGRAM, 0);
|
||||||
if (h <= -1) return 0u;
|
if (h <= -1) return -1;
|
||||||
|
|
||||||
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
|
QSE_MEMSET (&ifr, 0, QSE_SIZEOF(ifr));
|
||||||
|
#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
|
||||||
ifr.ifr_ifindex = index;
|
ifr.ifr_ifindex = index;
|
||||||
|
#else
|
||||||
|
ifr.ifr_index = index;
|
||||||
|
#endif
|
||||||
|
|
||||||
x = ioctl (h, SIOCGIFNAME, &ifr);
|
x = ioctl (h, SIOCGIFNAME, &ifr);
|
||||||
QSE_CLOSE (h);
|
QSE_CLOSE (h);
|
||||||
|
|
||||||
if (x <= -1) return 0;
|
if (x <= -1) return -1;
|
||||||
|
|
||||||
wl = len;
|
wl = len;
|
||||||
x = qse_mbstowcs (ifr.ifr_name, &ml, buf, &wl);
|
x = qse_mbstowcs (ifr.ifr_name, &ml, buf, &wl);
|
||||||
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
|
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
|
||||||
else if (x != 0) return 0;
|
else if (x != 0) return -1;
|
||||||
return wl;
|
return wl;
|
||||||
|
|
||||||
#elif defined(HAVE_IF_INDEXTONAME)
|
#elif defined(HAVE_IF_INDEXTONAME)
|
||||||
@ -284,13 +474,38 @@ qse_size_t qse_nwifindextowcs (unsigned int index, qse_wchar_t* buf, qse_size_t
|
|||||||
qse_size_t ml, wl;
|
qse_size_t ml, wl;
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
if (if_indextoname (index, tmp) == QSE_NULL) return 0;
|
if (if_indextoname (index, tmp) == QSE_NULL) return -1;
|
||||||
wl = len;
|
wl = len;
|
||||||
x = qse_mbstowcs (tmp, &ml, buf, &wl);
|
x = qse_mbstowcs (tmp, &ml, buf, &wl);
|
||||||
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
|
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
|
||||||
else if (x != 0) return 0;
|
else if (x != 0) return -1;
|
||||||
|
return wl;
|
||||||
|
|
||||||
|
#elif defined(SIOCGIFCONF) && (defined(SIOCGIFANUM) || defined(SIOCGIFNUM))
|
||||||
|
|
||||||
|
struct ifconf ifc;
|
||||||
|
qse_size_t wl, ml;
|
||||||
|
int num, x;
|
||||||
|
|
||||||
|
if (index <= 0) return -1;
|
||||||
|
if (get_sco_ifconf (&ifc) <= -1) return -1;
|
||||||
|
|
||||||
|
num = ifc.ifc_len / QSE_SIZEOF(struct ifreq);
|
||||||
|
if (index > num)
|
||||||
|
{
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wl = len;
|
||||||
|
x = qse_mbstowcs (ifc.ifc_req[index - 1].ifr_name, &ml, buf, &wl);
|
||||||
|
free_sco_ifconf (&ifc);
|
||||||
|
|
||||||
|
if (x == -2 && wl > 1) buf[wl - 1] = QSE_WT('\0');
|
||||||
|
else if (x != 0) return -1;
|
||||||
|
|
||||||
return wl;
|
return wl;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -55,63 +55,8 @@ static qse_ssize_t socket_output (
|
|||||||
static qse_ssize_t socket_input (
|
static qse_ssize_t socket_input (
|
||||||
qse_tio_t* tio, qse_tio_cmd_t cmd, void* buf, qse_size_t size);
|
qse_tio_t* tio, qse_tio_cmd_t cmd, void* buf, qse_size_t size);
|
||||||
|
|
||||||
#if defined(AF_INET)
|
|
||||||
union sockaddr_t
|
|
||||||
{
|
|
||||||
struct sockaddr_in in4;
|
|
||||||
#if defined(AF_INET6) && !defined(__OS2__)
|
|
||||||
struct sockaddr_in6 in6;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TMOUT_ENABLED(tmout) (tmout.sec >= 0 && tmout.nsec >= 0)
|
#define TMOUT_ENABLED(tmout) (tmout.sec >= 0 && tmout.nsec >= 0)
|
||||||
|
|
||||||
static int nwad_to_sockaddr (const qse_nwad_t* nwad, int* family, void* addr)
|
|
||||||
{
|
|
||||||
int addrsize = -1;
|
|
||||||
|
|
||||||
switch (nwad->type)
|
|
||||||
{
|
|
||||||
case QSE_NWAD_IN4:
|
|
||||||
{
|
|
||||||
#if defined(AF_INET)
|
|
||||||
struct sockaddr_in* in;
|
|
||||||
|
|
||||||
in = (struct sockaddr_in*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
QSE_MEMSET (in, 0, addrsize);
|
|
||||||
|
|
||||||
*family = AF_INET;
|
|
||||||
in->sin_family = AF_INET;
|
|
||||||
in->sin_addr.s_addr = nwad->u.in4.addr.value;
|
|
||||||
in->sin_port = nwad->u.in4.port;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case QSE_NWAD_IN6:
|
|
||||||
{
|
|
||||||
#if defined(AF_INET6) && !defined(__OS2__)
|
|
||||||
struct sockaddr_in6* in;
|
|
||||||
|
|
||||||
in = (struct sockaddr_in6*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
QSE_MEMSET (in, 0, addrsize);
|
|
||||||
|
|
||||||
*family = AF_INET6;
|
|
||||||
in->sin6_family = AF_INET6;
|
|
||||||
memcpy (&in->sin6_addr, &nwad->u.in6.addr, QSE_SIZEOF(nwad->u.in6.addr));
|
|
||||||
in->sin6_scope_id = nwad->u.in6.scope;
|
|
||||||
in->sin6_port = nwad->u.in6.port;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return addrsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
static qse_nwio_errnum_t syserr_to_errnum (DWORD e)
|
static qse_nwio_errnum_t syserr_to_errnum (DWORD e)
|
||||||
{
|
{
|
||||||
@ -361,16 +306,13 @@ int qse_nwio_init (
|
|||||||
qse_nwio_t* nwio, qse_mmgr_t* mmgr, const qse_nwad_t* nwad,
|
qse_nwio_t* nwio, qse_mmgr_t* mmgr, const qse_nwad_t* nwad,
|
||||||
int flags, const qse_nwio_tmout_t* tmout)
|
int flags, const qse_nwio_tmout_t* tmout)
|
||||||
{
|
{
|
||||||
#if defined(AF_INET)
|
qse_skad_t addr;
|
||||||
union sockaddr_t addr;
|
|
||||||
#endif
|
|
||||||
#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 family, type;
|
int family, type, tmp;
|
||||||
int tmp;
|
|
||||||
|
|
||||||
QSE_MEMSET (nwio, 0, QSE_SIZEOF(*nwio));
|
QSE_MEMSET (nwio, 0, QSE_SIZEOF(*nwio));
|
||||||
nwio->mmgr = mmgr;
|
nwio->mmgr = mmgr;
|
||||||
@ -385,8 +327,7 @@ int qse_nwio_init (
|
|||||||
nwio->tmout.a.sec = -1;
|
nwio->tmout.a.sec = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(AF_INET)
|
tmp = qse_nwadtoskad (nwad, &addr);
|
||||||
tmp = nwad_to_sockaddr (nwad, &family, &addr);
|
|
||||||
if (tmp <= -1)
|
if (tmp <= -1)
|
||||||
{
|
{
|
||||||
nwio->errnum = QSE_NWIO_EINVAL;
|
nwio->errnum = QSE_NWIO_EINVAL;
|
||||||
@ -394,6 +335,8 @@ int qse_nwio_init (
|
|||||||
}
|
}
|
||||||
addrlen = tmp;
|
addrlen = tmp;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SOCK_STREAM) && defined(SOCK_DGRAM)
|
||||||
if (flags & QSE_NWIO_TCP) type = SOCK_STREAM;
|
if (flags & QSE_NWIO_TCP) type = SOCK_STREAM;
|
||||||
else if (flags & QSE_NWIO_UDP) type = SOCK_DGRAM;
|
else if (flags & QSE_NWIO_UDP) type = SOCK_DGRAM;
|
||||||
else
|
else
|
||||||
@ -403,6 +346,8 @@ int qse_nwio_init (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
family = qse_skadfamily (&addr);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
nwio->handle = socket (family, type, 0);
|
nwio->handle = socket (family, type, 0);
|
||||||
if (nwio->handle == INVALID_SOCKET)
|
if (nwio->handle == INVALID_SOCKET)
|
||||||
@ -703,10 +648,12 @@ int qse_nwio_init (
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int orgfl, xret;
|
int xret;
|
||||||
|
|
||||||
if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP))
|
if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP))
|
||||||
{
|
{
|
||||||
|
int orgfl;
|
||||||
|
|
||||||
orgfl = fcntl (nwio->handle, F_GETFL, 0);
|
orgfl = fcntl (nwio->handle, F_GETFL, 0);
|
||||||
if (orgfl <= -1 ||
|
if (orgfl <= -1 ||
|
||||||
fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1)
|
fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1)
|
||||||
@ -714,12 +661,9 @@ int qse_nwio_init (
|
|||||||
nwio->errnum = syserr_to_errnum (errno);
|
nwio->errnum = syserr_to_errnum (errno);
|
||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen);
|
xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen);
|
||||||
|
|
||||||
if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP))
|
|
||||||
{
|
|
||||||
if ((xret <= -1 && errno != EINPROGRESS) ||
|
if ((xret <= -1 && errno != EINPROGRESS) ||
|
||||||
fcntl (nwio->handle, F_SETFL, orgfl) <= -1)
|
fcntl (nwio->handle, F_SETFL, orgfl) <= -1)
|
||||||
{
|
{
|
||||||
@ -750,6 +694,7 @@ int qse_nwio_init (
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen);
|
||||||
if (xret <= -1)
|
if (xret <= -1)
|
||||||
{
|
{
|
||||||
nwio->errnum = syserr_to_errnum (errno);
|
nwio->errnum = syserr_to_errnum (errno);
|
||||||
@ -907,7 +852,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
|||||||
|
|
||||||
if (nwio->status & STATUS_UDP_CONNECT)
|
if (nwio->status & STATUS_UDP_CONNECT)
|
||||||
{
|
{
|
||||||
union sockaddr_t addr;
|
qse_skad_t addr;
|
||||||
int addrlen;
|
int addrlen;
|
||||||
|
|
||||||
addrlen = QSE_SIZEOF(addr);
|
addrlen = QSE_SIZEOF(addr);
|
||||||
@ -951,7 +896,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
|||||||
|
|
||||||
if (nwio->status & STATUS_UDP_CONNECT)
|
if (nwio->status & STATUS_UDP_CONNECT)
|
||||||
{
|
{
|
||||||
union sockaddr_t addr;
|
qse_skad_t addr;
|
||||||
int addrlen;
|
int addrlen;
|
||||||
|
|
||||||
addrlen = QSE_SIZEOF(addr);
|
addrlen = QSE_SIZEOF(addr);
|
||||||
@ -1002,7 +947,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
|||||||
reread:
|
reread:
|
||||||
if (nwio->status & STATUS_UDP_CONNECT)
|
if (nwio->status & STATUS_UDP_CONNECT)
|
||||||
{
|
{
|
||||||
union sockaddr_t addr;
|
qse_skad_t addr;
|
||||||
#if defined(HAVE_SOCKLEN_T)
|
#if defined(HAVE_SOCKLEN_T)
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
#else
|
#else
|
||||||
|
@ -436,107 +436,13 @@ void* qse_httpd_getxtnstd (qse_httpd_t* httpd)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------- */
|
||||||
|
|
||||||
union sockaddr_t
|
|
||||||
{
|
|
||||||
struct sockaddr_in in4;
|
|
||||||
#if defined(AF_INET6)
|
|
||||||
struct sockaddr_in6 in6;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef union sockaddr_t sockaddr_t;
|
|
||||||
|
|
||||||
#define SOCKADDR_FAMILY(x) (((struct sockaddr_in*)(x))->sin_family)
|
|
||||||
|
|
||||||
static int sockaddr_to_nwad (const sockaddr_t* addr, qse_nwad_t* nwad)
|
|
||||||
{
|
|
||||||
int addrsize = -1;
|
|
||||||
|
|
||||||
switch (SOCKADDR_FAMILY(addr))
|
|
||||||
{
|
|
||||||
case AF_INET:
|
|
||||||
{
|
|
||||||
struct sockaddr_in* in;
|
|
||||||
in = (struct sockaddr_in*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
|
|
||||||
QSE_MEMSET (nwad, 0, QSE_SIZEOF(*nwad));
|
|
||||||
nwad->type = QSE_NWAD_IN4;
|
|
||||||
nwad->u.in4.addr.value = in->sin_addr.s_addr;
|
|
||||||
nwad->u.in4.port = in->sin_port;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(AF_INET6)
|
|
||||||
case AF_INET6:
|
|
||||||
{
|
|
||||||
struct sockaddr_in6* in;
|
|
||||||
in = (struct sockaddr_in6*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
|
|
||||||
QSE_MEMSET (nwad, 0, QSE_SIZEOF(*nwad));
|
|
||||||
nwad->type = QSE_NWAD_IN6;
|
|
||||||
QSE_MEMCPY (&nwad->u.in6.addr, &in->sin6_addr, QSE_SIZEOF(nwad->u.in6.addr));
|
|
||||||
nwad->u.in6.scope = in->sin6_scope_id;
|
|
||||||
nwad->u.in6.port = in->sin6_port;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return addrsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nwad_to_sockaddr (const qse_nwad_t* nwad, sockaddr_t* addr)
|
|
||||||
{
|
|
||||||
int addrsize = -1;
|
|
||||||
|
|
||||||
switch (nwad->type)
|
|
||||||
{
|
|
||||||
case QSE_NWAD_IN4:
|
|
||||||
{
|
|
||||||
struct sockaddr_in* in;
|
|
||||||
|
|
||||||
in = (struct sockaddr_in*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
QSE_MEMSET (in, 0, addrsize);
|
|
||||||
|
|
||||||
in->sin_family = AF_INET;
|
|
||||||
in->sin_addr.s_addr = nwad->u.in4.addr.value;
|
|
||||||
in->sin_port = nwad->u.in4.port;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case QSE_NWAD_IN6:
|
|
||||||
{
|
|
||||||
#if defined(AF_INET6)
|
|
||||||
struct sockaddr_in6* in;
|
|
||||||
|
|
||||||
in = (struct sockaddr_in6*)addr;
|
|
||||||
addrsize = QSE_SIZEOF(*in);
|
|
||||||
QSE_MEMSET (in, 0, addrsize);
|
|
||||||
|
|
||||||
in->sin6_family = AF_INET6;
|
|
||||||
QSE_MEMCPY (&in->sin6_addr, &nwad->u.in6.addr, QSE_SIZEOF(nwad->u.in6.addr));
|
|
||||||
in->sin6_scope_id = nwad->u.in6.scope;
|
|
||||||
in->sin6_port = nwad->u.in6.port;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return addrsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
int fd = -1, flag;
|
int fd = -1, flag;
|
||||||
sockaddr_t addr;
|
qse_skad_t addr;
|
||||||
int addrsize;
|
int addrsize;
|
||||||
|
|
||||||
addrsize = nwad_to_sockaddr (&server->nwad, &addr);
|
addrsize = qse_nwadtoskad (&server->nwad, &addr);
|
||||||
if (addrsize <= -1)
|
if (addrsize <= -1)
|
||||||
{
|
{
|
||||||
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
||||||
@ -667,7 +573,7 @@ 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)
|
||||||
{
|
{
|
||||||
sockaddr_t addr;
|
qse_skad_t addr;
|
||||||
|
|
||||||
#if defined(HAVE_SOCKLEN_T)
|
#if defined(HAVE_SOCKLEN_T)
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
@ -704,7 +610,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n"));
|
|||||||
if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK);
|
if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (sockaddr_to_nwad (&addr, &client->remote_addr) <= -1)
|
if (qse_skadtonwad (&addr, &client->remote_addr) <= -1)
|
||||||
{
|
{
|
||||||
/* TODO: logging */
|
/* TODO: logging */
|
||||||
client->remote_addr = server->nwad;
|
client->remote_addr = server->nwad;
|
||||||
@ -712,7 +618,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n"));
|
|||||||
|
|
||||||
addrlen = QSE_SIZEOF(addr);
|
addrlen = QSE_SIZEOF(addr);
|
||||||
if (getsockname (fd, (struct sockaddr*)&addr, &addrlen) <= -1 ||
|
if (getsockname (fd, (struct sockaddr*)&addr, &addrlen) <= -1 ||
|
||||||
sockaddr_to_nwad (&addr, &client->local_addr) <= -1)
|
qse_skadtonwad (&addr, &client->local_addr) <= -1)
|
||||||
{
|
{
|
||||||
/* TODO: logging */
|
/* TODO: logging */
|
||||||
client->local_addr = server->nwad;
|
client->local_addr = server->nwad;
|
||||||
@ -725,7 +631,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n"));
|
|||||||
|
|
||||||
addrlen = QSE_SIZEOF(addr);
|
addrlen = QSE_SIZEOF(addr);
|
||||||
if (getsockopt (fd, SOL_IP, SO_ORIGINAL_DST, (char*)&addr, &addrlen) <= -1 ||
|
if (getsockopt (fd, SOL_IP, SO_ORIGINAL_DST, (char*)&addr, &addrlen) <= -1 ||
|
||||||
sockaddr_to_nwad (&addr, &client->orgdst_addr) <= -1)
|
qse_skadtonwad (&addr, &client->orgdst_addr) <= -1)
|
||||||
{
|
{
|
||||||
client->orgdst_addr = client->local_addr;
|
client->orgdst_addr = client->local_addr;
|
||||||
}
|
}
|
||||||
@ -751,7 +657,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n"));
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
sockaddr_t connaddr, bindaddr;
|
qse_skad_t connaddr, bindaddr;
|
||||||
int connaddrsize, bindaddrsize;
|
int connaddrsize, bindaddrsize;
|
||||||
int connected = 1;
|
int connected = 1;
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -768,8 +674,8 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
|
|||||||
int flag;
|
int flag;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
connaddrsize = nwad_to_sockaddr (&peer->nwad, &connaddr);
|
connaddrsize = qse_nwadtoskad (&peer->nwad, &connaddr);
|
||||||
bindaddrsize = nwad_to_sockaddr (&peer->local, &bindaddr);
|
bindaddrsize = qse_nwadtoskad (&peer->local, &bindaddr);
|
||||||
if (connaddrsize <= -1 || bindaddrsize <= -1)
|
if (connaddrsize <= -1 || bindaddrsize <= -1)
|
||||||
{
|
{
|
||||||
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
||||||
@ -1239,15 +1145,12 @@ static void file_close (qse_httpd_t* httpd, qse_ubi_t handle)
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
||||||
return -1;
|
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
||||||
return -1;
|
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TODO: */
|
/* TODO: */
|
||||||
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
|
||||||
return -1;
|
|
||||||
#else
|
#else
|
||||||
qse_printf (QSE_T("closing file %d\n"), handle.i);
|
qse_printf (QSE_T("closing file %d\n"), handle.i);
|
||||||
QSE_CLOSE (handle.i);
|
QSE_CLOSE (handle.i);
|
||||||
@ -1386,7 +1289,15 @@ static int dir_read (qse_httpd_t* httpd, qse_ubi_t handle, qse_httpd_dirent_t* d
|
|||||||
static void client_close (
|
static void client_close (
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client)
|
qse_httpd_t* httpd, qse_httpd_client_t* client)
|
||||||
{
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
/* TODO: */
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
/* TODO: */
|
||||||
|
#elif defined(__DOS__)
|
||||||
|
/* TODO: */
|
||||||
|
#else
|
||||||
QSE_CLOSE (client->handle.i);
|
QSE_CLOSE (client->handle.i);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_shutdown (
|
static void client_shutdown (
|
||||||
@ -2075,7 +1986,6 @@ auth_ok:
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO */
|
/* TODO */
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
|
|
||||||
@ -2099,7 +2009,16 @@ auth_ok:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
/* TODO */
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
/* TODO */
|
||||||
|
#elif defined(__DOS__)
|
||||||
|
|
||||||
|
/* TODO */
|
||||||
|
#else
|
||||||
if (QSE_STAT (tpath, &st) == 0 && S_ISREG(st.st_mode))
|
if (QSE_STAT (tpath, &st) == 0 && S_ISREG(st.st_mode))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
/* the index file is found */
|
/* the index file is found */
|
||||||
QSE_MMGR_FREE (httpd->mmgr, xpath);
|
QSE_MMGR_FREE (httpd->mmgr, xpath);
|
||||||
|
@ -384,7 +384,7 @@ static int fnc_sleep (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
Sleep ((DWORD)QSE_SEC_TO_MSEC(lv));
|
Sleep ((DWORD)QSE_SEC_TO_MSEC(lv));
|
||||||
rx = 0;
|
rx = 0;
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
DosSleep ((ULONG)(QSE_SEC_TO_MSEC(lv));
|
DosSleep ((ULONG)QSE_SEC_TO_MSEC(lv));
|
||||||
rx = 0;
|
rx = 0;
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
rx = sleep (lv);
|
rx = sleep (lv);
|
||||||
|
@ -25,6 +25,8 @@ bin_PROGRAMS = \
|
|||||||
mbwc01 \
|
mbwc01 \
|
||||||
mbwc02 \
|
mbwc02 \
|
||||||
nwad01 \
|
nwad01 \
|
||||||
|
nwif01 \
|
||||||
|
nwif02 \
|
||||||
oht \
|
oht \
|
||||||
path01 \
|
path01 \
|
||||||
pio \
|
pio \
|
||||||
|
@ -38,11 +38,12 @@ bin_PROGRAMS = chr01$(EXEEXT) env$(EXEEXT) dll$(EXEEXT) fio01$(EXEEXT) \
|
|||||||
fio02$(EXEEXT) fma$(EXEEXT) fmt01$(EXEEXT) fmt02$(EXEEXT) \
|
fio02$(EXEEXT) fma$(EXEEXT) fmt01$(EXEEXT) fmt02$(EXEEXT) \
|
||||||
fs01$(EXEEXT) htb$(EXEEXT) glob01$(EXEEXT) ipad01$(EXEEXT) \
|
fs01$(EXEEXT) htb$(EXEEXT) glob01$(EXEEXT) ipad01$(EXEEXT) \
|
||||||
lda$(EXEEXT) main01$(EXEEXT) main02$(EXEEXT) mbwc01$(EXEEXT) \
|
lda$(EXEEXT) main01$(EXEEXT) main02$(EXEEXT) mbwc01$(EXEEXT) \
|
||||||
mbwc02$(EXEEXT) nwad01$(EXEEXT) oht$(EXEEXT) path01$(EXEEXT) \
|
mbwc02$(EXEEXT) nwad01$(EXEEXT) nwif01$(EXEEXT) \
|
||||||
pio$(EXEEXT) pma$(EXEEXT) rex01$(EXEEXT) rbt$(EXEEXT) \
|
nwif02$(EXEEXT) oht$(EXEEXT) path01$(EXEEXT) pio$(EXEEXT) \
|
||||||
sio01$(EXEEXT) sio02$(EXEEXT) sio03$(EXEEXT) sll$(EXEEXT) \
|
pma$(EXEEXT) rex01$(EXEEXT) rbt$(EXEEXT) sio01$(EXEEXT) \
|
||||||
slmb01$(EXEEXT) str01$(EXEEXT) task01$(EXEEXT) time$(EXEEXT) \
|
sio02$(EXEEXT) sio03$(EXEEXT) sll$(EXEEXT) slmb01$(EXEEXT) \
|
||||||
tre01$(EXEEXT) uri01$(EXEEXT) xma$(EXEEXT)
|
str01$(EXEEXT) task01$(EXEEXT) time$(EXEEXT) tre01$(EXEEXT) \
|
||||||
|
uri01$(EXEEXT) xma$(EXEEXT)
|
||||||
@WCHAR_TRUE@@WIN32_TRUE@am__append_1 = $(UNICOWS_LIBS)
|
@WCHAR_TRUE@@WIN32_TRUE@am__append_1 = $(UNICOWS_LIBS)
|
||||||
subdir = samples/cmn
|
subdir = samples/cmn
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
@ -135,6 +136,14 @@ am_nwad01_OBJECTS = nwad01.$(OBJEXT)
|
|||||||
nwad01_OBJECTS = $(am_nwad01_OBJECTS)
|
nwad01_OBJECTS = $(am_nwad01_OBJECTS)
|
||||||
nwad01_LDADD = $(LDADD)
|
nwad01_LDADD = $(LDADD)
|
||||||
nwad01_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
nwad01_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||||
|
nwif01_SOURCES = nwif01.c
|
||||||
|
nwif01_OBJECTS = nwif01.$(OBJEXT)
|
||||||
|
nwif01_LDADD = $(LDADD)
|
||||||
|
nwif01_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||||
|
nwif02_SOURCES = nwif02.c
|
||||||
|
nwif02_OBJECTS = nwif02.$(OBJEXT)
|
||||||
|
nwif02_LDADD = $(LDADD)
|
||||||
|
nwif02_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||||
am_oht_OBJECTS = oht.$(OBJEXT)
|
am_oht_OBJECTS = oht.$(OBJEXT)
|
||||||
oht_OBJECTS = $(am_oht_OBJECTS)
|
oht_OBJECTS = $(am_oht_OBJECTS)
|
||||||
oht_LDADD = $(LDADD)
|
oht_LDADD = $(LDADD)
|
||||||
@ -221,23 +230,23 @@ SOURCES = $(chr01_SOURCES) $(dll_SOURCES) $(env_SOURCES) \
|
|||||||
$(fmt01_SOURCES) $(fmt02_SOURCES) $(fs01_SOURCES) \
|
$(fmt01_SOURCES) $(fmt02_SOURCES) $(fs01_SOURCES) \
|
||||||
$(glob01_SOURCES) $(htb_SOURCES) $(ipad01_SOURCES) \
|
$(glob01_SOURCES) $(htb_SOURCES) $(ipad01_SOURCES) \
|
||||||
$(lda_SOURCES) $(main01_SOURCES) $(main02_SOURCES) \
|
$(lda_SOURCES) $(main01_SOURCES) $(main02_SOURCES) \
|
||||||
$(mbwc01_SOURCES) $(mbwc02_SOURCES) $(nwad01_SOURCES) \
|
$(mbwc01_SOURCES) $(mbwc02_SOURCES) $(nwad01_SOURCES) nwif01.c \
|
||||||
$(oht_SOURCES) $(path01_SOURCES) $(pio_SOURCES) $(pma_SOURCES) \
|
nwif02.c $(oht_SOURCES) $(path01_SOURCES) $(pio_SOURCES) \
|
||||||
$(rbt_SOURCES) $(rex01_SOURCES) $(sio01_SOURCES) \
|
$(pma_SOURCES) $(rbt_SOURCES) $(rex01_SOURCES) \
|
||||||
$(sio02_SOURCES) $(sio03_SOURCES) $(sll_SOURCES) \
|
$(sio01_SOURCES) $(sio02_SOURCES) $(sio03_SOURCES) \
|
||||||
$(slmb01_SOURCES) $(str01_SOURCES) task01.c $(time_SOURCES) \
|
$(sll_SOURCES) $(slmb01_SOURCES) $(str01_SOURCES) task01.c \
|
||||||
$(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
$(time_SOURCES) $(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
||||||
DIST_SOURCES = $(chr01_SOURCES) $(dll_SOURCES) $(env_SOURCES) \
|
DIST_SOURCES = $(chr01_SOURCES) $(dll_SOURCES) $(env_SOURCES) \
|
||||||
$(fio01_SOURCES) $(fio02_SOURCES) $(fma_SOURCES) \
|
$(fio01_SOURCES) $(fio02_SOURCES) $(fma_SOURCES) \
|
||||||
$(fmt01_SOURCES) $(fmt02_SOURCES) $(fs01_SOURCES) \
|
$(fmt01_SOURCES) $(fmt02_SOURCES) $(fs01_SOURCES) \
|
||||||
$(glob01_SOURCES) $(htb_SOURCES) $(ipad01_SOURCES) \
|
$(glob01_SOURCES) $(htb_SOURCES) $(ipad01_SOURCES) \
|
||||||
$(lda_SOURCES) $(main01_SOURCES) $(main02_SOURCES) \
|
$(lda_SOURCES) $(main01_SOURCES) $(main02_SOURCES) \
|
||||||
$(mbwc01_SOURCES) $(mbwc02_SOURCES) $(nwad01_SOURCES) \
|
$(mbwc01_SOURCES) $(mbwc02_SOURCES) $(nwad01_SOURCES) nwif01.c \
|
||||||
$(oht_SOURCES) $(path01_SOURCES) $(pio_SOURCES) $(pma_SOURCES) \
|
nwif02.c $(oht_SOURCES) $(path01_SOURCES) $(pio_SOURCES) \
|
||||||
$(rbt_SOURCES) $(rex01_SOURCES) $(sio01_SOURCES) \
|
$(pma_SOURCES) $(rbt_SOURCES) $(rex01_SOURCES) \
|
||||||
$(sio02_SOURCES) $(sio03_SOURCES) $(sll_SOURCES) \
|
$(sio01_SOURCES) $(sio02_SOURCES) $(sio03_SOURCES) \
|
||||||
$(slmb01_SOURCES) $(str01_SOURCES) task01.c $(time_SOURCES) \
|
$(sll_SOURCES) $(slmb01_SOURCES) $(str01_SOURCES) task01.c \
|
||||||
$(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
$(time_SOURCES) $(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
@ -583,6 +592,12 @@ mbwc02$(EXEEXT): $(mbwc02_OBJECTS) $(mbwc02_DEPENDENCIES) $(EXTRA_mbwc02_DEPENDE
|
|||||||
nwad01$(EXEEXT): $(nwad01_OBJECTS) $(nwad01_DEPENDENCIES) $(EXTRA_nwad01_DEPENDENCIES)
|
nwad01$(EXEEXT): $(nwad01_OBJECTS) $(nwad01_DEPENDENCIES) $(EXTRA_nwad01_DEPENDENCIES)
|
||||||
@rm -f nwad01$(EXEEXT)
|
@rm -f nwad01$(EXEEXT)
|
||||||
$(LINK) $(nwad01_OBJECTS) $(nwad01_LDADD) $(LIBS)
|
$(LINK) $(nwad01_OBJECTS) $(nwad01_LDADD) $(LIBS)
|
||||||
|
nwif01$(EXEEXT): $(nwif01_OBJECTS) $(nwif01_DEPENDENCIES) $(EXTRA_nwif01_DEPENDENCIES)
|
||||||
|
@rm -f nwif01$(EXEEXT)
|
||||||
|
$(LINK) $(nwif01_OBJECTS) $(nwif01_LDADD) $(LIBS)
|
||||||
|
nwif02$(EXEEXT): $(nwif02_OBJECTS) $(nwif02_DEPENDENCIES) $(EXTRA_nwif02_DEPENDENCIES)
|
||||||
|
@rm -f nwif02$(EXEEXT)
|
||||||
|
$(LINK) $(nwif02_OBJECTS) $(nwif02_LDADD) $(LIBS)
|
||||||
oht$(EXEEXT): $(oht_OBJECTS) $(oht_DEPENDENCIES) $(EXTRA_oht_DEPENDENCIES)
|
oht$(EXEEXT): $(oht_OBJECTS) $(oht_DEPENDENCIES) $(EXTRA_oht_DEPENDENCIES)
|
||||||
@rm -f oht$(EXEEXT)
|
@rm -f oht$(EXEEXT)
|
||||||
$(LINK) $(oht_OBJECTS) $(oht_LDADD) $(LIBS)
|
$(LINK) $(oht_OBJECTS) $(oht_LDADD) $(LIBS)
|
||||||
@ -659,6 +674,8 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc01.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc01.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc02.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc02.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad01.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad01.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif01.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif02.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path01.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path01.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Po@am__quote@
|
||||||
|
90
qse/samples/cmn/nwif01.c
Normal file
90
qse/samples/cmn/nwif01.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include <qse/cmn/nwif.h>
|
||||||
|
#include <qse/cmn/mbwc.h>
|
||||||
|
#include <qse/cmn/main.h>
|
||||||
|
#include <qse/cmn/stdio.h>
|
||||||
|
#include <qse/cmn/mem.h>
|
||||||
|
#include <qse/cmn/str.h>
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#if defined(_WIN32)
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void print_nwifcfg (qse_nwifcfg_t* ptr)
|
||||||
|
{
|
||||||
|
qse_char_t tmp[128];
|
||||||
|
|
||||||
|
qse_printf (QSE_T("[%s] ifindex=[%u] "), ptr->name, ptr->index);
|
||||||
|
|
||||||
|
qse_nwadtostr (&ptr->addr, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("addr=[%s] "), tmp);
|
||||||
|
qse_nwadtostr (&ptr->mask, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("mask=[%s] "), tmp);
|
||||||
|
|
||||||
|
if (ptr->flags & QSE_NWIFCFG_BCAST)
|
||||||
|
{
|
||||||
|
qse_nwadtostr (&ptr->bcast, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("bcast=[%s] "), tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_printf (QSE_T("mtu=[%d] "), (int)ptr->mtu);
|
||||||
|
qse_printf (QSE_T("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_main (int argc, qse_char_t* argv[])
|
||||||
|
{
|
||||||
|
qse_char_t name[100];
|
||||||
|
unsigned int index;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; ;i++)
|
||||||
|
{
|
||||||
|
if (qse_nwifindextostr (i, name, QSE_COUNTOF(name)) <= -1)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("ifindex %d failed\n"), i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
index = qse_nwifstrtoindex (name);
|
||||||
|
if (index == 0)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("ifname %s failed\n"), name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i != index)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("index mismatch %d %d %s\n"), i, index, name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_printf (QSE_T("OK %d %s\n"), index, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_printf (QSE_T("================================================\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_main (int argc, qse_achar_t* argv[])
|
||||||
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
char locale[100];
|
||||||
|
UINT codepage = GetConsoleOutputCP();
|
||||||
|
if (codepage == CP_UTF8)
|
||||||
|
{
|
||||||
|
/*SetConsoleOutputCP (CP_UTF8);*/
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_UTF8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf (locale, ".%u", (unsigned int)codepage);
|
||||||
|
setlocale (LC_ALL, locale);
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||||
|
#endif
|
||||||
|
return qse_runmain (argc, argv, test_main);
|
||||||
|
}
|
||||||
|
|
92
qse/samples/cmn/nwif02.c
Normal file
92
qse/samples/cmn/nwif02.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
#include <qse/cmn/nwif.h>
|
||||||
|
#include <qse/cmn/mbwc.h>
|
||||||
|
#include <qse/cmn/main.h>
|
||||||
|
#include <qse/cmn/stdio.h>
|
||||||
|
#include <qse/cmn/mem.h>
|
||||||
|
#include <qse/cmn/str.h>
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#if defined(_WIN32)
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void print_nwifcfg (qse_nwifcfg_t* ptr)
|
||||||
|
{
|
||||||
|
qse_char_t tmp[128];
|
||||||
|
|
||||||
|
qse_printf (QSE_T("[%s] ifindex=[%u] "), ptr->name, ptr->index);
|
||||||
|
|
||||||
|
qse_nwadtostr (&ptr->addr, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("addr=[%s] "), tmp);
|
||||||
|
qse_nwadtostr (&ptr->mask, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("mask=[%s] "), tmp);
|
||||||
|
|
||||||
|
if (ptr->flags & QSE_NWIFCFG_BCAST)
|
||||||
|
{
|
||||||
|
qse_nwadtostr (&ptr->bcast, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL);
|
||||||
|
qse_printf (QSE_T("bcast=[%s] "), tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_printf (QSE_T("mtu=[%d] "), (int)ptr->mtu);
|
||||||
|
qse_printf (QSE_T("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_main (int argc, qse_char_t* argv[])
|
||||||
|
{
|
||||||
|
qse_nwifcfg_t cfg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; ;i++)
|
||||||
|
{
|
||||||
|
if (qse_nwifindextostr (i, cfg.name, QSE_COUNTOF(cfg.name)) <= -1)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("ifindex %d failed for IN4\n"), i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.type = QSE_NWIFCFG_IN4;
|
||||||
|
if (qse_getnwifcfg (&cfg) <= -1)
|
||||||
|
qse_printf (QSE_T("Cannot get v4 configuration - %s\n"), cfg.name);
|
||||||
|
else print_nwifcfg (&cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; ;i++)
|
||||||
|
{
|
||||||
|
if (qse_nwifindextostr (i, cfg.name, QSE_COUNTOF(cfg.name)) <= -1)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("ifindex %d failed for IN6\n"), i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.type = QSE_NWIFCFG_IN6;
|
||||||
|
if (qse_getnwifcfg (&cfg) <= -1)
|
||||||
|
qse_printf (QSE_T("Cannot get v6 configuration - %s\n"), cfg.name);
|
||||||
|
else print_nwifcfg (&cfg);
|
||||||
|
}
|
||||||
|
qse_printf (QSE_T("================================================\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_main (int argc, qse_achar_t* argv[])
|
||||||
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
char locale[100];
|
||||||
|
UINT codepage = GetConsoleOutputCP();
|
||||||
|
if (codepage == CP_UTF8)
|
||||||
|
{
|
||||||
|
/*SetConsoleOutputCP (CP_UTF8);*/
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_UTF8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf (locale, ".%u", (unsigned int)codepage);
|
||||||
|
setlocale (LC_ALL, locale);
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||||
|
#endif
|
||||||
|
return qse_runmain (argc, argv, test_main);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user