Added some socket functions
This commit is contained in:
		
							
								
								
									
										168
									
								
								qse/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										168
									
								
								qse/configure
									
									
									
									
										vendored
									
									
								
							| @ -22246,6 +22246,84 @@ $as_echo "$ac_res" >&6; } | |||||||
|  |  | ||||||
| $as_echo "#define QSE_SOCKLEN_T_IS_SIGNED 1" >>confdefs.h | $as_echo "#define QSE_SOCKLEN_T_IS_SIGNED 1" >>confdefs.h | ||||||
|  |  | ||||||
|  |  elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then | ||||||
|  |     $as_echo_n "" | ||||||
|  |  fi | ||||||
|  |  | ||||||
|  | 	fi | ||||||
|  | 	# 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 sa_family_t" >&5 | ||||||
|  | $as_echo_n "checking size of sa_family_t... " >&6; } | ||||||
|  | if ${ac_cv_sizeof_sa_family_t+:} false; then : | ||||||
|  |   $as_echo_n "(cached) " >&6 | ||||||
|  | else | ||||||
|  |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (sa_family_t))" "ac_cv_sizeof_sa_family_t"        " | ||||||
|  | 		#include <winsock2.h> | ||||||
|  | 		#include <ws2tcpip.h> | ||||||
|  | "; then : | ||||||
|  |  | ||||||
|  | else | ||||||
|  |   if test "$ac_cv_type_sa_family_t" = 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 (sa_family_t) | ||||||
|  | See \`config.log' for more details" "$LINENO" 5; } | ||||||
|  |    else | ||||||
|  |      ac_cv_sizeof_sa_family_t=0 | ||||||
|  |    fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | fi | ||||||
|  | { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_sa_family_t" >&5 | ||||||
|  | $as_echo "$ac_cv_sizeof_sa_family_t" >&6; } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | cat >>confdefs.h <<_ACEOF | ||||||
|  | #define SIZEOF_SA_FAMILY_T $ac_cv_sizeof_sa_family_t | ||||||
|  | _ACEOF | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	if test ${ac_cv_sizeof_sa_family_t} -gt 0 | ||||||
|  | 	then | ||||||
|  |  | ||||||
|  |  typename=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g"` | ||||||
|  |  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sa_family_t is signed" >&5 | ||||||
|  | $as_echo_n "checking whether sa_family_t is signed... " >&6; } | ||||||
|  | if eval \${ax_cv_decl_${typename}_signed+:} false; then : | ||||||
|  |   $as_echo_n "(cached) " >&6 | ||||||
|  | else | ||||||
|  |  | ||||||
|  |    cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||||||
|  | /* end confdefs.h.  */ | ||||||
|  | #include <winsock2.h> | ||||||
|  | 			 #include <ws2tcpip.h> | ||||||
|  | int | ||||||
|  | main () | ||||||
|  | { | ||||||
|  |  int foo [ 1 - 2 * !(((sa_family_t) -1) < 0) ] | ||||||
|  |   ; | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | _ACEOF | ||||||
|  | if ac_fn_c_try_compile "$LINENO"; then : | ||||||
|  |    eval "ax_cv_decl_${typename}_signed=\"yes\"" | ||||||
|  | else | ||||||
|  |    eval "ax_cv_decl_${typename}_signed=\"no\"" | ||||||
|  | fi | ||||||
|  | rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | ||||||
|  | fi | ||||||
|  | eval ac_res=\$ax_cv_decl_${typename}_signed | ||||||
|  | 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | ||||||
|  | $as_echo "$ac_res" >&6; } | ||||||
|  |  symbolname=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g" | tr "a-z" "A-Z"` | ||||||
|  |  if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then | ||||||
|  |  | ||||||
|  | $as_echo "#define QSE_SA_FAMILY_T_IS_SIGNED 1" >>confdefs.h | ||||||
|  |  | ||||||
|  elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then |  elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then | ||||||
|     $as_echo_n "" |     $as_echo_n "" | ||||||
|  fi |  fi | ||||||
| @ -22262,6 +22340,7 @@ if ${ac_cv_sizeof_struct_sockaddr_in+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in))" "ac_cv_sizeof_struct_sockaddr_in"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in))" "ac_cv_sizeof_struct_sockaddr_in"        " | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h> | 		#include <netinet/in.h> | ||||||
| "; then : | "; then : | ||||||
| @ -22298,6 +22377,7 @@ if ${ac_cv_sizeof_struct_sockaddr_in6+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in6))" "ac_cv_sizeof_struct_sockaddr_in6"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in6))" "ac_cv_sizeof_struct_sockaddr_in6"        " | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h> | 		#include <netinet/in.h> | ||||||
| "; then : | "; then : | ||||||
| @ -22334,6 +22414,7 @@ if ${ac_cv_sizeof_struct_sockaddr_un+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_un))" "ac_cv_sizeof_struct_sockaddr_un"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_un))" "ac_cv_sizeof_struct_sockaddr_un"        " | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <sys/un.h> | 		#include <sys/un.h> | ||||||
| "; then : | "; then : | ||||||
| @ -22370,6 +22451,7 @@ if ${ac_cv_sizeof_struct_sockaddr_ll+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_ll))" "ac_cv_sizeof_struct_sockaddr_ll"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_ll))" "ac_cv_sizeof_struct_sockaddr_ll"        " | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netpacket/packet.h> | 		#include <netpacket/packet.h> | ||||||
| "; then : | "; then : | ||||||
| @ -22406,8 +22488,8 @@ if ${ac_cv_sizeof_struct_sockaddr_dl+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_dl))" "ac_cv_sizeof_struct_sockaddr_dl"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_dl))" "ac_cv_sizeof_struct_sockaddr_dl"        " | ||||||
| 		#include <sys/socket.h> |  | ||||||
| 		#include <sys/types.h> | 		#include <sys/types.h> | ||||||
|  | 		#include <sys/socket.h> | ||||||
| 		#include <net/if_dl.h> | 		#include <net/if_dl.h> | ||||||
| "; then : | "; then : | ||||||
|  |  | ||||||
| @ -22433,6 +22515,7 @@ cat >>confdefs.h <<_ACEOF | |||||||
| _ACEOF | _ACEOF | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	# 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]];'. | ||||||
| @ -22443,6 +22526,7 @@ if ${ac_cv_sizeof_socklen_t+:} false; then : | |||||||
|   $as_echo_n "(cached) " >&6 |   $as_echo_n "(cached) " >&6 | ||||||
| else | else | ||||||
|   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (socklen_t))" "ac_cv_sizeof_socklen_t"        " |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (socklen_t))" "ac_cv_sizeof_socklen_t"        " | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h> | 		#include <netinet/in.h> | ||||||
| "; then : | "; then : | ||||||
| @ -22469,7 +22553,6 @@ cat >>confdefs.h <<_ACEOF | |||||||
| _ACEOF | _ACEOF | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if test ${ac_cv_sizeof_socklen_t} -gt 0 | 	if test ${ac_cv_sizeof_socklen_t} -gt 0 | ||||||
| 	then | 	then | ||||||
|  |  | ||||||
| @ -22511,6 +22594,87 @@ $as_echo "#define QSE_SOCKLEN_T_IS_SIGNED 1" >>confdefs.h | |||||||
|  fi |  fi | ||||||
|  |  | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
|  | 	# 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 sa_family_t" >&5 | ||||||
|  | $as_echo_n "checking size of sa_family_t... " >&6; } | ||||||
|  | if ${ac_cv_sizeof_sa_family_t+:} false; then : | ||||||
|  |   $as_echo_n "(cached) " >&6 | ||||||
|  | else | ||||||
|  |   if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (sa_family_t))" "ac_cv_sizeof_sa_family_t"        " | ||||||
|  | 		#include <sys/socket.h> | ||||||
|  | 		#include <netinet/in.h> | ||||||
|  | "; then : | ||||||
|  |  | ||||||
|  | else | ||||||
|  |   if test "$ac_cv_type_sa_family_t" = 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 (sa_family_t) | ||||||
|  | See \`config.log' for more details" "$LINENO" 5; } | ||||||
|  |    else | ||||||
|  |      ac_cv_sizeof_sa_family_t=0 | ||||||
|  |    fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | fi | ||||||
|  | { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_sa_family_t" >&5 | ||||||
|  | $as_echo "$ac_cv_sizeof_sa_family_t" >&6; } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | cat >>confdefs.h <<_ACEOF | ||||||
|  | #define SIZEOF_SA_FAMILY_T $ac_cv_sizeof_sa_family_t | ||||||
|  | _ACEOF | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	if test ${ac_cv_sizeof_sa_family_t} -gt 0 | ||||||
|  | 	then | ||||||
|  |  | ||||||
|  |  typename=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g"` | ||||||
|  |  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sa_family_t is signed" >&5 | ||||||
|  | $as_echo_n "checking whether sa_family_t is signed... " >&6; } | ||||||
|  | if eval \${ax_cv_decl_${typename}_signed+:} false; then : | ||||||
|  |   $as_echo_n "(cached) " >&6 | ||||||
|  | else | ||||||
|  |  | ||||||
|  |    cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||||||
|  | /* end confdefs.h.  */ | ||||||
|  | #include <sys/types.h> | ||||||
|  | 			 #include <sys/socket.h> | ||||||
|  | 			 #include <netinet/in.h> | ||||||
|  | int | ||||||
|  | main () | ||||||
|  | { | ||||||
|  |  int foo [ 1 - 2 * !(((sa_family_t) -1) < 0) ] | ||||||
|  |   ; | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | _ACEOF | ||||||
|  | if ac_fn_c_try_compile "$LINENO"; then : | ||||||
|  |    eval "ax_cv_decl_${typename}_signed=\"yes\"" | ||||||
|  | else | ||||||
|  |    eval "ax_cv_decl_${typename}_signed=\"no\"" | ||||||
|  | fi | ||||||
|  | rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | ||||||
|  | fi | ||||||
|  | eval ac_res=\$ax_cv_decl_${typename}_signed | ||||||
|  | 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | ||||||
|  | $as_echo "$ac_res" >&6; } | ||||||
|  |  symbolname=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g" | tr "a-z" "A-Z"` | ||||||
|  |  if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then | ||||||
|  |  | ||||||
|  | $as_echo "#define QSE_SA_FAMILY_T_IS_SIGNED 1" >>confdefs.h | ||||||
|  |  | ||||||
|  |  elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then | ||||||
|  |     $as_echo_n "" | ||||||
|  |  fi | ||||||
|  |  | ||||||
|  | 	fi | ||||||
|  |  | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -451,27 +451,43 @@ then | |||||||
| 			[#include <winsock2.h> | 			[#include <winsock2.h> | ||||||
| 			 #include <ws2tcpip.h>]) | 			 #include <ws2tcpip.h>]) | ||||||
| 	fi | 	fi | ||||||
|  | 	AC_CHECK_SIZEOF(sa_family_t,, [ | ||||||
|  | 		#include <winsock2.h> | ||||||
|  | 		#include <ws2tcpip.h>]) | ||||||
|  | 	if test ${ac_cv_sizeof_sa_family_t} -gt 0 | ||||||
|  | 	then | ||||||
|  | 		AX_CHECK_SIGN([sa_family_t], | ||||||
|  | 			[ AC_DEFINE(QSE_SA_FAMILY_T_IS_SIGNED, 1, [Define if sa_family_t is signed]) ], | ||||||
|  | 			[ AS_ECHO_N("") ], | ||||||
|  | 			[#include <winsock2.h> | ||||||
|  | 			 #include <ws2tcpip.h>]) | ||||||
|  | 	fi | ||||||
| else | else | ||||||
| 	AC_CHECK_SIZEOF(struct sockaddr_in,,[ | 	AC_CHECK_SIZEOF(struct sockaddr_in,,[ | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h>]) | 		#include <netinet/in.h>]) | ||||||
| 	AC_CHECK_SIZEOF(struct sockaddr_in6,,[ | 	AC_CHECK_SIZEOF(struct sockaddr_in6,,[ | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h>]) | 		#include <netinet/in.h>]) | ||||||
| 	AC_CHECK_SIZEOF(struct sockaddr_un,,[ | 	AC_CHECK_SIZEOF(struct sockaddr_un,,[ | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <sys/un.h>]) | 		#include <sys/un.h>]) | ||||||
| 	AC_CHECK_SIZEOF(struct sockaddr_ll,,[ | 	AC_CHECK_SIZEOF(struct sockaddr_ll,,[ | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netpacket/packet.h>]) | 		#include <netpacket/packet.h>]) | ||||||
| 	AC_CHECK_SIZEOF(struct sockaddr_dl,,[ | 	AC_CHECK_SIZEOF(struct sockaddr_dl,,[ | ||||||
| 		#include <sys/socket.h> |  | ||||||
| 		#include <sys/types.h> | 		#include <sys/types.h> | ||||||
|  | 		#include <sys/socket.h> | ||||||
| 		#include <net/if_dl.h>]) | 		#include <net/if_dl.h>]) | ||||||
|  |  | ||||||
| 	AC_CHECK_SIZEOF(socklen_t,, [ | 	AC_CHECK_SIZEOF(socklen_t,, [ | ||||||
|  | 		#include <sys/types.h> | ||||||
| 		#include <sys/socket.h> | 		#include <sys/socket.h> | ||||||
| 		#include <netinet/in.h>]) | 		#include <netinet/in.h>]) | ||||||
|  |  | ||||||
| 	if test ${ac_cv_sizeof_socklen_t} -gt 0 | 	if test ${ac_cv_sizeof_socklen_t} -gt 0 | ||||||
| 	then | 	then | ||||||
| 		AX_CHECK_SIGN([socklen_t], | 		AX_CHECK_SIGN([socklen_t], | ||||||
| @ -479,6 +495,20 @@ else | |||||||
| 			[ AS_ECHO_N("") ], | 			[ AS_ECHO_N("") ], | ||||||
| 			[#include <sys/socket.h>]) | 			[#include <sys/socket.h>]) | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
|  | 	AC_CHECK_SIZEOF(sa_family_t,, [ | ||||||
|  | 		#include <sys/socket.h> | ||||||
|  | 		#include <netinet/in.h>]) | ||||||
|  | 	if test ${ac_cv_sizeof_sa_family_t} -gt 0 | ||||||
|  | 	then | ||||||
|  | 		AX_CHECK_SIGN([sa_family_t], | ||||||
|  | 			[ AC_DEFINE(QSE_SA_FAMILY_T_IS_SIGNED, 1, [Define if sa_family_t is signed]) ], | ||||||
|  | 			[ AS_ECHO_N("") ], | ||||||
|  | 			[#include <sys/types.h> | ||||||
|  | 			 #include <sys/socket.h> | ||||||
|  | 			 #include <netinet/in.h>]) | ||||||
|  | 	fi | ||||||
|  |  | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -960,6 +960,9 @@ | |||||||
| /* Define if pthread_t is signed */ | /* Define if pthread_t is signed */ | ||||||
| #undef QSE_PTHREAD_T_IS_SIGNED | #undef QSE_PTHREAD_T_IS_SIGNED | ||||||
|  |  | ||||||
|  | /* Define if sa_family_t is signed */ | ||||||
|  | #undef QSE_SA_FAMILY_T_IS_SIGNED | ||||||
|  |  | ||||||
| /* sizeof(char) */ | /* sizeof(char) */ | ||||||
| #undef QSE_SIZEOF_CHAR | #undef QSE_SIZEOF_CHAR | ||||||
|  |  | ||||||
| @ -1104,6 +1107,9 @@ | |||||||
| /* The size of `pthread_t', as computed by sizeof. */ | /* The size of `pthread_t', as computed by sizeof. */ | ||||||
| #undef SIZEOF_PTHREAD_T | #undef SIZEOF_PTHREAD_T | ||||||
|  |  | ||||||
|  | /* The size of `sa_family_t', as computed by sizeof. */ | ||||||
|  | #undef SIZEOF_SA_FAMILY_T | ||||||
|  |  | ||||||
| /* The size of `short', as computed by sizeof. */ | /* The size of `short', as computed by sizeof. */ | ||||||
| #undef SIZEOF_SHORT | #undef SIZEOF_SHORT | ||||||
|  |  | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ | |||||||
| QSE_BEGIN_NAMESPACE(QSE) | QSE_BEGIN_NAMESPACE(QSE) | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  |  | ||||||
| class AppRoot: Uncopyable, public Types, public Mmged | class AppRoot: public Uncopyable, public Types, public Mmged | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	AppRoot (Mmgr* mmgr): Mmged(mmgr), _root_only(false) {} | 	AppRoot (Mmgr* mmgr): Mmged(mmgr), _root_only(false) {} | ||||||
|  | |||||||
| @ -27,6 +27,8 @@ | |||||||
| #ifndef _QSE_SI_SOCKET_HPP_ | #ifndef _QSE_SI_SOCKET_HPP_ | ||||||
| #define _QSE_SI_SOCKET_HPP_ | #define _QSE_SI_SOCKET_HPP_ | ||||||
|  |  | ||||||
|  | #include <qse/Types.hpp> | ||||||
|  | #include <qse/Uncopyable.hpp> | ||||||
| #include <qse/si/SocketAddress.hpp> | #include <qse/si/SocketAddress.hpp> | ||||||
| #include <qse/si/sck.h> | #include <qse/si/sck.h> | ||||||
|  |  | ||||||
| @ -34,20 +36,41 @@ | |||||||
| QSE_BEGIN_NAMESPACE(QSE) | QSE_BEGIN_NAMESPACE(QSE) | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  |  | ||||||
| class Socket | class Socket: public Uncopyable, public Types | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  | 	enum ErrorCode | ||||||
|  | 	{ | ||||||
|  | 		E_NOERR, | ||||||
|  | 		E_NOMEM, | ||||||
|  | 		E_INVAL, | ||||||
|  | 		E_NOTOPEN, | ||||||
|  | 		E_SYSERR | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	Socket () QSE_CPP_NOEXCEPT; | 	Socket () QSE_CPP_NOEXCEPT; | ||||||
| 	~Socket () QSE_CPP_NOEXCEPT; | 	~Socket () QSE_CPP_NOEXCEPT; | ||||||
|  |  | ||||||
|  | 	void setError (ErrorCode error_code, const qse_char_t* fmt = QSE_NULL, ...); | ||||||
|  |  | ||||||
|  |  | ||||||
| 	int open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT; | 	int open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT; | ||||||
| 	void close () QSE_CPP_NOEXCEPT; | 	void close () QSE_CPP_NOEXCEPT; | ||||||
|  |  | ||||||
| 	int connect (const SocketAddress& target) QSE_CPP_NOEXCEPT; | 	int connect (const SocketAddress& target) QSE_CPP_NOEXCEPT; | ||||||
| 	int beginConnect (const SocketAddress& target) QSE_CPP_NOEXCEPT; | 	int bind (const SocketAddress& target) QSE_CPP_NOEXCEPT; | ||||||
|  | 	int accept (Socket* newsck, SocketAddress* newaddr, int flags) QSE_CPP_NOEXCEPT; | ||||||
|  |  | ||||||
|  | 	int read () QSE_CPP_NOEXCEPT; | ||||||
|  | 	int write () QSE_CPP_NOEXCEPT; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	qse_sck_hnd_t handle; | 	qse_sck_hnd_t handle; | ||||||
|  |  | ||||||
|  | 	ErrorCode errcode; | ||||||
|  | 	qse_char_t errmsg[128]; | ||||||
|  |  | ||||||
|  | 	void set_error_with_syserr (int syserr); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -41,7 +41,6 @@ public: | |||||||
| 	SocketAddress (int family); | 	SocketAddress (int family); | ||||||
| 	SocketAddress (const qse_skad_t* skad); | 	SocketAddress (const qse_skad_t* skad); | ||||||
| 	SocketAddress (const qse_nwad_t* nwad); | 	SocketAddress (const qse_nwad_t* nwad); | ||||||
| 	SocketAddress (const struct sockaddr* ptr, int len); |  | ||||||
|  |  | ||||||
| 	int getFamily () const; | 	int getFamily () const; | ||||||
|  |  | ||||||
| @ -68,7 +67,6 @@ public: | |||||||
|  |  | ||||||
| 	int set (const qse_skad_t* skad);  | 	int set (const qse_skad_t* skad);  | ||||||
| 	int set (const qse_nwad_t* nwad); | 	int set (const qse_nwad_t* nwad); | ||||||
| 	int set (const struct sockaddr* ptr, int len); // treat ptr as a pointer to struct sockaddr |  | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	qse_skad_t skad; | 	qse_skad_t skad; | ||||||
|  | |||||||
| @ -25,7 +25,13 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <qse/si/Socket.hpp> | #include <qse/si/Socket.hpp> | ||||||
|  | #include <qse/cmn/str.h> | ||||||
|  |  | ||||||
|  | #include <sys/types.h> | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| QSE_BEGIN_NAMESPACE(QSE) | QSE_BEGIN_NAMESPACE(QSE) | ||||||
| @ -47,6 +53,31 @@ int Socket::fdopen (int handle) QSE_CPP_NOEXCEPT | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | void Socket::setError (ErrorCode error_code, const qse_char_t* fmt, ...) | ||||||
|  | { | ||||||
|  | 	static const qse_char_t* errstr[] =  | ||||||
|  | 	{ | ||||||
|  | 		QSE_T("no error"), | ||||||
|  | 		QSE_T("insufficient memory"), | ||||||
|  | 		QSE_T("invalid parameter"), | ||||||
|  | 		QSE_T("socket not open"), | ||||||
|  | 		QSE_T("system error") | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	this->errcode = error_code; | ||||||
|  | 	if (fmt) | ||||||
|  | 	{ | ||||||
|  | 		va_list ap; | ||||||
|  | 		va_start (ap, fmt); | ||||||
|  | 		qse_strxvfmt (this->errmsg, QSE_COUNTOF(errmsg), fmt, ap); | ||||||
|  | 		va_end (ap); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		qse_strxcpy (this->errmsg, QSE_COUNTOF(errmsg), errstr[error_code]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| int Socket::open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT | int Socket::open (int domain, int type, int protocol) QSE_CPP_NOEXCEPT | ||||||
| { | { | ||||||
| 	int x; | 	int x; | ||||||
| @ -72,16 +103,85 @@ void Socket::close () QSE_CPP_NOEXCEPT | |||||||
|  |  | ||||||
| int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT | int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||||
| { | { | ||||||
| 	//if (this->handle == QSE_INVALID_SCKHND) | 	if (this->handle == QSE_INVALID_SCKHND) | ||||||
| 	//{ | 	{ | ||||||
| 	//	 | 		this->setError (Socket::E_NOTOPEN); | ||||||
| 	//} | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return -1; | 	if (::connect(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1) | ||||||
|  | 	{ | ||||||
|  | 		this->set_error_with_syserr (errno); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int Socket::beginConnect (const SocketAddress &target) QSE_CPP_NOEXCEPT | int Socket::bind (const SocketAddress& target) QSE_CPP_NOEXCEPT | ||||||
| { | { | ||||||
|  | 	if (this->handle == QSE_INVALID_SCKHND) | ||||||
|  | 	{ | ||||||
|  | 		this->setError (Socket::E_NOTOPEN); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (::bind(this->handle, (struct sockaddr*)target.getAddrPtr(), target.getAddrSize()) == -1) | ||||||
|  | 	{ | ||||||
|  | 		this->set_error_with_syserr (errno); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Socket::accept (Socket* newsck, SocketAddress* newaddr, int flags) QSE_CPP_NOEXCEPT | ||||||
|  | { | ||||||
|  | 	int n; | ||||||
|  |  | ||||||
|  | 	if (this->handle == QSE_INVALID_SCKHND) | ||||||
|  | 	{ | ||||||
|  | 		this->setError (Socket::E_NOTOPEN); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | #if 0 | ||||||
|  | 	qse_socklen_t len = newaddr->getAddrSize(); | ||||||
|  |  | ||||||
|  | 	if ((n = ::accept4 (this->handle, newaddr->getAddrPtr(), &len)) == -1) | ||||||
|  | 	{ | ||||||
|  | 		this->set_error_with_syserr (errno); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	newsck->handle = n; | ||||||
|  | #endif | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Socket::set_error_with_syserr (int syserr) | ||||||
|  | { | ||||||
|  | 	qse_mchar_t buf[128]; | ||||||
|  | 	ErrorCode errcode; | ||||||
|  |  | ||||||
|  | 	switch (errno) | ||||||
|  | 	{ | ||||||
|  | 		case EINVAL: | ||||||
|  | 			errcode = this->E_INVAL; | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 		case ENOMEM: | ||||||
|  | 			errcode = this->E_NOMEM; | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | // TODO: translate more system error codes | ||||||
|  |  | ||||||
|  | 		default: | ||||||
|  | 			strerror_r(errno, buf, QSE_COUNTOF(buf)); | ||||||
|  | 			this->setError (this->E_SYSERR, QSE_T("%hs"), buf); | ||||||
|  | 			return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	this->setError (errcode); | ||||||
| } | } | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  | |||||||
| @ -111,14 +111,6 @@ SocketAddress::SocketAddress (const qse_nwad_t* nwad) | |||||||
| 	this->set (nwad); | 	this->set (nwad); | ||||||
| } | } | ||||||
|  |  | ||||||
| SocketAddress::SocketAddress (const struct sockaddr* ptr, int len) |  | ||||||
| { |  | ||||||
| 	if (this->set (ptr, len) <= -1) |  | ||||||
| 	{ |  | ||||||
| 		QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad)); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int SocketAddress::getFamily () const | int SocketAddress::getFamily () const | ||||||
| { | { | ||||||
| 	return FAMILY(&this->skad); | 	return FAMILY(&this->skad); | ||||||
| @ -206,14 +198,6 @@ int SocketAddress::set (const qse_nwad_t* nwad) | |||||||
| 	return qse_nwadtoskad (nwad, &this->skad); | 	return qse_nwadtoskad (nwad, &this->skad); | ||||||
| } | } | ||||||
|  |  | ||||||
| int SocketAddress::set (const struct sockaddr* ptr, int len) |  | ||||||
| { |  | ||||||
| 	int exp_size = qse_skadsize((const qse_skad_t*)ptr); |  | ||||||
| 	if (len < exp_size) return -1; |  | ||||||
| 	QSE_MEMCPY (&this->skad, ptr, exp_size); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| QSE_END_NAMESPACE(QSE) | QSE_END_NAMESPACE(QSE) | ||||||
|  | |||||||
| @ -255,7 +255,7 @@ int qse_getnwifcfg (qse_nwifcfg_t* cfg) | |||||||
| 			head->flags |= QSE_NWIFCFG_PTOP; | 			head->flags |= QSE_NWIFCFG_PTOP; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) goto oops;		 | 		if (ioctl (s, SIOCGLIFINDEX, &ifrbuf) <= -1) goto oops; | ||||||
| 		head->index = ifrbuf.lifr_index; | 		head->index = ifrbuf.lifr_index; | ||||||
|  |  | ||||||
| 		if (ioctl (s, SIOCGLIFNETMASK, &ifrbuf) <= -1) goto oops; | 		if (ioctl (s, SIOCGLIFNETMASK, &ifrbuf) <= -1) goto oops; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user