Classes | |
| struct | If_Then_Else< true, Ta, Tb > |
| struct | If_Then_Else< false, Ta, Tb > |
| struct | VP_traits |
Value_Ptr traits template structure. More... | |
| class | Value_Ptr |
| Smart pointer implementation designed for use as a class member. More... | |
| struct | If_Then_Else |
| Compile-time selection of type based on a boolean value. More... | |
I/O operations | |
| Notes on common parameters: handle is the connected endpoint that will be used for I/O. buf is the buffer to write from or receive into. len is the number of bytes to transfer.
The timeout parameter in the following methods indicates how long to blocking trying to transfer data. If timeout == 0, then the call behaves as a normal send/recv call, i.e., for blocking sockets, the call will block until action is possible; for non-blocking sockets, If timeout != 0, the call will wait until the relative time specified in *timeout elapses.
The "_n()" I/O methods keep looping until all the data has been transferred. These methods also work for sockets in non-blocking mode i.e., they keep looping on The return values for the "*_n()" methods match the return values from the non "_n()" methods and are specified as follows:
On partial transfers, i.e., if any data is transferred before timeout / error / Methods with iovec parameter are I/O vector variants of the I/O operations.
Methods with the extra flags argument will always result in | |
| ACE_Export ssize_t | recv (ACE_HANDLE handle, void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | t_rcv (ACE_HANDLE handle, void *buf, size_t len, int *flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | recv (ACE_HANDLE handle, void *buf, size_t len, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | recvmsg (ACE_HANDLE handle, struct msghdr *msg, int flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | recvfrom (ACE_HANDLE handle, char *buf, int len, int flags, struct sockaddr *addr, int *addrlen, const ACE_Time_Value *timeout=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | recv_n (ACE_HANDLE handle, void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | t_rcv_n (ACE_HANDLE handle, void *buf, size_t len, int *flags, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | recv_n (ACE_HANDLE handle, void *buf, size_t len, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | recv (ACE_HANDLE handle, size_t n,...) |
| Receive into a variable number of pieces. | |
| ACE_Export ssize_t | recvv (ACE_HANDLE handle, iovec *iov, int iovcnt, const ACE_Time_Value *timeout=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | recvv_n (ACE_HANDLE handle, iovec *iov, int iovcnt, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | recv_n (ACE_HANDLE handle, ACE_Message_Block *message_block, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | send (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | t_snd (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | send (ACE_HANDLE handle, const void *buf, size_t len, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | sendmsg (ACE_HANDLE handle, const struct msghdr *msg, int flags, const ACE_Time_Value *timeout=0) |
| ACE_Export ssize_t | sendto (ACE_HANDLE handle, const char *buf, int len, int flags, const struct sockaddr *addr, int addrlen, const ACE_Time_Value *timeout=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | send_n (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | t_snd_n (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | send_n (ACE_HANDLE handle, const void *buf, size_t len, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | send (ACE_HANDLE handle, size_t n,...) |
| Varargs variant. | |
| ACE_Export ssize_t | sendv (ACE_HANDLE handle, const iovec *iov, int iovcnt, const ACE_Time_Value *timeout=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | sendv_n (ACE_HANDLE handle, const iovec *iov, int iovcnt, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | send_n (ACE_HANDLE handle, const ACE_Message_Block *message_block, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | read_n (ACE_HANDLE handle, void *buf, size_t len, size_t *bytes_transferred=0) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | write_n (ACE_HANDLE handle, const void *buf, size_t len, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | write_n (ACE_HANDLE handle, const ACE_Message_Block *message_block, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | readv_n (ACE_HANDLE handle, iovec *iov, int iovcnt, size_t *bytes_transferred=0) |
| ACE_Export ssize_t | writev_n (ACE_HANDLE handle, const iovec *iov, int iovcnt, size_t *bytes_transferred=0) |
Functions | |
| ACE_Export u_int | major_version (void) |
| e.g., the "5" in ACE 5.1.12. | |
| ACE_Export u_int | minor_version (void) |
| e.g., the "1" in ACE 5.1.12. | |
| ACE_Export u_int | beta_version (void) |
| ACE_Export const ACE_TCHAR * | compiler_name (void) |
| E.g., the "SunPro C++" in SunPro C++ 4.32.0. | |
| ACE_Export u_int | compiler_major_version (void) |
| E.g., the "4" in SunPro C++ 4.32.0. | |
| ACE_Export u_int | compiler_minor_version (void) |
| E.g., the "32" in SunPro C++ 4.32.0. | |
| ACE_Export u_int | compiler_beta_version (void) |
| E.g., the "0" in SunPro C++ 4.32.0. | |
| ACE_Export int | out_of_handles (int error) |
| ACE_Export bool | wild_match (const char *s, const char *pattern, bool case_sensitive=true) |
| ACE_Export int | handle_timed_accept (ACE_HANDLE listener, ACE_Time_Value *timeout, int restart) |
| ACE_Export ACE_HANDLE | handle_timed_complete (ACE_HANDLE listener, const ACE_Time_Value *timeout, int is_tli=0) |
| ACE_Export int | set_handle_limit (int new_limit=-1, int increase_limit_only=0) |
| ACE_Export int | max_handles (void) |
| ACE_Export ACE_TCHAR * | strenvdup (const ACE_TCHAR *str) |
| ACE_Export const char * | strend (const char *s) |
| ACE_Export char * | strnew (const char *s) |
| ACE_NAMESPACE_INLINE_FUNCTION void | strdelete (char *s) |
Delete the memory allocated by strnew. | |
| ACE_Export char * | strndup (const char *str, size_t n) |
| ACE_Export char * | strnnew (const char *str, size_t n) |
| ACE_Export const wchar_t * | strend (const wchar_t *s) |
| ACE_Export wchar_t * | strnew (const wchar_t *s) |
| ACE_NAMESPACE_INLINE_FUNCTION void | strdelete (wchar_t *s) |
| ACE_Export wchar_t * | strndup (const wchar_t *str, size_t n) |
| ACE_Export wchar_t * | strnnew (const wchar_t *str, size_t n) |
| ACE_Export const ACE_TCHAR * | execname (const ACE_TCHAR *pathname) |
| ACE_Export const ACE_TCHAR * | basename (const ACE_TCHAR *pathname, ACE_TCHAR delim=ACE_DIRECTORY_SEPARATOR_CHAR) |
| ACE_Export const ACE_TCHAR * | dirname (const ACE_TCHAR *pathname, ACE_TCHAR delim=ACE_DIRECTORY_SEPARATOR_CHAR) |
| ACE_Export ACE_TCHAR * | timestamp (ACE_TCHAR date_and_time[], int time_len, int return_pointer_to_first_digit=0) |
| ACE_Export pid_t | fork (const ACE_TCHAR *program_name=ACE_TEXT("< unknown >"), int avoid_zombies=0) |
| ACE_Export int | daemonize (const ACE_TCHAR pathname[]=ACE_TEXT("/"), bool close_all_handles=ACE_DEFAULT_CLOSE_ALL_HANDLES, const ACE_TCHAR program_name[]=ACE_TEXT("< unknown >")) |
| ACE_Export size_t | round_to_pagesize (size_t len) |
| Rounds the request to a multiple of the page size. | |
| ACE_Export size_t | round_to_allocation_granularity (size_t len) |
| Rounds the request to a multiple of the allocation granularity. | |
| ACE_Export size_t | format_hexdump (const char *buffer, size_t size, ACE_TCHAR *obuf, size_t obuf_sz) |
| ACE_Export u_long | hash_pjw (const char *str) |
| Computes the hash value of {str} using the "Hash PJW" routine. | |
| ACE_Export u_long | hash_pjw (const char *str, size_t len) |
| Computes the hash value of {str} using the "Hash PJW" routine. | |
| ACE_Export u_long | hash_pjw (const wchar_t *str) |
| Computes the hash value of {str} using the "Hash PJW" routine. | |
| ACE_Export u_long | hash_pjw (const wchar_t *str, size_t len) |
| Computes the hash value of {str} using the "Hash PJW" routine. | |
| ACE_Export ACE_UINT16 | crc_ccitt (const char *str) |
| Computes CRC-CCITT for the string. | |
| ACE_Export ACE_UINT16 | crc_ccitt (const void *buf, size_t len, ACE_UINT16 crc=0) |
| Computes CRC-CCITT for the buffer. | |
| ACE_Export ACE_UINT16 | crc_ccitt (const iovec *iov, int len, ACE_UINT16 crc=0) |
| Computes CRC-CCITT for the @ len iovec buffers. | |
| ACE_Export ACE_UINT32 | crc32 (const char *str) |
| Computes the ISO 8802-3 standard 32 bits CRC for the string. | |
| ACE_Export ACE_UINT32 | crc32 (const void *buf, size_t len, ACE_UINT32 crc=0) |
| Computes the ISO 8802-3 standard 32 bits CRC for the buffer. | |
| ACE_Export ACE_UINT32 | crc32 (const iovec *iov, int len, ACE_UINT32 crc=0) |
| ACE_Export u_long | gcd (u_long x, u_long y) |
| Euclid's greatest common divisor algorithm. | |
| ACE_Export u_long | minimum_frame_size (u_long period1, u_long period2) |
| Calculates the minimum enclosing frame size for the given values. | |
| ACE_Export u_long | is_prime (const u_long n, const u_long min_factor, const u_long max_factor) |
| ACE_Export int | map_errno (int error) |
| ACE_Export const ACE_TCHAR * | sock_error (int error) |
| ACE_Export bool | is_sock_error (int error) |
| ACE_Export int | process_active (pid_t pid) |
| ACE_Export int | terminate_process (pid_t pid) |
| ACE_NAMESPACE_INLINE_FUNCTION void | unique_name (const void *object, ACE_TCHAR *name, size_t length) |
| ACE_NAMESPACE_INLINE_FUNCTION u_long | log2 (u_long num) |
| Computes the base 2 logarithm of {num}. | |
| ACE_NAMESPACE_INLINE_FUNCTION ACE_TCHAR | nibble2hex (u_int n) |
| Hex conversion utility. | |
| ACE_NAMESPACE_INLINE_FUNCTION u_char | hex2byte (ACE_TCHAR c) |
| Convert a hex character to its byte representation. | |
| ACE_Export bool | debug (void) |
| ACE_Export void | debug (bool onoff) |
| ACE_Export int | select (int width, ACE_Handle_Set *readfds, ACE_Handle_Set *writefds=0, ACE_Handle_Set *exceptfds=0, const ACE_Time_Value *timeout=0) |
Wrapper facade for select that uses ACE_Handle_Sets. | |
| ACE_Export int | select (int width, ACE_Handle_Set &readfds, const ACE_Time_Value *timeout=0) |
| ACE_NAMESPACE_INLINE_FUNCTION int | handle_read_ready (ACE_HANDLE handle, const ACE_Time_Value *timeout) |
| Timed wait for handle to get read ready. | |
| ACE_NAMESPACE_INLINE_FUNCTION int | handle_write_ready (ACE_HANDLE handle, const ACE_Time_Value *timeout) |
| Timed wait for handle to get write ready. | |
| ACE_NAMESPACE_INLINE_FUNCTION int | handle_exception_ready (ACE_HANDLE handle, const ACE_Time_Value *timeout) |
| Timed wait for handle to get exception ready. | |
| ACE_Export int | handle_ready (ACE_HANDLE handle, const ACE_Time_Value *timeout, int read_ready, int write_ready, int exception_ready) |
| Timed wait for handle to get read, write, or exception ready. | |
| ACE_Export int | enter_recv_timedwait (ACE_HANDLE handle, const ACE_Time_Value *timeout, int &val) |
| ACE_Export int | enter_send_timedwait (ACE_HANDLE handle, const ACE_Time_Value *timeout, int &val) |
| ACE_Export void | record_and_set_non_blocking_mode (ACE_HANDLE handle, int &val) |
| ACE_Export void | restore_non_blocking_mode (ACE_HANDLE handle, int val) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | recv_i (ACE_HANDLE handle, void *buf, size_t len) |
| ACE_Export ssize_t | recv_n_i (ACE_HANDLE handle, void *buf, size_t len, int flags, size_t *bytes_transferred) |
| ACE_Export ssize_t | recv_n_i (ACE_HANDLE handle, void *buf, size_t len, int flags, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | t_rcv_n_i (ACE_HANDLE handle, void *buf, size_t len, int *flags, size_t *bytes_transferred) |
| ACE_Export ssize_t | t_rcv_n_i (ACE_HANDLE handle, void *buf, size_t len, int *flags, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | recv_n_i (ACE_HANDLE handle, void *buf, size_t len, size_t *bytes_transferred) |
| ACE_Export ssize_t | recv_n_i (ACE_HANDLE handle, void *buf, size_t len, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | recvv_n_i (ACE_HANDLE handle, iovec *iov, int iovcnt, size_t *bytes_transferred) |
| ACE_Export ssize_t | recvv_n_i (ACE_HANDLE handle, iovec *iov, int iovcnt, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_NAMESPACE_INLINE_FUNCTION ssize_t | send_i (ACE_HANDLE handle, const void *buf, size_t len) |
| ACE_Export ssize_t | send_n_i (ACE_HANDLE handle, const void *buf, size_t len, int flags, size_t *bytes_transferred) |
| ACE_Export ssize_t | send_n_i (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | t_snd_n_i (ACE_HANDLE handle, const void *buf, size_t len, int flags, size_t *bytes_transferred) |
| ACE_Export ssize_t | t_snd_n_i (ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | send_n_i (ACE_HANDLE handle, const void *buf, size_t len, size_t *bytes_transferred) |
| ACE_Export ssize_t | send_n_i (ACE_HANDLE handle, const void *buf, size_t len, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export ssize_t | sendv_n_i (ACE_HANDLE handle, const iovec *iov, int iovcnt, size_t *bytes_transferred) |
| ACE_Export ssize_t | sendv_n_i (ACE_HANDLE handle, const iovec *iov, int iovcnt, const ACE_Time_Value *timeout, size_t *bytes_transferred) |
| ACE_Export int | set_flags (ACE_HANDLE handle, int flags) |
| Set flags associated with handle. | |
| ACE_Export int | clr_flags (ACE_HANDLE handle, int flags) |
| Clear flags associated with handle. | |
| ACE_NAMESPACE_INLINE_FUNCTION int | get_flags (ACE_HANDLE handle) |
| Return the current setting of flags associated with handle. | |
| ACE_Export ACE_HANDLE | handle_timed_open (ACE_Time_Value *timeout, const ACE_TCHAR *name, int flags, int perms, LPSECURITY_ATTRIBUTES sa=0) |
| ACE_Export int | init (void) |
| ACE_Export int | fini (void) |
| ACE_Export int | ldfind (const ACE_TCHAR *filename, ACE_TCHAR pathname[], size_t maxpathnamelen) |
| ACE_Export FILE * | ldopen (const ACE_TCHAR *filename, const ACE_TCHAR *type) |
| ACE_Export ACE_TCHAR * | ldname (const ACE_TCHAR *entry_point) |
| ACE_Export int | get_temp_dir (ACE_TCHAR *buffer, size_t buffer_len) |
| ACE_Export ACE_HANDLE | open_temp_file (const ACE_TCHAR *name, int mode, int perm=0) |
| ACE_Export size_t | strrepl (char *s, char search, char replace) |
| ACE_Export char * | strsplit_r (char *s, const char *token, char *&next_start) |
| ACE_Export size_t | strrepl (wchar_t *s, wchar_t search, wchar_t replace) |
| As strrepl, but for wide characters. | |
| ACE_Export wchar_t * | strsplit_r (wchar_t *s, const wchar_t *token, wchar_t *&next_start) |
| As strsplit_r, but for wide characters. | |
| ACE_Export int | bind_port (ACE_HANDLE handle, ACE_UINT32 ip_addr=INADDR_ANY, int address_family=AF_UNSPEC) |
| Bind a new unused port to handle. | |
| ACE_Export int | get_bcast_addr (ACE_UINT32 &bcast_addr, const ACE_TCHAR *hostname=0, ACE_UINT32 host_addr=0, ACE_HANDLE handle=ACE_INVALID_HANDLE) |
| ACE_Export int | get_fqdn (ACE_INET_Addr const &addr, char hostname[], size_t len) |
| Get fully qualified host/domain name. | |
| ACE_Export int | get_ip_interfaces (size_t &count, ACE_INET_Addr *&addr_array) |
| ACE_Export int | count_interfaces (ACE_HANDLE handle, size_t &how_many) |
| ACE_Export ACE_HANDLE | get_handle (void) |
| ACE_Export bool | ipv4_enabled (void) |
| ACE_Export int | ipv6_enabled (void) |
Variables | |
| size_t | allocation_granularity_ = 0 |
| size_t | pagesize_ = 0 |
| char | debug_ |
| unsigned int | init_fini_count_ = 0 |
The ACE namespace contains all types (classes, structures, typedefs, etc), and global functions and variables in the ACE framework.
|
||||||||||||
|
Returns the "basename" of a pathname separated by delim. For instance, the basename of "/tmp/foo.cpp" is "foo.cpp" when delim is '/'. Definition at line 406 of file ACE.cpp. References ACE_TCHAR, ACE_TRACE, and ACE_OS::strrchr(). Referenced by ACE_Name_Options::process_name().
00407 {
00408 ACE_TRACE ("ACE::basename");
00409 const ACE_TCHAR *temp = ACE_OS::strrchr (pathname, delim);
00410
00411 if (temp == 0)
00412 return pathname;
00413 else
00414 return temp + 1;
00415 }
|
|
|
e.g., the "12" in ACE 5.1.12. Returns 0 for "stable" (non-beta) releases. Definition at line 119 of file ACE.cpp. References ACE_BETA_VERSION.
00120 {
00121 return ACE_BETA_VERSION;
00122 }
|
|
||||||||||||||||
|
Bind a new unused port to handle.
Definition at line 170 of file Sock_Connect.cpp. References ACE_INET_Addr, ACE_MAX_DEFAULT_PORT, ACE_TRACE, ACE_OS::bind(), EADDRINUSE, ACE_INET_Addr::get_addr(), ACE_Addr::get_size(), INADDR_ANY, IPPORT_RESERVED, and ACE_INET_Addr::set(). Referenced by ACE_SOCK_CODgram::open(), ACE_SOCK_SEQPACK_Acceptor::shared_open(), ACE_SOCK_Dgram::shared_open(), and ACE_SOCK_Acceptor::shared_open().
00171 {
00172 ACE_TRACE ("ACE::bind_port");
00173
00174 ACE_INET_Addr addr;
00175
00176 #if defined (ACE_HAS_IPV6)
00177 if (address_family != PF_INET6)
00178 // What do we do if it is PF_"INET6? Since it's 4 bytes, it must be an
00179 // IPV4 address. Is there a difference? Why is this test done? dhinton
00180 #else /* ACE_HAS_IPV6 */
00181 ACE_UNUSED_ARG (address_family);
00182 #endif /* !ACE_HAS_IPV6 */
00183 addr = ACE_INET_Addr ((u_short)0, ip_addr);
00184 #if defined (ACE_HAS_IPV6)
00185 else if (ip_addr != INADDR_ANY)
00186 // address_family == PF_INET6 and a non default IP address means to bind
00187 // to the IPv4-mapped IPv6 address
00188 addr.set ((u_short)0, ip_addr, 1, 1);
00189 #endif /* ACE_HAS_IPV6 */
00190
00191 #if !defined (ACE_LACKS_WILDCARD_BIND)
00192 // The OS kernel should select a free port for us.
00193 return ACE_OS::bind (handle,
00194 (sockaddr*)addr.get_addr(),
00195 addr.get_size());
00196 #else
00197 static u_short upper_limit = ACE_MAX_DEFAULT_PORT;
00198 int round_trip = upper_limit;
00199 int lower_limit = IPPORT_RESERVED;
00200
00201 // We have to select the port explicitly.
00202
00203 for (;;)
00204 {
00205 addr.set((u_short)upper_limit,ip_addr);
00206
00207 if (ACE_OS::bind (handle,
00208 (sockaddr*)addr.get_addr()
00209 addr.get_size()) >= 0)
00210 {
00211 #if defined (ACE_WIN32)
00212 upper_limit--;
00213 #endif /* ACE_WIN32 */
00214 return 0;
00215 }
00216 else if (errno != EADDRINUSE)
00217 return -1;
00218 else
00219 {
00220 upper_limit--;
00221
00222 // Wrap back around when we reach the bottom.
00223 if (upper_limit <= lower_limit)
00224 upper_limit = ACE_MAX_DEFAULT_PORT;
00225
00226 // See if we have already gone around once!
00227 if (upper_limit == round_trip)
00228 {
00229 errno = EAGAIN;
00230 return -1;
00231 }
00232 }
00233 }
00234 #endif /* ACE_HAS_WILDCARD_BIND */
00235 }
|
|
||||||||||||
|
Clear flags associated with handle.
Definition at line 62 of file Flag_Manip.cpp. References ACE_CLR_BITS, ACE_NONBLOCK, ACE_NOTSUP_RETURN, ACE_TRACE, F_GETFL, ACE_OS::fcntl(), and ACE_OS::ioctl(). Referenced by ACE_IPC_SAP::disable(), ACE_IO_SAP::disable(), restore_non_blocking_mode(), ACE_SOCK_SEQPACK_Acceptor::shared_accept_finish(), ACE_SOCK_Acceptor::shared_accept_finish(), and ACE_MEM_Acceptor::shared_accept_finish().
00063 {
00064 ACE_TRACE ("ACE::clr_flags");
00065
00066 #if defined (ACE_LACKS_FCNTL)
00067 switch (flags)
00068 {
00069 case ACE_NONBLOCK:
00070 // nonblocking argument (1)
00071 // blocking: (0)
00072 {
00073 int nonblock = 0;
00074 return ACE_OS::ioctl (handle, FIONBIO, &nonblock);
00075 }
00076 default:
00077 ACE_NOTSUP_RETURN (-1);
00078 }
00079 #else
00080 int val = ACE_OS::fcntl (handle, F_GETFL, 0);
00081
00082 if (val == -1)
00083 return -1;
00084
00085 // Turn flags off.
00086 ACE_CLR_BITS (val, flags);
00087
00088 if (ACE_OS::fcntl (handle, F_SETFL, val) == -1)
00089 return -1;
00090 else
00091 return 0;
00092 #endif /* ACE_LACKS_FCNTL */
00093 }
|
|
|
E.g., the "0" in SunPro C++ 4.32.0.
Definition at line 155 of file ACE.cpp.
00156 {
00157 #ifdef ACE_CC_BETA_VERSION
00158 return ACE_CC_BETA_VERSION;
00159 #else
00160 return 0;
00161 #endif
00162 }
|
|
|
E.g., the "4" in SunPro C++ 4.32.0.
Definition at line 135 of file ACE.cpp.
00136 {
00137 #ifdef ACE_CC_MAJOR_VERSION
00138 return ACE_CC_MAJOR_VERSION;
00139 #else
00140 return 0;
00141 #endif
00142 }
|
|
|
E.g., the "32" in SunPro C++ 4.32.0.
Definition at line 145 of file ACE.cpp.
00146 {
00147 #ifdef ACE_CC_MINOR_VERSION
00148 return ACE_CC_MINOR_VERSION;
00149 #else
00150 return 0;
00151 #endif
00152 }
|
|
|
E.g., the "SunPro C++" in SunPro C++ 4.32.0.
Definition at line 125 of file ACE.cpp. References ACE_TEXT.
00126 {
00127 #ifdef ACE_CC_NAME
00128 return ACE_CC_NAME;
00129 #else
00130 return ACE_TEXT ("");
00131 #endif
00132 }
|
|
||||||||||||
|
Helper routine for get_ip_interfaces, differs by UNIX platform so put into own subroutine. perform some ioctls to retrieve ifconf list of ifreq structs. Definition at line 1444 of file Sock_Connect.cpp. References ACE_ERROR_RETURN, ACE_NOTSUP_RETURN, ACE_TEXT, AF_UNSPEC, caddr_t, ACE_OS::fclose(), ACE_OS::fopen(), ACE_OS::free(), ACE_OS::ioctl(), LM_ERROR, ACE_OS::malloc(), ACE_OS::memset(), and SIOCGIFCONF_CMD. Referenced by get_ip_interfaces().
01446 {
01447 #if defined (ACE_WIN32) || defined (ACE_HAS_GETIFADDRS) || defined (__hpux) || defined (_AIX) || (defined (ACE_VXWORKS) && (ACE_VXWORKS < 0x600))
01448 // none of these platforms make use of count_interfaces
01449 ACE_UNUSED_ARG (handle);
01450 ACE_UNUSED_ARG (how_many);
01451 ACE_NOTSUP_RETURN (-1); // no implementation
01452
01453 #elif defined (SIOCGIFNUM)
01454 # if defined (SIOCGLIFNUM)
01455 int cmd = SIOCGLIFNUM;
01456 struct lifnum if_num = {AF_UNSPEC,0,0};
01457 # else
01458 int cmd = SIOCGIFNUM;
01459 int if_num = 0;
01460 # endif /* SIOCGLIFNUM */
01461 if (ACE_OS::ioctl (handle, cmd, (caddr_t)&if_num) == -1)
01462 ACE_ERROR_RETURN ((LM_ERROR,
01463 ACE_TEXT ("%p\n"),
01464 ACE_TEXT ("ACE::count_interfaces:")
01465 ACE_TEXT ("ioctl - SIOCGLIFNUM failed")),
01466 -1);
01467 # if defined (SIOCGLIFNUM)
01468 how_many = if_num.lifn_count;
01469 # else
01470 how_many = if_num;
01471 # endif /* SIOCGLIFNUM */
01472 return 0;
01473
01474 #elif (defined (__unix) || defined (__unix__) || defined (__Lynx__) || defined (ACE_OPENVMS) || defined (ACE_HAS_RTEMS)) && !defined (ACE_LACKS_NETWORKING)
01475 // Note: DEC CXX doesn't define "unix". BSD compatible OS: HP UX,
01476 // AIX, SunOS 4.x perform some ioctls to retrieve ifconf list of
01477 // ifreq structs no SIOCGIFNUM on SunOS 4.x, so use guess and scan
01478 // algorithm
01479
01480 // Probably hard to put this many ifs in a unix box..
01481 const int MAX_IF = 50;
01482
01483 // HACK - set to an unreasonable number
01484 int num_ifs = MAX_IF;
01485
01486 struct ifconf ifcfg;
01487 size_t ifreq_size = num_ifs * sizeof (struct ifreq);
01488 struct ifreq *p_ifs =
01489 (struct ifreq *) ACE_OS::malloc (ifreq_size);
01490
01491 if (!p_ifs)
01492 {
01493 errno = ENOMEM;
01494 return -1;
01495 }
01496
01497 ACE_OS::memset (p_ifs, 0, ifreq_size);
01498 ACE_OS::memset (&ifcfg, 0, sizeof (struct ifconf));
01499
01500 ifcfg.ifc_req = p_ifs;
01501 ifcfg.ifc_len = ifreq_size;
01502
01503 if (ACE_OS::ioctl (handle,
01504 SIOCGIFCONF_CMD,
01505 (caddr_t) &ifcfg) == -1)
01506 {
01507 ACE_OS::free (ifcfg.ifc_req);
01508 ACE_ERROR_RETURN ((LM_ERROR,
01509 ACE_TEXT ("%p\n"),
01510 ACE_TEXT ("ACE::count_interfaces:")
01511 ACE_TEXT ("ioctl - SIOCGIFCONF failed")),
01512 -1);
01513 }
01514
01515 int if_count = 0, i;
01516
01517 // get if address out of ifreq buffers. ioctl puts a blank-named
01518 // interface to mark the end of the returned interfaces.
01519 for (i = 0;
01520 i < num_ifs;
01521 i++)
01522 {
01523 /* In OpenBSD, the length of the list is returned. */
01524 ifcfg.ifc_len -= sizeof (struct ifreq);
01525 if (ifcfg.ifc_len < 0)
01526 break;
01527
01528 ++if_count;
01529 #if !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__) && !defined (ACE_HAS_RTEMS)
01530 ++p_ifs;
01531 #else
01532 if (p_ifs->ifr_addr.sa_len <= sizeof (struct sockaddr))
01533 {
01534 ++p_ifs;
01535 }
01536 else
01537 {
01538 p_ifs = (struct ifreq *)
01539 (p_ifs->ifr_addr.sa_len + (caddr_t) &p_ifs->ifr_addr);
01540 }
01541 #endif /* !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__) */
01542 }
01543
01544 ACE_OS::free (ifcfg.ifc_req);
01545
01546 # if defined (ACE_HAS_IPV6)
01547 FILE* fp = 0;
01548
01549 if ((fp = ACE_OS::fopen (ACE_TEXT ("/proc/net/if_inet6"), ACE_TEXT ("r"))) != 0)
01550 {
01551 // Scan the lines according to the expected format but don't really read any input
01552 while (fscanf (fp, "%*32s %*02x %*02x %*02x %*02x %*8s\n") != EOF)
01553 {
01554 ++if_count;
01555 }
01556 ACE_OS::fclose (fp);
01557 }
01558 # endif /* ACE_HAS_IPV6 */
01559
01560 how_many = if_count;
01561 return 0;
01562 #else
01563 ACE_UNUSED_ARG (handle);
01564 ACE_UNUSED_ARG (how_many);
01565 ACE_NOTSUP_RETURN (-1); // no implementation
01566 #endif /* sparc && SIOCGIFNUM */
01567 }
|
|
||||||||||||||||
|
Computes the ISO 8802-3 standard 32 bits CRC for the @ len iovec buffers. Definition at line 142 of file ACE_crc32.cpp. References COMPUTE.
00143 {
00144 crc = ~crc;
00145
00146 for (int i = 0; i < len; ++i)
00147 {
00148 for (const char *p = (const char *) iov[i].iov_base,
00149 *e = (const char *) iov[i].iov_base + iov[i].iov_len;
00150 p != e;
00151 ++p)
00152 COMPUTE (crc, *p);
00153 }
00154
00155 return ~crc;
00156 }
|
|
||||||||||||||||
|
Computes the ISO 8802-3 standard 32 bits CRC for the buffer.
Definition at line 126 of file ACE_crc32.cpp. References COMPUTE.
00127 {
00128 crc = ~crc;
00129
00130 for (const char *p = (const char *) buffer,
00131 *e = (const char *) buffer + len;
00132 p != e;
00133 ++p)
00134 {
00135 COMPUTE (crc, *p);
00136 }
00137
00138 return ~crc;
00139 }
|
|
|
Computes the ISO 8802-3 standard 32 bits CRC for the string.
Definition at line 111 of file ACE_crc32.cpp. References COMPUTE. Referenced by ACE_Shared_Memory_Pool::ACE_Shared_Memory_Pool(), and ACE_SV_Semaphore_Simple::name_2_key().
00112 {
00113 ACE_UINT32 crc = 0xFFFFFFFF;
00114
00115 for (const char *p = string;
00116 *p != 0;
00117 ++p)
00118 {
00119 COMPUTE (crc, *p);
00120 }
00121
00122 return ~crc;
00123 }
|
|
||||||||||||||||
|
Computes CRC-CCITT for the @ len iovec buffers.
Definition at line 109 of file ACE_crc_ccitt.cpp. References COMPUTE.
00110 {
00111 crc = ~crc;
00112
00113 for (int i = 0; i < len; ++i)
00114 {
00115 for (const char *p = (const char *) iov[i].iov_base,
00116 *e = (const char *) iov[i].iov_base + iov[i].iov_len;
00117 p != e;
00118 ++p)
00119 COMPUTE (crc, *p);
00120 }
00121
00122 return ~crc;
00123 }
|
|
||||||||||||||||
|
Computes CRC-CCITT for the buffer.
Definition at line 93 of file ACE_crc_ccitt.cpp. References COMPUTE.
00094 {
00095 crc = ~crc;
00096
00097 for (const char *p = (const char *) buffer,
00098 *e = (const char *) buffer + len;
00099 p != e;
00100 ++p)
00101 {
00102 COMPUTE (crc, *p);
00103 }
00104
00105 return ~crc;
00106 }
|
|
|
Computes CRC-CCITT for the string.
Definition at line 78 of file ACE_crc_ccitt.cpp. References COMPUTE.
00079 {
00080 ACE_UINT16 crc = 0xFFFF;
00081
00082 for (const char *p = string;
00083 *p != 0;
00084 ++p)
00085 {
00086 COMPUTE (crc, *p);
00087 }
00088
00089 return ~crc;
00090 }
|
|
||||||||||||||||
|
Become a daemon process using the algorithm in Richard Stevens "Advanced Programming in the UNIX Environment." If close_all_handles is non-zero then all open file handles are closed. Definition at line 2742 of file ACE.cpp. References ACE_NOTSUP_RETURN, ACE_TCHAR, ACE_TRACE, ACE_OS::chdir(), ACE_OS::close(), ACE_OS::exit(), ACE_OS::fork(), max_handles(), pid_t, ACE_OS::setsid(), SIG_IGN, SIGHUP, ACE_OS::signal(), and ACE_OS::umask(). Referenced by ACE_Service_Config::open_i().
02745 {
02746 ACE_TRACE ("ACE::daemonize");
02747 #if !defined (ACE_LACKS_FORK)
02748 pid_t pid = ACE_OS::fork ();
02749
02750 if (pid == -1)
02751 return -1;
02752 else if (pid != 0)
02753 ACE_OS::exit (0); // Parent exits.
02754
02755 // 1st child continues.
02756 ACE_OS::setsid (); // Become session leader.
02757
02758 ACE_OS::signal (SIGHUP, SIG_IGN);
02759
02760 pid = ACE_OS::fork (program_name);
02761
02762 if (pid != 0)
02763 ACE_OS::exit (0); // First child terminates.
02764
02765 // Second child continues.
02766
02767 if (pathname != 0)
02768 // change working directory.
02769 ACE_OS::chdir (pathname);
02770
02771 ACE_OS::umask (0); // clear our file mode creation mask.
02772
02773 // Close down the I/O handles.
02774 if (close_all_handles)
02775 for (int i = ACE::max_handles () - 1; i >= 0; i--)
02776 ACE_OS::close (i);
02777
02778 return 0;
02779 #else
02780 ACE_UNUSED_ARG (pathname);
02781 ACE_UNUSED_ARG (close_all_handles);
02782 ACE_UNUSED_ARG (program_name);
02783
02784 ACE_NOTSUP_RETURN (-1);
02785 #endif /* ACE_LACKS_FORK */
02786 }
|
|
|
Definition at line 172 of file ACE.cpp.
00173 {
00174 ACE::debug_ = onoff;
00175 }
|
|
|
||||||||||||
|
Returns the "dirname" of a pathname. For instance, the dirname of "/tmp/foo.cpp" is "/tmp" when delim is '/'. If pathname has no delim ".\0" is returned. This method does not modify pathname and is not reentrant. Definition at line 418 of file ACE.cpp. References ACE_TCHAR, ACE_TRACE, MAXPATHLEN, ACE_OS::strrchr(), and ACE_OS::strsncpy().
00419 {
00420 ACE_TRACE ("ACE::dirname");
00421 static ACE_TCHAR return_dirname[MAXPATHLEN + 1];
00422
00423 const ACE_TCHAR *temp = ACE_OS::strrchr (pathname, delim);
00424
00425 if (temp == 0)
00426 {
00427 return_dirname[0] = '.';
00428 return_dirname[1] = '\0';
00429
00430 return return_dirname;
00431 }
00432 else
00433 {
00434 // When the len is truncated, there are problems! This should
00435 // not happen in normal circomstances
00436 size_t len = temp - pathname + 1;
00437 if (len > (sizeof return_dirname / sizeof (ACE_TCHAR)))
00438 len = sizeof return_dirname / sizeof (ACE_TCHAR);
00439
00440 ACE_OS::strsncpy (return_dirname,
00441 pathname,
00442 len);
00443 return return_dirname;
00444 }
00445 }
|
|
||||||||||||||||
|
Wait for timeout before proceeding to a Definition at line 2230 of file ACE.cpp. References handle_read_ready(), and record_and_set_non_blocking_mode(). Referenced by recv(), recvfrom(), recvmsg(), recvv(), and t_rcv().
02233 {
02234 int result = ACE::handle_read_ready (handle,
02235 timeout);
02236
02237 if (result == -1)
02238 return -1;
02239
02240 ACE::record_and_set_non_blocking_mode (handle,
02241 val);
02242
02243 return result;
02244 }
|
|
||||||||||||||||
|
Wait for timeout before proceeding to a Definition at line 2247 of file ACE.cpp. References handle_write_ready(), and record_and_set_non_blocking_mode(). Referenced by send(), sendmsg(), sendto(), sendv(), and t_snd().
02250 {
02251 int result = ACE::handle_write_ready (handle,
02252 timeout);
02253
02254 if (result == -1)
02255 return -1;
02256
02257 ACE::record_and_set_non_blocking_mode (handle,
02258 val);
02259
02260 return result;
02261 }
|
|
|
On Windows, determines if a specified pathname ends with ".exe" (not case sensitive). If on Windows and there is no ".exe" suffix, a new ACE_TCHAR array is allocated and a copy of
Definition at line 287 of file ACE.cpp. References ACE_NEW_RETURN, ACE_TCHAR, ACE_TEXT, ACE_OS::strcasecmp(), ACE_OS::strcpy(), ACE_OS::strecpy(), ACE_OS::strlen(), and ACE_OS::strrchr().
00288 {
00289 #if defined (ACE_WIN32)
00290 const ACE_TCHAR *suffix = ACE_OS::strrchr (old_name, ACE_TEXT ('.'));
00291 if (suffix == 0 || ACE_OS::strcasecmp (suffix, ACE_TEXT (".exe")) != 0)
00292 {
00293 ACE_TCHAR *new_name;
00294
00295 size_t size =
00296 ACE_OS::strlen (old_name)
00297 + ACE_OS::strlen (ACE_TEXT (".exe"))
00298 + 1;
00299
00300 ACE_NEW_RETURN (new_name,
00301 ACE_TCHAR[size],
00302 0);
00303 ACE_TCHAR *end = new_name;
00304
00305 end = ACE_OS::strecpy (new_name, old_name);
00306
00307 // Concatenate the .exe suffix onto the end of the executable.
00308 // end points _after_ the terminating nul.
00309 ACE_OS::strcpy (end - 1, ACE_TEXT (".exe"));
00310
00311 return new_name;
00312 }
00313 #endif /* ACE_WIN32 */
00314 return old_name;
00315 }
|
|
|
Shut down ACE library services. Can be called only once per program invocation.
Definition at line 27 of file Init_ACE.cpp. References ACE_TRACE, ACE_Object_Manager::fini(), and ACE_Object_Manager::instance().
00028 {
00029 ACE_TRACE ("ACE::fini");
00030
00031 if (ACE::init_fini_count_ > 0)
00032 {
00033 if (--ACE::init_fini_count_ == 0)
00034 return ACE_Object_Manager::instance ()->fini ();
00035 else
00036 // Wait for remaining fini () calls.
00037 return 1;
00038 }
00039 else
00040 // More ACE::fini () calls than ACE::init () calls. Bad
00041 // application!
00042 return -1;
00043 }
|
|
||||||||||||
|
if avoid_zombies == 0 call Definition at line 2789 of file ACE.cpp. References ACE_OS::_exit(), ACE_exitcode, ACE_TCHAR, ACE_OS::fork(), pid_t, ACE_OS::waitpid(), WEXITSTATUS, and WIFEXITED. Referenced by ACE_Process_Strategy< SVC_HANDLER >::activate_svc_handler(), and ACE_Process::spawn().
02791 {
02792 if (avoid_zombies == 0)
02793 return ACE_OS::fork (program_name);
02794 else
02795 {
02796 // This algorithm is adapted from an example in the Stevens book
02797 // "Advanced Programming in the Unix Environment" and an item in
02798 // Andrew Gierth's Unix Programming FAQ. It creates an orphan
02799 // process that's inherited by the init process; init cleans up
02800 // when the orphan process terminates.
02801 //
02802 // Another way to avoid zombies is to ignore or catch the
02803 // SIGCHLD signal; we don't use that approach here.
02804
02805 pid_t pid = ACE_OS::fork ();
02806 if (pid == 0)
02807 {
02808 // The child process forks again to create a grandchild.
02809 switch (ACE_OS::fork (program_name))
02810 {
02811 case 0: // grandchild returns 0.
02812 return 0;
02813 case -1: // assumes all errnos are < 256
02814 ACE_OS::_exit (errno);
02815 default: // child terminates, orphaning grandchild
02816 ACE_OS::_exit (0);
02817 }
02818 }
02819
02820 // Parent process waits for child to terminate.
02821 ACE_exitcode status;
02822 if (pid < 0 || ACE_OS::waitpid (pid, &status, 0) < 0)
02823 return -1;
02824
02825 // child terminated by calling exit()?
02826 if (WIFEXITED ((status)))
02827 {
02828 // child terminated normally?
02829 if (WEXITSTATUS ((status)) == 0)
02830 return 1;
02831 else
02832 errno = WEXITSTATUS ((status));
02833 }
02834 else
02835 // child didn't call exit(); perhaps it received a signal?
02836 errno = EINTR;
02837
02838 return -1;
02839 }
02840 }
|
|
||||||||||||||||||||
|
Format buffer into printable format. This is useful for debugging. Definition at line 2298 of file ACE.cpp. References ACE_OS::ace_isprint(), ACE_TCHAR, ACE_TEXT, ACE_TRACE, and ACE_OS::sprintf().
02302 {
02303 ACE_TRACE ("ACE::format_hexdump");
02304
02305 u_char c;
02306 ACE_TCHAR textver[16 + 1];
02307
02308 // We can fit 16 bytes output in text mode per line, 4 chars per byte.
02309 size_t maxlen = (obuf_sz / 68) * 16;
02310
02311 if (size > maxlen)
02312 size = maxlen;
02313
02314 size_t i;
02315
02316 size_t lines = size / 16;
02317 for (i = 0; i < lines; i++)
02318 {
02319 size_t j;
02320
02321 for (j = 0 ; j < 16; j++)
02322 {
02323 c = (u_char) buffer[(i << 4) + j]; // or, buffer[i*16+j]
02324 ACE_OS::sprintf (obuf,
02325 ACE_TEXT ("%02x "),
02326 c);
02327 obuf += 3;
02328 if (j == 7)
02329 {
02330 ACE_OS::sprintf (obuf,
02331 ACE_TEXT (" "));
02332 ++obuf;
02333 }
02334 textver[j] = ACE_OS::ace_isprint (c) ? c : '.';
02335 }
02336
02337 textver[j] = 0;
02338
02339 ACE_OS::sprintf (obuf,
02340 ACE_TEXT (" %s\n"),
02341 textver);
02342
02343 while (*obuf != '\0')
02344 ++obuf;
02345 }
02346
02347 if (size % 16)
02348 {
02349 for (i = 0 ; i < size % 16; i++)
02350 {
02351 c = (u_char) buffer[size - size % 16 + i];
02352 ACE_OS::sprintf (obuf,
02353 ACE_TEXT ("%02x "),
02354 c);
02355 obuf += 3;
02356 if (i == 7)
02357 {
02358 ACE_OS::sprintf (obuf,
02359 ACE_TEXT (" "));
02360 ++obuf;
02361 }
02362 textver[i] = ACE_OS::ace_isprint (c) ? c : '.';
02363 }
02364
02365 for (i = size % 16; i < 16; i++)
02366 {
02367 ACE_OS::sprintf (obuf,
02368 ACE_TEXT (" "));
02369 obuf += 3;
02370 if (i == 7)
02371 {
02372 ACE_OS::sprintf (obuf,
02373 ACE_TEXT (" "));
02374 ++obuf;
02375 }
02376 textver[i] = ' ';
02377 }
02378
02379 textver[i] = 0;
02380 ACE_OS::sprintf (obuf,
02381 ACE_TEXT (" %s\n"),
02382 textver);
02383 }
02384 return size;
02385 }
|
|
||||||||||||
|
Euclid's greatest common divisor algorithm.
Definition at line 2933 of file ACE.cpp. Referenced by minimum_frame_size(), and ACE_Get_Opt::permute_args().
02934 {
02935 while (y != 0)
02936 {
02937 u_long r = x % y;
02938 x = y;
02939 y = r;
02940 }
02941
02942 return x;
02943 }
|
|
||||||||||||||||||||
|
Get our broadcast address based on our host_addr. If hostname is non-0 we'll use it to determine our IP address. If handle is not ACE_INVALID_HANDLE then we'll use this to determine our broadcast address, otherwise we'll have to create a socket internally (and free it). Returns -1 on failure and 0 on success. Definition at line 238 of file Sock_Connect.cpp. References ACE_BIT_DISABLED, ACE_BIT_ENABLED, ACE_ERROR, ACE_ERROR_RETURN, ACE_NOTSUP_RETURN, ACE_TCHAR, ACE_TEXT, ACE_TEXT_ALWAYS_CHAR, ACE_TRACE, ACE_UINT64, AF_INET, caddr_t, ACE_OS::close(), ACE_OS::gethostbyname(), IFF_BROADCAST, IFF_LOOPBACK, IFF_UP, ACE_OS::ioctl(), LM_ERROR, ACE_OS::memcpy(), ACE_OS::memset(), SIOCGIFBRDADDR, SIOCGIFCONF_CMD, SOCK_STREAM, and ACE_OS::socket().
00242 {
00243 ACE_TRACE ("ACE::get_bcast_addr");
00244
00245 #if defined (ACE_LACKS_GET_BCAST_ADDR)
00246 ACE_UNUSED_ARG (bcast_addr);
00247 ACE_UNUSED_ARG (host_name);
00248 ACE_UNUSED_ARG (host_addr);
00249 ACE_UNUSED_ARG (handle);
00250 ACE_NOTSUP_RETURN (-1);
00251 #elif !defined(ACE_WIN32) && !defined(__INTERIX)
00252 ACE_HANDLE s = handle;
00253
00254 if (s == ACE_INVALID_HANDLE)
00255 s = ACE_OS::socket (AF_INET, SOCK_STREAM, 0);
00256
00257 if (s == ACE_INVALID_HANDLE)
00258 ACE_ERROR_RETURN ((LM_ERROR,
00259 ACE_TEXT ("%p\n"),
00260 ACE_TEXT ("ACE_OS::socket")),
00261 -1);
00262
00263 struct ifconf ifc;
00264 char buf[BUFSIZ];
00265
00266 ifc.ifc_len = sizeof buf;
00267 ifc.ifc_buf = buf;
00268
00269 // Get interface structure and initialize the addresses using UNIX
00270 // techniques
00271 if (ACE_OS::ioctl (s, SIOCGIFCONF_CMD, (char *) &ifc) == -1)
00272 ACE_ERROR_RETURN ((LM_ERROR,
00273 ACE_TEXT ("%p\n"),
00274 ACE_TEXT ("ACE::get_bcast_addr:")
00275 ACE_TEXT ("ioctl (get interface configuration)")),
00276 -1);
00277
00278 struct ifreq *ifr = ifc.ifc_req;
00279
00280 struct sockaddr_in ip_addr;
00281
00282 // Get host ip address if necessary.
00283 if (host_name)
00284 {
00285 hostent *hp = ACE_OS::gethostbyname (ACE_TEXT_ALWAYS_CHAR (host_name));
00286
00287 if (hp == 0)
00288 return -1;
00289 else
00290 #if !defined(_UNICOS)
00291 ACE_OS::memcpy ((char *) &ip_addr.sin_addr.s_addr,
00292 (char *) hp->h_addr,
00293 hp->h_length);
00294 #else /* _UNICOS */
00295 {
00296 ACE_UINT64 haddr; // a place to put the address
00297 char * haddrp = (char *) &haddr; // convert to char pointer
00298 ACE_OS::memcpy(haddrp,(char *) hp->h_addr,hp->h_length);
00299 ip_addr.sin_addr.s_addr = haddr;
00300 }
00301 #endif /* ! _UNICOS */
00302 }
00303 else
00304 {
00305 ACE_OS::memset ((void *) &ip_addr, 0, sizeof ip_addr);
00306 #if !defined(_UNICOS)
00307 ACE_OS::memcpy ((void *) &ip_addr.sin_addr,
00308 (void*) &host_addr,
00309 sizeof ip_addr.sin_addr);
00310 #else /* _UNICOS */
00311 ip_addr.sin_addr.s_addr = host_addr; // just copy to the bitfield
00312 #endif /* ! _UNICOS */
00313 }
00314
00315 #if !defined(AIX) && !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__)
00316 for (int n = ifc.ifc_len / sizeof (struct ifreq) ; n > 0;
00317 n--, ifr++)
00318 #else
00319 // see mk_broadcast@SOCK_Dgram_Bcast.cpp
00320 for (int nbytes = ifc.ifc_len; nbytes >= (int) sizeof (struct ifreq) &&
00321 ((ifr->ifr_addr.sa_len > sizeof (struct sockaddr)) ?
00322 (nbytes >= (int) sizeof (ifr->ifr_name) + ifr->ifr_addr.sa_len) : 1);
00323 ((ifr->ifr_addr.sa_len > sizeof (struct sockaddr)) ?
00324 (nbytes -= sizeof (ifr->ifr_name) + ifr->ifr_addr.sa_len,
00325 ifr = (struct ifreq *)
00326 ((caddr_t) &ifr->ifr_addr + ifr->ifr_addr.sa_len)) :
00327 (nbytes -= sizeof (struct ifreq), ifr++)))
00328 #endif /* !defined(AIX) && !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__) */
00329 {
00330 struct sockaddr_in if_addr;
00331
00332 // Compare host ip address with interface ip address.
00333 ACE_OS::memcpy (&if_addr,
00334 &ifr->ifr_addr,
00335 sizeof if_addr);
00336
00337 if (ip_addr.sin_addr.s_addr != if_addr.sin_addr.s_addr)
00338 continue;
00339
00340 if (ifr->ifr_addr.sa_family != AF_INET)
00341 {
00342 ACE_ERROR ((LM_ERROR,
00343 ACE_TEXT ("%p\n"),
00344 ACE_TEXT ("ACE::get_bcast_addr:")
00345 ACE_TEXT ("Not AF_INET")));
00346 continue;
00347 }
00348
00349 struct ifreq flags = *ifr;
00350 struct ifreq if_req = *ifr;
00351
00352 if (ACE_OS::ioctl (s, SIOCGIFFLAGS, (char *) &flags) == -1)
00353 {
00354 ACE_ERROR ((LM_ERROR,
00355 ACE_TEXT ("%p\n"),
00356 ACE_TEXT ("ACE::get_bcast_addr:")
00357 ACE_TEXT (" ioctl (get interface flags)")));
00358 continue;
00359 }
00360
00361 if (ACE_BIT_DISABLED (flags.ifr_flags, IFF_UP))
00362 {
00363 ACE_ERROR ((LM_ERROR,
00364 ACE_TEXT ("%p\n"),
00365 ACE_TEXT ("ACE::get_bcast_addr:")
00366 ACE_TEXT ("Network interface is not up")));
00367 continue;
00368 }
00369
00370 if (ACE_BIT_ENABLED (flags.ifr_flags, IFF_LOOPBACK))
00371 continue;
00372
00373 if (ACE_BIT_ENABLED (flags.ifr_flags, IFF_BROADCAST))
00374 {
00375 if (ACE_OS::ioctl (s,
00376 SIOCGIFBRDADDR,
00377 (char *) &if_req) == -1)
00378 ACE_ERROR ((LM_ERROR,
00379 ACE_TEXT ("%p\n"),
00380 ACE_TEXT ("ACE::get_bcast_addr:")
00381 ACE_TEXT ("ioctl (get broadaddr)")));
00382 else
00383 {
00384 ACE_OS::memcpy (&ip_addr,
00385 &if_req.ifr_broadaddr,
00386 sizeof if_req.ifr_broadaddr);
00387
00388 ACE_OS::memcpy ((void *) &host_addr,
00389 (void *) &ip_addr.sin_addr,
00390 sizeof host_addr);
00391
00392 if (handle == ACE_INVALID_HANDLE)
00393 ACE_OS::close (s);
00394
00395 bcast_addr = host_addr;
00396 return 0;
00397 }
00398 }
00399 else
00400 ACE_ERROR ((LM_ERROR,
00401 ACE_TEXT ("%p\n"),
00402 ACE_TEXT ("ACE::get_bcast_addr:")
00403 ACE_TEXT ("Broadcast is not enable for this interface.")));
00404
00405 if (handle == ACE_INVALID_HANDLE)
00406 ACE_OS::close (s);
00407
00408 bcast_addr = host_addr;
00409 return 0;
00410 }
00411
00412 return 0;
00413 #else
00414 ACE_UNUSED_ARG (handle);
00415 ACE_UNUSED_ARG (host_addr);
00416 ACE_UNUSED_ARG (host_name);
00417 bcast_addr = (ACE_UINT32 (INADDR_BROADCAST));
00418 return 0;
00419 #endif /* !ACE_WIN32 && !__INTERIX */
00420 }
|
|
|
Return the current setting of flags associated with handle.
Definition at line 11 of file Flag_Manip.inl. References ACE_TRACE, F_GETFL, and ACE_OS::fcntl(). Referenced by record_and_set_non_blocking_mode().
00012 {
00013 ACE_TRACE ("ACE::get_flags");
00014
00015 #if defined (ACE_LACKS_FCNTL)
00016 // ACE_OS::fcntl is not supported. It
00017 // would be better to store ACE's notion of the flags
00018 // associated with the handle, but this works for now.
00019 ACE_UNUSED_ARG (handle);
00020 return 0;
00021 #else
00022 return ACE_OS::fcntl (handle, F_GETFL, 0);
00023 #endif /* ACE_LACKS_FCNTL */
00024 }
|
|
||||||||||||||||
|
Get fully qualified host/domain name.
Definition at line 423 of file Sock_Connect.cpp. References ACE_DEBUG, ACE_HOSTENT_DATA, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, AF_INET, debug(), ACE_INET_Addr::get_addr(), ACE_Addr::get_type(), ACE_OS::gethostbyaddr_r(), LM_DEBUG, ACE_OS::strchr(), ACE_OS::strcpy(), and ACE_OS::strlen().
00426 {
00427 int h_error; // Not the same as errno!
00428 hostent hentry;
00429 ACE_HOSTENT_DATA buf;
00430
00431 char * ip_addr = 0;
00432 int ip_addr_size = 0;
00433 if (addr.get_type () == AF_INET)
00434 {
00435 sockaddr_in * const sock_addr =
00436 reinterpret_cast<sockaddr_in *> (addr.get_addr ());
00437 ip_addr_size = sizeof sock_addr->sin_addr;
00438 ip_addr = (char*) &sock_addr->sin_addr;
00439 }
00440 #ifdef ACE_HAS_IPV6
00441 else
00442 {
00443 sockaddr_in6 * sock_addr =
00444 reinterpret_cast<sockaddr_in6 *> (addr.get_addr ());
00445
00446 ip_addr_size = sizeof sock_addr->sin6_addr;
00447 ip_addr = (char*) &sock_addr->sin6_addr;
00448 }
00449 #endif /* ACE_HAS_IPV6 */
00450
00451 // get the host entry for the address in question
00452 hostent * const hp = ACE_OS::gethostbyaddr_r (ip_addr,
00453 ip_addr_size,
00454 addr.get_type (),
00455 &hentry,
00456 buf,
00457 &h_error);
00458
00459 // if it's not found in the host file or the DNS datase, there is nothing
00460 // much we can do. embed the IP address
00461 if (hp == 0 || hp->h_name == 0)
00462 return -1;
00463
00464 if (ACE::debug())
00465 ACE_DEBUG ((LM_DEBUG,
00466 ACE_TEXT ("(%P|%t) - ACE::get_fqdn, ")
00467 ACE_TEXT ("canonical host name is %s\n"),
00468 ACE_TEXT_CHAR_TO_TCHAR (hp->h_name)));
00469
00470 // check if the canonical name is the FQDN
00471 if (!ACE_OS::strchr(hp->h_name, '.'))
00472 {
00473 // list of address
00474 char** p;
00475 // list of aliases
00476 char** q;
00477
00478 // for every address and for every alias within the address, check and
00479 // see if we can locate a FQDN
00480 for (p = hp->h_addr_list; *p != 0; ++p)
00481 {
00482 for (q = hp->h_aliases; *q != 0; ++q)
00483 {
00484 if (ACE_OS::strchr(*q, '.'))
00485 {
00486 // we got an FQDN from an alias. use this
00487 if (ACE_OS::strlen (*q) >= len)
00488 // the hostname is too huge to fit into a
00489 // buffer of size MAXHOSTNAMELEN
00490 // should we check other aliases as well
00491 // before bailing out prematurely?
00492 // for right now, let's do it. this (short name)
00493 // is atleast better than embedding the IP
00494 // address in the profile
00495 continue;
00496
00497 if (ACE::debug ())
00498 ACE_DEBUG ((LM_DEBUG,
00499 ACE_TEXT ("(%P|%t) - ACE::get_fqdn, ")
00500 ACE_TEXT ("found fqdn within alias as %s\n"),
00501 ACE_TEXT_CHAR_TO_TCHAR(*q)));
00502 ACE_OS::strcpy (hostname, *q);
00503
00504 return 0;
00505 }
00506 }
00507 }
00508 }
00509
00510 // The canonical name may be an FQDN when we reach here.
00511 // Alternatively, the canonical name (a non FQDN) may be the best
00512 // we can do.
00513 if (ACE_OS::strlen (hp->h_name) >= len)
00514 {
00515 // The hostname is too large to fit into a buffer of size
00516 // MAXHOSTNAMELEN.
00517 return -2;
00518 }
00519 else
00520 {
00521 ACE_OS::strcpy (hostname, hp->h_name);
00522 }
00523
00524 return 0;
00525 }
|
|
|
Routine to return a handle from which Definition at line 1572 of file Sock_Connect.cpp. References ACE_OS::open(), PF_INET, SOCK_DGRAM, and ACE_OS::socket(). Referenced by get_ip_interfaces().
01573 {
01574 // Solaris 2.x
01575 ACE_HANDLE handle = ACE_INVALID_HANDLE;
01576 #if defined (sparc)
01577 handle = ACE_OS::open ("/dev/udp", O_RDONLY);
01578 #elif defined (__unix) || defined (__unix__) || defined (__Lynx__) || defined (_AIX) || defined (__hpux) || (defined (ACE_VXWORKS) && (ACE_VXWORKS >= 0x600)) || defined (ACE_OPENVMS) || defined (ACE_HAS_RTEMS)
01579 // Note: DEC CXX doesn't define "unix" BSD compatible OS: HP UX,
01580 // AIX, SunOS 4.x
01581
01582 handle = ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);
01583 #endif /* sparc */
01584 return handle;
01585 }
|
|
||||||||||||
|
Return count and array of all configured IP interfaces on this host, rc = 0 on success (count == number of interfaces else -1). Caller is responsible for calling delete [] on addr_array. Definition at line 1220 of file Sock_Connect.cpp. References ACE_ERROR_RETURN, ACE_NEW_RETURN, ACE_NOTSUP_RETURN, ACE_TEXT, ACE_TRACE, AF_INET, AF_UNSPEC, caddr_t, ACE_OS::close(), count_interfaces(), ACE_OS::fclose(), ACE_OS::fopen(), ACE_Auto_Basic_Array_Ptr< X >::get(), get_handle(), get_ip_interfaces_win32(), IFCONF, IFREQ, ACE_OS::ioctl(), LM_ERROR, ACE_OS::memset(), ACE_INET_Addr::set(), SIOCGIFCONF_CMD, and ACE_OS::sprintf(). Referenced by ACE_SOCK_Dgram_Mcast::subscribe_ifs(), and ACE_SOCK_Dgram_Mcast::unsubscribe_ifs().
01222 {
01223 ACE_TRACE ("ACE::get_ip_interfaces");
01224
01225 count = 0;
01226 addrs = 0;
01227
01228 #if defined (ACE_WIN32)
01229 return get_ip_interfaces_win32 (count, addrs);
01230 #elif defined (ACE_HAS_GETIFADDRS)
01231 return get_ip_interfaces_getifaddrs (count, addrs);
01232 #elif defined (__hpux)
01233 return get_ip_interfaces_hpux (count, addrs);
01234 #elif defined (_AIX)
01235 return get_ip_interfaces_aix (count, addrs);
01236 #elif defined (ACE_VXWORKS) && (ACE_VXWORKS < 0x600)
01237 return get_ip_interfaces_vxworks_lt600 (count, addrs);
01238 #elif (defined (__unix) || defined (__unix__) || defined (__Lynx__) || defined (ACE_OPENVMS) || (defined (ACE_VXWORKS) && (ACE_VXWORKS == 0x650)) || defined (ACE_HAS_RTEMS)) && !defined (ACE_LACKS_NETWORKING)
01239 // COMMON (SVR4 and BSD) UNIX CODE
01240
01241 // Call specific routine as necessary.
01242 ACE_HANDLE handle = ACE::get_handle();
01243
01244 if (handle == ACE_INVALID_HANDLE)
01245 ACE_ERROR_RETURN ((LM_ERROR,
01246 ACE_TEXT ("%p\n"),
01247 ACE_TEXT ("ACE::get_ip_interfaces:open")),
01248 -1);
01249
01250 size_t num_ifs, num_ifs_found;
01251
01252 if (ACE::count_interfaces (handle, num_ifs))
01253 {
01254 ACE_OS::close (handle);
01255 return -1;
01256 }
01257
01258 // ioctl likes to have an extra ifreq structure to mark the end of
01259 // what it returned, so increase the num_ifs by one.
01260 ++num_ifs;
01261
01262 struct IFREQ *ifs = 0;
01263 ACE_NEW_RETURN (ifs,
01264 struct IFREQ[num_ifs],
01265 -1);
01266 ACE_OS::memset (ifs, 0, num_ifs * sizeof (struct IFREQ));
01267
01268 ACE_Auto_Array_Ptr<struct IFREQ> p_ifs (ifs);
01269
01270 if (p_ifs.get() == 0)
01271 {
01272 ACE_OS::close (handle);
01273 errno = ENOMEM;
01274 return -1;
01275 }
01276
01277 struct IFCONF ifcfg;
01278 ACE_OS::memset (&ifcfg, 0, sizeof (struct IFCONF));
01279
01280 # ifdef SETFAMILY
01281 ifcfg.IFC_FAMILY = AF_UNSPEC; // request all families be returned
01282 ifcfg.IFC_FLAGS = 0;
01283 # endif
01284
01285 ifcfg.IFC_REQ = p_ifs.get ();
01286 ifcfg.IFC_LEN = num_ifs * sizeof (struct IFREQ);
01287
01288 if (ACE_OS::ioctl (handle,
01289 SIOCGIFCONF_CMD,
01290 (caddr_t) &ifcfg) == -1)
01291 {
01292 ACE_OS::close (handle);
01293 ACE_ERROR_RETURN ((LM_ERROR,
01294 ACE_TEXT ("%p\n"),
01295 ACE_TEXT ("ACE::get_ip_interfaces:")
01296 ACE_TEXT ("ioctl - SIOCGIFCONF failed")),
01297 -1);
01298 }
01299
01300 ACE_OS::close (handle);
01301
01302 // Now create and initialize output array.
01303
01304 ACE_NEW_RETURN (addrs,
01305 ACE_INET_Addr[num_ifs],
01306 -1); // caller must free
01307
01308 struct IFREQ *pcur = p_ifs.get ();
01309 num_ifs_found = ifcfg.IFC_LEN / sizeof (struct IFREQ); // get the number of returned ifs
01310
01311 // Pull the address out of each INET interface. Not every interface
01312 // is for IP, so be careful to count properly. When setting the
01313 // INET_Addr, note that the 3rd arg (0) says to leave the byte order
01314 // (already in net byte order from the interface structure) as is.
01315 count = 0;
01316
01317 for (size_t i = 0;
01318 i < num_ifs_found;
01319 i++)
01320 {
01321 if (pcur->IFR_ADDR.SA_FAMILY == AF_INET
01322 # if defined (ACE_HAS_IPV6)
01323 || pcur->IFR_ADDR.SA_FAMILY == AF_INET6
01324 # endif
01325 )
01326
01327 {
01328 # if !defined(_UNICOS)
01329 struct sockaddr_in *addr =
01330 reinterpret_cast<sockaddr_in *> (&pcur->IFR_ADDR);
01331
01332 // Sometimes the kernel returns 0.0.0.0 as an IPv4 interface
01333 // address; skip those...
01334 if (addr->sin_addr.s_addr != 0
01335 # if defined (ACE_HAS_IPV6)
01336 || (addr->sin_family == AF_INET6 &&
01337 !IN6_IS_ADDR_UNSPECIFIED(&reinterpret_cast<sockaddr_in6 *>(addr)->sin6_addr))
01338 # endif
01339 )
01340 {
01341 int addrlen = static_cast<int> (sizeof (struct sockaddr_in));
01342 # if defined (ACE_HAS_IPV6)
01343 if (addr->sin_family == AF_INET6)
01344 addrlen = static_cast<int> (sizeof (struct sockaddr_in6));
01345 # endif
01346 addrs[count].set (addr, addrlen);
01347 ++count;
01348 }
01349 # else /* ! _UNICOS */
01350 // need to explicitly copy on the Cray, since the bitfields kinda
01351 // screw things up here
01352 struct sockaddr_in inAddr;
01353
01354 inAddr.sin_len = pcur->IFR_ADDR.sa_len;
01355 inAddr.sin_family = pcur->IFR_ADDR.sa_family;
01356 memcpy((void *)&(inAddr.sin_addr),
01357 (const void *)&(pcur->IFR_ADDR.sa_data[8]),
01358 sizeof(struct in_addr));
01359
01360 if (inAddr.sin_addr.s_addr != 0)
01361 {
01362 addrs[count].set(&inAddr, sizeof(struct sockaddr_in));
01363 ++count;
01364 }
01365 # endif /* ! _UNICOS */
01366 }
01367
01368 #if !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__) && !defined (ACE_HAS_RTEMS)
01369 ++pcur;
01370 #else
01371 if (pcur->ifr_addr.sa_len <= sizeof (struct sockaddr))
01372 {
01373 ++pcur;
01374 }
01375 else
01376 {
01377 pcur = (struct ifreq *)
01378 (pcur->ifr_addr.sa_len + (caddr_t) &pcur->ifr_addr);
01379 }
01380 #endif /* !defined (__QNX__) && !defined (__FreeBSD__) && !defined(__NetBSD__) */
01381 }
01382
01383 # if defined (ACE_HAS_IPV6)
01384 // Retrieve IPv6 local interfaces by scanning /proc/net/if_inet6 if
01385 // it exists. If we cannot open it then ignore possible IPv6
01386 // interfaces, we did our best;-)
01387 FILE* fp;
01388 char addr_p[8][5];
01389 char s_ipaddr[64];
01390 int scopeid;
01391 struct addrinfo hints, *res0;
01392 int error;
01393
01394 ACE_OS::memset (&hints, 0, sizeof (hints));
01395 hints.ai_flags = AI_NUMERICHOST;
01396 hints.ai_family = AF_INET6;
01397
01398 if ((fp = ACE_OS::fopen (ACE_TEXT ("/proc/net/if_inet6"), ACE_TEXT ("r"))) != 0)
01399 {
01400 while (fscanf (fp,
01401 "%4s%4s%4s%4s%4s%4s%4s%4s %02x %*02x %*02x %*02x %*8s\n",
01402 addr_p[0], addr_p[1], addr_p[2], addr_p[3],
01403 addr_p[4], addr_p[5], addr_p[6], addr_p[7], &scopeid) != EOF)
01404 {
01405 // Format the address intoa proper IPv6 decimal address specification and
01406 // resolve the resulting text using getaddrinfo().
01407
01408 const char* ip_fmt = "%s:%s:%s:%s:%s:%s:%s:%s%%%d";
01409 ACE_OS::sprintf (s_ipaddr,
01410 ip_fmt,
01411 addr_p[0], addr_p[1], addr_p[2], addr_p[3],
01412 addr_p[4], addr_p[5], addr_p[6], addr_p[7], scopeid);
01413
01414 error = getaddrinfo (s_ipaddr, 0, &hints, &res0);
01415 if (error)
01416 continue;
01417
01418 if (res0->ai_family == AF_INET6 &&
01419 !IN6_IS_ADDR_UNSPECIFIED (&reinterpret_cast<sockaddr_in6 *> (res0->ai_addr)->sin6_addr))
01420 {
01421 addrs[count].set(reinterpret_cast<sockaddr_in *> (res0->ai_addr), res0->ai_addrlen);
01422 ++count;
01423 }
01424 freeaddrinfo (res0);
01425
01426 }
01427 ACE_OS::fclose (fp);
01428 }
01429 # endif /* ACE_HAS_IPV6 */
01430
01431 return 0;
01432 #else
01433 ACE_UNUSED_ARG (count);
01434 ACE_UNUSED_ARG (addrs);
01435 ACE_NOTSUP_RETURN (-1); // no implementation
01436 #endif /* ACE_WIN32 */
01437 }
|
|
||||||||||||
|
Returns the temporary directory including the trailing slash in buffer. Returns -1 for an error or if the buffer_len is not long enough. Definition at line 593 of file Lib_Find.cpp. References ACE_TCHAR, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, ACE_TEXT_GetTempPath, ACE_OS::getenv(), ACE_OS::strcpy(), and ACE_OS::strlen(). Referenced by ACE_MEM_Acceptor::accept(), ACE_MMAP_Memory_Pool::ACE_MMAP_Memory_Pool(), ACE_Name_Options::ACE_Name_Options(), ACE_System_Time::ACE_System_Time(), and ACE_FILE_Addr::set().
00594 {
00595 int result;
00596 #if defined (ACE_WIN32)
00597 result = ACE_TEXT_GetTempPath (static_cast<DWORD> (buffer_len),
00598 buffer);
00599
00600 // Make sure to return -1 if there is an error
00601 if (result == 0 && ::GetLastError () != ERROR_SUCCESS
00602 || result > static_cast<int> (buffer_len))
00603 result = -1;
00604
00605 #else /* ACE_WIN32 */
00606
00607 // NOTE! Non-Windows platforms don't deal with wide chars for env.
00608 // variables, so do this narrow-char and convert to wide for the
00609 // caller if necessary.
00610
00611 // On non-win32 platforms, check to see what the TMPDIR environment
00612 // variable is defined to be. If it doesn't exist, just use /tmp
00613 const char *tmpdir = ACE_OS::getenv ("TMPDIR");
00614
00615 if (tmpdir == 0)
00616 tmpdir = "/tmp";
00617
00618 size_t len = ACE_OS::strlen (tmpdir);
00619
00620 // Check to see if the buffer is large enough for the string,
00621 // another /, and its null character (hence the + 2)
00622 if ((len + 2) > buffer_len)
00623 {
00624 result = -1;
00625 }
00626 else
00627 {
00628 ACE_OS::strcpy (buffer, ACE_TEXT_CHAR_TO_TCHAR (tmpdir));
00629
00630 // Add a trailing slash because we cannot assume there is already one
00631 // at the end. And having an extra one should not cause problems.
00632 buffer[len] = ACE_TEXT ('/');
00633 buffer[len + 1] = 0;
00634 result = 0;
00635 }
00636 #endif /* ACE_WIN32 */
00637 return result;
00638 }
|
|
||||||||||||
|
Timed wait for handle to get exception ready.
Definition at line 263 of file ACE.inl. References handle_ready().
00265 {
00266 return ACE::handle_ready (handle,
00267 timeout,
00268 0,
00269 0,
00270 1);
00271 }
|
|
||||||||||||
|
Timed wait for handle to get read ready.
Definition at line 241 of file ACE.inl. References handle_ready(). Referenced by enter_recv_timedwait(), recv_n_i(), recvv_n_i(), and t_rcv_n_i().
00243 {
00244 return ACE::handle_ready (handle,
00245 timeout,
00246 1,
00247 0,
00248 0);
00249 }
|
|
||||||||||||||||||||||||
|
Timed wait for handle to get read, write, or exception ready.
Definition at line 2176 of file ACE.cpp. References ETIME, ACE_Handle_Set::fdset(), ACE_OS::poll(), ACE_OS::select(), and ACE_Handle_Set::set_bit(). Referenced by handle_exception_ready(), handle_read_ready(), and handle_write_ready().
02181 {
02182 #if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02183 ACE_UNUSED_ARG (write_ready);
02184 ACE_UNUSED_ARG (exception_ready);
02185
02186 struct pollfd fds;
02187
02188 fds.fd = handle;
02189 fds.events = read_ready ? POLLIN : POLLOUT;
02190 fds.revents = 0;
02191
02192 int result = ACE_OS::poll (&fds, 1, timeout);
02193 #else
02194 ACE_Handle_Set handle_set;
02195 handle_set.set_bit (handle);
02196
02197 // Wait for data or for the timeout to elapse.
02198 int select_width;
02199 # if defined (ACE_WIN32)
02200 // This arg is ignored on Windows and causes pointer truncation
02201 // warnings on 64-bit compiles.
02202 select_width = 0;
02203 # else
02204 select_width = int (handle) + 1;
02205 # endif /* ACE_WIN64 */
02206 int result = ACE_OS::select (select_width,
02207 read_ready ? handle_set.fdset () : 0, // read_fds.
02208 write_ready ? handle_set.fdset () : 0, // write_fds.
02209 exception_ready ? handle_set.fdset () : 0, // exception_fds.
02210 timeout);
02211
02212 #endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02213
02214 switch (result)
02215 {
02216 case 0: // Timer expired.
02217 errno = ETIME;
02218 /* FALLTHRU */
02219 case -1: // we got here directly - select() returned -1.
02220 return -1;
02221 case 1: // Handle has data.
02222 /* FALLTHRU */
02223 default: // default is case result > 0; return a
02224 // ACE_ASSERT (result == 1);
02225 return result;
02226 }
02227 }
|
|
||||||||||||||||
|
Wait up to timeout amount of time to passively establish a connection. This method doesn't perform the Definition at line 2665 of file ACE.cpp. References ACE_TRACE, ETIMEDOUT, EWOULDBLOCK, ACE_OS::poll(), ACE_Time_Value::sec(), ACE_OS::select(), ACE_Handle_Set::set_bit(), and ACE_Time_Value::usec(). Referenced by ACE_TLI_Acceptor::accept(), ACE_SPIPE_Acceptor::accept(), ACE_SOCK_SEQPACK_Acceptor::shared_accept_start(), and ACE_SOCK_Acceptor::shared_accept_start().
02668 {
02669 ACE_TRACE ("ACE::handle_timed_accept");
02670 // Make sure we don't bomb out on erroneous values.
02671 if (listener == ACE_INVALID_HANDLE)
02672 return -1;
02673
02674 #if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02675
02676 struct pollfd fds;
02677
02678 fds.fd = listener;
02679 fds.events = POLLIN;
02680 fds.revents = 0;
02681
02682 #else
02683 // Use the select() implementation rather than poll().
02684 ACE_Handle_Set rd_handle;
02685 rd_handle.set_bit (listener);
02686 #endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02687
02688 // We need a loop here if <restart> is enabled.
02689
02690 for (;;)
02691 {
02692 #if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02693
02694 int n = ACE_OS::poll (&fds, 1, timeout);
02695
02696 #else
02697 int select_width;
02698 # if defined (ACE_WIN32)
02699 // This arg is ignored on Windows and causes pointer truncation
02700 // warnings on 64-bit compiles.
02701 select_width = 0;
02702 # else
02703 select_width = int (listener) + 1;
02704 # endif /* ACE_WIN32 */
02705 int n = ACE_OS::select (select_width,
02706 rd_handle, 0, 0,
02707 timeout);
02708 #endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02709
02710 switch (n)
02711 {
02712 case -1:
02713 if (errno == EINTR && restart)
02714 continue;
02715 else
02716 return -1;
02717 /* NOTREACHED */
02718 case 0:
02719 if (timeout != 0
02720 && timeout->sec () == 0
02721 && timeout->usec () == 0)
02722 errno = EWOULDBLOCK;
02723 else
02724 errno = ETIMEDOUT;
02725 return -1;
02726 /* NOTREACHED */
02727 case 1:
02728 return 0;
02729 /* NOTREACHED */
02730 default:
02731 errno = EINVAL;
02732 return -1;
02733 /* NOTREACHED */
02734 }
02735 }
02736 }
|
|
||||||||||||||||
|
Wait up to timeout amount of time to complete an actively established non-blocking connection. If is_tli is non-0 then we are being called by a TLI wrapper (which behaves slightly differently from a socket wrapper). Definition at line 2507 of file ACE.cpp. References ACE_TRACE, ECONNREFUSED, ETIME, EWOULDBLOCK, ACE_OS::getsockopt(), ACE_Handle_Set::is_set(), MSG_PEEK, ACE_OS::poll(), recv(), ACE_OS::select(), ACE_Handle_Set::set_bit(), SO_ERROR, and SOL_SOCKET. Referenced by ACE_TLI_Connector::complete(), ACE_SOCK_SEQPACK_Connector::complete(), ACE_SOCK_Connector::complete(), and ACE_SOCK_Connector::shared_connect_finish().
02510 {
02511 ACE_TRACE ("ACE::handle_timed_complete");
02512
02513 #if !defined (ACE_WIN32) && defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02514
02515 struct pollfd fds;
02516
02517 fds.fd = h;
02518 fds.events = POLLIN | POLLOUT;
02519 fds.revents = 0;
02520
02521 #else
02522 ACE_Handle_Set rd_handles;
02523 ACE_Handle_Set wr_handles;
02524
02525 rd_handles.set_bit (h);
02526 wr_handles.set_bit (h);
02527 #endif /* !ACE_WIN32 && ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02528
02529 #if defined (ACE_WIN32)
02530 // Winsock is different - it sets the exception bit for failed connect,
02531 // unlike other platforms, where the read bit is set.
02532 ACE_Handle_Set ex_handles;
02533 ex_handles.set_bit (h);
02534 #endif /* ACE_WIN32 */
02535
02536 bool need_to_check = false;
02537 bool known_failure = false;
02538
02539 #if defined (ACE_WIN32)
02540 int n = ACE_OS::select (0, // Ignored on Windows: int (h) + 1,
02541 0,
02542 wr_handles,
02543 ex_handles,
02544 timeout);
02545 #else
02546 # if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02547
02548 int n = ACE_OS::poll (&fds, 1, timeout);
02549
02550 # else
02551 int n = ACE_OS::select (int (h) + 1,
02552 rd_handles,
02553 wr_handles,
02554 0,
02555 timeout);
02556 # endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02557 #endif /* ACE_WIN32 */
02558
02559 // If we failed to connect within the time period allocated by the
02560 // caller, then we fail (e.g., the remote host might have been too
02561 // busy to accept our call).
02562 if (n <= 0)
02563 {
02564 if (n == 0 && timeout != 0)
02565 errno = ETIME;
02566 return ACE_INVALID_HANDLE;
02567 }
02568
02569 // Usually, a ready-for-write handle is successfully connected, and
02570 // ready-for-read (exception on Win32) is a failure. On fails, we
02571 // need to grab the error code via getsockopt. On possible success for
02572 // any platform where we can't tell just from select() (e.g. AIX),
02573 // we also need to check for success/fail.
02574 #if defined (ACE_WIN32)
02575 ACE_UNUSED_ARG (is_tli);
02576
02577 // On Win32, ex_handle set indicates a failure. We'll do the check
02578 // to try and get an errno value, but the connect failed regardless of
02579 // what getsockopt says about the error.
02580 if (ex_handles.is_set (h))
02581 {
02582 need_to_check = true;
02583 known_failure = true;
02584 }
02585 #elif defined (ACE_VXWORKS)
02586 ACE_UNUSED_ARG (is_tli);
02587
02588 // Force the check on VxWorks. The read handle for "h" is not set,
02589 // so "need_to_check" is false at this point. The write handle is
02590 // set, for what it's worth.
02591 need_to_check = true;
02592 #else
02593 if (is_tli)
02594
02595 # if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02596 need_to_check = (fds.revents & POLLIN) && !(fds.revents & POLLOUT);
02597 # else
02598 need_to_check = rd_handles.is_set (h) && !wr_handles.is_set (h);
02599 # endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02600
02601 else
02602 #if defined(AIX)
02603 // AIX is broken... both success and failed connect will set the
02604 // write handle only, so always check.
02605 need_to_check = true;
02606 #else
02607 # if defined (ACE_HAS_POLL) && defined (ACE_HAS_LIMITED_SELECT)
02608 need_to_check = (fds.revents & POLLIN);
02609 # else
02610 need_to_check = rd_handles.is_set (h);
02611 # endif /* ACE_HAS_POLL && ACE_HAS_LIMITED_SELECT */
02612 #endif /* AIX */
02613 #endif /* ACE_WIN32 */
02614
02615 if (need_to_check)
02616 {
02617 #if defined (SOL_SOCKET) && defined (SO_ERROR)
02618 int sock_err = 0;
02619 int sock_err_len = sizeof (sock_err);
02620 int sockopt_ret = ACE_OS::getsockopt (h, SOL_SOCKET, SO_ERROR,
02621 (char *)&sock_err, &sock_err_len);
02622 if (sockopt_ret < 0)
02623 {
02624 h = ACE_INVALID_HANDLE;
02625 }
02626
02627 if (sock_err != 0 || known_failure)
02628 {
02629 h = ACE_INVALID_HANDLE;
02630 errno = sock_err;
02631 }
02632 #else
02633 char dummy;
02634
02635 // The following recv() won't block provided that the
02636 // ACE_NONBLOCK flag has not been turned off .
02637 n = ACE::recv (h, &dummy, 1, MSG_PEEK);
02638
02639 // If no data was read/peeked at, check to see if it's because
02640 // of a non-connected socket (and therefore an error) or there's
02641 // just no data yet.
02642 if (n <= 0)
02643 {
02644 if (n == 0)
02645 {
02646 errno = ECONNREFUSED;
02647 h = ACE_INVALID_HANDLE;
02648 }
02649 else if (errno != EWOULDBLOCK && errno != EAGAIN)
02650 h = ACE_INVALID_HANDLE;
02651 }
02652 #endif
02653 }
02654
02655 // 1. The HANDLE is ready for writing and doesn't need to be checked or
02656 // 2. recv() returned an indication of the state of the socket - if there is
02657 // either data present, or a recv is legit but there's no data yet,
02658 // the connection was successfully established.
02659 return h;
02660 }
|
|
||||||||||||||||||||||||
|
Wait up to timeout> amount of time to actively open a device. This method doesn't perform the Definition at line 17 of file Handle_Ops.cpp. References ACE_NONBLOCK, ACE_TCHAR, ACE_TRACE, ETIMEDOUT, EWOULDBLOCK, ACE_OS::open(), ACE_Time_Value::sec(), and ACE_Time_Value::usec(). Referenced by ACE_UPIPE_Connector::connect(), ACE_SPIPE_Connector::connect(), ACE_FILE_Connector::connect(), and ACE_DEV_Connector::connect().
00022 {
00023 ACE_TRACE ("ACE::handle_timed_open");
00024
00025 if (timeout != 0)
00026 {
00027 #if !defined (ACE_WIN32)
00028 // On Win32, ACE_NONBLOCK gets recognized as O_WRONLY so we
00029 // don't use it there
00030 flags |= ACE_NONBLOCK;
00031 #endif /* ACE_WIN32 */
00032
00033 // Open the named pipe or file using non-blocking mode...
00034 ACE_HANDLE const handle = ACE_OS::open (name, flags, perms, sa);
00035
00036 if (handle == ACE_INVALID_HANDLE
00037 && (errno == EWOULDBLOCK
00038 && (timeout->sec () > 0 || timeout->usec () > 0)))
00039 // This expression checks if we were polling.
00040 errno = ETIMEDOUT;
00041
00042 return handle;
00043 }
00044 else
00045 return ACE_OS::open (name, flags, perms, sa);
00046 }
|
|
||||||||||||
|
Timed wait for handle to get write ready.
Definition at line 252 of file ACE.inl. References handle_ready(). Referenced by enter_send_timedwait(), send_n_i(), sendv_n_i(), and t_snd_n_i().
00254 {
00255 return ACE::handle_ready (handle,
00256 timeout,
00257 0,
00258 1,
00259 0);
00260 }
|
|
||||||||||||
|
Computes the hash value of {str} using the "Hash PJW" routine.
Definition at line 347 of file ACE.cpp.
00348 {
00349 u_long hash = 0;
00350
00351 for (size_t i = 0; i < len; i++)
00352 {
00353 // @@ UNICODE: Does this function do the correct thing with wchar's?
00354
00355 const wchar_t temp = str[i];
00356 hash = (hash << 4) + (temp * 13);
00357
00358 u_long g = hash & 0xf0000000;
00359
00360 if (g)
00361 {
00362 hash ^= (g >> 24);
00363 hash ^= g;
00364 }
00365 }
00366
00367 return hash;
00368 }
|
|
|
Computes the hash value of {str} using the "Hash PJW" routine.
Definition at line 371 of file ACE.cpp. References hash_pjw().
00372 {
00373 return ACE::hash_pjw (str, ACE_OS::strlen (str));
00374 }
|
|
||||||||||||
|
Computes the hash value of {str} using the "Hash PJW" routine.
Definition at line 318 of file ACE.cpp.
00319 {
00320 u_long hash = 0;
00321
00322 for (size_t i = 0; i < len; i++)
00323 {
00324 const char temp = str[i];
00325 hash = (hash << 4) + (temp * 13);
00326
00327 u_long g = hash & 0xf0000000;
00328
00329 if (g)
00330 {
00331 hash ^= (g >> 24);
00332 hash ^= g;
00333 }
00334 }
00335
00336 return hash;
00337 }
|
|
|
Computes the hash value of {str} using the "Hash PJW" routine.
Definition at line 340 of file ACE.cpp. Referenced by ACE_Filecache::create(), ACE_Filecache::fetch(), ACE_Filecache::finish(), ACE_UNIX_Addr::hash(), ACE_String_Base< CHAR >::hash(), ACE_SString::hash(), hash_pjw(), ACE_Hash< wchar_t * >::operator()(), ACE_Hash< const wchar_t * >::operator()(), ACE_Hash< char * >::operator()(), ACE_Hash< const char * >::operator()(), and ACE_Filecache::remove().
00341 {
00342 return ACE::hash_pjw (str, ACE_OS::strlen (str));
00343 }
|
|
|
Convert a hex character to its byte representation.
Definition at line 339 of file ACE.inl. References ACE_OS::ace_isdigit(), ACE_OS::ace_islower(), ACE_TCHAR, and ACE_TEXT.
00340 {
00341 if (ACE_OS::ace_isdigit (c))
00342 return (u_char) (c - ACE_TEXT ('0'));
00343 else if (ACE_OS::ace_islower (c))
00344 return (u_char) (10 + c - ACE_TEXT ('a'));
00345 else
00346 return (u_char) (10 + c - ACE_TEXT ('A'));
00347 }
|
|
|
This class implements the functions for the initialization and shutting down ACE. These functions are called only once per ACE invokation.
Definition at line 15 of file Init_ACE.cpp. References ACE_Object_Manager::init(), and ACE_Object_Manager::instance().
00016 {
00017 // Don't use ACE_TRACE, because Object_Manager might not have been
00018 // instantiated yet.
00019 // ACE_TRACE ("ACE::init");
00020
00021 ++ACE::init_fini_count_;
00022
00023 return ACE_Object_Manager::instance ()->init ();
00024 }
|
|
|
This is an execution-time check. If ACE has not been compiled with Definition at line 1617 of file Sock_Connect.cpp. References ace_ipv4_enabled, and PF_INET.
01618 {
01619 #if defined (ACE_HAS_IPV6)
01620 return static_cast<bool> (ace_ipv4_enabled == -1 ?
01621 ::ip_check (ace_ipv4_enabled, PF_INET) :
01622 ace_ipv4_enabled);
01623 #else
01624 // Assume it's always enabled since ACE requires some version of
01625 // TCP/IP to exist.
01626 return true;
01627 #endif /* ACE_HAS_IPV6*/
01628 }
|
|
|
Returns 1 if IPv6 is enabled on the current host; 0 if not. This is an execution-time check. If ACE has not been compiled with ACE_HAS_IPV6, it always returns 0. If ACE_HAS_IPV6 is enabled, this function tries to create a PF_INET6 socket, returning 1 if it succeeds, and 0 if it fails. Caches the result so it only gets checked once. Definition at line 1631 of file Sock_Connect.cpp. References ace_ipv6_enabled. Referenced by ACE_INET_Addr::determine_type(), ACE_SOCK_SEQPACK_Acceptor::open(), ACE_SOCK_Dgram::open(), ACE_SOCK_Acceptor::open(), and ACE_INET_Addr::set().
01632 {
01633 #if defined (ACE_HAS_IPV6)
01634 return ace_ipv6_enabled == -1 ?
01635 ::ip_check (ace_ipv6_enabled, PF_INET6) :
01636 ace_ipv6_enabled;
01637 #else /* ACE_HAS_IPV6 */
01638 return 0;
01639 #endif /* !ACE_HAS_IPV6 */
01640 }
|
|
||||||||||||||||
|
Function that can burn up noticeable CPU time: brute-force determination of whether number n is prime. Returns 0 if it is prime, or the smallest factor if it is not prime. min_factor and max_factor can be used to partition the work among threads. For just one thread, typical values are 2 and n/2. Definition at line 2991 of file ACE.cpp.
02994 {
02995 if (n > 3)
02996 for (u_long factor = min_factor;
02997 factor <= max_factor;
02998 ++factor)
02999 if (n / factor * factor == n)
03000 return factor;
03001
03002 return 0;
03003 }
|
|
|
Determins whether the given error code corresponds to to a WinSock error. If so returns true, false otherwise. For internal use only.
Definition at line 3158 of file ACE.cpp. Referenced by ACE_OS::strerror().
03159 {
03160 #if defined (ACE_WIN32)
03161 switch (error)
03162 {
03163 case WSAVERNOTSUPPORTED:
03164 case WSASYSNOTREADY:
03165 case WSAEINVAL:
03166 case WSAHOST_NOT_FOUND:
03167 case WSATRY_AGAIN:
03168 case WSANO_RECOVERY:
03169 case WSANO_DATA:
03170 /*
03171 case WSANO_ADDRESS:
03172 */
03173 case WSANOTINITIALISED:
03174 case WSAENETDOWN:
03175 case WSAEINPROGRESS:
03176 case WSAEINTR:
03177 case WSAEAFNOSUPPORT:
03178 case WSAEMFILE:
03179 case WSAENOBUFS:
03180 case WSAEPROTONOSUPPORT:
03181 case WSAEPROTOTYPE:
03182 case WSAESOCKTNOSUPPORT:
03183 case WSAENOTSOCK:
03184 case WSAEWOULDBLOCK:
03185 case WSAEADDRINUSE:
03186 case WSAECONNABORTED:
03187 case WSAECONNRESET:
03188 case WSAENOTCONN:
03189 case WSAETIMEDOUT:
03190 case WSAECONNREFUSED:
03191 case WSAEHOSTDOWN:
03192 case WSAEHOSTUNREACH:
03193 case WSAEADDRNOTAVAIL:
03194 case WSAEISCONN:
03195 case WSAENETRESET:
03196 case WSAEMSGSIZE:
03197 case WSAENETUNREACH:
03198 case WSAEFAULT:
03199 case WSAEDISCON:
03200 case WSAEACCES:
03201 case WSAESHUTDOWN:
03202 case WSAEPROCLIM:
03203 case WSAEALREADY:
03204 case WSAEPFNOSUPPORT:
03205 case WSAENOPROTOOPT:
03206 case WSATYPE_NOT_FOUND:
03207 case WSAEOPNOTSUPP:
03208 return true;
03209 }
03210 #else
03211 ACE_UNUSED_ARG (error);
03212 #endif /* ACE_WIN32 */
03213 return false;
03214 }
|
|
||||||||||||||||
|
Finds the file filename either using an absolute path or using a relative path in conjunction with ACE_LD_SEARCH_PATH (e.g., $LD_LIBRARY_PATH on UNIX or the directories scaned by Win32 API SearchPath on Win32). This function will add appropriate suffix (e.g., .dll on Win32 or .so on UNIX) according to the OS platform. In addition, this function will apply the appropriate prefix (e.g., "lib" on UNIX and "" on Win32) if the filename doesn't match directly. Definition at line 121 of file Lib_Find.cpp. References ACE_OS::access(), ACE_DIRECTORY_SEPARATOR_CHAR, ACE_DLL_PREFIX, ACE_DLL_SUFFIX, ACE_ERROR, ACE_LD_SEARCH_PATH, ACE_LD_SEARCH_PATH_SEPARATOR_STR, ACE_TCHAR, ACE_TEXT, ACE_TEXT_ALWAYS_CHAR, ACE_TEXT_ExpandEnvironmentStrings, ACE_TEXT_SearchPath, ACE_TRACE, F_OK, ACE_OS::free(), ACE_OS::getenv(), LM_WARNING, ACE_OS::malloc(), MAXPATHLEN, ACE_OS::sprintf(), ACE_OS::strcasecmp(), ACE_OS::strcat(), ACE_OS::strcmp(), ACE_OS::strcpy(), ACE_OS::strdup(), ACE_OS::strlen(), ACE_OS::strrchr(), strrepl(), and strsplit_r(). Referenced by ldopen(), and ACE_DLL_Handle::open().
00124 {
00125 ACE_TRACE ("ACE::ldfind");
00126 #if defined (ACE_OPENVMS)
00127 if (ACE_OS::strlen(filename) >= maxpathnamelen)
00128 {
00129 errno = ENOMEM;
00130 return -1;
00131 }
00132
00133 dsc$descriptor nameDsc;
00134 nameDsc.dsc$b_class = DSC$K_CLASS_S;
00135 nameDsc.dsc$b_dtype = DSC$K_DTYPE_T;
00136 nameDsc.dsc$w_length = ACE_OS::strlen(filename);
00137 nameDsc.dsc$a_pointer = (char*)filename;
00138
00139 char symbol[] = "NULL";
00140 dsc$descriptor symbolDsc;
00141 symbolDsc.dsc$b_class = DSC$K_CLASS_S;
00142 symbolDsc.dsc$b_dtype = DSC$K_DTYPE_T;
00143 symbolDsc.dsc$w_length = ACE_OS::strlen(symbol);
00144 symbolDsc.dsc$a_pointer = symbol;
00145
00146 int symbolValue;
00147 int result;
00148 try
00149 {
00150 result = LIB$FIND_IMAGE_SYMBOL(&nameDsc, &symbolDsc, &symbolValue, 0, 0);
00151 }
00152 catch (chf$signal_array& sig)
00153 {
00154 result = sig.chf$l_sig_name;
00155 }
00156
00157 int severity = result & STS$M_SEVERITY;
00158 int conditionId = result & STS$M_COND_ID;
00159 if (severity == STS$K_SUCCESS || severity == STS$K_WARNING || severity == STS$K_INFO ||
00160 (severity == STS$K_ERROR && conditionId == (LIB$_KEYNOTFOU & STS$M_COND_ID)))
00161 {
00162 ACE_OS::strcpy(pathname, filename);
00163 return 0;
00164 }
00165
00166 if (ACE_OS::strlen(filename) + ACE_OS::strlen(ACE_DLL_PREFIX) >= maxpathnamelen)
00167 {
00168 errno = ENOMEM;
00169 return -1;
00170 }
00171
00172
00173 ACE_OS::strcpy(pathname, ACE_DLL_PREFIX);
00174 ACE_OS::strcat(pathname, filename);
00175 nameDsc.dsc$w_length = ACE_OS::strlen(pathname);
00176 nameDsc.dsc$a_pointer = pathname;
00177 try
00178 {
00179 result = LIB$FIND_IMAGE_SYMBOL(&nameDsc, &symbolDsc, &symbolValue, 0, 0);
00180 }
00181 catch (chf$signal_array& sig)
00182 {
00183 result = sig.chf$l_sig_name;
00184 }
00185
00186 severity = result & STS$M_SEVERITY;
00187 conditionId = result & STS$M_COND_ID;
00188 if (severity == STS$K_SUCCESS || severity == STS$K_WARNING || severity == STS$K_INFO ||
00189 (severity == STS$K_ERROR && conditionId == (LIB$_KEYNOTFOU & STS$M_COND_ID)))
00190 {
00191 return 0;
00192 }
00193 errno = ENOENT;
00194 return -1;
00195 #endif /* ACE_OPENVMS */
00196
00197 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE) && \
00198 !defined (ACE_HAS_PHARLAP)
00199 ACE_TCHAR expanded_filename[MAXPATHLEN];
00200 if (ACE_TEXT_ExpandEnvironmentStrings (filename,
00201 expanded_filename,
00202 sizeof expanded_filename
00203 / sizeof (ACE_TCHAR)))
00204 filename = expanded_filename;
00205 #endif /* ACE_WIN32 && !ACE_HAS_WINCE && !ACE_HAS_PHARLAP */
00206
00207 ACE_TCHAR tempcopy[MAXPATHLEN + 1];
00208 ACE_TCHAR searchpathname[MAXPATHLEN + 1];
00209 #if defined (ACE_WIN32) && defined (ACE_LD_DECORATOR_STR) && !defined (ACE_DISABLE_DEBUG_DLL_CHECK)
00210 ACE_TCHAR decorator[] = ACE_LD_DECORATOR_STR;
00211 ACE_TCHAR searchfilename[MAXPATHLEN + sizeof(decorator) / sizeof (ACE_TCHAR)];
00212 #else
00213 ACE_TCHAR searchfilename[MAXPATHLEN + 1];
00214 #endif /* ACE_WIN32 && ACE_LD_DECORATOR_STR && !ACE_DISABLE_DEBUG_DLL_CHECK */
00215
00216 // Create a copy of filename to work with.
00217 if (ACE_OS::strlen (filename) + 1
00218 > (sizeof tempcopy / sizeof (ACE_TCHAR)))
00219 {
00220 errno = ENOMEM;
00221 return -1;
00222 }
00223 else
00224 ACE_OS::strcpy (tempcopy, filename);
00225
00226 // Insert canonical directory separators.
00227 ACE_TCHAR *separator_ptr;
00228
00229 #if (ACE_DIRECTORY_SEPARATOR_CHAR != '/')
00230 // Make all the directory separators "canonical" to simplify
00231 // subsequent code.
00232 ACE::strrepl (tempcopy, ACE_DIRECTORY_SEPARATOR_CHAR, '/');
00233 #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */
00234
00235 // Separate filename from pathname.
00236 separator_ptr = ACE_OS::strrchr (tempcopy, '/');
00237
00238 // This is a relative path.
00239 if (separator_ptr == 0)
00240 {
00241 searchpathname[0] = '\0';
00242 ACE_OS::strcpy (searchfilename, tempcopy);
00243 }
00244 else // This is an absolute path.
00245 {
00246 ACE_OS::strcpy (searchfilename, separator_ptr + 1);
00247 separator_ptr[1] = '\0';
00248 ACE_OS::strcpy (searchpathname, tempcopy);
00249 }
00250
00251 bool has_suffix = false;
00252
00253 // Check to see if this has an appropriate DLL suffix for the OS
00254 // platform.
00255 ACE_TCHAR *s = ACE_OS::strrchr (searchfilename, '.');
00256
00257 const ACE_TCHAR *dll_suffix = ACE_DLL_SUFFIX;
00258
00259 if (s != 0)
00260 {
00261 // If we have a dot, we have a suffix
00262 has_suffix = true;
00263
00264 // Check whether this matches the appropriate platform-specific
00265 // suffix.
00266 #if defined (ACE_WIN32)
00267 // Use <ACE_OS::strcasecmp> on any platform with
00268 // case-insensitive filenames.
00269 if (ACE_OS::strcasecmp (s, dll_suffix) != 0)
00270 #else
00271 if (ACE_OS::strcmp (s, dll_suffix) != 0)
00272 #endif /* ACE_WIN32 */
00273 {
00274 ACE_ERROR ((LM_WARNING,
00275 ACE_TEXT ("Warning: improper suffix for a ")
00276 ACE_TEXT ("shared library on this platform: %s\n"),
00277 s));
00278 }
00279 }
00280
00281 // Make sure we've got enough space in searchfilename.
00282 if (ACE_OS::strlen (searchfilename)
00283 + ACE_OS::strlen (ACE_DLL_PREFIX)
00284 + (has_suffix ? 0 : ACE_OS::strlen (dll_suffix))
00285 >= (sizeof searchfilename / sizeof (ACE_TCHAR)))
00286 {
00287 errno = ENOMEM;
00288 return -1;
00289 }
00290
00291 #if defined (ACE_WIN32) && defined (ACE_LD_DECORATOR_STR) && !defined (ACE_DISABLE_DEBUG_DLL_CHECK)
00292 size_t len_searchfilename = ACE_OS::strlen (searchfilename);
00293 if (! has_suffix)
00294 ACE_OS::strcpy (searchfilename + len_searchfilename,
00295 decorator);
00296
00297 for (int tag = 1; tag >= 0; tag --)
00298 {
00299 if (tag == 0)
00300 searchfilename [len_searchfilename] = 0;
00301
00302 #endif /* ACE_WIN32 && ACE_LD_DECORATOR_STR && !ACE_DISABLE_DEBUG_DLL_CHECK */
00303 // Use absolute pathname if there is one.
00304 if (ACE_OS::strlen (searchpathname) > 0)
00305 {
00306 if (ACE_OS::strlen (searchfilename)
00307 + ACE_OS::strlen (searchpathname) >= maxpathnamelen)
00308 {
00309 errno = ENOMEM;
00310 return -1;
00311 }
00312 else
00313 {
00314 #if (ACE_DIRECTORY_SEPARATOR_CHAR != '/')
00315 // Revert to native path name separators.
00316 ACE::strrepl (searchpathname,
00317 '/',
00318 ACE_DIRECTORY_SEPARATOR_CHAR);
00319 #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */
00320 // First, try matching the filename *without* adding a
00321 // prefix.
00322 ACE_OS::sprintf (pathname,
00323 ACE_TEXT ("%s%s%s"),
00324 searchpathname,
00325 searchfilename,
00326 has_suffix ? ACE_TEXT ("") : dll_suffix);
00327 if (ACE_OS::access (pathname, F_OK) == 0)
00328 return 0;
00329
00330 // Second, try matching the filename *with* adding a prefix.
00331 ACE_OS::sprintf (pathname,
00332 ACE_TEXT ("%s%s%s%s"),
00333 searchpathname,
00334 ACE_DLL_PREFIX,
00335 searchfilename,
00336 has_suffix ? ACE_TEXT ("") : dll_suffix);
00337 if (ACE_OS::access (pathname, F_OK) == 0)
00338 return 0;
00339 }
00340 }
00341
00342 // Use relative filenames via LD_LIBRARY_PATH or PATH (depending on
00343 // OS platform).
00344 else
00345 {
00346 #if defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)
00347 ACE_TCHAR *file_component = 0;
00348 DWORD pathlen =
00349 ACE_TEXT_SearchPath (0,
00350 searchfilename,
00351 dll_suffix,
00352 static_cast<DWORD> (maxpathnamelen),
00353 pathname,
00354 &file_component);
00355 if (pathlen >= maxpathnamelen)
00356 {
00357 errno = ENOMEM;
00358 return -1;
00359 }
00360 else if (pathlen > 0)
00361 return 0;
00362
00363 // In case not found we should try again with the ACE_DLL_PREFIX
00364 // prefixed
00365 ACE_OS::strcpy (searchfilename, ACE_DLL_PREFIX);
00366 ACE_OS::strcat (searchfilename, tempcopy);
00367 pathlen =
00368 ACE_TEXT_SearchPath (0,
00369 searchfilename,
00370 dll_suffix,
00371 static_cast<DWORD> (maxpathnamelen),
00372 pathname,
00373 &file_component);
00374 if (pathlen >= maxpathnamelen)
00375 {
00376 errno = ENOMEM;
00377 return -1;
00378 }
00379 else if (pathlen > 0)
00380 return 0;
00381 #else
00382 ACE_TCHAR *ld_path;
00383 # if defined ACE_DEFAULT_LD_SEARCH_PATH
00384 ld_path = ACE_DEFAULT_LD_SEARCH_PATH;
00385 # else
00386 # if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
00387 ld_path = ACE_OS::getenv (ACE_LD_SEARCH_PATH);
00388 # else
00389 // Wide-char, non-Windows only offers char * getenv. So capture
00390 // it, translate to wide-char, and continue.
00391 ACE_Ascii_To_Wide wide_ldpath
00392 (ACE_OS::getenv (ACE_TEXT_ALWAYS_CHAR (ACE_LD_SEARCH_PATH)));
00393 ld_path = wide_ldpath.wchar_rep ();
00394 # endif /* ACE_WIN32 || !ACE_USES_WCHAR */
00395 # endif /* ACE_DEFAULT_LD_SEARCH_PATH */
00396
00397 #if defined (ACE_HAS_WINCE)
00398 ACE_TCHAR *ld_path_temp = 0;
00399 if (ld_path != 0)
00400 {
00401 ld_path_temp = (ACE_TCHAR *)
00402 ACE_OS::malloc ((ACE_OS::strlen (ld_path) + 2)
00403 * sizeof (ACE_TCHAR));
00404 if (ld_path_temp != 0)
00405 {
00406 ACE_OS::strcpy (ld_path_temp,
00407 ACE_LD_SEARCH_PATH_SEPARATOR_STR);
00408
00409 ACE_OS::strcat (ld_path_temp, ld_path);
00410 ld_path = ld_path_temp;
00411 }
00412 else
00413 {
00414 ACE_OS::free ((void *) ld_path_temp);
00415 ld_path = ld_path_temp = 0;
00416 }
00417 }
00418 #endif /* ACE_HAS_WINCE */
00419
00420 if (ld_path != 0
00421 && (ld_path = ACE_OS::strdup (ld_path)) != 0)
00422 {
00423 // strtok has the strange behavior of not separating the
00424 // string ":/foo:/bar" into THREE tokens. One would expect
00425 // that the first iteration the token would be an empty
00426 // string, the second iteration would be "/foo", and the
00427 // third iteration would be "/bar". However, this is not
00428 // the case; one only gets two iterations: "/foo" followed
00429 // by "/bar".
00430
00431 // This is especially a problem in parsing Unix paths
00432 // because it is permissible to specify 'the current
00433 // directory' as an empty entry. So, we introduce the
00434 // following special code to cope with this:
00435
00436 // Look at each dynamic lib directory in the search path.
00437
00438 ACE_TCHAR *nextholder = 0;
00439 const ACE_TCHAR *path_entry =
00440 ACE::strsplit_r (ld_path,
00441 ACE_LD_SEARCH_PATH_SEPARATOR_STR,
00442 nextholder);
00443 int result = 0;
00444
00445 for (;;)
00446 {
00447 // Check if at end of search path.
00448 if (path_entry == 0)
00449 {
00450 errno = ENOENT;
00451 result = -1;
00452 break;
00453 }
00454 else if (ACE_OS::strlen (path_entry)
00455 + 1
00456 + ACE_OS::strlen (searchfilename)
00457 >= maxpathnamelen)
00458 {
00459 errno = ENOMEM;
00460 result = -1;
00461 break;
00462 }
00463 // This works around the issue where a path might have
00464 // an empty component indicating 'current directory'.
00465 // We need to do it here rather than anywhere else so
00466 // that the loop condition will still work.
00467 else if (path_entry[0] == '\0')
00468 path_entry = ACE_TEXT (".");
00469
00470 // First, try matching the filename *without* adding a
00471 // prefix.
00472 ACE_OS::sprintf (pathname,
00473 ACE_TEXT ("%s%c%s%s"),
00474 path_entry,
00475 ACE_DIRECTORY_SEPARATOR_CHAR,
00476 searchfilename,
00477 has_suffix ? ACE_TEXT ("") : dll_suffix);
00478 if (ACE_OS::access (pathname, F_OK) == 0)
00479 break;
00480
00481 // Second, try matching the filename *with* adding a
00482 // prefix.
00483 ACE_OS::sprintf (pathname,
00484 ACE_TEXT ("%s%c%s%s%s"),
00485 path_entry,
00486 ACE_DIRECTORY_SEPARATOR_CHAR,
00487 ACE_DLL_PREFIX,
00488 searchfilename,
00489 has_suffix ? ACE_TEXT ("") : dll_suffix);
00490 if (ACE_OS::access (pathname, F_OK) == 0)
00491 break;
00492
00493 // Fetch the next item in the path
00494 path_entry =
00495 ACE::strsplit_r (0,
00496 ACE_LD_SEARCH_PATH_SEPARATOR_STR,
00497 nextholder);
00498 }
00499
00500 #if defined (ACE_HAS_WINCE)
00501 if (ld_path_temp != 0)
00502 ACE_OS::free (ld_path_temp);
00503 #endif /* ACE_HAS_WINCE */
00504 ACE_OS::free ((void *) ld_path);
00505 #if defined (ACE_HAS_WINCE) && defined (ACE_LD_DECORATOR_STR) && \
00506 !defined (ACE_DISABLE_DEBUG_DLL_CHECK)
00507 if (result == 0 || tag == 0)
00508 #endif /* ACE_HAS_WINCE && ACE_LD_DECORATOR_STR && !ACE_DISABLE_DEBUG_DLL_CHECK */
00509 return result;
00510 }
00511 #endif /* ACE_WIN32 && !ACE_HAS_WINCE */
00512 }
00513 #if defined (ACE_WIN32) && defined (ACE_LD_DECORATOR_STR) && !defined (ACE_DISABLE_DEBUG_DLL_CHECK)
00514 }
00515 #endif /* ACE_WIN32 && ACE_LD_DECORATOR_STR && !ACE_DISABLE_DEBUG_DLL_CHECK */
00516
00517 errno = ENOENT;
00518 return -1;
00519 }
|
|
|
Transforms entry_point into a form that can be located in a dynamic library using . For example, with Win32/Borland extern "C" functions which use the default calling convention have a '_' prepended. Always returns a buffer that has been dynamically allocated using . Definition at line 537 of file Lib_Find.cpp. References ACE_NEW_RETURN, ACE_TCHAR, ACE_TEXT, ACE_TRACE, ACE_OS::strcat(), ACE_OS::strcpy(), and ACE_OS::strlen().
00538 {
00539 ACE_TRACE ("ACE::ldname");
00540
00541 #if defined(ACE_NEEDS_DL_UNDERSCORE)
00542 size_t size =
00543 1 // leading '_'
00544 + ACE_OS::strlen (entry_point)
00545 + 1;
00546
00547 ACE_TCHAR *new_name;
00548 ACE_NEW_RETURN (new_name,
00549 ACE_TCHAR[size],
00550 0);
00551
00552 ACE_OS::strcpy (new_name, ACE_TEXT ("_"));
00553 ACE_OS::strcat (new_name, entry_point);
00554
00555 return new_name;
00556 #else /* ACE_NEEDS_DL_UNDERSCORE */
00557 size_t size =
00558 ACE_OS::strlen (entry_point)
00559 + 1;
00560
00561 ACE_TCHAR *new_name;
00562 ACE_NEW_RETURN (new_name,
00563 ACE_TCHAR[size],
00564 0);
00565
00566 ACE_OS::strcpy (new_name, entry_point);
00567 return new_name;
00568 #endif /* ACE_NEEDS_DL_UNDERSCORE */
00569 }
|
|
||||||||||||
|
Uses Definition at line 522 of file Lib_Find.cpp. References ACE_TCHAR, ACE_TRACE, ACE_OS::fopen(), ldfind(), and MAXPATHLEN.
00524 {
00525 ACE_TRACE ("ACE::ldopen");
00526
00527 ACE_TCHAR buf[MAXPATHLEN + 1];
00528 if (ACE::ldfind (filename,
00529 buf,
00530 sizeof (buf) /sizeof (ACE_TCHAR)) == -1)
00531 return 0;
00532 else
00533 return ACE_OS::fopen (buf, type);
00534 }
|
|
|
Computes the base 2 logarithm of {num}.
Definition at line 296 of file ACE.inl. Referenced by ACE_Log_Record::priority(), and ACE_Log_Record::priority_name().
00297 {
00298 u_long log = 0;
00299
00300 for (; num > 1; ++log)
00301 num >>= 1;
00302
00303 return log;
00304 }
|
|
|
e.g., the "5" in ACE 5.1.12.
Definition at line 107 of file ACE.cpp. References ACE_MAJOR_VERSION.
00108 {
00109 return ACE_MAJOR_VERSION;
00110 }
|
|
|
Map troublesome win32 errno values to values that standard C strerr function understands. Thank you Microsoft. Definition at line 325 of file ACE.inl. Referenced by ACE_Log_Msg::log().
00326 {
00327 #if defined (ACE_WIN32)
00328 switch (error)
00329 {
00330 case WSAEWOULDBLOCK:
00331 return EAGAIN; // Same as UNIX errno EWOULDBLOCK.
00332 }
00333 #endif /* ACE_WIN32 */
00334
00335 return error;
00336 }
|
|
|
Returns the maximum number of open handles currently permitted in this process. This maximum may be extended using Definition at line 2843 of file ACE.cpp. References ACE_NOTSUP_RETURN, ACE_TRACE, ACE_OS::getrlimit(), and ACE_OS::sysconf(). Referenced by daemonize(), and set_handle_limit().
02844 {
02845 ACE_TRACE ("ACE::max_handles");
02846 #if defined (RLIMIT_NOFILE) && !defined (ACE_LACKS_RLIMIT)
02847 rlimit rl;
02848 int r = ACE_OS::getrlimit (RLIMIT_NOFILE, &rl);
02849 # if !defined (RLIM_INFINITY)
02850 if (r == 0)
02851 return rl.rlim_cur;
02852 #else
02853 if (r == 0 && rl.rlim_cur != RLIM_INFINITY)
02854 return rl.rlim_cur;
02855 // If == RLIM_INFINITY, fall through to the ACE_LACKS_RLIMIT sections
02856 # endif /* RLIM_INFINITY */
02857 #endif /* RLIMIT_NOFILE && !ACE_LACKS_RLIMIT */
02858
02859 #if defined (_SC_OPEN_MAX)
02860 return ACE_OS::sysconf (_SC_OPEN_MAX);
02861 #elif defined (ACE_VXWORKS) && (ACE_VXWORKS < 0x620)
02862 return maxFiles;
02863 #elif defined (FD_SETSIZE)
02864 return FD_SETSIZE;
02865 #else
02866 ACE_NOTSUP_RETURN (-1);
02867 #endif /* _SC_OPEN_MAX */
02868 }
|
|
||||||||||||
|
Calculates the minimum enclosing frame size for the given values.
Definition at line 2948 of file ACE.cpp. References gcd().
02949 {
02950 // if one of the periods is zero, treat it as though it as
02951 // uninitialized and return the other period as the frame size
02952 if (0 == period1)
02953 {
02954 return period2;
02955 }
02956 if (0 == period2)
02957 {
02958 return period1;
02959 }
02960
02961 // if neither is zero, find the greatest common divisor of the two periods
02962 u_long greatest_common_divisor = ACE::gcd (period1, period2);
02963
02964 // explicitly consider cases to reduce risk of possible overflow errors
02965 if (greatest_common_divisor == 1)
02966 {
02967 // periods are relative primes: just multiply them together
02968 return period1 * period2;
02969 }
02970 else if (greatest_common_divisor == period1)
02971 {
02972 // the first period divides the second: return the second
02973 return period2;
02974 }
02975 else if (greatest_common_divisor == period2)
02976 {
02977 // the second period divides the first: return the first
02978 return period1;
02979 }
02980 else
02981 {
02982 // the current frame size and the entry's effective period
02983 // have a non-trivial greatest common divisor: return the
02984 // product of factors divided by those in their gcd.
02985 return (period1 * period2) / greatest_common_divisor;
02986 }
02987 }
|
|
|
e.g., the "1" in ACE 5.1.12.
Definition at line 113 of file ACE.cpp. References ACE_MINOR_VERSION.
00114 {
00115 return ACE_MINOR_VERSION;
00116 }
|
|
|
Hex conversion utility.
Definition at line 307 of file ACE.inl. References ACE_TCHAR, and ACE_TEXT.
00308 {
00309 // Hexadecimal characters.
00310 #if defined (ACE_VXWORKS) && !defined (__DCPLUSPLUS__)
00311 // temporary solution to prevent Windriver GNU toolchains from spewing
00312 // loads of warnings when inlining.
00313 // problem (incorrect warning leftover from older GNU) has been reported as
00314 // TSR to Windriver.
00315 const ACE_TCHAR hex_chars[] = ACE_TEXT ("0123456789abcdef");
00316 #else
00317 static const ACE_TCHAR hex_chars[] = ACE_TEXT ("0123456789abcdef");
00318 #endif
00319
00320 // Yes, this works for UNICODE
00321 return hex_chars[n & 0x0f];
00322 }
|
|
||||||||||||||||
|
Opening the temp file. File is automagically unlinked when it is closed. This is useful for have temp files. Definition at line 641 of file Lib_Find.cpp. References ACE_TCHAR, ACE_OS::open(), and ACE_OS::unlink().
00642 {
00643 #if defined (ACE_WIN32)
00644 ACE_UNUSED_ARG (perm);
00645 ACE_HANDLE handle = ACE_OS::open (name,
00646 mode,
00647 FILE_SHARE_READ
00648 | FILE_SHARE_WRITE
00649 | FILE_SHARE_DELETE);
00650 #else
00651 // Open it.
00652 ACE_HANDLE handle = ACE_OS::open (name, mode, perm);
00653 #endif /* ACE_WIN32 */
00654
00655 if (handle == ACE_INVALID_HANDLE)
00656 return ACE_INVALID_HANDLE;
00657
00658 // Unlink it so that the file will be removed automatically when the
00659 // process goes away.
00660 if (ACE_OS::unlink (name) == -1)
00661 return ACE_INVALID_HANDLE;
00662 else
00663 // Return the handle.
00664 return handle;
00665 }
|
|
|
Check if error indicates the process being out of handles (file descriptors). Definition at line 65 of file ACE.cpp. References EADDRNOTAVAIL, ENFILE, ENOBUFS, ENOSYS, ENOTSUP, and EOPNOTSUPP. Referenced by ACE_Handle_Gobbler::consume_handles().
00066 {
00067 // EMFILE is common to all platforms.
00068 if (error == EMFILE ||
00069 #if defined (ACE_WIN32)
00070 // On Win32, we need to check for ENOBUFS also.
00071 error == ENOBUFS ||
00072 #elif defined (HPUX)
00073 // On HPUX, we need to check for EADDRNOTAVAIL also.
00074 error == EADDRNOTAVAIL ||
00075 #elif defined (linux)
00076 // On linux, we need to check for ENOENT also.
00077 error == ENOENT ||
00078 // For RedHat5.2, need to check for EINVAL too.
00079 error == EINVAL ||
00080 // Without threads check for EOPNOTSUPP
00081 error == EOPNOTSUPP ||
00082 #elif defined (sun)
00083 // On sun, we need to check for ENOSR also.
00084 error == ENOSR ||
00085 // Without threads check for ENOTSUP
00086 error == ENOTSUP ||
00087 #elif defined (__FreeBSD__)
00088 // On FreeBSD we need to check for EOPNOTSUPP (LinuxThreads) or
00089 // ENOSYS (libc_r threads) also.
00090 error == EOPNOTSUPP ||
00091 error == ENOSYS ||
00092 #elif defined (__OpenBSD__)
00093 // OpenBSD appears to return EBADF.
00094 error == EBADF ||
00095 #elif defined (__sgi) // irix
00096 error == ENOTSUP ||
00097 #elif defined (DIGITAL_UNIX) // osf1
00098 error == ENOTSUP ||
00099 #endif /* ACE_WIN32 */
00100 error == ENFILE)
00101 return 1;
00102 else
00103 return 0;
00104 }
|
|
|
Checks if process with {pid} is still alive. Returns 1 if it is still alive, 0 if it isn't alive, and -1 if something weird happened. Definition at line 253 of file ACE.cpp. References ACE_OS::kill(), and pid_t.
00254 {
00255 #if !defined(ACE_WIN32)
00256 int retval = ACE_OS::kill (pid, 0);
00257
00258 if (retval == 0)
00259 return 1;
00260 else if (errno == ESRCH)
00261 return 0;
00262 else
00263 return -1;
00264 #else
00265 // Create a handle for the given process id.
00266 ACE_HANDLE process_handle =
00267 ::OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, pid);
00268 if (process_handle == ACE_INVALID_HANDLE
00269 || process_handle == 0)
00270 return 0;
00271 else
00272 {
00273 DWORD status;
00274 int result = 1;
00275 if (::GetExitCodeProcess (process_handle,
00276 &status) == 0
00277 || status != STILL_ACTIVE)
00278 result = 0;
00279
00280 ::CloseHandle (process_handle);
00281 return result;
00282 }
00283 #endif /* !ACE_WIN32 */
00284 }
|
|
||||||||||||||||||||
|
Definition at line 17 of file ACE.inl. References ACE_OS::read_n(). Referenced by ACE_SPIPE_Stream::recv_n(), ACE_Pipe::recv_n(), ACE_FILE_IO::recv_n(), and ACE_DEV_IO::recv_n().
00021 {
00022 return ACE_OS::read_n (handle,
00023 buf,
00024 len,
00025 bytes_transferred);
00026 }
|
|
||||||||||||||||||||
|
Definition at line 2099 of file ACE.cpp. References ACE_OS::readv(), and ssize_t.
02103 {
02104 size_t temp;
02105 size_t &bytes_transferred = bt == 0 ? temp : *bt;
02106 bytes_transferred = 0;
02107
02108 for (int s = 0;
02109 s < iovcnt;
02110 )
02111 {
02112 ssize_t n = ACE_OS::readv (handle,
02113 iov + s,
02114 iovcnt - s);
02115
02116 if (n == -1 || n == 0)
02117 return n;
02118
02119 for (bytes_transferred += n;
02120 s < iovcnt
02121 && n >= static_cast<ssize_t> (iov[s].iov_len);
02122 s++)
02123 n -= iov[s].iov_len;
02124
02125 if (n != 0)
02126 {
02127 char *base = reinterpret_cast<char *> (iov[s].iov_base);
02128 iov[s].iov_base = base + n;
02129 iov[s].iov_len = iov[s].iov_len - n;
02130 }
02131 }
02132
02133 return bytes_transferred;
02134 }
|
|
||||||||||||
|
This makes sure that handle is set into non-blocking mode. val keeps track of whether were in non-blocking mode or not. Definition at line 2264 of file ACE.cpp. References ACE_BIT_DISABLED, ACE_NONBLOCK, get_flags(), and set_flags(). Referenced by enter_recv_timedwait(), enter_send_timedwait(), recv_n_i(), recvv_n_i(), send_n_i(), sendv_n_i(), t_rcv_n_i(), and t_snd_n_i().
02266 {
02267 // We need to record whether we are already *in* nonblocking mode,
02268 // so that we can correctly reset the state when we're done.
02269 val = ACE::get_flags (handle);
02270
02271 if (ACE_BIT_DISABLED (val, ACE_NONBLOCK))
02272 // Set the handle into non-blocking mode if it's not already in
02273 // it.
02274 ACE::set_flags (handle, ACE_NONBLOCK);
02275 }
|
|
||||||||||||||||
|
Receive into a variable number of pieces. Accepts a variable, caller-specified, number of pointer/length pairs. Arguments following n are char *, size_t pairs.
Definition at line 931 of file ACE.cpp. References ACE_NEW_RETURN, ACE_OS::recvv(), and ssize_t.
00932 {
00933 va_list argp;
00934 int total_tuples = static_cast<int> (n / 2);
00935 iovec *iovp;
00936 #if defined (ACE_HAS_ALLOCA)
00937 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
00938 #else
00939 ACE_NEW_RETURN (iovp,
00940 iovec[total_tuples],
00941 -1);
00942 #endif /* !defined (ACE_HAS_ALLOCA) */
00943
00944 va_start (argp, n);
00945
00946 for (int i = 0; i < total_tuples; i++)
00947 {
00948 iovp[i].iov_base = va_arg (argp, char *);
00949 iovp[i].iov_len = va_arg (argp, int);
00950 }
00951
00952 ssize_t result = ACE_OS::recvv (handle, iovp, total_tuples);
00953 #if !defined (ACE_HAS_ALLOCA)
00954 delete [] iovp;
00955 #endif /* !defined (ACE_HAS_ALLOCA) */
00956 va_end (argp);
00957 return result;
00958 }
|
|
||||||||||||||||||||
|
Definition at line 500 of file ACE.cpp. References enter_recv_timedwait(), recv_i(), restore_non_blocking_mode(), and ssize_t.
00504 {
00505 if (timeout == 0)
00506 return ACE::recv_i (handle, buf, n);
00507 else
00508 {
00509 int val = 0;
00510 if (ACE::enter_recv_timedwait (handle, timeout, val) == -1)
00511 return -1;
00512 else
00513 {
00514 ssize_t bytes_transferred = ACE::recv_i (handle, buf, n);
00515 ACE::restore_non_blocking_mode (handle, val);
00516 return bytes_transferred;
00517 }
00518 }
00519 }
|
|
||||||||||||||||||||||||
|
Definition at line 448 of file ACE.cpp. References enter_recv_timedwait(), ACE_OS::recv(), restore_non_blocking_mode(), and ssize_t. Referenced by ACE_MEM_Acceptor::accept(), handle_timed_complete(), ACE_Select_Reactor_Notify::read_notify_pipe(), ACE_TLI_Stream::recv(), ACE_SOCK_IO::recv(), ACE_SOCK_Stream::recv_urg(), and ACE_SOCK_SEQPACK_Association::recv_urg().
00453 {
00454 if (timeout == 0)
00455 return ACE_OS::recv (handle, (char *) buf, len, flags);
00456 else
00457 {
00458 int val = 0;
00459 if (ACE::enter_recv_timedwait (handle, timeout, val) ==-1)
00460 return -1;
00461 else
00462 {
00463 ssize_t bytes_transferred =
00464 ACE_OS::recv (handle, (char *) buf, len, flags);
00465 ACE::restore_non_blocking_mode (handle, val);
00466 return bytes_transferred;
00467 }
00468 }
00469 }
|
|
||||||||||||||||
|
Definition at line 231 of file ACE.inl. References ACE_OS::read(), and ACE_OS::recv(). Referenced by recv(), and recv_n_i().
00232 {
00233 #if defined (ACE_WIN32) || defined (ACE_OPENVMS) || defined (ACE_TANDEM_T1248_PTHREADS)
00234 return ACE_OS::recv (handle, (char *) buf, len);
00235 #else
00236 return ACE_OS::read (handle, (char *) buf, len);
00237 #endif /* ACE_WIN32 */
00238 }
|
|
||||||||||||||||||||
|
Definition at line 1123 of file ACE.cpp. References ACE_IOV_MAX, ACE_Message_Block::cont(), ACE_Message_Block::length(), ACE_Message_Block::next(), ACE_Message_Block::rd_ptr(), recvv_n(), and ssize_t.
01127 {
01128 size_t temp;
01129 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01130 bytes_transferred = 0;
01131
01132 iovec iov[ACE_IOV_MAX];
01133 int iovcnt = 0;
01134
01135 while (message_block != 0)
01136 {
01137 // Our current message block chain.
01138 const ACE_Message_Block *current_message_block = message_block;
01139
01140 while (current_message_block != 0)
01141 {
01142 size_t current_message_block_length =
01143 current_message_block->length ();
01144 char *this_rd_ptr = current_message_block->rd_ptr ();
01145
01146 // Check if this block has any space for incoming data.
01147 while (current_message_block_length > 0)
01148 {
01149 u_long this_chunk_length;
01150 if (current_message_block_length > ULONG_MAX)
01151 this_chunk_length = ULONG_MAX;
01152 else
01153 this_chunk_length =
01154 static_cast<u_long> (current_message_block_length);
01155 // Collect the data in the iovec.
01156 iov[iovcnt].iov_base = this_rd_ptr;
01157 iov[iovcnt].iov_len = this_chunk_length;
01158 current_message_block_length -= this_chunk_length;
01159 this_rd_ptr += this_chunk_length;
01160
01161 // Increment iovec counter.
01162 ++iovcnt;
01163
01164 // The buffer is full make a OS call. @@ TODO find a way to
01165 // find ACE_IOV_MAX for platforms that do not define it rather
01166 // than simply setting ACE_IOV_MAX to some arbitrary value such
01167 // as 16.
01168 if (iovcnt == ACE_IOV_MAX)
01169 {
01170 size_t current_transfer = 0;
01171
01172 ssize_t result = ACE::recvv_n (handle,
01173 iov,
01174 iovcnt,
01175 timeout,
01176 ¤t_transfer);
01177
01178 // Add to total bytes transferred.
01179 bytes_transferred += current_transfer;
01180
01181 // Errors.
01182 if (result == -1 || result == 0)
01183 return result;
01184
01185 // Reset iovec counter.
01186 iovcnt = 0;
01187 }
01188 }
01189
01190 // Select the next message block in the chain.
01191 current_message_block = current_message_block->cont ();
01192 }
01193
01194 // Selection of the next message block chain.
01195 message_block = message_block->next ();
01196 }
01197
01198 // Check for remaining buffers to be sent. This will happen when
01199 // ACE_IOV_MAX is not a multiple of the number of message blocks.
01200 if (iovcnt != 0)
01201 {
01202 size_t current_transfer = 0;
01203
01204 ssize_t result = ACE::recvv_n (handle,
01205 iov,
01206 iovcnt,
01207 timeout,
01208 ¤t_transfer);
01209
01210 // Add to total bytes transferred.
01211 bytes_transferred += current_transfer;
01212
01213 // Errors.
01214 if (result == -1 || result == 0)
01215 return result;
01216 }
01217
01218 // Return total bytes transferred.
01219 return bytes_transferred;
01220 }
|
|
||||||||||||||||||||||||
|
Definition at line 91 of file ACE.inl. References recv_n_i().
00096 {
00097 if (timeout == 0)
00098 return ACE::recv_n_i (handle,
00099 buf,
00100 len,
00101 bytes_transferred);
00102 else
00103 return ACE::recv_n_i (handle,
00104 buf,
00105 len,
00106 timeout,
00107 bytes_transferred);
00108 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 41 of file ACE.inl. References recv_n_i(). Referenced by ACE_TLI_Stream::recv_n(), ACE_SOCK_Stream::recv_n(), ACE_SOCK_SEQPACK_Association::recv_n(), ACE_Pipe::recv_n(), ACE_FIFO_Recv::recv_n(), and ACE_DEV_IO::recv_n().
00047 {
00048 if (timeout == 0)
00049 return ACE::recv_n_i (handle,
00050 buf,
00051 len,
00052 flags,
00053 bytes_transferred);
00054 else
00055 return ACE::recv_n_i (handle,
00056 buf,
00057 len,
00058 flags,
00059 timeout,
00060 bytes_transferred);
00061 }
|
|
||||||||||||||||||||||||
|
Definition at line 860 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), record_and_set_non_blocking_mode(), recv_i(), restore_non_blocking_mode(), and ssize_t.
00865 {
00866 size_t temp;
00867 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00868 ssize_t n;
00869 ssize_t result = 0;
00870 int error = 0;
00871
00872 int val = 0;
00873 ACE::record_and_set_non_blocking_mode (handle, val);
00874
00875 for (bytes_transferred = 0;
00876 bytes_transferred < len;
00877 bytes_transferred += n)
00878 {
00879 // Try to transfer as much of the remaining data as possible.
00880 // Since the socket is in non-blocking mode, this call will not
00881 // block.
00882 n = ACE::recv_i (handle,
00883 static_cast <char *> (buf) + bytes_transferred,
00884 len - bytes_transferred);
00885
00886 // Check for errors.
00887 if (n == 0 ||
00888 n == -1)
00889 {
00890 // Check for possible blocking.
00891 if (n == -1 &&
00892 errno == EWOULDBLOCK)
00893 {
00894 // Wait upto <timeout> for the blocking to subside.
00895 int rtn = ACE::handle_read_ready (handle,
00896 timeout);
00897
00898 // Did select() succeed?
00899 if (rtn != -1)
00900 {
00901 // Blocking subsided in <timeout> period. Continue
00902 // data transfer.
00903 n = 0;
00904 continue;
00905 }
00906 }
00907
00908 // Wait in select() timed out or other data transfer or
00909 // select() failures.
00910 error = 1;
00911 result = n;
00912 break;
00913 }
00914 }
00915
00916 ACE::restore_non_blocking_mode (handle, val);
00917
00918 if (error)
00919 return result;
00920 else
00921 return static_cast<ssize_t> (bytes_transferred);
00922 }
|
|
||||||||||||||||||||
|
Definition at line 810 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), recv_i(), and ssize_t.
00814 {
00815 size_t temp;
00816 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00817 ssize_t n;
00818
00819 for (bytes_transferred = 0;
00820 bytes_transferred < len;
00821 bytes_transferred += n)
00822 {
00823 // Try to transfer as much of the remaining data as possible.
00824 n = ACE::recv_i (handle,
00825 static_cast <char *> (buf) + bytes_transferred,
00826 len - bytes_transferred);
00827 // Check EOF.
00828 if (n == 0)
00829 {
00830 return 0;
00831 }
00832 // Check for other errors.
00833 if (n == -1)
00834 {
00835 // Check for possible blocking.
00836 if (errno == EWOULDBLOCK)
00837 {
00838 // Wait for the blocking to subside.
00839 int result = ACE::handle_read_ready (handle,
00840 0);
00841
00842 // Did select() succeed?
00843 if (result != -1)
00844 {
00845 // Blocking subsided. Continue data transfer.
00846 n = 0;
00847 continue;
00848 }
00849 }
00850
00851 // Other data transfer or select() failures.
00852 return -1;
00853 }
00854 }
00855
00856 return static_cast<ssize_t> (bytes_transferred);
00857 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 621 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), record_and_set_non_blocking_mode(), ACE_OS::recv(), restore_non_blocking_mode(), and ssize_t.
00627 {
00628 size_t temp;
00629 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00630 ssize_t n;
00631 ssize_t result = 0;
00632 int error = 0;
00633
00634 int val = 0;
00635 ACE::record_and_set_non_blocking_mode (handle, val);
00636
00637 for (bytes_transferred = 0;
00638 bytes_transferred < len;
00639 bytes_transferred += n)
00640 {
00641 // Try to transfer as much of the remaining data as possible.
00642 // Since the socket is in non-blocking mode, this call will not
00643 // block.
00644 n = ACE_OS::recv (handle,
00645 static_cast <char *> (buf) + bytes_transferred,
00646 len - bytes_transferred,
00647 flags);
00648
00649 // Check for errors.
00650 if (n == 0 ||
00651 n == -1)
00652 {
00653 // Check for possible blocking.
00654 if (n == -1 &&
00655 errno == EWOULDBLOCK)
00656 {
00657 // Wait upto <timeout> for the blocking to subside.
00658 int rtn = ACE::handle_read_ready (handle,
00659 timeout);
00660
00661 // Did select() succeed?
00662 if (rtn != -1)
00663 {
00664 // Blocking subsided in <timeout> period. Continue
00665 // data transfer.
00666 n = 0;
00667 continue;
00668 }
00669 }
00670
00671 // Wait in select() timed out or other data transfer or
00672 // select() failures.
00673 error = 1;
00674 result = n;
00675 break;
00676 }
00677 }
00678
00679 ACE::restore_non_blocking_mode (handle, val);
00680
00681 if (error)
00682 return result;
00683 else
00684 return static_cast<ssize_t> (bytes_transferred);
00685 }
|
|
||||||||||||||||||||||||
|
Definition at line 570 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), ACE_OS::recv(), and ssize_t. Referenced by recv_n().
00575 {
00576 size_t temp;
00577 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00578 ssize_t n;
00579
00580 for (bytes_transferred = 0;
00581 bytes_transferred < len;
00582 bytes_transferred += n)
00583 {
00584 // Try to transfer as much of the remaining data as possible.
00585 n = ACE_OS::recv (handle,
00586 static_cast <char *> (buf) + bytes_transferred,
00587 len - bytes_transferred,
00588 flags);
00589 // Check EOF.
00590 if (n == 0)
00591 return 0;
00592
00593 // Check for other errors.
00594 if (n == -1)
00595 {
00596 // Check for possible blocking.
00597 if (errno == EWOULDBLOCK)
00598 {
00599 // Wait for the blocking to subside.
00600 int result = ACE::handle_read_ready (handle,
00601 0);
00602
00603 // Did select() succeed?
00604 if (result != -1)
00605 {
00606 // Blocking subsided. Continue data transfer.
00607 n = 0;
00608 continue;
00609 }
00610 }
00611
00612 // Other data transfer or select() failures.
00613 return -1;
00614 }
00615 }
00616
00617 return static_cast<ssize_t> (bytes_transferred);
00618 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 544 of file ACE.cpp. References enter_recv_timedwait(), ACE_OS::recvfrom(), restore_non_blocking_mode(), and ssize_t.
00551 {
00552 if (timeout == 0)
00553 return ACE_OS::recvfrom (handle, buf, len, flags, addr, addrlen);
00554 else
00555 {
00556 int val = 0;
00557 if (ACE::enter_recv_timedwait (handle, timeout, val) == -1)
00558 return -1;
00559 else
00560 {
00561 ssize_t bytes_transferred =
00562 ACE_OS::recvfrom (handle, buf, len, flags, addr, addrlen);
00563 ACE::restore_non_blocking_mode (handle, val);
00564 return bytes_transferred;
00565 }
00566 }
00567 }
|
|
||||||||||||||||||||
|
Definition at line 522 of file ACE.cpp. References enter_recv_timedwait(), ACE_OS::recvmsg(), restore_non_blocking_mode(), and ssize_t.
00526 {
00527 if (timeout == 0)
00528 return ACE_OS::recvmsg (handle, msg, flags);
00529 else
00530 {
00531 int val = 0;
00532 if (ACE::enter_recv_timedwait (handle, timeout, val) == -1)
00533 return -1;
00534 else
00535 {
00536 ssize_t bytes_transferred = ACE_OS::recvmsg (handle, msg, flags);
00537 ACE::restore_non_blocking_mode (handle, val);
00538 return bytes_transferred;
00539 }
00540 }
00541 }
|
|
||||||||||||||||||||
|
Definition at line 961 of file ACE.cpp. References enter_recv_timedwait(), ACE_OS::recvv(), restore_non_blocking_mode(), and ssize_t. Referenced by ACE_Pipe::recv(), and ACE_SOCK_IO::recvv().
00965 {
00966 if (timeout == 0)
00967 return ACE_OS::recvv (handle, iov, iovcnt);
00968 else
00969 {
00970 int val = 0;
00971 if (ACE::enter_recv_timedwait (handle, timeout, val) == -1)
00972 return -1;
00973 else
00974 {
00975 ssize_t bytes_transferred = ACE_OS::recvv (handle, iov, iovcnt);
00976 ACE::restore_non_blocking_mode (handle, val);
00977 return bytes_transferred;
00978 }
00979 }
00980 }
|
|
||||||||||||||||||||||||
|
Definition at line 111 of file ACE.inl. References recvv_n_i(). Referenced by recv_n(), ACE_SOCK_Stream::recvv_n(), and ACE_SOCK_SEQPACK_Association::recvv_n().
00116 {
00117 if (timeout == 0)
00118 return ACE::recvv_n_i (handle,
00119 iov,
00120 iovcnt,
00121 bytes_transferred);
00122 else
00123 return ACE::recvv_n_i (handle,
00124 iov,
00125 iovcnt,
00126 timeout,
00127 bytes_transferred);
00128 }
|
|
||||||||||||||||||||||||
|
Definition at line 1045 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), record_and_set_non_blocking_mode(), ACE_OS::recvv(), restore_non_blocking_mode(), and ssize_t.
01050 {
01051 size_t temp;
01052 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01053 bytes_transferred = 0;
01054 ssize_t result = 0;
01055 int error = 0;
01056
01057 int val = 0;
01058 ACE::record_and_set_non_blocking_mode (handle, val);
01059
01060 for (int s = 0;
01061 s < iovcnt;
01062 )
01063 {
01064 // Try to transfer as much of the remaining data as possible.
01065 // Since the socket is in non-blocking mode, this call will not
01066 // block.
01067 ssize_t n = ACE_OS::recvv (handle,
01068 iov + s,
01069 iovcnt - s);
01070
01071 // Check for errors.
01072 if (n == 0 ||
01073 n == -1)
01074 {
01075 // Check for possible blocking.
01076 if (n == -1 &&
01077 errno == EWOULDBLOCK)
01078 {
01079 // Wait upto <timeout> for the blocking to subside.
01080 int rtn = ACE::handle_read_ready (handle,
01081 timeout);
01082
01083 // Did select() succeed?
01084 if (rtn != -1)
01085 {
01086 // Blocking subsided in <timeout> period. Continue
01087 // data transfer.
01088 n = 0;
01089 continue;
01090 }
01091 }
01092
01093 // Wait in select() timed out or other data transfer or
01094 // select() failures.
01095 error = 1;
01096 result = n;
01097 break;
01098 }
01099
01100 for (bytes_transferred += n;
01101 s < iovcnt
01102 && n >= static_cast<ssize_t> (iov[s].iov_len);
01103 s++)
01104 n -= iov[s].iov_len;
01105
01106 if (n != 0)
01107 {
01108 char *base = reinterpret_cast<char *> (iov[s].iov_base);
01109 iov[s].iov_base = base + n;
01110 iov[s].iov_len = iov[s].iov_len - n;
01111 }
01112 }
01113
01114 ACE::restore_non_blocking_mode (handle, val);
01115
01116 if (error)
01117 return result;
01118 else
01119 return bytes_transferred;
01120 }
|
|
||||||||||||||||||||
|
Definition at line 983 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), ACE_OS::recvv(), and ssize_t. Referenced by recvv_n().
00987 {
00988 size_t temp;
00989 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00990 bytes_transferred = 0;
00991
00992 for (int s = 0;
00993 s < iovcnt;
00994 )
00995 {
00996 // Try to transfer as much of the remaining data as possible.
00997 ssize_t n = ACE_OS::recvv (handle,
00998 iov + s,
00999 iovcnt - s);
01000 // Check EOF.
01001 if (n == 0)
01002 return 0;
01003
01004 // Check for other errors.
01005 if (n == -1)
01006 {
01007 // Check for possible blocking.
01008 if (errno == EWOULDBLOCK)
01009 {
01010 // Wait for the blocking to subside.
01011 int result = ACE::handle_read_ready (handle,
01012 0);
01013
01014 // Did select() succeed?
01015 if (result != -1)
01016 {
01017 // Blocking subsided. Continue data transfer.
01018 n = 0;
01019 continue;
01020 }
01021 }
01022
01023 // Other data transfer or select() failures.
01024 return -1;
01025 }
01026
01027 for (bytes_transferred += n;
01028 s < iovcnt
01029 && n >= static_cast<ssize_t> (iov[s].iov_len);
01030 s++)
01031 n -= iov[s].iov_len;
01032
01033 if (n != 0)
01034 {
01035 char *base = static_cast<char *> (iov[s].iov_base);
01036 iov[s].iov_base = base + n;
01037 iov[s].iov_len = iov[s].iov_len - n;
01038 }
01039 }
01040
01041 return bytes_transferred;
01042 }
|
|
||||||||||||
|
Cleanup after a timed operation, restore the appropriate non-blocking status of handle. Definition at line 2278 of file ACE.cpp. References ACE_BIT_DISABLED, ACE_NONBLOCK, and clr_flags(). Referenced by recv(), recv_n_i(), recvfrom(), recvmsg(), recvv(), recvv_n_i(), send(), send_n_i(), sendmsg(), sendto(), sendv(), sendv_n_i(), t_rcv(), t_rcv_n_i(), t_snd(), and t_snd_n_i().
02280 {
02281 if (ACE_BIT_DISABLED (val,
02282 ACE_NONBLOCK))
02283 {
02284 // Save/restore errno.
02285 ACE_Errno_Guard error (errno);
02286 // Only disable ACE_NONBLOCK if we weren't in non-blocking mode
02287 // originally.
02288 ACE::clr_flags (handle, ACE_NONBLOCK);
02289 }
02290 }
|
|
|
Rounds the request to a multiple of the allocation granularity.
Definition at line 2496 of file ACE.cpp. References ACE_TRACE, and ACE_OS::allocation_granularity().
02497 {
02498 ACE_TRACE ("ACE::round_to_allocation_granularity");
02499
02500 if (ACE::allocation_granularity_ == 0)
02501 ACE::allocation_granularity_ = ACE_OS::allocation_granularity ();
02502
02503 return (len + (ACE::allocation_granularity_ - 1)) & ~(ACE::allocation_granularity_ - 1);
02504 }
|
|
|
Rounds the request to a multiple of the page size.
Definition at line 2485 of file ACE.cpp. References ACE_TRACE, and ACE_OS::getpagesize(). Referenced by ACE_Shared_Memory_Pool::init_acquire(), ACE_Shared_Memory_Pool::round_up(), ACE_Sbrk_Memory_Pool::round_up(), ACE_MMAP_Memory_Pool::round_up(), and ACE_Local_Memory_Pool::round_up().
02486 {
02487 ACE_TRACE ("ACE::round_to_pagesize");
02488
02489 if (ACE::pagesize_ == 0)
02490 ACE::pagesize_ = ACE_OS::getpagesize ();
02491
02492 return (len + (ACE::pagesize_ - 1)) & ~(ACE::pagesize_ - 1);
02493 }
|
|
||||||||||||||||
|
Wrapper facade for the most common use of Definition at line 205 of file ACE.cpp. References ACE_Handle_Set::fdset(), ACE_OS::select(), and ACE_Handle_Set::sync().
00208 {
00209 int result = ACE_OS::select (width,
00210 readfds.fdset (),
00211 0,
00212 0,
00213 timeout);
00214
00215 #if !defined (ACE_WIN32)
00216 if (result > 0)
00217 readfds.sync ((ACE_HANDLE) width);
00218 #endif /* ACE_WIN32 */
00219 return result;
00220 }
|
|
||||||||||||||||||||||||
|
Wrapper facade for
Definition at line 178 of file ACE.cpp. References ACE_Handle_Set::fdset(), ACE_OS::select(), and ACE_Handle_Set::sync().
00183 {
00184 int result = ACE_OS::select (width,
00185 readfds ? readfds->fdset () : 0,
00186 writefds ? writefds->fdset () : 0,
00187 exceptfds ? exceptfds->fdset () : 0,
00188 timeout);
00189 if (result > 0)
00190 {
00191 # if !defined (ACE_WIN32)
00192 // This isn't needed for Windows... it's a no-op anyway.
00193 if (readfds)
00194 readfds->sync ((ACE_HANDLE) width);
00195 if (writefds)
00196 writefds->sync ((ACE_HANDLE) width);
00197 if (exceptfds)
00198 exceptfds->sync ((ACE_HANDLE) width);
00199 #endif /* ACE_WIN32 */
00200 }
00201 return result;
00202 }
|
|
||||||||||||||||
|
Varargs variant.
Definition at line 1706 of file ACE.cpp. References ACE_NEW_RETURN, ACE_OS::sendv(), and ssize_t.
01707 {
01708 va_list argp;
01709 int total_tuples = static_cast<int> (n / 2);
01710 iovec *iovp;
01711 #if defined (ACE_HAS_ALLOCA)
01712 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
01713 #else
01714 ACE_NEW_RETURN (iovp,
01715 iovec[total_tuples],
01716 -1);
01717 #endif /* !defined (ACE_HAS_ALLOCA) */
01718
01719 va_start (argp, n);
01720
01721 for (int i = 0; i < total_tuples; i++)
01722 {
01723 iovp[i].iov_base = va_arg (argp, char *);
01724 iovp[i].iov_len = va_arg (argp, int);
01725 }
01726
01727 ssize_t result = ACE_OS::sendv (handle, iovp, total_tuples);
01728 #if !defined (ACE_HAS_ALLOCA)
01729 delete [] iovp;
01730 #endif /* !defined (ACE_HAS_ALLOCA) */
01731 va_end (argp);
01732 return result;
01733 }
|
|
||||||||||||||||||||
|
Definition at line 1273 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), send_i(), and ssize_t.
01277 {
01278 if (timeout == 0)
01279 return ACE::send_i (handle, buf, n);
01280 else
01281 {
01282 int val = 0;
01283 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01284 return -1;
01285 else
01286 {
01287 ssize_t bytes_transferred = ACE::send_i (handle, buf, n);
01288 ACE::restore_non_blocking_mode (handle, val);
01289 return bytes_transferred;
01290 }
01291 }
01292 }
|
|
||||||||||||||||||||||||
|
Definition at line 1223 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), ACE_OS::send(), and ssize_t. Referenced by ACE_MEM_Acceptor::accept(), ACE_Select_Reactor_Notify::dispatch_notify(), ACE_Select_Reactor_Notify::notify(), ACE_TLI_Stream::send(), ACE_SOCK_IO::send(), ACE_SOCK_Stream::send_urg(), and ACE_SOCK_SEQPACK_Association::send_urg().
01228 {
01229 if (timeout == 0)
01230 return ACE_OS::send (handle, (const char *) buf, n, flags);
01231 else
01232 {
01233 int val = 0;
01234 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01235 return -1;
01236 else
01237 {
01238 ssize_t bytes_transferred = ACE_OS::send (handle, (const char *) buf, n, flags);
01239 ACE::restore_non_blocking_mode (handle, val);
01240 return bytes_transferred;
01241 }
01242 }
01243 }
|
|
||||||||||||||||
|
Definition at line 221 of file ACE.inl. References ACE_OS::send(), and ACE_OS::write(). Referenced by send(), and send_n_i().
00222 {
00223 #if defined (ACE_WIN32) || defined (HPUX)
00224 return ACE_OS::send (handle, (const char *) buf, len);
00225 #else
00226 return ACE_OS::write (handle, (const char *) buf, len);
00227 #endif /* ACE_WIN32 */
00228 }
|
|
||||||||||||||||||||
|
Send all the message_blocks chained through their Definition at line 1999 of file ACE.cpp. References ACE_IOV_MAX, ACE_Message_Block::cont(), ACE_Message_Block::length(), ACE_Message_Block::next(), ACE_Message_Block::rd_ptr(), sendv_n(), and ssize_t.
02003 {
02004 size_t temp;
02005 size_t &bytes_transferred = bt == 0 ? temp : *bt;
02006 bytes_transferred = 0;
02007
02008 iovec iov[ACE_IOV_MAX];
02009 int iovcnt = 0;
02010
02011 while (message_block != 0)
02012 {
02013 // Our current message block chain.
02014 const ACE_Message_Block *current_message_block = message_block;
02015
02016 while (current_message_block != 0)
02017 {
02018 char *this_block_ptr = current_message_block->rd_ptr ();
02019 size_t current_message_block_length =
02020 current_message_block->length ();
02021
02022 // Check if this block has any data to be sent.
02023 while (current_message_block_length > 0)
02024 {
02025 u_long this_chunk_length;
02026 if (current_message_block_length > ULONG_MAX)
02027 this_chunk_length = ULONG_MAX;
02028 else
02029 this_chunk_length =
02030 static_cast<u_long> (current_message_block_length);
02031 // Collect the data in the iovec.
02032 iov[iovcnt].iov_base = this_block_ptr;
02033 iov[iovcnt].iov_len = this_chunk_length;
02034 current_message_block_length -= this_chunk_length;
02035 this_block_ptr += this_chunk_length;
02036
02037 // Increment iovec counter.
02038 ++iovcnt;
02039
02040 // The buffer is full make a OS call. @@ TODO find a way to
02041 // find ACE_IOV_MAX for platforms that do not define it rather
02042 // than simply setting ACE_IOV_MAX to some arbitrary value such
02043 // as 16.
02044 if (iovcnt == ACE_IOV_MAX)
02045 {
02046 size_t current_transfer = 0;
02047
02048 ssize_t result = ACE::sendv_n (handle,
02049 iov,
02050 iovcnt,
02051 timeout,
02052 ¤t_transfer);
02053
02054 // Add to total bytes transferred.
02055 bytes_transferred += current_transfer;
02056
02057 // Errors.
02058 if (result == -1 || result == 0)
02059 return result;
02060
02061 // Reset iovec counter.
02062 iovcnt = 0;
02063 }
02064 }
02065
02066 // Select the next message block in the chain.
02067 current_message_block = current_message_block->cont ();
02068 }
02069
02070 // Selection of the next message block chain.
02071 message_block = message_block->next ();
02072 }
02073
02074 // Check for remaining buffers to be sent. This will happen when
02075 // ACE_IOV_MAX is not a multiple of the number of message blocks.
02076 if (iovcnt != 0)
02077 {
02078 size_t current_transfer = 0;
02079
02080 ssize_t result = ACE::sendv_n (handle,
02081 iov,
02082 iovcnt,
02083 timeout,
02084 ¤t_transfer);
02085
02086 // Add to total bytes transferred.
02087 bytes_transferred += current_transfer;
02088
02089 // Errors.
02090 if (result == -1 || result == 0)
02091 return result;
02092 }
02093
02094 // Return total bytes transferred.
02095 return bytes_transferred;
02096 }
|
|
||||||||||||||||||||||||
|
Definition at line 181 of file ACE.inl. References send_n_i().
00186 {
00187 if (timeout == 0)
00188 return ACE::send_n_i (handle,
00189 buf,
00190 len,
00191 bytes_transferred);
00192 else
00193 return ACE::send_n_i (handle,
00194 buf,
00195 len,
00196 timeout,
00197 bytes_transferred);
00198 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 131 of file ACE.inl. References send_n_i(). Referenced by ACE_TLI_Stream::send_n(), ACE_SOCK_Stream::send_n(), ACE_SOCK_SEQPACK_Association::send_n(), ACE_Pipe::send_n(), and ACE_FIFO_Send::send_n().
00137 {
00138 if (timeout == 0)
00139 return ACE::send_n_i (handle,
00140 buf,
00141 len,
00142 flags,
00143 bytes_transferred);
00144 else
00145 return ACE::send_n_i (handle,
00146 buf,
00147 len,
00148 flags,
00149 timeout,
00150 bytes_transferred);
00151 }
|
|
||||||||||||||||||||||||
|
Definition at line 1636 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), record_and_set_non_blocking_mode(), restore_non_blocking_mode(), send_i(), and ssize_t.
01641 {
01642 size_t temp;
01643 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01644 ssize_t n;
01645 ssize_t result = 0;
01646 int error = 0;
01647
01648 int val = 0;
01649 ACE::record_and_set_non_blocking_mode (handle, val);
01650
01651 for (bytes_transferred = 0;
01652 bytes_transferred < len;
01653 bytes_transferred += n)
01654 {
01655 // Try to transfer as much of the remaining data as possible.
01656 // Since the socket is in non-blocking mode, this call will not
01657 // block.
01658 n = ACE::send_i (handle,
01659 (char *) buf + bytes_transferred,
01660 len - bytes_transferred);
01661
01662 // Check for errors.
01663 if (n == 0 ||
01664 n == -1)
01665 {
01666 // Check for possible blocking.
01667 if (n == -1 &&
01668 errno == EWOULDBLOCK || errno == ENOBUFS)
01669 {
01670 // Wait upto <timeout> for the blocking to subside.
01671 int rtn = ACE::handle_write_ready (handle,
01672 timeout);
01673
01674 // Did select() succeed?
01675 if (rtn != -1)
01676 {
01677 // Blocking subsided in <timeout> period. Continue
01678 // data transfer.
01679 n = 0;
01680 continue;
01681 }
01682 }
01683
01684 // Wait in select() timed out or other data transfer or
01685 // select() failures.
01686 error = 1;
01687 result = n;
01688 break;
01689 }
01690 }
01691
01692 ACE::restore_non_blocking_mode (handle, val);
01693
01694 if (error)
01695 return result;
01696 else
01697 return bytes_transferred;
01698 }
|
|
||||||||||||||||||||
|
Definition at line 1587 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), send_i(), and ssize_t.
01591 {
01592 size_t temp;
01593 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01594 ssize_t n;
01595
01596 for (bytes_transferred = 0;
01597 bytes_transferred < len;
01598 bytes_transferred += n)
01599 {
01600 // Try to transfer as much of the remaining data as possible.
01601 n = ACE::send_i (handle,
01602 (char *) buf + bytes_transferred,
01603 len - bytes_transferred);
01604 // Check EOF.
01605 if (n == 0)
01606 return 0;
01607
01608 // Check for other errors.
01609 if (n == -1)
01610 {
01611 // Check for possible blocking.
01612 if (errno == EWOULDBLOCK || errno == ENOBUFS)
01613 {
01614 // Wait for the blocking to subside.
01615 int result = ACE::handle_write_ready (handle,
01616 0);
01617
01618 // Did select() succeed?
01619 if (result != -1)
01620 {
01621 // Blocking subsided. Continue data transfer.
01622 n = 0;
01623 continue;
01624 }
01625 }
01626
01627 // Other data transfer or select() failures.
01628 return -1;
01629 }
01630 }
01631
01632 return bytes_transferred;
01633 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 1398 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), record_and_set_non_blocking_mode(), restore_non_blocking_mode(), ACE_OS::send(), and ssize_t.
01404 {
01405 size_t temp;
01406 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01407 ssize_t n;
01408 ssize_t result = 0;
01409 int error = 0;
01410
01411 int val = 0;
01412 ACE::record_and_set_non_blocking_mode (handle, val);
01413
01414 for (bytes_transferred = 0;
01415 bytes_transferred < len;
01416 bytes_transferred += n)
01417 {
01418 // Try to transfer as much of the remaining data as possible.
01419 // Since the socket is in non-blocking mode, this call will not
01420 // block.
01421 n = ACE_OS::send (handle,
01422 (char *) buf + bytes_transferred,
01423 len - bytes_transferred,
01424 flags);
01425
01426 // Check for errors.
01427 if (n == 0 ||
01428 n == -1)
01429 {
01430 // Check for possible blocking.
01431 if (n == -1 &&
01432 errno == EWOULDBLOCK || errno == ENOBUFS)
01433 {
01434 // Wait upto <timeout> for the blocking to subside.
01435 int rtn = ACE::handle_write_ready (handle,
01436 timeout);
01437
01438 // Did select() succeed?
01439 if (rtn != -1)
01440 {
01441 // Blocking subsided in <timeout> period. Continue
01442 // data transfer.
01443 n = 0;
01444 continue;
01445 }
01446 }
01447
01448 // Wait in select() timed out or other data transfer or
01449 // select() failures.
01450 error = 1;
01451 result = n;
01452 break;
01453 }
01454 }
01455
01456 ACE::restore_non_blocking_mode (handle, val);
01457
01458 if (error)
01459 return result;
01460 else
01461 return bytes_transferred;
01462 }
|
|
||||||||||||||||||||||||
|
Definition at line 1343 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), ACE_OS::send(), and ssize_t. Referenced by send_n().
01348 {
01349 size_t temp;
01350 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01351 ssize_t n;
01352
01353 for (bytes_transferred = 0;
01354 bytes_transferred < len;
01355 bytes_transferred += n)
01356 {
01357 // Try to transfer as much of the remaining data as possible.
01358 n = ACE_OS::send (handle,
01359 (char *) buf + bytes_transferred,
01360 len - bytes_transferred,
01361 flags);
01362 // Check EOF.
01363 if (n == 0)
01364 return 0;
01365
01366 // Check for other errors.
01367 if (n == -1)
01368 {
01369 // Check for possible blocking.
01370 #if defined (ACE_WIN32)
01371 if (errno == EWOULDBLOCK) // If enobufs no need to loop
01372 #else
01373 if (errno == EWOULDBLOCK || errno == ENOBUFS)
01374 #endif /* ACE_WIN32 */
01375 {
01376 // Wait for the blocking to subside.
01377 int result = ACE::handle_write_ready (handle,
01378 0);
01379
01380 // Did select() succeed?
01381 if (result != -1)
01382 {
01383 // Blocking subsided. Continue data transfer.
01384 n = 0;
01385 continue;
01386 }
01387 }
01388
01389 // Other data transfer or select() failures.
01390 return -1;
01391 }
01392 }
01393
01394 return bytes_transferred;
01395 }
|
|
||||||||||||||||||||
|
Definition at line 1295 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), ACE_OS::sendmsg(), and ssize_t.
01299 {
01300 if (timeout == 0)
01301 return ACE_OS::sendmsg (handle, msg, flags);
01302 else
01303 {
01304 int val = 0;
01305 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01306 return -1;
01307 else
01308 {
01309 ssize_t bytes_transferred = ACE_OS::sendmsg (handle, msg, flags);
01310 ACE::restore_non_blocking_mode (handle, val);
01311 return bytes_transferred;
01312 }
01313 }
01314 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 1317 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), ACE_OS::sendto(), and ssize_t.
01324 {
01325 if (timeout == 0)
01326 return ACE_OS::sendto (handle, buf, len, flags, addr, addrlen);
01327 else
01328 {
01329 int val = 0;
01330 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01331 return -1;
01332 else
01333 {
01334 ssize_t bytes_transferred =
01335 ACE_OS::sendto (handle, buf, len, flags, addr, addrlen);
01336 ACE::restore_non_blocking_mode (handle, val);
01337 return bytes_transferred;
01338 }
01339 }
01340 }
|
|
||||||||||||||||||||
|
Definition at line 1736 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), ACE_OS::sendv(), and ssize_t. Referenced by ACE_Pipe::send(), and ACE_SOCK_IO::sendv().
01740 {
01741 if (timeout == 0)
01742 return ACE_OS::sendv (handle, iov, iovcnt);
01743 else
01744 {
01745 int val = 0;
01746 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01747 return -1;
01748 else
01749 {
01750 ssize_t bytes_transferred = ACE_OS::sendv (handle, iov, iovcnt);
01751 ACE::restore_non_blocking_mode (handle, val);
01752 return bytes_transferred;
01753 }
01754 }
01755 }
|
|
||||||||||||||||||||||||
|
Definition at line 201 of file ACE.inl. References sendv_n_i(). Referenced by send_n(), ACE_SOCK_Stream::sendv_n(), ACE_SOCK_SEQPACK_Association::sendv_n(), and ACE_Pipe::sendv_n().
00206 {
00207 if (timeout == 0)
00208 return ACE::sendv_n_i (handle,
00209 iov,
00210 iovcnt,
00211 bytes_transferred);
00212 else
00213 return ACE::sendv_n_i (handle,
00214 iov,
00215 iovcnt,
00216 timeout,
00217 bytes_transferred);
00218 }
|
|
||||||||||||||||||||||||
|
Definition at line 1822 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), record_and_set_non_blocking_mode(), restore_non_blocking_mode(), ACE_OS::sendv(), and ssize_t.
01827 {
01828 size_t temp;
01829 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01830 bytes_transferred = 0;
01831 ssize_t result = 0;
01832 int error = 0;
01833
01834 int val = 0;
01835 ACE::record_and_set_non_blocking_mode (handle, val);
01836
01837 iovec *iov = const_cast<iovec *> (i);
01838
01839 for (int s = 0;
01840 s < iovcnt;
01841 )
01842 {
01843 // Try to transfer as much of the remaining data as possible.
01844 // Since the socket is in non-blocking mode, this call will not
01845 // block.
01846 ssize_t n = ACE_OS::sendv (handle,
01847 iov + s,
01848 iovcnt - s);
01849
01850 // Check for errors.
01851 if (n == 0 ||
01852 n == -1)
01853 {
01854 // Check for possible blocking.
01855 if (n == -1 &&
01856 errno == EWOULDBLOCK || errno == ENOBUFS)
01857 {
01858 // Wait upto <timeout> for the blocking to subside.
01859 int rtn = ACE::handle_write_ready (handle,
01860 timeout);
01861
01862 // Did select() succeed?
01863 if (rtn != -1)
01864 {
01865 // Blocking subsided in <timeout> period. Continue
01866 // data transfer.
01867 n = 0;
01868 continue;
01869 }
01870 }
01871
01872 // Wait in select() timed out or other data transfer or
01873 // select() failures.
01874 error = 1;
01875 result = n;
01876 break;
01877 }
01878
01879 for (bytes_transferred += n;
01880 s < iovcnt
01881 && n >= static_cast<ssize_t> (iov[s].iov_len);
01882 s++)
01883 n -= iov[s].iov_len;
01884
01885 if (n != 0)
01886 {
01887 char *base = reinterpret_cast<char *> (iov[s].iov_base);
01888 iov[s].iov_base = base + n;
01889 iov[s].iov_len = iov[s].iov_len - n;
01890 }
01891 }
01892
01893 ACE::restore_non_blocking_mode (handle, val);
01894
01895 if (error)
01896 return result;
01897 else
01898 return bytes_transferred;
01899 }
|
|
||||||||||||||||||||
|
Definition at line 1758 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), ACE_OS::sendv(), and ssize_t. Referenced by sendv_n().
01762 {
01763 size_t temp;
01764 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01765 bytes_transferred = 0;
01766
01767 iovec *iov = const_cast<iovec *> (i);
01768
01769 for (int s = 0;
01770 s < iovcnt;
01771 )
01772 {
01773 // Try to transfer as much of the remaining data as possible.
01774 ssize_t n = ACE_OS::sendv (handle,
01775 iov + s,
01776 iovcnt - s);
01777 // Check EOF.
01778 if (n == 0)
01779 return 0;
01780
01781 // Check for other errors.
01782 if (n == -1)
01783 {
01784 // Check for possible blocking.
01785 if (errno == EWOULDBLOCK || errno == ENOBUFS)
01786 {
01787 // Wait for the blocking to subside.
01788 int result = ACE::handle_write_ready (handle,
01789 0);
01790
01791 // Did select() succeed?
01792 if (result != -1)
01793 {
01794 // Blocking subsided. Continue data transfer.
01795 n = 0;
01796 continue;
01797 }
01798 }
01799
01800 // Other data transfer or select() failures.
01801 return -1;
01802 }
01803
01804 for (bytes_transferred += n;
01805 s < iovcnt
01806 && n >= static_cast<ssize_t> (iov[s].iov_len);
01807 s++)
01808 n -= iov[s].iov_len;
01809
01810 if (n != 0)
01811 {
01812 char *base = reinterpret_cast<char *> (iov[s].iov_base);
01813 iov[s].iov_base = base + n;
01814 iov[s].iov_len = iov[s].iov_len - n;
01815 }
01816 }
01817
01818 return bytes_transferred;
01819 }
|
|
||||||||||||
|
Set flags associated with handle.
Definition at line 27 of file Flag_Manip.cpp. References ACE_NONBLOCK, ACE_NOTSUP_RETURN, ACE_SET_BITS, ACE_TRACE, F_GETFL, ACE_OS::fcntl(), and ACE_OS::ioctl(). Referenced by ACE_IPC_SAP::enable(), ACE_IO_SAP::enable(), ACE_Select_Reactor_Notify::open(), record_and_set_non_blocking_mode(), ACE_SOCK_SEQPACK_Acceptor::shared_accept_start(), and ACE_SOCK_Acceptor::shared_accept_start().
00028 {
00029 ACE_TRACE ("ACE::set_flags");
00030 #if defined (ACE_LACKS_FCNTL)
00031 switch (flags)
00032 {
00033 case ACE_NONBLOCK:
00034 // nonblocking argument (1)
00035 // blocking: (0)
00036 {
00037 int nonblock = 1;
00038 return ACE_OS::ioctl (handle, FIONBIO, &nonblock);
00039 }
00040 default:
00041 ACE_NOTSUP_RETURN (-1);
00042 }
00043 #else
00044 int val = ACE_OS::fcntl (handle, F_GETFL, 0);
00045
00046 if (val == -1)
00047 return -1;
00048
00049 // Turn on flags.
00050 ACE_SET_BITS (val, flags);
00051
00052 if (ACE_OS::fcntl (handle, F_SETFL, val) == -1)
00053 return -1;
00054 else
00055 return 0;
00056 #endif /* ACE_LACKS_FCNTL */
00057 }
|
|
||||||||||||
|
Reset the limit on the number of open handles. If new_limit == -1 set the limit to the maximum allowable. Otherwise, set the limit value to new_limit. If increase_limit_only is non-0 then only allow increases to the limit. Definition at line 2876 of file ACE.cpp. References ACE_NOTSUP_RETURN, ACE_TRACE, ACE_OS::getrlimit(), max_handles(), ACE_OS::memset(), and ACE_OS::setrlimit().
02878 {
02879 ACE_TRACE ("ACE::set_handle_limit");
02880 int cur_limit = ACE::max_handles ();
02881 int max_limit = cur_limit;
02882
02883 if (cur_limit == -1)
02884 return -1;
02885
02886 #if !defined (ACE_LACKS_RLIMIT) && defined (RLIMIT_NOFILE)
02887 struct rlimit rl;
02888
02889 ACE_OS::memset ((void *) &rl, 0, sizeof rl);
02890 int r = ACE_OS::getrlimit (RLIMIT_NOFILE, &rl);
02891 if (r == 0)
02892 max_limit = rl.rlim_max;
02893 #endif /* ACE_LACKS_RLIMIT */
02894
02895 if (new_limit == -1)
02896 new_limit = max_limit;
02897
02898 if (new_limit < 0)
02899 {
02900 errno = EINVAL;
02901 return -1;
02902 }
02903 else if (new_limit > cur_limit)
02904 {
02905 // Increase the limit.
02906 #if !defined (ACE_LACKS_RLIMIT) && defined (RLIMIT_NOFILE)
02907 rl.rlim_cur = new_limit;
02908 return ACE_OS::setrlimit (RLIMIT_NOFILE, &rl);
02909 #else
02910 // Must return EINVAL errno.
02911 ACE_NOTSUP_RETURN (-1);
02912 #endif /* ACE_LACKS_RLIMIT */
02913 }
02914 else if (increase_limit_only == 0)
02915 {
02916 // Decrease the limit.
02917 #if !defined (ACE_LACKS_RLIMIT) && defined (RLIMIT_NOFILE)
02918 rl.rlim_cur = new_limit;
02919 return ACE_OS::setrlimit (RLIMIT_NOFILE, &rl);
02920 #else
02921 // We give a chance to platforms without RLIMIT to work.
02922 // Instead of ACE_NOTSUP_RETURN (0), just return 0 because
02923 // new_limit is <= cur_limit, so it's a no-op.
02924 return 0;
02925 #endif /* ACE_LACKS_RLIMIT */
02926 }
02927
02928 return 0;
02929 }
|
|
|
Returns a string containing the error message corresponding to a WinSock error. This works around an omission in the Win32 API. For internal use only.
Definition at line 3006 of file ACE.cpp. References ACE_NOTSUP_RETURN, ACE_TCHAR, ACE_TEXT, and ACE_OS::sprintf(). Referenced by ACE_Log_Msg::log(), and ACE_OS::strerror().
03007 {
03008 #if defined (ACE_WIN32)
03009 static ACE_TCHAR unknown_msg[64];
03010
03011 switch (error)
03012 {
03013 case WSAVERNOTSUPPORTED:
03014 return ACE_TEXT ("version of WinSock not supported");
03015 /* NOTREACHED */
03016 case WSASYSNOTREADY:
03017 return ACE_TEXT ("WinSock not present or not responding");
03018 /* NOTREACHED */
03019 case WSAEINVAL:
03020 return ACE_TEXT ("app version not supported by DLL");
03021 /* NOTREACHED */
03022 case WSAHOST_NOT_FOUND:
03023 return ACE_TEXT ("Authoritive: Host not found");
03024 /* NOTREACHED */
03025 case WSATRY_AGAIN:
03026 return ACE_TEXT ("Non-authoritive: host not found or server failure");
03027 /* NOTREACHED */
03028 case WSANO_RECOVERY:
03029 return ACE_TEXT ("Non-recoverable: refused or not implemented");
03030 /* NOTREACHED */
03031 case WSANO_DATA:
03032 return ACE_TEXT ("Valid name, no data record for type");
03033 /* NOTREACHED */
03034 /*
03035 case WSANO_ADDRESS:
03036 return "Valid name, no MX record";
03037 */
03038 case WSANOTINITIALISED:
03039 return ACE_TEXT ("WSA Startup not initialized");
03040 /* NOTREACHED */
03041 case WSAENETDOWN:
03042 return ACE_TEXT ("Network subsystem failed");
03043 /* NOTREACHED */
03044 case WSAEINPROGRESS:
03045 return ACE_TEXT ("Blocking operation in progress");
03046 /* NOTREACHED */
03047 case WSAEINTR:
03048 return ACE_TEXT ("Blocking call cancelled");
03049 /* NOTREACHED */
03050 case WSAEAFNOSUPPORT:
03051 return ACE_TEXT ("address family not supported");
03052 /* NOTREACHED */
03053 case WSAEMFILE:
03054 return ACE_TEXT ("no file handles available");
03055 /* NOTREACHED */
03056 case WSAENOBUFS:
03057 return ACE_TEXT ("no buffer space available");
03058 /* NOTREACHED */
03059 case WSAEPROTONOSUPPORT:
03060 return ACE_TEXT ("specified protocol not supported");
03061 /* NOTREACHED */
03062 case WSAEPROTOTYPE:
03063 return ACE_TEXT ("protocol wrong type for this socket");
03064 /* NOTREACHED */
03065 case WSAESOCKTNOSUPPORT:
03066 return ACE_TEXT ("socket type not supported for address family");
03067 /* NOTREACHED */
03068 case WSAENOTSOCK:
03069 return ACE_TEXT ("handle is not a socket");
03070 /* NOTREACHED */
03071 case WSAEWOULDBLOCK:
03072 return ACE_TEXT ("resource temporarily unavailable");
03073 /* NOTREACHED */
03074 case WSAEADDRINUSE:
03075 return ACE_TEXT ("address already in use");
03076 /* NOTREACHED */
03077 case WSAECONNABORTED:
03078 return ACE_TEXT ("connection aborted");
03079 /* NOTREACHED */
03080 case WSAECONNRESET:
03081 return ACE_TEXT ("connection reset");
03082 /* NOTREACHED */
03083 case WSAENOTCONN:
03084 return ACE_TEXT ("not connected");
03085 /* NOTREACHED */
03086 case WSAETIMEDOUT:
03087 return ACE_TEXT ("connection timed out");
03088 /* NOTREACHED */
03089 case WSAECONNREFUSED:
03090 return ACE_TEXT ("connection refused");
03091 /* NOTREACHED */
03092 case WSAEHOSTDOWN:
03093 return ACE_TEXT ("host down");
03094 /* NOTREACHED */
03095 case WSAEHOSTUNREACH:
03096 return ACE_TEXT ("host unreachable");
03097 /* NOTREACHED */
03098 case WSAEADDRNOTAVAIL:
03099 return ACE_TEXT ("address not available");
03100 /* NOTREACHED */
03101 case WSAEISCONN:
03102 return ACE_TEXT ("socket is already connected");
03103 /* NOTREACHED */
03104 case WSAENETRESET:
03105 return ACE_TEXT ("network dropped connection on reset");
03106 /* NOTREACHED */
03107 case WSAEMSGSIZE:
03108 return ACE_TEXT ("message too long");
03109 /* NOTREACHED */
03110 case WSAENETUNREACH:
03111 return ACE_TEXT ("network is unreachable");
03112 /* NOTREACHED */
03113 case WSAEFAULT:
03114 return ACE_TEXT ("bad address");
03115 /* NOTREACHED */
03116 case WSAEDISCON:
03117 return ACE_TEXT ("graceful shutdown in progress");
03118 /* NOTREACHED */
03119 case WSAEACCES:
03120 return ACE_TEXT ("permission denied");
03121 /* NOTREACHED */
03122 case WSAESHUTDOWN:
03123 return ACE_TEXT ("cannot send after socket shutdown");
03124 /* NOTREACHED */
03125 case WSAEPROCLIM:
03126 return ACE_TEXT ("too many processes");
03127 /* NOTREACHED */
03128 case WSAEALREADY:
03129 return ACE_TEXT ("operation already in progress");
03130 /* NOTREACHED */
03131 case WSAEPFNOSUPPORT:
03132 return ACE_TEXT ("protocol family not supported");
03133 /* NOTREACHED */
03134 case WSAENOPROTOOPT:
03135 return ACE_TEXT ("bad protocol option");
03136 /* NOTREACHED */
03137 case WSATYPE_NOT_FOUND:
03138 return ACE_TEXT ("class type not found");
03139 /* NOTREACHED */
03140 case WSAEOPNOTSUPP:
03141 return ACE_TEXT ("operation not supported");
03142 /* NOTREACHED */
03143 case WSAEDESTADDRREQ:
03144 return ACE_TEXT ("destination address required");
03145 /* NOTREACHED */
03146 default:
03147 ACE_OS::sprintf (unknown_msg, ACE_TEXT ("unknown error: %d"), error);
03148 return unknown_msg;
03149 /* NOTREACHED */
03150 }
03151 #else
03152 ACE_UNUSED_ARG (error);
03153 ACE_NOTSUP_RETURN (0);
03154 #endif /* ACE_WIN32 */
03155 }
|
|
|
Definition at line 281 of file ACE.inl.
00282 {
00283 delete [] s;
00284 }
|
|
|
Delete the memory allocated by
Definition at line 274 of file ACE.inl. Referenced by ACE_Process_Options::command_line_argv(), ACE_Service_Type_Impl::name(), ACE_Framework_Component::~ACE_Framework_Component(), and ACE_Process_Options::~ACE_Process_Options().
00275 {
00276 delete [] s;
00277 }
|
|
|
Definition at line 3316 of file ACE.cpp. References ACE_TEXT_WIDE.
03317 {
03318 while (*s++ != ACE_TEXT_WIDE ('\0'))
03319 continue;
03320
03321 return s;
03322 }
|
|
|
Returns a pointer to the "end" of the string, i.e., the character past the ''. Definition at line 3306 of file ACE.cpp.
03307 {
03308 while (*s++ != '\0')
03309 continue;
03310
03311 return s;
03312 }
|
|
|
Return a dynamically allocated duplicate of str, substituting the environment variable if Definition at line 379 of file ACE.cpp. References ACE_TCHAR, ACE_TRACE, and ACE_OS::strenvdup().
00380 {
00381 ACE_TRACE ("ACE::strenvdup");
00382
00383 return ACE_OS::strenvdup (str);
00384 }
|
|
||||||||||||
|
Definition at line 3239 of file ACE.cpp. References ACE_ALLOCATOR_RETURN, and ACE_OS::strsncpy().
03240 {
03241 const wchar_t *t = str;
03242 size_t len;
03243
03244 // Figure out how long this string is (remember, it might not be
03245 // NUL-terminated).
03246
03247 for (len = 0;
03248 len < n && *t++ != '\0';
03249 len++)
03250 continue;
03251
03252 wchar_t *s;
03253 ACE_ALLOCATOR_RETURN (s,
03254 static_cast<wchar_t *> (
03255 ACE_OS::malloc ((len + 1) * sizeof (wchar_t))),
03256 0);
03257 return ACE_OS::strsncpy (s, str, len + 1);
03258 }
|
|
||||||||||||
|
Create a fresh new copy of str, up to n chars long. Uses Definition at line 3217 of file ACE.cpp. References ACE_ALLOCATOR_RETURN, and ACE_OS::strsncpy().
03218 {
03219 const char *t = str;
03220 size_t len;
03221
03222 // Figure out how long this string is (remember, it might not be
03223 // NUL-terminated).
03224
03225 for (len = 0;
03226 len < n && *t++ != '\0';
03227 len++)
03228 continue;
03229
03230 char *s;
03231 ACE_ALLOCATOR_RETURN (s,
03232 (char *) ACE_OS::malloc (len + 1),
03233 0);
03234 return ACE_OS::strsncpy (s, str, len + 1);
03235 }
|
|
|
Definition at line 3342 of file ACE.cpp. References ACE_NEW_RETURN, and ACE_OS::strcpy().
03343 {
03344 if (s == 0)
03345 return 0;
03346 wchar_t *t = 0;
03347 ACE_NEW_RETURN (t,
03348 wchar_t[ACE_OS::strlen (s) + 1],
03349 0);
03350 if (t == 0)
03351 return 0;
03352 else
03353 return ACE_OS::strcpy (t, s);
03354 }
|
|
|
This method is just like Definition at line 3326 of file ACE.cpp. References ACE_NEW_RETURN, and ACE_OS::strcpy(). Referenced by ACE_Logging_Strategy::ACE_Logging_Strategy(), ACE_Process_Options::command_line_argv(), ACE_MEM_Acceptor::mmap_prefix(), ACE_Service_Type_Impl::name(), ACE_Service_Type::name(), ACE_DLL_Handle::open(), ACE_DLL::open_i(), and ACE_Logging_Strategy::parse_args().
03327 {
03328 if (s == 0)
03329 return 0;
03330 char *t = 0;
03331 ACE_NEW_RETURN (t,
03332 char [ACE_OS::strlen (s) + 1],
03333 0);
03334 if (t == 0)
03335 return 0;
03336 else
03337 return ACE_OS::strcpy (t, s);
03338 }
|
|
||||||||||||
|
Definition at line 3284 of file ACE.cpp. References ACE_NEW_RETURN, ACE_TEXT_WIDE, and ACE_OS::strsncpy().
03285 {
03286 const wchar_t *t = str;
03287 size_t len;
03288
03289 // Figure out how long this string is (remember, it might not be
03290 // NUL-terminated).
03291
03292 for (len = 0;
03293 len < n && *t++ != ACE_TEXT_WIDE ('\0');
03294 len++)
03295 continue;
03296
03297 wchar_t *s;
03298 ACE_NEW_RETURN (s,
03299 wchar_t[len + 1],
03300 0);
03301 return ACE_OS::strsncpy (s, str, len + 1);
03302 }
|
|
||||||||||||
|
Create a fresh new copy of str, up to n chars long. Uses Definition at line 3262 of file ACE.cpp. References ACE_NEW_RETURN, and ACE_OS::strsncpy().
03263 {
03264 const char *t = str;
03265 size_t len;
03266
03267 // Figure out how long this string is (remember, it might not be
03268 // NUL-terminated).
03269
03270 for (len = 0;
03271 len < n && *t++ != L'\0';
03272 len++)
03273 continue;
03274
03275 char *s;
03276 ACE_NEW_RETURN (s,
03277 char[len + 1],
03278 0);
03279 return ACE_OS::strsncpy (s, str, len + 1);
03280 }
|
|
||||||||||||||||
|
As strrepl, but for wide characters.
Definition at line 756 of file Lib_Find.cpp. References ACE_TRACE.
00757 {
00758 ACE_TRACE ("ACE::strrepl");
00759
00760 size_t replaced = 0;
00761
00762 for (size_t i = 0; s[i] != '\0'; i++)
00763 if (s[i] == search)
00764 {
00765 s[i] = replace;
00766 replaced++;
00767 }
00768
00769 return replaced;
00770 }
|
|
||||||||||||||||
|
Replace all instances of search in s with replace. Returns the number of replacements made. Definition at line 668 of file Lib_Find.cpp. References ACE_TRACE. Referenced by ldfind().
00669 {
00670 ACE_TRACE ("ACE::strrepl");
00671
00672 size_t replaced = 0;
00673
00674 for (size_t i = 0; s[i] != '\0'; i++)
00675 if (s[i] == search)
00676 {
00677 s[i] = replace;
00678 replaced++;
00679 }
00680
00681 return replaced;
00682 }
|
|
||||||||||||||||
|
As strsplit_r, but for wide characters.
Definition at line 723 of file Lib_Find.cpp. References ACE_OS::strlen(), and ACE_OS::strstr().
00726 {
00727 wchar_t *result = 0;
00728
00729 if (str != 0)
00730 next_start = str;
00731
00732 if (next_start != 0)
00733 {
00734 wchar_t *tok_loc = ACE_OS::strstr (next_start, token);
00735
00736 if (tok_loc != 0)
00737 {
00738 // Return the beginning of the string.
00739 result = next_start;
00740
00741 // Insure it's terminated.
00742 *tok_loc = '\0';
00743 next_start = tok_loc + ACE_OS::strlen (token);
00744 }
00745 else
00746 {
00747 result = next_start;
00748 next_start = (wchar_t *) 0;
00749 }
00750 }
00751
00752 return result;
00753 }
|
|
||||||||||||||||
|
Splits string into pieces separated by the string . is an opaque cookie handed back by the call to store its state for the next invocation, thus making it re-entrant. This operates very similar to Perl's function except that it returns pieces one at a time instead of into an array. Definition at line 689 of file Lib_Find.cpp. References ACE_OS::strlen(), and ACE_OS::strstr(). Referenced by ldfind().
00692 {
00693 char *result = 0;
00694
00695 if (str != 0)
00696 next_start = str;
00697
00698 if (next_start != 0)
00699 {
00700 char *tok_loc = ACE_OS::strstr (next_start, token);
00701
00702 if (tok_loc != 0)
00703 {
00704 // Return the beginning of the string.
00705 result = next_start;
00706
00707 // Insure it's terminated.
00708 *tok_loc = '\0';
00709 next_start = tok_loc + ACE_OS::strlen (token);
00710 }
00711 else
00712 {
00713 result = next_start;
00714 next_start = (char *) 0;
00715 }
00716 }
00717
00718 return result;
00719 }
|
|
||||||||||||||||||||||||
|
Definition at line 474 of file ACE.cpp. References enter_recv_timedwait(), restore_non_blocking_mode(), ssize_t, and ACE_OS::t_rcv(). Referenced by ACE_TLI_Stream::recv().
00479 {
00480 if (timeout == 0)
00481 return ACE_OS::t_rcv (handle, (char *) buf, len, flags);
00482 else
00483 {
00484 int val = 0;
00485 if (ACE::enter_recv_timedwait (handle, timeout, val) ==-1)
00486 return -1;
00487 else
00488 {
00489 ssize_t bytes_transferred =
00490 ACE_OS::t_rcv (handle, (char *) buf, len, flags);
00491 ACE::restore_non_blocking_mode (handle, val);
00492 return bytes_transferred;
00493 }
00494 }
00495 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 66 of file ACE.inl. References t_rcv_n_i(). Referenced by ACE_TLI_Stream::recv_n().
00072 {
00073 if (timeout == 0)
00074 return ACE::t_rcv_n_i (handle,
00075 buf,
00076 len,
00077 flags,
00078 bytes_transferred);
00079 else
00080 return ACE::t_rcv_n_i (handle,
00081 buf,
00082 len,
00083 flags,
00084 timeout,
00085 bytes_transferred);
00086 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 741 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), record_and_set_non_blocking_mode(), restore_non_blocking_mode(), ssize_t, and ACE_OS::t_rcv().
00747 {
00748 size_t temp;
00749 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00750 ssize_t n;
00751 ssize_t result = 0;
00752 int error = 0;
00753
00754 int val = 0;
00755 ACE::record_and_set_non_blocking_mode (handle, val);
00756
00757 for (bytes_transferred = 0;
00758 bytes_transferred < len;
00759 bytes_transferred += n)
00760 {
00761 // Try to transfer as much of the remaining data as possible.
00762 // Since the socket is in non-blocking mode, this call will not
00763 // block.
00764 n = ACE_OS::t_rcv (handle,
00765 (char *) buf + bytes_transferred,
00766 len - bytes_transferred,
00767 flags);
00768
00769 // Check for errors.
00770 if (n == 0 ||
00771 n == -1)
00772 {
00773 // Check for possible blocking.
00774 if (n == -1 &&
00775 errno == EWOULDBLOCK)
00776 {
00777 // Wait upto <timeout> for the blocking to subside.
00778 int rtn = ACE::handle_read_ready (handle,
00779 timeout);
00780
00781 // Did select() succeed?
00782 if (rtn != -1)
00783 {
00784 // Blocking subsided in <timeout> period. Continue
00785 // data transfer.
00786 n = 0;
00787 continue;
00788 }
00789 }
00790
00791 // Wait in select() timed out or other data transfer or
00792 // select() failures.
00793 error = 1;
00794 result = n;
00795 break;
00796 }
00797 }
00798
00799 ACE::restore_non_blocking_mode (handle, val);
00800
00801 if (error)
00802 return result;
00803 else
00804 return bytes_transferred;
00805 }
|
|
||||||||||||||||||||||||
|
Definition at line 690 of file ACE.cpp. References EWOULDBLOCK, handle_read_ready(), ssize_t, and ACE_OS::t_rcv(). Referenced by t_rcv_n().
00695 {
00696 size_t temp;
00697 size_t &bytes_transferred = bt == 0 ? temp : *bt;
00698 ssize_t n;
00699
00700 for (bytes_transferred = 0;
00701 bytes_transferred < len;
00702 bytes_transferred += n)
00703 {
00704 // Try to transfer as much of the remaining data as possible.
00705 n = ACE_OS::t_rcv (handle,
00706 (char *) buf + bytes_transferred,
00707 len - bytes_transferred,
00708 flags);
00709 // Check EOF.
00710 if (n == 0)
00711 return 0;
00712
00713 // Check for other errors.
00714 if (n == -1)
00715 {
00716 // Check for possible blocking.
00717 if (errno == EWOULDBLOCK)
00718 {
00719 // Wait for the blocking to subside.
00720 int result = ACE::handle_read_ready (handle,
00721 0);
00722
00723 // Did select() succeed?
00724 if (result != -1)
00725 {
00726 // Blocking subsided. Continue data transfer.
00727 n = 0;
00728 continue;
00729 }
00730 }
00731
00732 // Other data transfer or select() failures.
00733 return -1;
00734 }
00735 }
00736
00737 return bytes_transferred;
00738 }
|
|
||||||||||||||||||||||||
|
Definition at line 1248 of file ACE.cpp. References enter_send_timedwait(), restore_non_blocking_mode(), ssize_t, and ACE_OS::t_snd(). Referenced by ACE_TLI_Stream::send().
01253 {
01254 if (timeout == 0)
01255 return ACE_OS::t_snd (handle, (const char *) buf, n, flags);
01256 else
01257 {
01258 int val = 0;
01259 if (ACE::enter_send_timedwait (handle, timeout, val) == -1)
01260 return -1;
01261 else
01262 {
01263 ssize_t bytes_transferred = ACE_OS::t_snd (handle, (const char *) buf, n, flags);
01264 ACE::restore_non_blocking_mode (handle, val);
01265 return bytes_transferred;
01266 }
01267 }
01268 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 156 of file ACE.inl. References t_snd_n_i(). Referenced by ACE_TLI_Stream::send_n().
00162 {
00163 if (timeout == 0)
00164 return ACE::t_snd_n_i (handle,
00165 buf,
00166 len,
00167 flags,
00168 bytes_transferred);
00169 else
00170 return ACE::t_snd_n_i (handle,
00171 buf,
00172 len,
00173 flags,
00174 timeout,
00175 bytes_transferred);
00176 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 1518 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), record_and_set_non_blocking_mode(), restore_non_blocking_mode(), ssize_t, and ACE_OS::t_snd().
01524 {
01525 size_t temp;
01526 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01527 ssize_t n;
01528 ssize_t result = 0;
01529 int error = 0;
01530
01531 int val = 0;
01532 ACE::record_and_set_non_blocking_mode (handle, val);
01533
01534 for (bytes_transferred = 0;
01535 bytes_transferred < len;
01536 bytes_transferred += n)
01537 {
01538 // Try to transfer as much of the remaining data as possible.
01539 // Since the socket is in non-blocking mode, this call will not
01540 // block.
01541 n = ACE_OS::t_snd (handle,
01542 (char *) buf + bytes_transferred,
01543 len - bytes_transferred,
01544 flags);
01545
01546 // Check for errors.
01547 if (n == 0 ||
01548 n == -1)
01549 {
01550 // Check for possible blocking.
01551 if (n == -1 &&
01552 errno == EWOULDBLOCK || errno == ENOBUFS)
01553 {
01554 // Wait upto <timeout> for the blocking to subside.
01555 int rtn = ACE::handle_write_ready (handle,
01556 timeout);
01557
01558 // Did select() succeed?
01559 if (rtn != -1)
01560 {
01561 // Blocking subsided in <timeout> period. Continue
01562 // data transfer.
01563 n = 0;
01564 continue;
01565 }
01566 }
01567
01568 // Wait in select() timed out or other data transfer or
01569 // select() failures.
01570 error = 1;
01571 result = n;
01572 break;
01573 }
01574 }
01575
01576 ACE::restore_non_blocking_mode (handle, val);
01577
01578 if (error)
01579 return result;
01580 else
01581 return bytes_transferred;
01582 }
|
|
||||||||||||||||||||||||
|
Definition at line 1467 of file ACE.cpp. References ENOBUFS, EWOULDBLOCK, handle_write_ready(), ssize_t, and ACE_OS::t_snd(). Referenced by t_snd_n().
01472 {
01473 size_t temp;
01474 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01475 ssize_t n;
01476
01477 for (bytes_transferred = 0;
01478 bytes_transferred < len;
01479 bytes_transferred += n)
01480 {
01481 // Try to transfer as much of the remaining data as possible.
01482 n = ACE_OS::t_snd (handle,
01483 (char *) buf + bytes_transferred,
01484 len - bytes_transferred,
01485 flags);
01486 // Check EOF.
01487 if (n == 0)
01488 return 0;
01489
01490 // Check for other errors.
01491 if (n == -1)
01492 {
01493 // Check for possible blocking.
01494 if (errno == EWOULDBLOCK || errno == ENOBUFS)
01495 {
01496 // Wait for the blocking to subside.
01497 int result = ACE::handle_write_ready (handle,
01498 0);
01499
01500 // Did select() succeed?
01501 if (result != -1)
01502 {
01503 // Blocking subsided. Continue data transfer.
01504 n = 0;
01505 continue;
01506 }
01507 }
01508
01509 // Other data transfer or select() failures.
01510 return -1;
01511 }
01512 }
01513
01514 return bytes_transferred;
01515 }
|
|
|
Terminate the process abruptly with id pid. On Win32 platforms this uses {TerminateProcess} and on POSIX platforms is uses {kill} with the -9 (SIGKILL) signal, which cannot be caught or ignored. Note that this call is potentially dangerous to use since the process being terminated may not have a chance to cleanup before it shuts down. Definition at line 223 of file ACE.cpp. References ACE_NOTSUP_RETURN, ACE_OS::close(), ACE_OS::kill(), and pid_t. Referenced by ACE_Process_Manager::terminate(), and ACE_Process::terminate().
00224 {
00225 #if defined (ACE_HAS_PHARLAP)
00226 ACE_UNUSED_ARG (pid);
00227 ACE_NOTSUP_RETURN (-1);
00228 #elif defined (ACE_WIN32)
00229 // Create a handle for the given process id.
00230 ACE_HANDLE process_handle =
00231 ::OpenProcess (PROCESS_TERMINATE,
00232 FALSE, // New handle is not inheritable.
00233 pid);
00234
00235 if (process_handle == ACE_INVALID_HANDLE
00236 || process_handle == 0)
00237 return -1;
00238 else
00239 {
00240 // Kill the process associated with process_handle.
00241 BOOL terminate_result =
00242 ::TerminateProcess (process_handle, 0);
00243 // Free up the kernel resources.
00244 ACE_OS::close (process_handle);
00245 return terminate_result ? 0 : -1;
00246 }
00247 #else
00248 return ACE_OS::kill (pid, 9);
00249 #endif /* ACE_HAS_PHARLAP */
00250 }
|
|
||||||||||||||||
|
Returns the current timestamp in the form "hour:minute:second:microsecond." The month, day, and year are also stored in the beginning of the date_and_time array, which is a user-supplied array of size time_len> Definition at line 2392 of file ACE.cpp. References ACE_TCHAR, ACE_TEXT, ACE_OS::ctime_r(), ACE_OS::gettimeofday(), ACE_Time_Value::sec(), ACE_OS::sprintf(), ACE_OS::strsncpy(), and ACE_Time_Value::usec(). Referenced by ACE_Log_Msg_UNIX_Syslog::log(), and ACE_Log_Msg::log().
02395 {
02396 //ACE_TRACE ("ACE::timestamp");
02397
02398 if (date_and_timelen < 35)
02399 {
02400 errno = EINVAL;
02401 return 0;
02402 }
02403
02404 #if defined (WIN32)
02405 // Emulate Unix. Win32 does NOT support all the UNIX versions
02406 // below, so DO we need this ifdef.
02407 static const ACE_TCHAR *day_of_week_name[] =
02408 {
02409 ACE_TEXT ("Sun"),
02410 ACE_TEXT ("Mon"),
02411 ACE_TEXT ("Tue"),
02412 ACE_TEXT ("Wed"),
02413 ACE_TEXT ("Thu"),
02414 ACE_TEXT ("Fri"),
02415 ACE_TEXT ("Sat")
02416 };
02417
02418 static const ACE_TCHAR *month_name[] =
02419 {
02420 ACE_TEXT ("Jan"),
02421 ACE_TEXT ("Feb"),
02422 ACE_TEXT ("Mar"),
02423 ACE_TEXT ("Apr"),
02424 ACE_TEXT ("May"),
02425 ACE_TEXT ("Jun"),
02426 ACE_TEXT ("Jul"),
02427 ACE_TEXT ("Aug"),
02428 ACE_TEXT ("Sep"),
02429 ACE_TEXT ("Oct"),
02430 ACE_TEXT ("Nov"),
02431 ACE_TEXT ("Dec")
02432 };
02433
02434 SYSTEMTIME local;
02435 ::GetLocalTime (&local);
02436
02437 ACE_OS::sprintf (date_and_time,
02438 ACE_TEXT ("%3s %3s %2d %04d %02d:%02d:%02d.%06d"),
02439 day_of_week_name[local.wDayOfWeek],
02440 month_name[local.wMonth - 1],
02441 (int) local.wDay,
02442 (int) local.wYear,
02443 (int) local.wHour,
02444 (int) local.wMinute,
02445 (int) local.wSecond,
02446 (int) (local.wMilliseconds * 1000));
02447 return &date_and_time[15 + (return_pointer_to_first_digit != 0)];
02448 #else /* UNIX */
02449 ACE_TCHAR timebuf[26]; // This magic number is based on the ctime(3c) man page.
02450 ACE_Time_Value cur_time = ACE_OS::gettimeofday ();
02451 time_t secs = cur_time.sec ();
02452
02453 ACE_OS::ctime_r (&secs,
02454 timebuf,
02455 sizeof timebuf);
02456 // date_and_timelen > sizeof timebuf!
02457 ACE_OS::strsncpy (date_and_time,
02458 timebuf,
02459 date_and_timelen);
02460 ACE_TCHAR yeartmp[5];
02461 ACE_OS::strsncpy (yeartmp,
02462 &date_and_time[20],
02463 5);
02464 ACE_TCHAR timetmp[9];
02465 ACE_OS::strsncpy (timetmp,
02466 &date_and_time[11],
02467 9);
02468 ACE_OS::sprintf (&date_and_time[11],
02469 # if defined (ACE_USES_WCHAR)
02470 ACE_TEXT ("%ls %ls.%06ld"),
02471 # else
02472 ACE_TEXT ("%s %s.%06ld"),
02473 # endif /* ACE_USES_WCHAR */
02474 yeartmp,
02475 timetmp,
02476 cur_time.usec ());
02477 date_and_time[33] = '\0';
02478 return &date_and_time[15 + (return_pointer_to_first_digit != 0)];
02479 #endif /* WIN32 */
02480 }
|
|
||||||||||||||||
|
This method uses process id and object pointer to come up with a machine wide unique name. The process ID will provide uniqueness between processes on the same machine. The "this" pointer of the {object} will provide uniqueness between other "live" objects in the same process. The uniqueness of this name is therefore only valid for the life of {object}. Definition at line 288 of file ACE.inl. References ACE_TCHAR, and ACE_OS::unique_name(). Referenced by ACE_Semaphore::ACE_Semaphore(), ACE_RW_Process_Mutex::unique_name(), and ACE_Process_Mutex::unique_name().
00291 {
00292 ACE_OS::unique_name (object, name, length);
00293 }
|
|
||||||||||||||||
|
Simple wildcard matching function supporting '*' and '?' return true if string s matches pattern. Definition at line 3365 of file ACE.cpp. References equal_char().
03366 {
03367 if (str == pat)
03368 return true;
03369 if (pat == 0 || str == 0)
03370 return false;
03371
03372 bool star = false;
03373 const char* s = str;
03374 const char* p = pat;
03375 while (*s != '\0')
03376 {
03377 if (*p == '*')
03378 {
03379 star = true;
03380 pat = p;
03381 while (*++pat == '*');
03382
03383 if (*pat == '\0')
03384 return true;
03385 p = pat;
03386 }
03387 else if (*p == '?')
03388 {
03389 ++s;
03390 ++p;
03391 }
03392 else if (! equal_char(*s, *p, case_sensitive))
03393 {
03394 if (!star)
03395 return false;
03396 s = ++str;
03397 p = pat;
03398 }
03399 else
03400 {
03401 ++s;
03402 ++p;
03403 }
03404 }
03405 if (*p == '*')
03406 while (*++p == '*');
03407
03408 return *p == '\0';
03409 }
|
|
||||||||||||||||
|
Write all the message_blocks chained through their Definition at line 1902 of file ACE.cpp. References ACE_IOV_MAX, ACE_Message_Block::cont(), ACE_Message_Block::length(), ACE_Message_Block::next(), ACE_Message_Block::rd_ptr(), ssize_t, and writev_n().
01905 {
01906 size_t temp;
01907 size_t &bytes_transferred = bt == 0 ? temp : *bt;
01908 bytes_transferred = 0;
01909
01910 iovec iov[ACE_IOV_MAX];
01911 int iovcnt = 0;
01912
01913 while (message_block != 0)
01914 {
01915 // Our current message block chain.
01916 const ACE_Message_Block *current_message_block = message_block;
01917
01918 while (current_message_block != 0)
01919 {
01920 size_t current_message_block_length =
01921 current_message_block->length ();
01922 char *this_block_ptr = current_message_block->rd_ptr ();
01923
01924 // Check if this block has any data to be sent.
01925 while (current_message_block_length > 0)
01926 {
01927 u_long this_chunk_length;
01928 if (current_message_block_length > ULONG_MAX)
01929 this_chunk_length = ULONG_MAX;
01930 else
01931 this_chunk_length =
01932 static_cast<u_long> (current_message_block_length);
01933 // Collect the data in the iovec.
01934 iov[iovcnt].iov_base = this_block_ptr;
01935 iov[iovcnt].iov_len = this_chunk_length;
01936 current_message_block_length -= this_chunk_length;
01937 this_block_ptr += this_chunk_length;
01938
01939 // Increment iovec counter.
01940 ++iovcnt;
01941
01942 // The buffer is full make a OS call. @@ TODO find a way to
01943 // find ACE_IOV_MAX for platforms that do not define it rather
01944 // than simply setting ACE_IOV_MAX to some arbitrary value such
01945 // as 16.
01946 if (iovcnt == ACE_IOV_MAX)
01947 {
01948 size_t current_transfer = 0;
01949
01950 ssize_t result = ACE::writev_n (handle,
01951 iov,
01952 iovcnt,
01953 ¤t_transfer);
01954
01955 // Add to total bytes transferred.
01956 bytes_transferred += current_transfer;
01957
01958 // Errors.
01959 if (result == -1 || result == 0)
01960 return result;
01961
01962 // Reset iovec counter.
01963 iovcnt = 0;
01964 }
01965 }
01966
01967 // Select the next message block in the chain.
01968 current_message_block = current_message_block->cont ();
01969 }
01970
01971 // Selection of the next message block chain.
01972 message_block = message_block->next ();
01973 }
01974
01975 // Check for remaining buffers to be sent. This will happen when
01976 // ACE_IOV_MAX is not a multiple of the number of message blocks.
01977 if (iovcnt != 0)
01978 {
01979 size_t current_transfer = 0;
01980
01981 ssize_t result = ACE::writev_n (handle,
01982 iov,
01983 iovcnt,
01984 ¤t_transfer);
01985
01986 // Add to total bytes transferred.
01987 bytes_transferred += current_transfer;
01988
01989 // Errors.
01990 if (result == -1 || result == 0)
01991 return result;
01992 }
01993
01994 // Return total bytes transferred.
01995 return bytes_transferred;
01996 }
|
|
||||||||||||||||||||
|
Definition at line 29 of file ACE.inl. References ACE_OS::write_n(). Referenced by ACE_SPIPE_Stream::send_n(), ACE_Pipe::send_n(), ACE_FILE_IO::send_n(), and ACE_DEV_IO::send_n().
00033 {
00034 return ACE_OS::write_n (handle,
00035 buf,
00036 len,
00037 bytes_transferred);
00038 }
|
|
||||||||||||||||||||
|
Definition at line 2137 of file ACE.cpp. References ssize_t, and ACE_OS::writev(). Referenced by ACE_SPIPE_Stream::sendv_n(), ACE_Pipe::sendv_n(), ACE_FILE_IO::sendv_n(), and write_n().
02141 {
02142 size_t temp;
02143 size_t &bytes_transferred = bt == 0 ? temp : *bt;
02144 bytes_transferred = 0;
02145
02146 iovec *iov = const_cast<iovec *> (i);
02147
02148 for (int s = 0;
02149 s < iovcnt;
02150 )
02151 {
02152 ssize_t n = ACE_OS::writev (handle,
02153 iov + s,
02154 iovcnt - s);
02155 if (n == -1 || n == 0)
02156 return n;
02157
02158 for (bytes_transferred += n;
02159 s < iovcnt
02160 && n >= static_cast<ssize_t> (iov[s].iov_len);
02161 s++)
02162 n -= iov[s].iov_len;
02163
02164 if (n != 0)
02165 {
02166 char *base = reinterpret_cast<char *> (iov[s].iov_base);
02167 iov[s].iov_base = base + n;
02168 iov[s].iov_len = iov[s].iov_len - n;
02169 }
02170 }
02171
02172 return bytes_transferred;
02173 }
|
|
|
|
|
|
|
|
|
Counter to match <init()>/<fini()> calls. <init()> must increment it; <fini()> must decrement it. <fini()> then does nothing until it reaches 0. Definition at line 12 of file Init_ACE.cpp. |
|
|
|
1.3.6