From c35e1616e67de2d5852dae647c2db6d811f451bd Mon Sep 17 00:00:00 2001 From: damitha Date: Tue, 29 Jun 2010 08:57:05 +0000 Subject: Partial fix of AXIS2C-1440 git-svn-id: http://svn.apache.org/repos/asf/axis/axis2/c/core/trunk@958884 13f79535-47bb-0310-9956-ffa450edef68 --- util/include/axutil_network_handler.h | 388 +++--- util/include/axutil_utils_defines.h | 12 +- util/include/platforms/os400/axutil_os400.h | 554 ++++----- .../platforms/windows/axutil_uuid_gen_windows.h | 90 +- util/src/network_handler.c | 1292 ++++++++++---------- util/src/platforms/os400/platformSpecificOS400.c | 770 ++++++------ util/src/platforms/windows/axutil_windows.c | 186 +-- 7 files changed, 1646 insertions(+), 1646 deletions(-) (limited to 'util') diff --git a/util/include/axutil_network_handler.h b/util/include/axutil_network_handler.h index 3d55cd1..bc361e2 100644 --- a/util/include/axutil_network_handler.h +++ b/util/include/axutil_network_handler.h @@ -1,194 +1,194 @@ - -/* - * Copyright 2004,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain count copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AXUTIL_NETWORK_HANDLER_H -#define AXUTIL_NETWORK_HANDLER_H - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - - /** - * @defgroup axutil_network_handler network handler - * @ingroup axis2_util - * @{ - */ - - /** - * open a socket for a given server - * @param server ip address or the fqn of the server - * @param port port of the service - * @return opened socket - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - - axutil_network_handler_open_socket( - const axutil_env_t * env, - char *server, - int port); - - /** - * creates a server socket for a given port - * @param port port of the socket to be bound - * @return creates server socket - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - - axutil_network_handler_create_server_socket( - const axutil_env_t * env, - int port); - - /** - * closes a socket - * @param opened socket that need to be closed - * @return status code - */ - AXIS2_EXTERN axis2_status_t AXIS2_CALL - - axutil_network_handler_close_socket( - const axutil_env_t * env, - axis2_socket_t socket); - - /** - * used to set up socket options such as timeouts, non-blocking ..etc - * @param socket valid socket (obtained by socket() or similar call) - * @param option the name of the option - * @param value Value to be set - * @return status of the operations as axis2_status_t - */ - AXIS2_EXTERN axis2_status_t AXIS2_CALL - - axutil_network_handler_set_sock_option( - const axutil_env_t * env, - axis2_socket_t socket, - int option, - int value); - - /** - * Accepts remote connections for a server socket - * @param socket valid server socket (obtained by socket() or similar call) - * @return created socket to handle the incoming client connection - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - - axutil_network_handler_svr_socket_accept( - const axutil_env_t * env, - axis2_socket_t socket); - - /** - * Returns the ip address of the server associated with the socket - * @param socket valid socket (obtained by accept() or similar call) - * @return ip address asoociated with the socket or NULL - */ - AXIS2_EXTERN axis2_char_t *AXIS2_CALL - axutil_network_handler_get_svr_ip( - const axutil_env_t * env, - axis2_socket_t socket); - - AXIS2_EXTERN axis2_char_t *AXIS2_CALL - axutil_network_handler_get_peer_ip( - const axutil_env_t * env, - axis2_socket_t socket); - - /* - * Create a datagram socket. - * @param env pointer to env - * @return a datagram socket - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - axutil_network_handler_open_dgram_socket(const axutil_env_t *env); - - /* - * Send a UDP packet to the given source and port address. - * Read a incoming UDP packet from the port and server address. - * @param env pointer to the env structure - * @param socket a datagram socket - * @param buffer a buffer containing the data to be sent - * @param buf_len length of the buffer - * @param addr address of the source field - * @param port udp port number - * @return success if everything goes well - */ - AXIS2_EXTERN axis2_status_t AXIS2_CALL - axutil_network_handler_send_dgram(const axutil_env_t *env, axis2_socket_t socket, - axis2_char_t *buff, int *buf_len, - axis2_char_t *addr, int dest_port, int *source_port); - - /* - * Read a incoming UDP packet from the port and server address. - * @param env pointer to the env structure - * @param socket a datagram socket - * @param buffer a buffer allocated and passed to be filled - * @param buf_len length of the buffer allocated. In return buffer len - contains the length of the data read - * @param addr address of the sender. This is a return value. - * @param port senders port address. Return value - * @return if everything goes well return success - */ - AXIS2_EXTERN axis2_status_t AXIS2_CALL - axutil_network_handler_read_dgram(const axutil_env_t *env, axis2_socket_t socket, - axis2_char_t *buffer, int *buf_len, - axis2_char_t **addr, int *port); - - /* - * Create a datagram socket to receive incoming UDP packets. - * @param env a pointer to the env structure - * @param port udp port to listen - * @return AXIS2_SUCCESS if everything goes well - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - axutil_network_handler_create_dgram_svr_socket( - const axutil_env_t *env, - int port); - - /* - * Bind a socket to the specified address - * @param env a pointer to the env structure - * @param sock socket - * @param port port number to bind to - * @return AXIS2_SUCCESS if binding is performed - */ - AXIS2_EXTERN axis2_status_t AXIS2_CALL - axutil_network_handler_bind_socket(const axutil_env_t *env, - axis2_socket_t sock, int port); - - /* - * Create a multicast socket for listening on the given port. - * @param env a pointer to the env structure - * @param port udp port to listen - * @param mul_addr multicast address to join. The address should be valid and in dotted format. - * @param ttl TTL value. - * @return AXIS2_SUCCESS if everything goes well.s - */ - AXIS2_EXTERN axis2_socket_t AXIS2_CALL - axutil_network_hadler_create_multicast_svr_socket(const axutil_env_t *env, - int port, axis2_char_t *mul_addr); - - /** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* AXIS2_NETWORK_HANDLER_H */ + +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain count copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef AXUTIL_NETWORK_HANDLER_H +#define AXUTIL_NETWORK_HANDLER_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @defgroup axutil_network_handler network handler + * @ingroup axis2_util + * @{ + */ + + /** + * open a socket for a given server + * @param server ip address or the fqn of the server + * @param port port of the service + * @return opened socket + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + + axutil_network_handler_open_socket( + const axutil_env_t * env, + char *server, + int port); + + /** + * creates a server socket for a given port + * @param port port of the socket to be bound + * @return creates server socket + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + + axutil_network_handler_create_server_socket( + const axutil_env_t * env, + int port); + + /** + * closes a socket + * @param opened socket that need to be closed + * @return status code + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + + axutil_network_handler_close_socket( + const axutil_env_t * env, + axis2_socket_t socket); + + /** + * used to set up socket options such as timeouts, non-blocking ..etc + * @param socket valid socket (obtained by socket() or similar call) + * @param option the name of the option + * @param value Value to be set + * @return status of the operations as axis2_status_t + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + + axutil_network_handler_set_sock_option( + const axutil_env_t * env, + axis2_socket_t socket, + int option, + int value); + + /** + * Accepts remote connections for a server socket + * @param socket valid server socket (obtained by socket() or similar call) + * @return created socket to handle the incoming client connection + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + + axutil_network_handler_svr_socket_accept( + const axutil_env_t * env, + axis2_socket_t socket); + + /** + * Returns the ip address of the server associated with the socket + * @param socket valid socket (obtained by accept() or similar call) + * @return ip address asoociated with the socket or NULL + */ + AXIS2_EXTERN axis2_char_t *AXIS2_CALL + axutil_network_handler_get_svr_ip( + const axutil_env_t * env, + axis2_socket_t socket); + + AXIS2_EXTERN axis2_char_t *AXIS2_CALL + axutil_network_handler_get_peer_ip( + const axutil_env_t * env, + axis2_socket_t socket); + + /* + * Create a datagram socket. + * @param env pointer to env + * @return a datagram socket + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + axutil_network_handler_open_dgram_socket(const axutil_env_t *env); + + /* + * Send a UDP packet to the given source and port address. + * Read a incoming UDP packet from the port and server address. + * @param env pointer to the env structure + * @param socket a datagram socket + * @param buffer a buffer containing the data to be sent + * @param buf_len length of the buffer + * @param addr address of the source field + * @param port udp port number + * @return success if everything goes well + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axutil_network_handler_send_dgram(const axutil_env_t *env, axis2_socket_t socket, + axis2_char_t *buff, int *buf_len, + axis2_char_t *addr, int dest_port, int *source_port); + + /* + * Read a incoming UDP packet from the port and server address. + * @param env pointer to the env structure + * @param socket a datagram socket + * @param buffer a buffer allocated and passed to be filled + * @param buf_len length of the buffer allocated. In return buffer len + contains the length of the data read + * @param addr address of the sender. This is a return value. + * @param port senders port address. Return value + * @return if everything goes well return success + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axutil_network_handler_read_dgram(const axutil_env_t *env, axis2_socket_t socket, + axis2_char_t *buffer, int *buf_len, + axis2_char_t **addr, int *port); + + /* + * Create a datagram socket to receive incoming UDP packets. + * @param env a pointer to the env structure + * @param port udp port to listen + * @return AXIS2_SUCCESS if everything goes well + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + axutil_network_handler_create_dgram_svr_socket( + const axutil_env_t *env, + int port); + + /* + * Bind a socket to the specified address + * @param env a pointer to the env structure + * @param sock socket + * @param port port number to bind to + * @return AXIS2_SUCCESS if binding is performed + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axutil_network_handler_bind_socket(const axutil_env_t *env, + axis2_socket_t sock, int port); + + /* + * Create a multicast socket for listening on the given port. + * @param env a pointer to the env structure + * @param port udp port to listen + * @param mul_addr multicast address to join. The address should be valid and in dotted format. + * @param ttl TTL value. + * @return AXIS2_SUCCESS if everything goes well.s + */ + AXIS2_EXTERN axis2_socket_t AXIS2_CALL + axutil_network_hadler_create_multicast_svr_socket(const axutil_env_t *env, + int port, axis2_char_t *mul_addr); + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* AXIS2_NETWORK_HANDLER_H */ diff --git a/util/include/axutil_utils_defines.h b/util/include/axutil_utils_defines.h index ddc3a70..003cbae 100644 --- a/util/include/axutil_utils_defines.h +++ b/util/include/axutil_utils_defines.h @@ -62,12 +62,12 @@ extern "C" #define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%lld" #define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%llu" #endif -# if defined(_MSC_VER) && _MSC_VER >= 1300 -# define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d" -# define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u" -# else -# define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d" -# define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u" +# if defined(_MSC_VER) && _MSC_VER >= 1300 +# define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d" +# define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u" +# else +# define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d" +# define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u" # endif /**#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d" #define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u" */ diff --git a/util/include/platforms/os400/axutil_os400.h b/util/include/platforms/os400/axutil_os400.h index 1b6477f..5261c4d 100644 --- a/util/include/platforms/os400/axutil_os400.h +++ b/util/include/platforms/os400/axutil_os400.h @@ -1,277 +1,277 @@ - -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AXIS2_UNIX_H -#define AXIS2_UNIX_H - -#include - -/** - * @file axutil_unix.h - * @brief axis2 unix platform specific interface - */ - -#ifdef __cplusplus -extern "C" -{ -#endif - - /** @defgroup axis2_unix Platform Specific - * @ingroup axis2_platforms_unix - * @{ - */ - - /*************************************************************** - * Default paths to shared library/DLLs and files - *************************************************************** - */ - -#define AXIS2_PLATFORM_DEFAULT_DEPLOY_PATH "" - -#define AXIS2_PLATFORM_XMLPARSER_PATH "libaxis2_parser.so" -#define AXIS2_PLATFORM_TRANSPORTHTTP_PATH "libhttp_transport.so" -#define AXIS2_PLATFORM_CHANNEL_PATH "libhttp_channel.so" -#define AXIS2_PLATFORM_SSLCHANNEL_PATH "Unknown" - -#define AXIS2_PLATFORM_LOG_PATH "/axis2/log/axutil_log" -#define AXIS2_PLATFORM_CLIENTLOG_PATH "/axis2/log/axis2_client_log" -#define AXIS2_PLATFORM_CONFIG_PATH "/etc/axiscpp.conf" -#define AXIS2_PLATFORM_SECUREINFO "" - - /** - * Resource that contains the configuration - */ -#define AXIS2_CONFIGURATION_RESOURCE "/axis2/axis2.xml" - - /***************************************************************** - * Library loading and procedure resolution - ****************************************************************/ - -#define AXIS2_DLHANDLER void* - -#define AXIS2_PLATFORM_LOADLIBINIT() -#define AXIS2_PLATFORM_LOADLIB(_lib) os400_dlopen(_lib) - -#define AXIS2_PLATFORM_UNLOADLIB os400_dlclose -#define AXIS2_PLATFORM_GETPROCADDR os400_dlsym -#define AXIS2_PLATFORM_LOADLIBEXIT() -#define AXIS2_PLATFORM_LOADLIB_ERROR os400_dlerror() - -extern void *os400_dlopen(const char *); -extern void *os400_dlsym(void *, const char *); -extern int os400_dlclose(void *); -extern char *os400_dlerror(); - - - /*************************************************************** - * National Language Support - ****************************************************************/ - -// STRTOASC is to translate single byte 'native' character representation to ASCII -// ASCTOSTR is to translate single byte ascii representation to 'native' character (EBCDIC) -// CANNOT be used with constants. -extern char* strtoasc( char* ); -extern char* asctostr( char* ); -#define AXIS2_PLATFORM_STRTOASC( x ) strtoasc( (char*)(x) ) -#define AXIS2_PLATFORM_ASCTOSTR( x ) asctostr( (char*)(x) ) - -// reference to ebcdic to ascii conversion table -extern const char EBCDICtoASCII[256]; - -// Turkish double quote in EBCDIC is not invariant (i.e. the hexadecimal -// value for double quote is different in turkish locale than when running -// in english locale). This, when using double quotes we must reference the -// following, which will be set to proper value on EBCDIC-based systems. - -extern char AXIS2_PLATFORM_DOUBLE_QUOTE_S[]; -extern char AXIS2_PLATFORM_DOUBLE_QUOTE_C; - -extern char AXIS2_PLATFORM_XML_ENTITY_REFERENCE_CHARS_S[]; - - /*************************************************************** - * Miscellaneous - ****************************************************************/ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include "axutil_uuid_gen_os400.h" /* uuid_gen unix implementation */ -#include /* TCP_NODELAY */ -#include - -#include "axutil_date_time_util_os400.h" - - /* for file access handling */ -#include - - /* network handling */ -#include -#include -#include -#include -#include - -#include - - /* dir handling */ -#include -#include - -#define AXIS2_STRRCHR(x, y) (strrchr(x, y)) - -#define AXIS2_PLATFORM_SLEEP(x) sleep(0) - - /** sleep function abstraction */ -#define AXIS2_SLEEP sleep -#define AXIS2_USLEEP usleep - - /** - * Platform specific method to obtain current thread ID - */ -#include -#define AXIS2_PLATFORM_GET_THREAD_ID() os400_getThreadID() - -static long long os400_getThreadID() -{ - pthread_id_np_t tid = pthread_getthreadid_np(); - return *((long long *)&tid); -} - - /** - * Platform specific method to obtain current time in milli seconds - */ -struct os400_timeb -{ - long time; - long millitm; -}; - -static int os400_ftime(struct os400_timeb * tp) -{ - struct timeval t; - gettimeofday(&t, NULL); - tp->time = t.tv_sec; - tp->millitm = t.tv_usec/1000; - return 0; -} -#define AXIS2_PLATFORM_GET_TIME_IN_MILLIS os400_ftime -#define AXIS2_PLATFORM_TIMEB os400_timeb - - /** - * type to be used for 64bit integers - */ -#define AXIS2_LONGLONG long long -#define AXIS2_LONGLONGVALUE(value) value##LL -#define AXIS2_UNSIGNED_LONGLONGVALUE(value) value##ULL - - /** - * Format string to be used in printf for 64bit integers - */ -#define AXIS2_PRINTF_LONGLONG_FORMAT_SPECIFIER "%lld" -#define AXIS2_PRINTF_LONGLONG_FORMAT_SPECIFIER_CHARS "lld" -#define AXIS2_PRINTF_UNSIGNED_LONGLONG_FORMAT_SPECIFIER "%llu" -#define AXIS2_PRINTF_UNSIGNED_LONGLONG_FORMAT_SPECIFIER_CHARS "llu" - - /** - * Platform specific path separator char - */ - -#define AXIS2_PATH_SEP_CHAR '/' -#define AXIS2_PATH_SEP_STR "/" -#define AXIS2_LIB_PREFIX "lib" -#define AXIS2_LIB_SUFFIX ".so" - - /** - * Platform specific time - */ -#define AXIS2_TIME_T time_t - - /** - * Platform specific file handling - */ -#define AXIS2_FOPEN fopen -#define AXIS2_FREAD fread -#define AXIS2_FWRITE fwrite -#define AXIS2_FCLOSE fclose -#define AXIS2_FTELL ftell -#define AXIS2_ACCESS(zpath,imode) access(zpath,imode) -#define AXIS2_R_OK R_OK /* test for read permission */ -#define AXIS2_W_OK W_OK /* test for write permission */ -#define AXIS2_X_OK X_OK /* test for execute or search permission */ -#define AXIS2_F_OK F_OK /* test whether the directories leading to the file can be - searched and the file exists */ - - /** - * Platform specific environment variable access method - */ -#define AXIS2_GETENV(_env_var_name) getenv(_env_var_name) - - /** - * unix specific directory handling functions - */ -#define AXIS2_SCANDIR os400_scandir -#define AXIS2_ALPHASORT os400_alphasort -#define AXIS2_OPENDIR opendir -#define AXIS2_CLOSEDIR closedir -#define AXIS2_READDIR readdir -#define AXIS2_READDIR_R readdir_r -#define AXIS2_REWINDDIR rewinddir -#define AXIS2_MKDIR mkdir -#define AXIS2_GETCWD getcwd -#define AXIS2_CHDIR chdir - - /** - * network specific functions and defs - */ -#define axis2_socket_t int -#define AXIS2_INVALID_SOCKET -1 -#define AXIS2_INADDR_NONE (in_addr_t)-1 -#define axis2_unsigned_short_t uint16_t -#define AXIS2_CLOSE_SOCKET(sock) close(sock) -#define AXIS2_CLOSE_SOCKET_ON_EXIT(sock) fcntl(sock,F_SETFD, FD_CLOEXEC) -#define axis2_socket_len_t socklen_t -#define AXIS2_SHUT_WR SHUT_WR - - /** getopt function */ -#define AXIS2_GETOPT getopt - - /** minizip functions */ -#define axis2_fill_win32_filefunc(ffunc) -#define AXIS2_UNZOPEN2(zipfilename,ffunc) do { unzOpen2(zipfilename,NULL); memset(&ffunc, 0, sizeof(ffunc)); } while (0) - - /** - * handling variable number of arguments (for log.c) - */ -#define AXIS2_VSNPRINTF vsnprintf - -#define AXIS2_SNPRINTF snprintf - -#define axis2_gmtime_r gmtime_r - - /** @} */ -#ifdef __cplusplus -} -#endif - -#endif /* AXIS2_UNIX_H */ + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef AXIS2_UNIX_H +#define AXIS2_UNIX_H + +#include + +/** + * @file axutil_unix.h + * @brief axis2 unix platform specific interface + */ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @defgroup axis2_unix Platform Specific + * @ingroup axis2_platforms_unix + * @{ + */ + + /*************************************************************** + * Default paths to shared library/DLLs and files + *************************************************************** + */ + +#define AXIS2_PLATFORM_DEFAULT_DEPLOY_PATH "" + +#define AXIS2_PLATFORM_XMLPARSER_PATH "libaxis2_parser.so" +#define AXIS2_PLATFORM_TRANSPORTHTTP_PATH "libhttp_transport.so" +#define AXIS2_PLATFORM_CHANNEL_PATH "libhttp_channel.so" +#define AXIS2_PLATFORM_SSLCHANNEL_PATH "Unknown" + +#define AXIS2_PLATFORM_LOG_PATH "/axis2/log/axutil_log" +#define AXIS2_PLATFORM_CLIENTLOG_PATH "/axis2/log/axis2_client_log" +#define AXIS2_PLATFORM_CONFIG_PATH "/etc/axiscpp.conf" +#define AXIS2_PLATFORM_SECUREINFO "" + + /** + * Resource that contains the configuration + */ +#define AXIS2_CONFIGURATION_RESOURCE "/axis2/axis2.xml" + + /***************************************************************** + * Library loading and procedure resolution + ****************************************************************/ + +#define AXIS2_DLHANDLER void* + +#define AXIS2_PLATFORM_LOADLIBINIT() +#define AXIS2_PLATFORM_LOADLIB(_lib) os400_dlopen(_lib) + +#define AXIS2_PLATFORM_UNLOADLIB os400_dlclose +#define AXIS2_PLATFORM_GETPROCADDR os400_dlsym +#define AXIS2_PLATFORM_LOADLIBEXIT() +#define AXIS2_PLATFORM_LOADLIB_ERROR os400_dlerror() + +extern void *os400_dlopen(const char *); +extern void *os400_dlsym(void *, const char *); +extern int os400_dlclose(void *); +extern char *os400_dlerror(); + + + /*************************************************************** + * National Language Support + ****************************************************************/ + +// STRTOASC is to translate single byte 'native' character representation to ASCII +// ASCTOSTR is to translate single byte ascii representation to 'native' character (EBCDIC) +// CANNOT be used with constants. +extern char* strtoasc( char* ); +extern char* asctostr( char* ); +#define AXIS2_PLATFORM_STRTOASC( x ) strtoasc( (char*)(x) ) +#define AXIS2_PLATFORM_ASCTOSTR( x ) asctostr( (char*)(x) ) + +// reference to ebcdic to ascii conversion table +extern const char EBCDICtoASCII[256]; + +// Turkish double quote in EBCDIC is not invariant (i.e. the hexadecimal +// value for double quote is different in turkish locale than when running +// in english locale). This, when using double quotes we must reference the +// following, which will be set to proper value on EBCDIC-based systems. + +extern char AXIS2_PLATFORM_DOUBLE_QUOTE_S[]; +extern char AXIS2_PLATFORM_DOUBLE_QUOTE_C; + +extern char AXIS2_PLATFORM_XML_ENTITY_REFERENCE_CHARS_S[]; + + /*************************************************************** + * Miscellaneous + ****************************************************************/ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "axutil_uuid_gen_os400.h" /* uuid_gen unix implementation */ +#include /* TCP_NODELAY */ +#include + +#include "axutil_date_time_util_os400.h" + + /* for file access handling */ +#include + + /* network handling */ +#include +#include +#include +#include +#include + +#include + + /* dir handling */ +#include +#include + +#define AXIS2_STRRCHR(x, y) (strrchr(x, y)) + +#define AXIS2_PLATFORM_SLEEP(x) sleep(0) + + /** sleep function abstraction */ +#define AXIS2_SLEEP sleep +#define AXIS2_USLEEP usleep + + /** + * Platform specific method to obtain current thread ID + */ +#include +#define AXIS2_PLATFORM_GET_THREAD_ID() os400_getThreadID() + +static long long os400_getThreadID() +{ + pthread_id_np_t tid = pthread_getthreadid_np(); + return *((long long *)&tid); +} + + /** + * Platform specific method to obtain current time in milli seconds + */ +struct os400_timeb +{ + long time; + long millitm; +}; + +static int os400_ftime(struct os400_timeb * tp) +{ + struct timeval t; + gettimeofday(&t, NULL); + tp->time = t.tv_sec; + tp->millitm = t.tv_usec/1000; + return 0; +} +#define AXIS2_PLATFORM_GET_TIME_IN_MILLIS os400_ftime +#define AXIS2_PLATFORM_TIMEB os400_timeb + + /** + * type to be used for 64bit integers + */ +#define AXIS2_LONGLONG long long +#define AXIS2_LONGLONGVALUE(value) value##LL +#define AXIS2_UNSIGNED_LONGLONGVALUE(value) value##ULL + + /** + * Format string to be used in printf for 64bit integers + */ +#define AXIS2_PRINTF_LONGLONG_FORMAT_SPECIFIER "%lld" +#define AXIS2_PRINTF_LONGLONG_FORMAT_SPECIFIER_CHARS "lld" +#define AXIS2_PRINTF_UNSIGNED_LONGLONG_FORMAT_SPECIFIER "%llu" +#define AXIS2_PRINTF_UNSIGNED_LONGLONG_FORMAT_SPECIFIER_CHARS "llu" + + /** + * Platform specific path separator char + */ + +#define AXIS2_PATH_SEP_CHAR '/' +#define AXIS2_PATH_SEP_STR "/" +#define AXIS2_LIB_PREFIX "lib" +#define AXIS2_LIB_SUFFIX ".so" + + /** + * Platform specific time + */ +#define AXIS2_TIME_T time_t + + /** + * Platform specific file handling + */ +#define AXIS2_FOPEN fopen +#define AXIS2_FREAD fread +#define AXIS2_FWRITE fwrite +#define AXIS2_FCLOSE fclose +#define AXIS2_FTELL ftell +#define AXIS2_ACCESS(zpath,imode) access(zpath,imode) +#define AXIS2_R_OK R_OK /* test for read permission */ +#define AXIS2_W_OK W_OK /* test for write permission */ +#define AXIS2_X_OK X_OK /* test for execute or search permission */ +#define AXIS2_F_OK F_OK /* test whether the directories leading to the file can be + searched and the file exists */ + + /** + * Platform specific environment variable access method + */ +#define AXIS2_GETENV(_env_var_name) getenv(_env_var_name) + + /** + * unix specific directory handling functions + */ +#define AXIS2_SCANDIR os400_scandir +#define AXIS2_ALPHASORT os400_alphasort +#define AXIS2_OPENDIR opendir +#define AXIS2_CLOSEDIR closedir +#define AXIS2_READDIR readdir +#define AXIS2_READDIR_R readdir_r +#define AXIS2_REWINDDIR rewinddir +#define AXIS2_MKDIR mkdir +#define AXIS2_GETCWD getcwd +#define AXIS2_CHDIR chdir + + /** + * network specific functions and defs + */ +#define axis2_socket_t int +#define AXIS2_INVALID_SOCKET -1 +#define AXIS2_INADDR_NONE (in_addr_t)-1 +#define axis2_unsigned_short_t uint16_t +#define AXIS2_CLOSE_SOCKET(sock) close(sock) +#define AXIS2_CLOSE_SOCKET_ON_EXIT(sock) fcntl(sock,F_SETFD, FD_CLOEXEC) +#define axis2_socket_len_t socklen_t +#define AXIS2_SHUT_WR SHUT_WR + + /** getopt function */ +#define AXIS2_GETOPT getopt + + /** minizip functions */ +#define axis2_fill_win32_filefunc(ffunc) +#define AXIS2_UNZOPEN2(zipfilename,ffunc) do { unzOpen2(zipfilename,NULL); memset(&ffunc, 0, sizeof(ffunc)); } while (0) + + /** + * handling variable number of arguments (for log.c) + */ +#define AXIS2_VSNPRINTF vsnprintf + +#define AXIS2_SNPRINTF snprintf + +#define axis2_gmtime_r gmtime_r + + /** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* AXIS2_UNIX_H */ diff --git a/util/include/platforms/windows/axutil_uuid_gen_windows.h b/util/include/platforms/windows/axutil_uuid_gen_windows.h index f8c0872..3b9a371 100644 --- a/util/include/platforms/windows/axutil_uuid_gen_windows.h +++ b/util/include/platforms/windows/axutil_uuid_gen_windows.h @@ -1,46 +1,46 @@ -/* - * Copyright 2004,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AXIS2_UDDI_GEN_WINDOWS_H -#define AXIS2_UDDI_GEN_WINDOWS_H - -#include - -#ifdef __cplusplus -extern "C" -{ - -#endif /* */ - - /* Function prototypes */ - - - /** - * Generate universally unique id - * @return a char pointer to uuid - */ - AXIS2_EXTERN axis2_char_t * AXIS2_CALL - axutil_platform_uuid_gen( - char *s); - - - /** @} */ -#ifdef __cplusplus -} -#endif /* */ - -#endif /* AXIS2_UDDI_GEN_WINDOWS_H */ +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef AXIS2_UDDI_GEN_WINDOWS_H +#define AXIS2_UDDI_GEN_WINDOWS_H + +#include + +#ifdef __cplusplus +extern "C" +{ + +#endif /* */ + + /* Function prototypes */ + + + /** + * Generate universally unique id + * @return a char pointer to uuid + */ + AXIS2_EXTERN axis2_char_t * AXIS2_CALL + axutil_platform_uuid_gen( + char *s); + + + /** @} */ +#ifdef __cplusplus +} +#endif /* */ + +#endif /* AXIS2_UDDI_GEN_WINDOWS_H */ diff --git a/util/src/network_handler.c b/util/src/network_handler.c index ae41943..40c9723 100644 --- a/util/src/network_handler.c +++ b/util/src/network_handler.c @@ -1,646 +1,646 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - - -#if defined(WIN32) -/* fix for an older version of winsock2.h */ -#if !defined(SO_EXCLUSIVEADDRUSE) -#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) -#endif -#endif - -#if defined(WIN32) -static int is_init_socket = 0; -axis2_bool_t axis2_init_socket( -); -#endif - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_handler_open_socket( - const axutil_env_t *env, - char *server, - int port) -{ - axis2_socket_t sock = AXIS2_INVALID_SOCKET; - struct sockaddr_in sock_addr; - struct linger ll; - int nodelay = 1; - -#if defined(WIN32) - if (is_init_socket == 0) - { - axis2_init_socket(); - is_init_socket = 1; - } -#endif - - AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); - AXIS2_PARAM_CHECK(env->error, server, AXIS2_INVALID_SOCKET); - -#ifndef WIN32 - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) - /*AF_INET is not defined in sys/socket.h but PF_INET */ - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#else - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) - /* In Win 32 if the socket creation failed it return 0 not a negative value */ - { - char buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - /* Get the detailed error message */ - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#endif - - memset(&sock_addr, 0, sizeof(sock_addr)); - sock_addr.sin_family = AF_INET; - sock_addr.sin_addr.s_addr = inet_addr(server); /*arpa/inet.d */ - - if(sock_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */ - { - /* - * server may be a host name - */ - struct hostent *lphost = NULL; - lphost = gethostbyname(server); - - if(lphost) - { - sock_addr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr; - } - else - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - } - - sock_addr.sin_port = htons((axis2_unsigned_short_t)port); - - /* Connect to server */ - if(connect(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) - { - AXIS2_CLOSE_SOCKET(sock); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(nodelay)); - ll.l_onoff = 1; - ll.l_linger = 5; - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *)&ll, sizeof(struct linger)); - return sock; -} - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_handler_create_server_socket( - const axutil_env_t *env, - int port) -{ - axis2_socket_t sock = AXIS2_INVALID_SOCKET; - axis2_socket_t i = 0; - struct sockaddr_in sock_addr; - - AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); -#if defined(WIN32) - if (is_init_socket == 0) - { - axis2_init_socket(); - is_init_socket = 1; - } -#endif - sock = socket(AF_INET, SOCK_STREAM, 0); - -#ifndef WIN32 - if(sock < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#else - if (sock == INVALID_SOCKET) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_INVALID_SOCKET; - } -#endif - /* Address re-use */ - i = 1; -#if defined(WIN32) - setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char *) &i, sizeof(axis2_socket_t)); /*casted 4th param to char* */ -#else - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&i, sizeof(axis2_socket_t)); /*casted 4th param to char* */ -#endif - - /* Exec behaviour */ - AXIS2_CLOSE_SOCKET_ON_EXIT(sock); - memset(&sock_addr, 0, sizeof(sock_addr)); - - sock_addr.sin_family = AF_INET; - sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); - sock_addr.sin_port = htons((axis2_unsigned_short_t)port); - - /* Bind the socket to our port number */ - if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - if(listen(sock, 50) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_LISTEN_FAILED, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - return sock; -} - -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axutil_network_handler_close_socket( - const axutil_env_t *env, - axis2_socket_t socket) -{ - int i = 0; - char buf[32]; - if(socket < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOCKET, AXIS2_FAILURE); - return AXIS2_FAILURE; - } - shutdown(socket, AXIS2_SHUT_WR); - axutil_network_handler_set_sock_option(env, socket, SO_RCVTIMEO, 1); - i = recv(socket, buf, 32, 0); - AXIS2_CLOSE_SOCKET(socket); - return AXIS2_SUCCESS; -} - -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axutil_network_handler_set_sock_option( - const axutil_env_t *env, - axis2_socket_t socket, - int option, - int value) -{ - if(option == SO_RCVTIMEO || option == SO_SNDTIMEO) - { -#if defined(WIN32) - DWORD tv = value; /* windows expects milliseconds in a DWORD */ -#else - struct timeval tv; - /* we deal with milliseconds */ - tv.tv_sec = value / 1000; - tv.tv_usec = (value % 1000) * 1000; -#endif - setsockopt(socket, SOL_SOCKET, option, (char *)&tv, sizeof(tv)); - return AXIS2_SUCCESS; - } - else if(option == SO_REUSEADDR) - { - if((setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&value, sizeof(value))) < 0) - { - return AXIS2_FAILURE; - } - return AXIS2_SUCCESS; - } - return AXIS2_FAILURE; -} - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_handler_svr_socket_accept( - const axutil_env_t *env, - axis2_socket_t svr_socket) -{ - struct sockaddr cli_addr; - struct linger ll; - int nodelay = 1; - axis2_socket_len_t cli_len = 0; - axis2_socket_t cli_socket = AXIS2_INVALID_SOCKET; - AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); - - cli_len = sizeof(cli_addr); - cli_socket = accept(svr_socket, (struct sockaddr *)&cli_addr, &cli_len); -#ifndef WIN32 - if(cli_socket < 0) - { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, - "[Axis2][network_handler] Socket accept \ - failed"); - } -#else - if (cli_socket == INVALID_SOCKET) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - } -#endif - - setsockopt(svr_socket, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, (int)sizeof(nodelay)); - /* We are sure that the difference lies within the int range */ - ll.l_onoff = 1; - ll.l_linger = 5; - setsockopt(cli_socket, SOL_SOCKET, SO_LINGER, (const char *)&ll, (int)sizeof(struct linger)); - /* We are sure that the difference lies within the int range */ - return cli_socket; -} - -#if defined (WIN32) -axis2_bool_t -axis2_init_socket( -) -{ - WORD wVersionRequested; - WSADATA wsaData; - int err; - wVersionRequested = MAKEWORD(2, 2); - - err = WSAStartup(wVersionRequested, &wsaData); - - if (err != 0) - return 0; /* WinSock 2.2 not found */ - - /* Confirm that the WinSock DLL supports 2.2. - * Note that if the DLL supports versions greater - * than 2.2 in addition to 2.2, it will still return - * 2.2 in wVersion since that is the version we - * requested. - */ - - if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) - { - WSACleanup(); - return 0; /* WinSock 2.2 not supported */ - } - return 1; -} -#endif - -AXIS2_EXTERN axis2_char_t *AXIS2_CALL -axutil_network_handler_get_svr_ip( - const axutil_env_t *env, - axis2_socket_t socket) -{ - struct sockaddr_in addr; - axis2_socket_len_t len = sizeof(addr); - char *ret = NULL; - memset(&addr, 0, sizeof(addr)); - if(getsockname(socket, (struct sockaddr *)&addr, &len) < 0) - { - return NULL; - } - ret = inet_ntoa(addr.sin_addr); - return ret; -} - -AXIS2_EXTERN axis2_char_t *AXIS2_CALL -axutil_network_handler_get_peer_ip( - const axutil_env_t *env, - axis2_socket_t socket) -{ - struct sockaddr_in addr; - axis2_socket_len_t len = sizeof(addr); - char *ret = NULL; - memset(&addr, 0, sizeof(addr)); - if(getpeername(socket, (struct sockaddr *)&addr, &len) < 0) - { - return NULL; - } - ret = inet_ntoa(addr.sin_addr); - return ret; -} - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_handler_create_dgram_svr_socket( - const axutil_env_t *env, - int port) -{ - axis2_socket_t sock = AXIS2_INVALID_SOCKET; - struct sockaddr_in sock_addr; - - AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); -#if defined(WIN32) - if (is_init_socket == 0) - { - axis2_init_socket(); - is_init_socket = 1; - } -#endif - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - -#ifndef WIN32 - if(sock < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#else - if (sock == INVALID_SOCKET) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_INVALID_SOCKET; - } -#endif - /* Exec behaviour */ - AXIS2_CLOSE_SOCKET_ON_EXIT(sock); - memset(&sock_addr, 0, sizeof(sock_addr)); - - sock_addr.sin_family = AF_INET; - sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); - sock_addr.sin_port = htons((axis2_unsigned_short_t)port); - - /* Bind the socket to our port number */ - if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - return sock; -} - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_handler_open_dgram_socket( - const axutil_env_t *env) -{ - axis2_socket_t sock = AXIS2_INVALID_SOCKET; -#if defined(WIN32) - if (is_init_socket == 0) - { - axis2_init_socket(); - is_init_socket = 1; - } -#endif - -#ifndef WIN32 - if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - /*AF_INET is not defined in sys/socket.h but PF_INET */ - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#else - if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) - /* In Win 32 if the socket creation failed it return 0 not a negative value */ - { - char buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - /* Get the detailed error message */ - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#endif - return sock; -} - -/* - * This function blocks until data is available to read from the socket - * and read all the data in the socket. If the buffer size specified is - * lesser than the actual data a failure will be returned. - */ -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axutil_network_handler_read_dgram( - const axutil_env_t *env, - axis2_socket_t sock, - axis2_char_t *buffer, - int *buf_len, - axis2_char_t **addr, - int *port) -{ - struct sockaddr_in sender_address; - int received = 0; - socklen_t sender_address_size; - - sender_address_size = sizeof(sender_address); - received = recvfrom(sock, buffer, *buf_len, 0, (struct sockaddr *)&sender_address, &sender_address_size); -#ifdef WIN32 - if (SOCKET_ERROR == received) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_FAILURE; - } -#else - if(received < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#endif - if(port && addr) - { - *port = ntohs(sender_address.sin_port); - *addr = inet_ntoa(sender_address.sin_addr); - } - *buf_len = received; - return AXIS2_SUCCESS; -} - -/* - * Sends a datagram to the specified location. - */ -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axutil_network_handler_send_dgram( - const axutil_env_t *env, - axis2_socket_t sock, - axis2_char_t *buff, - int *buf_len, - axis2_char_t *addr, - int dest_port, - int *source_port) -{ - struct sockaddr_in recv_addr, source_addr; - int send_bytes = 0; - unsigned int recv_addr_size = 0; - socklen_t source_addr_size = sizeof(source_addr); - recv_addr_size = sizeof(recv_addr); - - memset(&recv_addr, 0, sizeof(recv_addr)); - memset(&recv_addr, 0, sizeof(source_addr)); - - recv_addr.sin_addr.s_addr = inet_addr(addr); - if(recv_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */ - { - /* - * server may be a host name - */ - struct hostent *lphost = NULL; - lphost = gethostbyname(addr); - - if(lphost) - { - recv_addr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr; - } - else - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); - return AXIS2_FAILURE; - } - } - - recv_addr.sin_family = AF_INET; - recv_addr.sin_port = htons((axis2_unsigned_short_t)dest_port); - - send_bytes = sendto(sock, buff, *buf_len, 0, (struct sockaddr *)&recv_addr, recv_addr_size); - - getsockname(sock, (struct sockaddr *)&source_addr, &source_addr_size); - -#ifdef WIN32 - if (send_bytes == SOCKET_ERROR) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_FAILURE; - } -#else - if(send_bytes < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_FAILURE; - } -#endif - if(source_port) - { - *source_port = ntohs(source_addr.sin_port); - } - *buf_len = send_bytes; - return AXIS2_SUCCESS; -} - -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axutil_network_handler_bind_socket( - const axutil_env_t *env, - axis2_socket_t sock, - int port) -{ - struct sockaddr_in source_addr; - - memset(&source_addr, 0, sizeof(source_addr)); - source_addr.sin_family = AF_INET; - source_addr.sin_addr.s_addr = htonl(INADDR_ANY); - source_addr.sin_port = htons((axis2_unsigned_short_t)port); -#ifdef WIN32 - if (bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) == SOCKET_ERROR) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_FAILURE; - } -#else - if(bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } -#endif - return AXIS2_SUCCESS; -} - -AXIS2_EXTERN axis2_socket_t AXIS2_CALL -axutil_network_hadler_create_multicast_svr_socket( - const axutil_env_t *env, - int port, - axis2_char_t *mul_addr) -{ - axis2_socket_t sock = AXIS2_INVALID_SOCKET; - struct sockaddr_in sock_addr; - struct ip_mreq mc_req; - - AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); -#if defined(WIN32) - if (is_init_socket == 0) - { - axis2_init_socket(); - is_init_socket = 1; - } -#endif - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - -#ifndef WIN32 - if(sock < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_FAILURE; - } -#else - if (sock == INVALID_SOCKET) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_FAILURE; - } -#endif - - /* Exec behaviour */ - AXIS2_CLOSE_SOCKET_ON_EXIT(sock); - memset(&sock_addr, 0, sizeof(sock_addr)); - - sock_addr.sin_family = AF_INET; - sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); - sock_addr.sin_port = htons((axis2_unsigned_short_t)port); - - /* Bind the socket to our port number */ - if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); - return AXIS2_INVALID_SOCKET; - } - - /* Send an IGMP request to join the multicast group */ - mc_req.imr_multiaddr.s_addr = inet_addr(mul_addr); - mc_req.imr_interface.s_addr = htonl(INADDR_ANY); -#ifdef WIN32 - if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_req, sizeof(mc_req))) == SOCKET_ERROR) - { - axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; - axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); - return AXIS2_FAILURE; - } -#else - if((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mc_req, sizeof(mc_req))) < 0) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); - return AXIS2_FAILURE; - } -#endif - return sock; -} - +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + + +#if defined(WIN32) +/* fix for an older version of winsock2.h */ +#if !defined(SO_EXCLUSIVEADDRUSE) +#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) +#endif +#endif + +#if defined(WIN32) +static int is_init_socket = 0; +axis2_bool_t axis2_init_socket( +); +#endif + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_handler_open_socket( + const axutil_env_t *env, + char *server, + int port) +{ + axis2_socket_t sock = AXIS2_INVALID_SOCKET; + struct sockaddr_in sock_addr; + struct linger ll; + int nodelay = 1; + +#if defined(WIN32) + if (is_init_socket == 0) + { + axis2_init_socket(); + is_init_socket = 1; + } +#endif + + AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); + AXIS2_PARAM_CHECK(env->error, server, AXIS2_INVALID_SOCKET); + +#ifndef WIN32 + if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + /*AF_INET is not defined in sys/socket.h but PF_INET */ + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#else + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + /* In Win 32 if the socket creation failed it return 0 not a negative value */ + { + char buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + /* Get the detailed error message */ + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#endif + + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = inet_addr(server); /*arpa/inet.d */ + + if(sock_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */ + { + /* + * server may be a host name + */ + struct hostent *lphost = NULL; + lphost = gethostbyname(server); + + if(lphost) + { + sock_addr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr; + } + else + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + } + + sock_addr.sin_port = htons((axis2_unsigned_short_t)port); + + /* Connect to server */ + if(connect(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) + { + AXIS2_CLOSE_SOCKET(sock); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(nodelay)); + ll.l_onoff = 1; + ll.l_linger = 5; + setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *)&ll, sizeof(struct linger)); + return sock; +} + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_handler_create_server_socket( + const axutil_env_t *env, + int port) +{ + axis2_socket_t sock = AXIS2_INVALID_SOCKET; + axis2_socket_t i = 0; + struct sockaddr_in sock_addr; + + AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); +#if defined(WIN32) + if (is_init_socket == 0) + { + axis2_init_socket(); + is_init_socket = 1; + } +#endif + sock = socket(AF_INET, SOCK_STREAM, 0); + +#ifndef WIN32 + if(sock < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#else + if (sock == INVALID_SOCKET) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_INVALID_SOCKET; + } +#endif + /* Address re-use */ + i = 1; +#if defined(WIN32) + setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char *) &i, sizeof(axis2_socket_t)); /*casted 4th param to char* */ +#else + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&i, sizeof(axis2_socket_t)); /*casted 4th param to char* */ +#endif + + /* Exec behaviour */ + AXIS2_CLOSE_SOCKET_ON_EXIT(sock); + memset(&sock_addr, 0, sizeof(sock_addr)); + + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); + sock_addr.sin_port = htons((axis2_unsigned_short_t)port); + + /* Bind the socket to our port number */ + if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + if(listen(sock, 50) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_LISTEN_FAILED, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + return sock; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axutil_network_handler_close_socket( + const axutil_env_t *env, + axis2_socket_t socket) +{ + int i = 0; + char buf[32]; + if(socket < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOCKET, AXIS2_FAILURE); + return AXIS2_FAILURE; + } + shutdown(socket, AXIS2_SHUT_WR); + axutil_network_handler_set_sock_option(env, socket, SO_RCVTIMEO, 1); + i = recv(socket, buf, 32, 0); + AXIS2_CLOSE_SOCKET(socket); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axutil_network_handler_set_sock_option( + const axutil_env_t *env, + axis2_socket_t socket, + int option, + int value) +{ + if(option == SO_RCVTIMEO || option == SO_SNDTIMEO) + { +#if defined(WIN32) + DWORD tv = value; /* windows expects milliseconds in a DWORD */ +#else + struct timeval tv; + /* we deal with milliseconds */ + tv.tv_sec = value / 1000; + tv.tv_usec = (value % 1000) * 1000; +#endif + setsockopt(socket, SOL_SOCKET, option, (char *)&tv, sizeof(tv)); + return AXIS2_SUCCESS; + } + else if(option == SO_REUSEADDR) + { + if((setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&value, sizeof(value))) < 0) + { + return AXIS2_FAILURE; + } + return AXIS2_SUCCESS; + } + return AXIS2_FAILURE; +} + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_handler_svr_socket_accept( + const axutil_env_t *env, + axis2_socket_t svr_socket) +{ + struct sockaddr cli_addr; + struct linger ll; + int nodelay = 1; + axis2_socket_len_t cli_len = 0; + axis2_socket_t cli_socket = AXIS2_INVALID_SOCKET; + AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); + + cli_len = sizeof(cli_addr); + cli_socket = accept(svr_socket, (struct sockaddr *)&cli_addr, &cli_len); +#ifndef WIN32 + if(cli_socket < 0) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[Axis2][network_handler] Socket accept \ + failed"); + } +#else + if (cli_socket == INVALID_SOCKET) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + } +#endif + + setsockopt(svr_socket, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, (int)sizeof(nodelay)); + /* We are sure that the difference lies within the int range */ + ll.l_onoff = 1; + ll.l_linger = 5; + setsockopt(cli_socket, SOL_SOCKET, SO_LINGER, (const char *)&ll, (int)sizeof(struct linger)); + /* We are sure that the difference lies within the int range */ + return cli_socket; +} + +#if defined (WIN32) +axis2_bool_t +axis2_init_socket( +) +{ + WORD wVersionRequested; + WSADATA wsaData; + int err; + wVersionRequested = MAKEWORD(2, 2); + + err = WSAStartup(wVersionRequested, &wsaData); + + if (err != 0) + return 0; /* WinSock 2.2 not found */ + + /* Confirm that the WinSock DLL supports 2.2. + * Note that if the DLL supports versions greater + * than 2.2 in addition to 2.2, it will still return + * 2.2 in wVersion since that is the version we + * requested. + */ + + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) + { + WSACleanup(); + return 0; /* WinSock 2.2 not supported */ + } + return 1; +} +#endif + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +axutil_network_handler_get_svr_ip( + const axutil_env_t *env, + axis2_socket_t socket) +{ + struct sockaddr_in addr; + axis2_socket_len_t len = sizeof(addr); + char *ret = NULL; + memset(&addr, 0, sizeof(addr)); + if(getsockname(socket, (struct sockaddr *)&addr, &len) < 0) + { + return NULL; + } + ret = inet_ntoa(addr.sin_addr); + return ret; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +axutil_network_handler_get_peer_ip( + const axutil_env_t *env, + axis2_socket_t socket) +{ + struct sockaddr_in addr; + axis2_socket_len_t len = sizeof(addr); + char *ret = NULL; + memset(&addr, 0, sizeof(addr)); + if(getpeername(socket, (struct sockaddr *)&addr, &len) < 0) + { + return NULL; + } + ret = inet_ntoa(addr.sin_addr); + return ret; +} + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_handler_create_dgram_svr_socket( + const axutil_env_t *env, + int port) +{ + axis2_socket_t sock = AXIS2_INVALID_SOCKET; + struct sockaddr_in sock_addr; + + AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); +#if defined(WIN32) + if (is_init_socket == 0) + { + axis2_init_socket(); + is_init_socket = 1; + } +#endif + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + +#ifndef WIN32 + if(sock < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#else + if (sock == INVALID_SOCKET) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_INVALID_SOCKET; + } +#endif + /* Exec behaviour */ + AXIS2_CLOSE_SOCKET_ON_EXIT(sock); + memset(&sock_addr, 0, sizeof(sock_addr)); + + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); + sock_addr.sin_port = htons((axis2_unsigned_short_t)port); + + /* Bind the socket to our port number */ + if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + return sock; +} + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_handler_open_dgram_socket( + const axutil_env_t *env) +{ + axis2_socket_t sock = AXIS2_INVALID_SOCKET; +#if defined(WIN32) + if (is_init_socket == 0) + { + axis2_init_socket(); + is_init_socket = 1; + } +#endif + +#ifndef WIN32 + if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + /*AF_INET is not defined in sys/socket.h but PF_INET */ + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#else + if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) + /* In Win 32 if the socket creation failed it return 0 not a negative value */ + { + char buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + /* Get the detailed error message */ + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#endif + return sock; +} + +/* + * This function blocks until data is available to read from the socket + * and read all the data in the socket. If the buffer size specified is + * lesser than the actual data a failure will be returned. + */ +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axutil_network_handler_read_dgram( + const axutil_env_t *env, + axis2_socket_t sock, + axis2_char_t *buffer, + int *buf_len, + axis2_char_t **addr, + int *port) +{ + struct sockaddr_in sender_address; + int received = 0; + socklen_t sender_address_size; + + sender_address_size = sizeof(sender_address); + received = recvfrom(sock, buffer, *buf_len, 0, (struct sockaddr *)&sender_address, &sender_address_size); +#ifdef WIN32 + if (SOCKET_ERROR == received) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_FAILURE; + } +#else + if(received < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#endif + if(port && addr) + { + *port = ntohs(sender_address.sin_port); + *addr = inet_ntoa(sender_address.sin_addr); + } + *buf_len = received; + return AXIS2_SUCCESS; +} + +/* + * Sends a datagram to the specified location. + */ +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axutil_network_handler_send_dgram( + const axutil_env_t *env, + axis2_socket_t sock, + axis2_char_t *buff, + int *buf_len, + axis2_char_t *addr, + int dest_port, + int *source_port) +{ + struct sockaddr_in recv_addr, source_addr; + int send_bytes = 0; + unsigned int recv_addr_size = 0; + socklen_t source_addr_size = sizeof(source_addr); + recv_addr_size = sizeof(recv_addr); + + memset(&recv_addr, 0, sizeof(recv_addr)); + memset(&recv_addr, 0, sizeof(source_addr)); + + recv_addr.sin_addr.s_addr = inet_addr(addr); + if(recv_addr.sin_addr.s_addr == AXIS2_INADDR_NONE) /*netinet/in.h */ + { + /* + * server may be a host name + */ + struct hostent *lphost = NULL; + lphost = gethostbyname(addr); + + if(lphost) + { + recv_addr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr; + } + else + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); + return AXIS2_FAILURE; + } + } + + recv_addr.sin_family = AF_INET; + recv_addr.sin_port = htons((axis2_unsigned_short_t)dest_port); + + send_bytes = sendto(sock, buff, *buf_len, 0, (struct sockaddr *)&recv_addr, recv_addr_size); + + getsockname(sock, (struct sockaddr *)&source_addr, &source_addr_size); + +#ifdef WIN32 + if (send_bytes == SOCKET_ERROR) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_FAILURE; + } +#else + if(send_bytes < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_FAILURE; + } +#endif + if(source_port) + { + *source_port = ntohs(source_addr.sin_port); + } + *buf_len = send_bytes; + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axutil_network_handler_bind_socket( + const axutil_env_t *env, + axis2_socket_t sock, + int port) +{ + struct sockaddr_in source_addr; + + memset(&source_addr, 0, sizeof(source_addr)); + source_addr.sin_family = AF_INET; + source_addr.sin_addr.s_addr = htonl(INADDR_ANY); + source_addr.sin_port = htons((axis2_unsigned_short_t)port); +#ifdef WIN32 + if (bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) == SOCKET_ERROR) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_FAILURE; + } +#else + if(bind(sock, (struct sockaddr *)&source_addr, sizeof(source_addr)) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } +#endif + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_socket_t AXIS2_CALL +axutil_network_hadler_create_multicast_svr_socket( + const axutil_env_t *env, + int port, + axis2_char_t *mul_addr) +{ + axis2_socket_t sock = AXIS2_INVALID_SOCKET; + struct sockaddr_in sock_addr; + struct ip_mreq mc_req; + + AXIS2_ENV_CHECK(env, AXIS2_CRITICAL_FAILURE); +#if defined(WIN32) + if (is_init_socket == 0) + { + axis2_init_socket(); + is_init_socket = 1; + } +#endif + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + +#ifndef WIN32 + if(sock < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_FAILURE; + } +#else + if (sock == INVALID_SOCKET) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_FAILURE; + } +#endif + + /* Exec behaviour */ + AXIS2_CLOSE_SOCKET_ON_EXIT(sock); + memset(&sock_addr, 0, sizeof(sock_addr)); + + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); + sock_addr.sin_port = htons((axis2_unsigned_short_t)port); + + /* Bind the socket to our port number */ + if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_BIND_FAILED, AXIS2_FAILURE); + return AXIS2_INVALID_SOCKET; + } + + /* Send an IGMP request to join the multicast group */ + mc_req.imr_multiaddr.s_addr = inet_addr(mul_addr); + mc_req.imr_interface.s_addr = htonl(INADDR_ANY); +#ifdef WIN32 + if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mc_req, sizeof(mc_req))) == SOCKET_ERROR) + { + axis2_char_t buf[AXUTIL_WIN32_ERROR_BUFSIZE]; + axutil_win32_get_last_wsa_error(buf, AXUTIL_WIN32_ERROR_BUFSIZE); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, buf); + return AXIS2_FAILURE; + } +#else + if((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mc_req, sizeof(mc_req))) < 0) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOCKET_ERROR, AXIS2_FAILURE); + return AXIS2_FAILURE; + } +#endif + return sock; +} + diff --git a/util/src/platforms/os400/platformSpecificOS400.c b/util/src/platforms/os400/platformSpecificOS400.c index be60e8c..969d345 100644 --- a/util/src/platforms/os400/platformSpecificOS400.c +++ b/util/src/platforms/os400/platformSpecificOS400.c @@ -1,388 +1,388 @@ -/* - * Copyright 2004-2004 The Apache Software Foundation. -// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "platforms/axutil_platform_auto_sense.h" - -#include -#include -#include -#include // Qus_EC_t -#include // rslvsp() -#include // _AUTH_EXECUTE -#include // QleActBndPgm(), QleGetExp() -#include // Qp0lCvtPathToQSYSObjName() -#include // readlink() -#include -#include -#include // Retrieve job's ccsid API prototype - - - -/**********************************************************************/ -/* Function: */ -/* retrieveJobCcsid */ -/* Description: */ -/* Retrieves the ccsid of the current job. */ -/* If the current job's ccsid is 65535, the job's default ccsid is */ -/* returned. */ -/* If the ccsid cannot be retrieved (error occurs), -1 is returned. */ -/* Return: */ -/* int status of call. if 0, success; -1 failure. */ -/**********************************************************************/ - -#define RTV_CCSID_ATTR_LEN 512 - -static int retrieveJobCcsid(int *ccsid, char *langID) -{ - char receiverVariable[RTV_CCSID_ATTR_LEN]; - char format[8] = {'R', 'T', 'V', 'C', '0', '1', '0', '0'}; - int numberOfAttributes = 3; - int attributeKeys[3] = {QWCA_KEY_CCSID, QWCA_KEY_DEFAULTCCSID, QWCA_KEY_LANGID}; - Qwc_RTVC_Attribute_Data_t *attribute; - int defaultCcsid; - char errorCode[8]; - int i; - memset(errorCode, 0x00, sizeof(errorCode)); - -#pragma exception_handler(RetrieveJobCcsidError,0,_C1_ALL,_C2_ALL,_CTLA_HANDLE) - QWCRTVCA(receiverVariable,RTV_CCSID_ATTR_LEN,format,numberOfAttributes,attributeKeys,&errorCode); -#pragma disable_handler - if (((Qwc_RTVC0100_t *)receiverVariable)->Number_Fields_Rtnd != 3) - { - /* Unable to retrieve the ccsid information */ - return -1; - } - /* Retrieved ccsid, default CCSID and language ID */ - attribute = (Qwc_RTVC_Attribute_Data_t *)(receiverVariable + sizeof(int)); - for (i=0; i < 3; i++) - { - if (attribute->Key_Field == QWCA_KEY_CCSID) - *ccsid = *(int *)((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)); - else if (attribute->Key_Field == QWCA_KEY_DEFAULTCCSID) - defaultCcsid = *(int *)((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)); - else - strncpy(langID, ((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)), 3); - attribute = (Qwc_RTVC_Attribute_Data_t *)((char *)attribute + attribute->Length_Field_Info_Rtnd); - } - if (*ccsid == 65535) - *ccsid = defaultCcsid; - - return 0; - - RetrieveJobCcsidError: - return -1; -} - - -typedef int HMODULE; - -static char *dlErrorMessage = NULL; - -/* - * ========================================== - * dlopen() - * Gain access to an executable object file. - * ========================================== - */ -void * os400_dlopen(const char *file) -{ - Qus_EC_t err = { sizeof(err), 0}; - int rc; - char dllPath[4*1024+1]; - char *fp; - char pathNameBuffer[8*1024]; - Qlg_Path_Name_T *pathName; - Qp0l_QSYS_Info_t qsys_info; - char objectName[11]; - char objectLibrary[11]; - _SYSPTR sysP; - _OBJ_TYPE_T objectType; - HMODULE handle; - int actInfoLen; - Qle_ABP_Info_t activationInfo; - void *returnHandle; - - dlErrorMessage = NULL; - - // Assume symbolic link, if error, assume actual path - - memset(dllPath, 0x00, 4*1024+1); - rc = readlink ( file , dllPath, 4*1024); - if (rc == -1) - strcpy(dllPath, file); - - // Uppercase file - fp = dllPath; - while (*fp++) *fp = toupper(*fp); - - // Parse the path to its QSYS.LIB file system name: library and service program. - - pathName = (Qlg_Path_Name_T *)pathNameBuffer; - - memset(pathNameBuffer, 0x00, sizeof (pathNameBuffer)); - pathName->Path_Length = strlen(dllPath); - memcpy( &(((char *) pathName)[sizeof(Qlg_Path_Name_T)]), dllPath, pathName->Path_Length); - pathName->Path_Name_Delimiter[0] = '/'; - - Qp0lCvtPathToQSYSObjName(pathName,&qsys_info,"QSYS0100",sizeof(Qp0l_QSYS_Info_t), 0, &err); - - if (err.Bytes_Available) - { - dlErrorMessage = "Path to shared library not valid."; - return NULL; - } - - // blank pad object name and library in order to use on rslvsp(). - - sprintf(objectName, "%-10.10s", qsys_info.Obj_Name); - sprintf(objectLibrary,"%-10.10s", qsys_info.Lib_Name); - -#pragma exception_handler (LBL_RSLV_EH, 0,_C1_ALL,_C2_MH_ESCAPE |_C2_MH_FUNCTION_CHECK, _CTLA_HANDLE) - - // Resolve pointer to DLL. - objectType = WLI_SRVPGM; - sysP = rslvsp(objectType,objectName, objectLibrary,_AUTH_EXECUTE); - -#pragma disable_handler - - // We got a pointer to the DLL. Activate it (i.e. load it). - actInfoLen = sizeof(activationInfo); - QleActBndPgm (&sysP,&handle,&activationInfo,&actInfoLen,&err); - if (err.Bytes_Available) - { - dlErrorMessage = "Unable to activate shared library."; - return NULL; - } - - // Return the dlopen object. - returnHandle = malloc(sizeof(HMODULE)); - memcpy(returnHandle, &handle, sizeof(HMODULE)); - return returnHandle; - - LBL_RSLV_EH: - dlErrorMessage = "Unable to resolve to shared library."; - return NULL; -} - -/* - * dlsym() - * Obtain the address to symbol from a dlopen() object. - */ -void * os400_dlsym(void *handle, const char * name) -{ - void *symbolAddress = NULL; - int exportType; - - Qus_EC_t err = {sizeof(err),0 }; - dlErrorMessage = NULL; - -#pragma exception_handler (LBL_RSLV_EH, 0,_C1_ALL,_C2_MH_ESCAPE |_C2_MH_FUNCTION_CHECK, _CTLA_HANDLE) - - // Get the function pointer. - // Export type of 1 means that that the pointer is to a procedure. - - QleGetExp ((int *)handle,0,0,(char *)name,&symbolAddress,&exportType,&err); - if (err.Bytes_Available) - { - dlErrorMessage = "Unable to resolve to procedure in shared library."; - return NULL; - } - - return symbolAddress; - -#pragma disable_handler - - LBL_RSLV_EH: - dlErrorMessage = "Unable to resolve to procedure in shared library."; - return NULL; -} - - -/* - * ========================================== - * dlclose() - * Close a dlopen() object. - * ========================================== - */ -int os400_dlclose(void *handle) -{ - dlErrorMessage = NULL; - *(int *)handle = -1; - free(handle); - return 0; -} - -/* - * ========================================== - * dlclose() - * Close a dlopen() object. - * ========================================== - */ -char * os400_dlerror() -{ - char *retError = dlErrorMessage; - dlErrorMessage = NULL; - return retError; -} - -/* ---------------------------------------------------------------------------------*/ -/* ---------------------------------------------------------------------------------*/ -/* Below are routines to handle conversion between ascii and ebcdic */ -/* */ -/* The tables below are used to translate single byte data, and should never */ -/* be used to translate data that is not single byte. */ -/* ---------------------------------------------------------------------------------*/ -/* ---------------------------------------------------------------------------------*/ - - -/* constToAsc conversion table generated by ebcdic 37 -> ascii 819 */ -const char EBCDICtoASCII[256] = { -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - 0, 1, 2, 3, 156, 9, 134, 127, 151, 141, 142, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 157, 133, 8, 135, 24, 25, 146, 143, 28, 29, 30, 31, - 128, 129, 130, 131, 132, 10, 23, 27, 136, 137, 138, 139, 140, 5, 6, 7, - 144, 145, 22, 147, 148, 149, 150, 4, 152, 153, 154, 155, 20, 21, 158, 26, - 32, 160, 226, 228, 224, 225, 227, 229, 231, 241, 162, 46, 60, 40, 43, 124, - 38, 233, 234, 235, 232, 237, 238, 239, 236, 223, 33, 36, 42, 41, 59, 172, - 45, 47, 194, 196, 192, 193, 195, 197, 199, 209, 166, 44, 37, 95, 62, 63, - 248, 201, 202, 203, 200, 205, 206, 207, 204, 96, 58, 35, 64, 39, 61, 34, - 216, 97, 98, 99, 100, 101, 102, 103, 104, 105, 171, 187, 240, 253, 254, 177, - 176, 106, 107, 108, 109, 110, 111, 112, 113, 114, 170, 186, 230, 184, 198, 164, - 181, 126, 115, 116, 117, 118, 119, 120, 121, 122, 161, 191, 208, 221, 222, 174, - 94, 163, 165, 183, 169, 167, 182, 188, 189, 190, 91, 93, 175, 168, 180, 215, - 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 173, 244, 246, 242, 243, 245, - 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, 185, 251, 252, 249, 250, 255, - 92, 247, 83, 84, 85, 86, 87, 88, 89, 90, 178, 212, 214, 210, 211, 213, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 179, 219, 220, 217, 218, 159 -}; - -/* ascToString conversion table generated by ascii 819 -> ebcdic 37 */ -const char ASCIItoEBCDIC[256] = { -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, - 64, 90, 127, 123, 91, 108, 80, 125, 77, 93, 92, 78, 107, 96, 75, 97, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 122, 94, 76, 126, 110, 111, - 124, 193, 194, 195, 196, 197, 198, 199, 200, 201, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 226, 227, 228, 229, 230, 231, 232, 233, 186, 224, 187, 176, 109, - 121, 129, 130, 131, 132, 133, 134, 135, 136, 137, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 192, 79, 208, 161, 7, - 32, 33, 34, 35, 36, 21, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27, - 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62, 255, - 65, 170, 74, 177, 159, 178, 106, 181, 189, 180, 154, 138, 95, 202, 175, 188, - 144, 143, 234, 250, 190, 160, 182, 179, 157, 218, 155, 139, 183, 184, 185, 171, - 100, 101, 98, 102, 99, 103, 158, 104, 116, 113, 114, 115, 120, 117, 118, 119, - 172, 105, 237, 238, 235, 239, 236, 191, 128, 253, 254, 251, 252, 173, 174, 89, - 68, 69, 66, 70, 67, 71, 156, 72, 84, 81, 82, 83, 88, 85, 86, 87, - 140, 73, 205, 206, 203, 207, 204, 225, 112, 221, 222, 219, 220, 141, 142, 223 -}; - - -/* converts an existing non constant character buffer from Ebcdic ( 37 ) */ -/* to Ascii ( 819 ). */ -char* strtoasc( char *string ) -{ - char* pch = string; - if( string == NULL ) return NULL; - - /* while not EOL... */ - while( *pch != (char)0 ) - { - *pch = EBCDICtoASCII[*pch]; - pch++; - } - return string; -} -char* buftoasc( char *b, int len ) -{ - char* pch = b; - if( b == NULL ) return NULL; - - /* while not EOL... */ - while( len > 0 ) - { - *pch = EBCDICtoASCII[*pch]; - pch++;len--; - } - return b; -} - -/* converts an existing non-constant character buffer from ASCII ( 819 ) */ -/* to EBCDIC ( 37 ). */ -char* asctostr( char *string ) -{ - char* pch = string; - if( string == NULL ) return NULL; - - /* while not EOL... */ - while( *pch != (char)0 ) - { - *pch = ASCIItoEBCDIC[*pch]; - pch++; - } - return string; -} -char* asctobuf( char *b, int len ) -{ - char* pch = b; - if( b == NULL ) return NULL; - - /* while not EOL... */ - while( len > 0 ) - { - *pch = ASCIItoEBCDIC[*pch]; - pch++;len--; - } - return b; -} - - -char PLATFORM_DOUBLE_QUOTE_S[] = "\""; -char PLATFORM_DOUBLE_QUOTE_C = '\"'; -char PLATFORM_XML_ENTITY_REFERENCE_CHARS_S[] = "<>&\"\'"; - -static int initializePlatform(void) -{ - char *language= "En_US"; - char langID[3] = {'E' , 'N' , 'U'}; - int jobCCSID = 37; - - int rc = retrieveJobCcsid(&jobCCSID, langID); - if (rc == 0) - { - // double quote character is not invariant when running - // turkish ccsid (1026). That is, the hexadecimal value - // of double quote is different than when running in - // any other language. So use correct double quote character. - if (jobCCSID == 1026) - { - strcpy(PLATFORM_DOUBLE_QUOTE_S, "\xFC"); - PLATFORM_DOUBLE_QUOTE_C = '\xFC'; - strcpy(PLATFORM_XML_ENTITY_REFERENCE_CHARS_S, "<>&\xFC\'"); - } - } - - return rc; -} - -// TODO-AMRA static int platformRc = initializePlatform(); - - +/* + * Copyright 2004-2004 The Apache Software Foundation. +// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "platforms/axutil_platform_auto_sense.h" + +#include +#include +#include +#include // Qus_EC_t +#include // rslvsp() +#include // _AUTH_EXECUTE +#include // QleActBndPgm(), QleGetExp() +#include // Qp0lCvtPathToQSYSObjName() +#include // readlink() +#include +#include +#include // Retrieve job's ccsid API prototype + + + +/**********************************************************************/ +/* Function: */ +/* retrieveJobCcsid */ +/* Description: */ +/* Retrieves the ccsid of the current job. */ +/* If the current job's ccsid is 65535, the job's default ccsid is */ +/* returned. */ +/* If the ccsid cannot be retrieved (error occurs), -1 is returned. */ +/* Return: */ +/* int status of call. if 0, success; -1 failure. */ +/**********************************************************************/ + +#define RTV_CCSID_ATTR_LEN 512 + +static int retrieveJobCcsid(int *ccsid, char *langID) +{ + char receiverVariable[RTV_CCSID_ATTR_LEN]; + char format[8] = {'R', 'T', 'V', 'C', '0', '1', '0', '0'}; + int numberOfAttributes = 3; + int attributeKeys[3] = {QWCA_KEY_CCSID, QWCA_KEY_DEFAULTCCSID, QWCA_KEY_LANGID}; + Qwc_RTVC_Attribute_Data_t *attribute; + int defaultCcsid; + char errorCode[8]; + int i; + memset(errorCode, 0x00, sizeof(errorCode)); + +#pragma exception_handler(RetrieveJobCcsidError,0,_C1_ALL,_C2_ALL,_CTLA_HANDLE) + QWCRTVCA(receiverVariable,RTV_CCSID_ATTR_LEN,format,numberOfAttributes,attributeKeys,&errorCode); +#pragma disable_handler + if (((Qwc_RTVC0100_t *)receiverVariable)->Number_Fields_Rtnd != 3) + { + /* Unable to retrieve the ccsid information */ + return -1; + } + /* Retrieved ccsid, default CCSID and language ID */ + attribute = (Qwc_RTVC_Attribute_Data_t *)(receiverVariable + sizeof(int)); + for (i=0; i < 3; i++) + { + if (attribute->Key_Field == QWCA_KEY_CCSID) + *ccsid = *(int *)((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)); + else if (attribute->Key_Field == QWCA_KEY_DEFAULTCCSID) + defaultCcsid = *(int *)((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)); + else + strncpy(langID, ((char *)attribute + sizeof(Qwc_RTVC_Attribute_Data_t)), 3); + attribute = (Qwc_RTVC_Attribute_Data_t *)((char *)attribute + attribute->Length_Field_Info_Rtnd); + } + if (*ccsid == 65535) + *ccsid = defaultCcsid; + + return 0; + + RetrieveJobCcsidError: + return -1; +} + + +typedef int HMODULE; + +static char *dlErrorMessage = NULL; + +/* + * ========================================== + * dlopen() + * Gain access to an executable object file. + * ========================================== + */ +void * os400_dlopen(const char *file) +{ + Qus_EC_t err = { sizeof(err), 0}; + int rc; + char dllPath[4*1024+1]; + char *fp; + char pathNameBuffer[8*1024]; + Qlg_Path_Name_T *pathName; + Qp0l_QSYS_Info_t qsys_info; + char objectName[11]; + char objectLibrary[11]; + _SYSPTR sysP; + _OBJ_TYPE_T objectType; + HMODULE handle; + int actInfoLen; + Qle_ABP_Info_t activationInfo; + void *returnHandle; + + dlErrorMessage = NULL; + + // Assume symbolic link, if error, assume actual path + + memset(dllPath, 0x00, 4*1024+1); + rc = readlink ( file , dllPath, 4*1024); + if (rc == -1) + strcpy(dllPath, file); + + // Uppercase file + fp = dllPath; + while (*fp++) *fp = toupper(*fp); + + // Parse the path to its QSYS.LIB file system name: library and service program. + + pathName = (Qlg_Path_Name_T *)pathNameBuffer; + + memset(pathNameBuffer, 0x00, sizeof (pathNameBuffer)); + pathName->Path_Length = strlen(dllPath); + memcpy( &(((char *) pathName)[sizeof(Qlg_Path_Name_T)]), dllPath, pathName->Path_Length); + pathName->Path_Name_Delimiter[0] = '/'; + + Qp0lCvtPathToQSYSObjName(pathName,&qsys_info,"QSYS0100",sizeof(Qp0l_QSYS_Info_t), 0, &err); + + if (err.Bytes_Available) + { + dlErrorMessage = "Path to shared library not valid."; + return NULL; + } + + // blank pad object name and library in order to use on rslvsp(). + + sprintf(objectName, "%-10.10s", qsys_info.Obj_Name); + sprintf(objectLibrary,"%-10.10s", qsys_info.Lib_Name); + +#pragma exception_handler (LBL_RSLV_EH, 0,_C1_ALL,_C2_MH_ESCAPE |_C2_MH_FUNCTION_CHECK, _CTLA_HANDLE) + + // Resolve pointer to DLL. + objectType = WLI_SRVPGM; + sysP = rslvsp(objectType,objectName, objectLibrary,_AUTH_EXECUTE); + +#pragma disable_handler + + // We got a pointer to the DLL. Activate it (i.e. load it). + actInfoLen = sizeof(activationInfo); + QleActBndPgm (&sysP,&handle,&activationInfo,&actInfoLen,&err); + if (err.Bytes_Available) + { + dlErrorMessage = "Unable to activate shared library."; + return NULL; + } + + // Return the dlopen object. + returnHandle = malloc(sizeof(HMODULE)); + memcpy(returnHandle, &handle, sizeof(HMODULE)); + return returnHandle; + + LBL_RSLV_EH: + dlErrorMessage = "Unable to resolve to shared library."; + return NULL; +} + +/* + * dlsym() + * Obtain the address to symbol from a dlopen() object. + */ +void * os400_dlsym(void *handle, const char * name) +{ + void *symbolAddress = NULL; + int exportType; + + Qus_EC_t err = {sizeof(err),0 }; + dlErrorMessage = NULL; + +#pragma exception_handler (LBL_RSLV_EH, 0,_C1_ALL,_C2_MH_ESCAPE |_C2_MH_FUNCTION_CHECK, _CTLA_HANDLE) + + // Get the function pointer. + // Export type of 1 means that that the pointer is to a procedure. + + QleGetExp ((int *)handle,0,0,(char *)name,&symbolAddress,&exportType,&err); + if (err.Bytes_Available) + { + dlErrorMessage = "Unable to resolve to procedure in shared library."; + return NULL; + } + + return symbolAddress; + +#pragma disable_handler + + LBL_RSLV_EH: + dlErrorMessage = "Unable to resolve to procedure in shared library."; + return NULL; +} + + +/* + * ========================================== + * dlclose() + * Close a dlopen() object. + * ========================================== + */ +int os400_dlclose(void *handle) +{ + dlErrorMessage = NULL; + *(int *)handle = -1; + free(handle); + return 0; +} + +/* + * ========================================== + * dlclose() + * Close a dlopen() object. + * ========================================== + */ +char * os400_dlerror() +{ + char *retError = dlErrorMessage; + dlErrorMessage = NULL; + return retError; +} + +/* ---------------------------------------------------------------------------------*/ +/* ---------------------------------------------------------------------------------*/ +/* Below are routines to handle conversion between ascii and ebcdic */ +/* */ +/* The tables below are used to translate single byte data, and should never */ +/* be used to translate data that is not single byte. */ +/* ---------------------------------------------------------------------------------*/ +/* ---------------------------------------------------------------------------------*/ + + +/* constToAsc conversion table generated by ebcdic 37 -> ascii 819 */ +const char EBCDICtoASCII[256] = { +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 0, 1, 2, 3, 156, 9, 134, 127, 151, 141, 142, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 157, 133, 8, 135, 24, 25, 146, 143, 28, 29, 30, 31, + 128, 129, 130, 131, 132, 10, 23, 27, 136, 137, 138, 139, 140, 5, 6, 7, + 144, 145, 22, 147, 148, 149, 150, 4, 152, 153, 154, 155, 20, 21, 158, 26, + 32, 160, 226, 228, 224, 225, 227, 229, 231, 241, 162, 46, 60, 40, 43, 124, + 38, 233, 234, 235, 232, 237, 238, 239, 236, 223, 33, 36, 42, 41, 59, 172, + 45, 47, 194, 196, 192, 193, 195, 197, 199, 209, 166, 44, 37, 95, 62, 63, + 248, 201, 202, 203, 200, 205, 206, 207, 204, 96, 58, 35, 64, 39, 61, 34, + 216, 97, 98, 99, 100, 101, 102, 103, 104, 105, 171, 187, 240, 253, 254, 177, + 176, 106, 107, 108, 109, 110, 111, 112, 113, 114, 170, 186, 230, 184, 198, 164, + 181, 126, 115, 116, 117, 118, 119, 120, 121, 122, 161, 191, 208, 221, 222, 174, + 94, 163, 165, 183, 169, 167, 182, 188, 189, 190, 91, 93, 175, 168, 180, 215, + 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 173, 244, 246, 242, 243, 245, + 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, 185, 251, 252, 249, 250, 255, + 92, 247, 83, 84, 85, 86, 87, 88, 89, 90, 178, 212, 214, 210, 211, 213, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 179, 219, 220, 217, 218, 159 +}; + +/* ascToString conversion table generated by ascii 819 -> ebcdic 37 */ +const char ASCIItoEBCDIC[256] = { +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, + 64, 90, 127, 123, 91, 108, 80, 125, 77, 93, 92, 78, 107, 96, 75, 97, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 122, 94, 76, 126, 110, 111, + 124, 193, 194, 195, 196, 197, 198, 199, 200, 201, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 226, 227, 228, 229, 230, 231, 232, 233, 186, 224, 187, 176, 109, + 121, 129, 130, 131, 132, 133, 134, 135, 136, 137, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 192, 79, 208, 161, 7, + 32, 33, 34, 35, 36, 21, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27, + 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62, 255, + 65, 170, 74, 177, 159, 178, 106, 181, 189, 180, 154, 138, 95, 202, 175, 188, + 144, 143, 234, 250, 190, 160, 182, 179, 157, 218, 155, 139, 183, 184, 185, 171, + 100, 101, 98, 102, 99, 103, 158, 104, 116, 113, 114, 115, 120, 117, 118, 119, + 172, 105, 237, 238, 235, 239, 236, 191, 128, 253, 254, 251, 252, 173, 174, 89, + 68, 69, 66, 70, 67, 71, 156, 72, 84, 81, 82, 83, 88, 85, 86, 87, + 140, 73, 205, 206, 203, 207, 204, 225, 112, 221, 222, 219, 220, 141, 142, 223 +}; + + +/* converts an existing non constant character buffer from Ebcdic ( 37 ) */ +/* to Ascii ( 819 ). */ +char* strtoasc( char *string ) +{ + char* pch = string; + if( string == NULL ) return NULL; + + /* while not EOL... */ + while( *pch != (char)0 ) + { + *pch = EBCDICtoASCII[*pch]; + pch++; + } + return string; +} +char* buftoasc( char *b, int len ) +{ + char* pch = b; + if( b == NULL ) return NULL; + + /* while not EOL... */ + while( len > 0 ) + { + *pch = EBCDICtoASCII[*pch]; + pch++;len--; + } + return b; +} + +/* converts an existing non-constant character buffer from ASCII ( 819 ) */ +/* to EBCDIC ( 37 ). */ +char* asctostr( char *string ) +{ + char* pch = string; + if( string == NULL ) return NULL; + + /* while not EOL... */ + while( *pch != (char)0 ) + { + *pch = ASCIItoEBCDIC[*pch]; + pch++; + } + return string; +} +char* asctobuf( char *b, int len ) +{ + char* pch = b; + if( b == NULL ) return NULL; + + /* while not EOL... */ + while( len > 0 ) + { + *pch = ASCIItoEBCDIC[*pch]; + pch++;len--; + } + return b; +} + + +char PLATFORM_DOUBLE_QUOTE_S[] = "\""; +char PLATFORM_DOUBLE_QUOTE_C = '\"'; +char PLATFORM_XML_ENTITY_REFERENCE_CHARS_S[] = "<>&\"\'"; + +static int initializePlatform(void) +{ + char *language= "En_US"; + char langID[3] = {'E' , 'N' , 'U'}; + int jobCCSID = 37; + + int rc = retrieveJobCcsid(&jobCCSID, langID); + if (rc == 0) + { + // double quote character is not invariant when running + // turkish ccsid (1026). That is, the hexadecimal value + // of double quote is different than when running in + // any other language. So use correct double quote character. + if (jobCCSID == 1026) + { + strcpy(PLATFORM_DOUBLE_QUOTE_S, "\xFC"); + PLATFORM_DOUBLE_QUOTE_C = '\xFC'; + strcpy(PLATFORM_XML_ENTITY_REFERENCE_CHARS_S, "<>&\xFC\'"); + } + } + + return rc; +} + +// TODO-AMRA static int platformRc = initializePlatform(); + + int os400_alphasort( const struct dirent **__d1, diff --git a/util/src/platforms/windows/axutil_windows.c b/util/src/platforms/windows/axutil_windows.c index e2abb5d..5e37abb 100644 --- a/util/src/platforms/windows/axutil_windows.c +++ b/util/src/platforms/windows/axutil_windows.c @@ -1,93 +1,93 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - - -/* - -std::string* getPlatformErrorMessage(long errorNumber) -{ - std::string* returningString = new std::string(); - LPVOID lpMsgBuf; - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errorNumber, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ); - - returningString->append((LPTSTR)lpMsgBuf); - LocalFree(lpMsgBuf); - - return returningString; -} - */ -AXIS2_EXTERN HMODULE AXIS2_CALL -callLoadLib( - char *lib) -{ - /* Disable display of the critical-error-handler message box */ - SetErrorMode(SEM_FAILCRITICALERRORS); - return LoadLibraryEx(lib, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); -} - -AXIS2_EXTERN struct tm *AXIS2_CALL -axis2_win_gmtime( - const time_t * timep, - struct tm *result) -{ - return gmtime(timep); -} - -AXIS2_EXTERN void AXIS2_CALL -axutil_win32_get_last_error( - axis2_char_t *buf, - unsigned int buf_size) -{ - LPVOID lpMsgBuf; - int rc = GetLastError(); - sprintf(buf, "DLL Load Error %d: ", rc); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, rc, 0, - (LPTSTR) & lpMsgBuf, 0, NULL); - if(lpMsgBuf) - { - strncat(buf, (char*)lpMsgBuf, buf_size - strlen(buf) - 1); - } - LocalFree(lpMsgBuf); -} - -AXIS2_EXTERN void AXIS2_CALL -axutil_win32_get_last_wsa_error( - axis2_char_t *buf, - unsigned int buf_size) -{ - LPVOID lpMsgBuf; - int rc = WSAGetLastError(); - sprintf(buf, "Winsock error %d: ", rc); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, rc, 0, - (LPTSTR) & lpMsgBuf, 0, NULL); - if(lpMsgBuf) - { - strncat(buf, (char*)lpMsgBuf, buf_size - strlen(buf) - 1); - } - LocalFree(lpMsgBuf); -} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + + +/* + +std::string* getPlatformErrorMessage(long errorNumber) +{ + std::string* returningString = new std::string(); + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errorNumber, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, NULL ); + + returningString->append((LPTSTR)lpMsgBuf); + LocalFree(lpMsgBuf); + + return returningString; +} + */ +AXIS2_EXTERN HMODULE AXIS2_CALL +callLoadLib( + char *lib) +{ + /* Disable display of the critical-error-handler message box */ + SetErrorMode(SEM_FAILCRITICALERRORS); + return LoadLibraryEx(lib, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); +} + +AXIS2_EXTERN struct tm *AXIS2_CALL +axis2_win_gmtime( + const time_t * timep, + struct tm *result) +{ + return gmtime(timep); +} + +AXIS2_EXTERN void AXIS2_CALL +axutil_win32_get_last_error( + axis2_char_t *buf, + unsigned int buf_size) +{ + LPVOID lpMsgBuf; + int rc = GetLastError(); + sprintf(buf, "DLL Load Error %d: ", rc); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, rc, 0, + (LPTSTR) & lpMsgBuf, 0, NULL); + if(lpMsgBuf) + { + strncat(buf, (char*)lpMsgBuf, buf_size - strlen(buf) - 1); + } + LocalFree(lpMsgBuf); +} + +AXIS2_EXTERN void AXIS2_CALL +axutil_win32_get_last_wsa_error( + axis2_char_t *buf, + unsigned int buf_size) +{ + LPVOID lpMsgBuf; + int rc = WSAGetLastError(); + sprintf(buf, "Winsock error %d: ", rc); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, rc, 0, + (LPTSTR) & lpMsgBuf, 0, NULL); + if(lpMsgBuf) + { + strncat(buf, (char*)lpMsgBuf, buf_size - strlen(buf) - 1); + } + LocalFree(lpMsgBuf); +} -- cgit v1.1-32-gdbae