You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by "Philippe M. Chiasson" <go...@cpan.org> on 2003/07/17 09:15:40 UTC

[Patch] Adding apr_socket_type_get()

The following patch adds apr_socket_type_get(apr_socket_t *sock, int
*type) to the network_io API, to allow differentiating between UDP and
TCP sockets for example (SOCK_STREAM vs SOCK_DGRAM)

When dealing with a mix of UDP & TCP sockets, I need this to know if I
should call recvfrom() or not, for instance.

Simple enough IMHO. Thoughts?

Index: srclib/apr/include/apr_network_io.h
===================================================================
RCS file: /home/cvspublic/apr/include/apr_network_io.h,v
retrieving revision 1.128
diff -u -I'$Id' -I'$Revision' -U10 -r1.128 apr_network_io.h
--- srclib/apr/include/apr_network_io.h	15 Aug 2002 03:23:36 -0000	1.128
+++ srclib/apr/include/apr_network_io.h	12 Mar 2003 02:51:14 -0000
@@ -647,20 +647,28 @@
  *
  * @param addr1 One of the APR socket addresses.
  * @param addr2 The other APR socket address.
  * @remark The return value will be non-zero if the addresses
  * are equivalent.
  */
 APR_DECLARE(int) apr_sockaddr_equal(const apr_sockaddr_t *addr1,
                                     const apr_sockaddr_t *addr2);
 
 
+ /**
+ * Return the type of the socket.
+ * @param sock The socket to query.
+ * @param type The returned type (e.g., SOCK_STREAM).
+ */
+APR_DECLARE(apr_status_t) apr_socket_type_get(apr_socket_t *sock,
+                                              int *type);
+
 #if APR_FILES_AS_SOCKETS || defined(DOXYGEN)
 
 /**
  * Convert a File type to a socket so that it can be used in a poll
operation.
  * @param newsock the newly created socket which represents a file.
  * @param file the file to mask as a socket.
  * @warning This is not available on all platforms.  Platforms that
have the
  *      ability to poll files for data to be read/written/exceptions
will
  *      have the APR_FILES_AS_SOCKETS macro defined as true.
  * @deprecated This function has been deprecated, because of the new
poll
Index: srclib/apr/network_io/os2/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/os2/sockets.c,v
retrieving revision 1.56
diff -u -I'$Id' -I'$Revision' -U10 -r1.56 sockets.c
--- srclib/apr/network_io/os2/sockets.c	30 Jul 2002 13:56:14 -0000	1.56
+++ srclib/apr/network_io/os2/sockets.c	12 Mar 2003 02:51:14 -0000
@@ -213,20 +213,25 @@
     }
     else {
         int namelen = sizeof(sock->local_addr->sa.sin);
         getsockname(sock->socketdes, (struct sockaddr
*)&sock->local_addr->sa.sin, 
                     &namelen);
         sock->remote_addr = sa;
         return APR_SUCCESS;
     }
 }
 
+APR_DECLARE(apr_status_t) apr_socket_type_get(apr_socket_t *sock, int
*type)
+{
+    *type = sock->type;
+    return APR_SUCCESS;
+}
 
 APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char
*key,
                                      apr_socket_t *socket)
 {
     return apr_pool_userdata_get(data, key, socket->cntxt);
 }
 
 
 
 APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *socket,
void *data, const char *key,
Index: srclib/apr/network_io/unix/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/unix/sockets.c,v
retrieving revision 1.101
diff -u -I'$Id' -I'$Revision' -U10 -r1.101 sockets.c
--- srclib/apr/network_io/unix/sockets.c	30 Jul 2002 13:56:14
-0000	1.101
+++ srclib/apr/network_io/unix/sockets.c	12 Mar 2003 02:51:14 -0000
@@ -293,20 +293,26 @@
          * one for the socket
          */
         sock->local_interface_unknown = 1;
     }
 #ifndef HAVE_POLL
     sock->connected=1;
 #endif
     return APR_SUCCESS;
 }
 
+APR_DECLARE(apr_status_t) apr_socket_type_get(apr_socket_t *sock, int
*type)
+{
+    *type = sock->type;
+    return APR_SUCCESS;
+}
+
 apr_status_t apr_socket_data_get(void **data, const char *key,
apr_socket_t *sock)
 {
     return apr_pool_userdata_get(data, key, sock->cntxt);
 }
 
 apr_status_t apr_socket_data_set(apr_socket_t *sock, void *data, const
char *key,
                               apr_status_t (*cleanup) (void *))
 {
     return apr_pool_userdata_set(data, key, cleanup, sock->cntxt);
 }
Index: srclib/apr/network_io/win32/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/win32/sockets.c,v
retrieving revision 1.85
diff -u -I'$Id' -I'$Revision' -U10 -r1.85 sockets.c
--- srclib/apr/network_io/win32/sockets.c	30 Jul 2002 13:56:17
-0000	1.85
+++ srclib/apr/network_io/win32/sockets.c	12 Mar 2003 02:51:14 -0000
@@ -376,20 +376,26 @@
                 generic_inaddr_any,
                 sock->local_addr->ipaddr_len)) {
         /* not bound to specific local interface; connect() had to
assign
          * one for the socket
          */
         sock->local_interface_unknown = 1;
     }
     return APR_SUCCESS;
 }
 
+APR_DECLARE(apr_status_t) apr_socket_type_get(apr_socket_t *sock, int
*type)
+{
+    *type = sock->type;
+    return APR_SUCCESS;
+}
+
 APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char
*key,
                                              apr_socket_t *socket)
 {
     return apr_pool_userdata_get(data, key, socket->cntxt);
 }
 
 APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *socket,
void *data,
                                              const char *key,
                                              apr_status_t
(*cleanup)(void *))
 {

-- 
--------------------------------------------------------------------------------
Philippe M. Chiasson /gozer\@(cpan|ectoplasm)\.org/ 88C3A5A5 (122FF51B/C634E37B)
http://gozer.ectoplasm.org/    F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3 A5A5
Q: It is impossible to make anything foolproof because fools are so ingenious.
perl -e'$$=\${gozer};{$_=unpack(P7,pack(L,$$));/^JAm_pH\n$/&&print||$$++&&redo}'