Dear all:

I attach the option 1 patch... aka add the call
apr_socket_create_protocol() to the  apr. This causes
the smallest amount of change to the apr.

I will follow up .. possibly tommorrow if I get the
cycles...sigh.. with option 2 .. change to
the arguments of apr_socket_create() itself to include
the protocol and then changing all the places that
apr_socket_create is called...


I would appreciate feedback on style.. I think I got everything correct.. but it never hurts to find out :>

I found the setting for emacs so no more ugly tabs :> now
if I could teach it to add a space for me between ){ and arguments
I would be set :-0

R
--
Randall R. Stewart
[EMAIL PROTECTED] 815-342-5222 (cell phone)
Index: configure.in
===================================================================
RCS file: /home/cvspublic/apr/configure.in,v
retrieving revision 1.488
diff -u -r1.488 configure.in
--- configure.in        16 Oct 2002 12:49:18 -0000      1.488
+++ configure.in        17 Oct 2002 12:59:18 -0000
@@ -940,6 +940,8 @@
     kernel/OS.h                \
     net/errno.h                \
     netinet/in.h       \
+    netinet/sctp.h      \
+    netinet/sctp_uio.h  \
     sys/file.h         \
     sys/mman.h         \
     sys/poll.h         \
@@ -974,7 +976,6 @@
 else
   AC_MSG_RESULT(no)
 fi
-
 AC_SUBST(arpa_ineth)
 AC_SUBST(conioh)
 AC_SUBST(ctypeh)
@@ -987,6 +988,8 @@
 AC_SUBST(netdbh)
 AC_SUBST(sys_syslimitsh)
 AC_SUBST(netinet_inh)
+AC_SUBST(netinet_sctph)
+AC_SUBST(netinet_sctp_uioh)
 AC_SUBST(netinet_tcph)
 AC_SUBST(stdargh)
 AC_SUBST(stdioh)
Index: include/apr.h.in
===================================================================
RCS file: /home/cvspublic/apr/include/apr.h.in,v
retrieving revision 1.115
diff -u -r1.115 apr.h.in
--- include/apr.h.in    3 Aug 2002 20:29:54 -0000       1.115
+++ include/apr.h.in    17 Oct 2002 12:59:19 -0000
@@ -32,38 +32,40 @@
 #define APR_HAS_INLINE         1
 #endif
 
-#define APR_HAVE_ARPA_INET_H     @arpa_ineth@
-#define APR_HAVE_CONIO_H         @conioh@
-#define APR_HAVE_CRYPT_H         @crypth@
-#define APR_HAVE_CTYPE_H         @ctypeh@
-#define APR_HAVE_DIRENT_H        @direnth@
-#define APR_HAVE_ERRNO_H         @errnoh@
-#define APR_HAVE_FCNTL_H         @fcntlh@
-#define APR_HAVE_IO_H            @ioh@
-#define APR_HAVE_LIMITS_H        @limitsh@
-#define APR_HAVE_NETDB_H         @netdbh@
-#define APR_HAVE_NETINET_IN_H    @netinet_inh@
-#define APR_HAVE_NETINET_TCP_H   @netinet_tcph@
-#define APR_HAVE_PTHREAD_H       @pthreadh@
-#define APR_HAVE_SEMAPHORE_H     @semaphoreh@
-#define APR_HAVE_SIGNAL_H        @signalh@
-#define APR_HAVE_STDARG_H        @stdargh@
-#define APR_HAVE_STDINT_H        @stdint@
-#define APR_HAVE_STDIO_H         @stdioh@
-#define APR_HAVE_STDLIB_H        @stdlibh@
-#define APR_HAVE_STRING_H        @stringh@
-#define APR_HAVE_STRINGS_H       @stringsh@
-#define APR_HAVE_SYS_SENDFILE_H  @sys_sendfileh@
-#define APR_HAVE_SYS_SIGNAL_H    @sys_signalh@
-#define APR_HAVE_SYS_SOCKET_H    @sys_socketh@
-#define APR_HAVE_SYS_SYSLIMITS_H @sys_syslimitsh@
-#define APR_HAVE_SYS_TIME_H      @sys_timeh@
-#define APR_HAVE_SYS_TYPES_H     @sys_typesh@
-#define APR_HAVE_SYS_UIO_H       @sys_uioh@
-#define APR_HAVE_SYS_UN_H        @sys_unh@
-#define APR_HAVE_SYS_WAIT_H      @sys_waith@
-#define APR_HAVE_TIME_H          @timeh@
-#define APR_HAVE_UNISTD_H        @unistdh@
+#define APR_HAVE_ARPA_INET_H         @arpa_ineth@
+#define APR_HAVE_CONIO_H             @conioh@
+#define APR_HAVE_CRYPT_H             @crypth@
+#define APR_HAVE_CTYPE_H             @ctypeh@
+#define APR_HAVE_DIRENT_H            @direnth@
+#define APR_HAVE_ERRNO_H             @errnoh@
+#define APR_HAVE_FCNTL_H             @fcntlh@
+#define APR_HAVE_IO_H                @ioh@
+#define APR_HAVE_LIMITS_H            @limitsh@
+#define APR_HAVE_NETDB_H             @netdbh@
+#define APR_HAVE_NETINET_IN_H        @netinet_inh@
+#define APR_HAVE_NETINET_TCP_H       @netinet_tcph@
+#define APR_HAVE_NETINET_SCTP_H      @netinet_sctph@
+#define APR_HAVE_NETINET_SCTP_UIO_H  @netinet_sctp_uioh@
+#define APR_HAVE_PTHREAD_H           @pthreadh@
+#define APR_HAVE_SEMAPHORE_H         @semaphoreh@
+#define APR_HAVE_SIGNAL_H            @signalh@
+#define APR_HAVE_STDARG_H            @stdargh@
+#define APR_HAVE_STDINT_H            @stdint@
+#define APR_HAVE_STDIO_H             @stdioh@
+#define APR_HAVE_STDLIB_H            @stdlibh@
+#define APR_HAVE_STRING_H            @stringh@
+#define APR_HAVE_STRINGS_H           @stringsh@
+#define APR_HAVE_SYS_SENDFILE_H      @sys_sendfileh@
+#define APR_HAVE_SYS_SIGNAL_H        @sys_signalh@
+#define APR_HAVE_SYS_SOCKET_H        @sys_socketh@
+#define APR_HAVE_SYS_SYSLIMITS_H     @sys_syslimitsh@
+#define APR_HAVE_SYS_TIME_H          @sys_timeh@
+#define APR_HAVE_SYS_TYPES_H         @sys_typesh@
+#define APR_HAVE_SYS_UIO_H           @sys_uioh@
+#define APR_HAVE_SYS_UN_H            @sys_unh@
+#define APR_HAVE_SYS_WAIT_H          @sys_waith@
+#define APR_HAVE_TIME_H              @timeh@
+#define APR_HAVE_UNISTD_H            @unistdh@
 
 #define APR_HAVE_SHMEM_MMAP_TMP     @havemmaptmp@
 #define APR_HAVE_SHMEM_MMAP_SHM     @havemmapshm@
@@ -128,6 +130,12 @@
 
 #if APR_HAVE_STDINT_H
 #include <stdint.h>
+#endif
+
+#if APR_HAVE_NETINET_SCTP_H
+#define APR_HAVE_SCTP 1
+#else
+#define APR_HAVE_SCTP 0
 #endif
 
 /*  APR Feature Macros */
Index: include/apr_network_io.h
===================================================================
RCS file: /home/cvspublic/apr/include/apr_network_io.h,v
retrieving revision 1.129
diff -u -r1.129 apr_network_io.h
--- include/apr_network_io.h    11 Oct 2002 20:41:23 -0000      1.129
+++ include/apr_network_io.h    17 Oct 2002 12:59:20 -0000
@@ -168,6 +168,26 @@
 #endif
 
 /**
+ * Some defines for the various IP protocols
+ */
+#ifdef IPPROTO_TCP
+#define APR_PROTO_TCP    IPPROTO_TCP
+#else
+#define APR_PROTO_TCP    6
+#endif
+#ifdef IPPROTO_UDP
+#define APR_PROTO_UDP    IPPROTO_UDP
+#else
+#define APR_PROTO_UDP    17
+#endif
+#ifdef IPPROTO_SCTP
+#define APR_PROTO_SCTP   IPPROTO_SCTP
+#else
+#define APR_PROTO_SCTP   132
+#endif
+
+
+/**
  * Enum to tell us if we're interested in remote or local socket
  */
 typedef enum {
@@ -262,9 +282,12 @@
 };
 
 /* function definitions */
-
 /**
- * Create a socket.
+ * Create a socket. Note that this version attempts to
+ * guess the protocol type and then calls 
+ * apr_socket_create_protocol() users should really use
+ * the apr_socket_create_protocol() function below to assure
+ * proper assignement of protocol.
  * @param new_sock The new socket that has been set up.
  * @param family The address family of the socket (e.g., APR_INET).
  * @param type The type of the socket (e.g., SOCK_STREAM).
@@ -275,6 +298,19 @@
                                             apr_pool_t *cont);
 
 /**
+ * Create a socket.
+ * @param new_sock The new socket that has been set up.
+ * @param family The address family of the socket (e.g., APR_INET).
+ * @param type The type of the socket (e.g., SOCK_STREAM).
+ * @param protocl The protocol to use (e.g., APR_TCP, APR_UDP, APR_SCTP)
+ * @param cont The pool to use
+ */
+APR_DECLARE(apr_status_t) apr_socket_create_protocol(apr_socket_t **new_sock, 
+                                                     int family, int type, 
+                                                     int protocol,
+                                                     apr_pool_t *cont);
+
+/**
  * Shutdown either reading, writing, or both sides of a socket.
  * @param thesocket The socket to close 
  * @param how How to shutdown the socket.  One of:
@@ -728,6 +764,12 @@
 apr_status_t apr_socket_accept_filter(apr_socket_t *sock, char *name,
                                       char *args);
 #endif
+
+/**
+ * Return the protocol in the APR socket structure
+ */
+APR_DECLARE(apr_status_t) apr_socket_get_protocol(apr_socket_t *sock,
+                                                 int *protocol);
 
 /**
  * Set a socket to be inherited by child processes.
Index: include/apr_portable.h
===================================================================
RCS file: /home/cvspublic/apr/include/apr_portable.h,v
retrieving revision 1.81
diff -u -r1.81 apr_portable.h
--- include/apr_portable.h      3 Oct 2002 17:55:42 -0000       1.81
+++ include/apr_portable.h      17 Oct 2002 12:59:20 -0000
@@ -214,6 +214,7 @@
     struct sockaddr *remote; /**< NULL if not connected */
     int family;             /**< always required (APR_INET, APR_INET6, etc. */
     int type;               /**< always required (SOCK_STREAM, SOCK_DGRAM, 
etc. */
+    int protocol;           /**< APR_PROTO_SCTP/APR_PROTO_TCP/APR_PROTO_UDP **/
 };
 
 typedef struct apr_os_sock_info_t apr_os_sock_info_t;
Index: include/arch/os2/networkio.h
===================================================================
RCS file: /home/cvspublic/apr/include/arch/os2/networkio.h,v
retrieving revision 1.26
diff -u -r1.26 networkio.h
--- include/arch/os2/networkio.h        11 Jul 2002 06:28:40 -0000      1.26
+++ include/arch/os2/networkio.h        17 Oct 2002 12:59:20 -0000
@@ -67,6 +67,7 @@
     apr_pool_t *cntxt;
     int socketdes;
     int type;
+    int protocol;
     apr_sockaddr_t *local_addr;
     apr_sockaddr_t *remote_addr;
     apr_interval_time_t timeout;
Index: include/arch/unix/networkio.h
===================================================================
RCS file: /home/cvspublic/apr/include/arch/unix/networkio.h,v
retrieving revision 1.54
diff -u -r1.54 networkio.h
--- include/arch/unix/networkio.h       11 Jul 2002 05:19:44 -0000      1.54
+++ include/arch/unix/networkio.h       17 Oct 2002 12:59:21 -0000
@@ -87,6 +87,12 @@
 #if APR_HAVE_NETINET_TCP_H
 #include <netinet/tcp.h>
 #endif
+#if APR_HAVE_NETINET_SCTP_UIO_H
+#include <netinet/sctp_uio.h>
+#endif
+#if APR_HAVE_NETINET_SCTP_H
+#include <netinet/sctp.h>
+#endif
 #if APR_HAVE_NETINET_IN_H
 #include <netinet/in.h>
 #endif
@@ -120,6 +126,7 @@
     apr_pool_t *cntxt;
     int socketdes;
     int type;
+    int protocol;
     apr_sockaddr_t *local_addr;
     apr_sockaddr_t *remote_addr;
     apr_interval_time_t timeout; 
Index: include/arch/win32/networkio.h
===================================================================
RCS file: /home/cvspublic/apr/include/arch/win32/networkio.h,v
retrieving revision 1.28
diff -u -r1.28 networkio.h
--- include/arch/win32/networkio.h      15 Jul 2002 07:26:12 -0000      1.28
+++ include/arch/win32/networkio.h      17 Oct 2002 12:59:21 -0000
@@ -62,6 +62,7 @@
     apr_pool_t         *cntxt;
     SOCKET              socketdes;
     int                 type; /* SOCK_STREAM, SOCK_DGRAM */
+    int                 protocol;
     apr_sockaddr_t     *local_addr;
     apr_sockaddr_t     *remote_addr;
     int                 timeout_ms; /* MUST MATCH if timeout > 0 */
Index: network_io/os2/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/os2/sockets.c,v
retrieving revision 1.56
diff -u -r1.56 sockets.c
--- network_io/os2/sockets.c    30 Jul 2002 13:56:14 -0000      1.56
+++ network_io/os2/sockets.c    17 Oct 2002 12:59:21 -0000
@@ -103,9 +103,48 @@
     (*new)->remote_addr->pool = p;
 }
 
-APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int family, 
int type,
+
+APR_DECLARE(apr_status_t) apr_socket_get_protocol(apr_socket_t *sock,
+                                                 int *protocol)
+{
+    *protocol = sock->protocol;
+    return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, 
+                                            int family, 
+                                            int type,
                                             apr_pool_t *cont)
 {
+    /* Here we guess the protocol type based on the 
+     * family and type.
+     */
+    int protocol;
+    if ((family == APR_INET) || (family == APR_INET6)) {
+        if (type == SOCK_DGRAM) {
+            protocol = APR_PROTO_UDP;
+        } else if (type == SOCK_STREAM) {
+            protocol = APR_PROTO_TCP;
+        } else if (type == SOCK_SEQPACKET) {
+            protocol = APR_PROTO_SCTP;
+        } else {
+            /* Punt? */
+            protocol = 0;
+        }
+    } else {
+        /* Punt? */
+        protocol = 0;          
+    }
+    return apr_socket_create_protocol(new,family,type,protocol,cont);
+}
+
+
+APR_DECLARE(apr_status_t) apr_socket_create_protocol(apr_socket_t **new, 
+                                                     int family, 
+                                                     int type,
+                                                     int protocol,
+                                                     apr_pool_t *cont)
+{
     int downgrade = (family == AF_UNSPEC);
 
     if (family == AF_UNSPEC) {
@@ -118,11 +157,11 @@
 
     alloc_socket(new, cont);
 
-    (*new)->socketdes = socket(family, type, 0);
+    (*new)->socketdes = socket(family, type, protocol);
 #if APR_HAVE_IPV6
     if ((*new)->socketdes < 0 && downgrade) {
         family = AF_INET;
-        (*new)->socketdes = socket(family, type, 0);
+        (*new)->socketdes = socket(family, type, protocol);
     }
 #endif
 
@@ -130,7 +169,7 @@
         return APR_OS2_STATUS(sock_errno());
     }
     set_socket_vars(*new, family, type);
-
+    (*new)->protocol = protocol;
     (*new)->timeout = -1;
     (*new)->nonblock = FALSE;
     apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), 
@@ -249,6 +288,7 @@
     set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type);
     (*apr_sock)->timeout = -1;
     (*apr_sock)->socketdes = *os_sock_info->os_sock;
+    (*apr_sock)->protocol = os_sock_info->protocol;
     if (os_sock_info->local) {
         memcpy(&(*apr_sock)->local_addr->sa.sin, 
                os_sock_info->local, 
Index: network_io/unix/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/unix/sockets.c,v
retrieving revision 1.101
diff -u -r1.101 sockets.c
--- network_io/unix/sockets.c   30 Jul 2002 13:56:14 -0000      1.101
+++ network_io/unix/sockets.c   17 Oct 2002 12:59:22 -0000
@@ -103,9 +103,42 @@
     (*new)->remote_addr->pool = p;
 }
 
-apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type,
+apr_status_t apr_socket_get_protocol(apr_socket_t *sock,
+                                     int *protocol)
+{
+    *protocol = sock->protocol;
+    return APR_SUCCESS;
+}
+
+apr_status_t apr_socket_create(apr_socket_t **new, int family, int type,
                                apr_pool_t *cont)
 {
+    /* Here we guess the protocol type based on the 
+     * family and type.
+     */
+    int protocol;
+    if ((family == APR_INET) || (family == APR_INET6)) {
+        if (type == SOCK_DGRAM) {
+            protocol = APR_PROTO_UDP;
+        } else if (type == SOCK_STREAM) {
+            protocol = APR_PROTO_TCP;
+        } else if (type == SOCK_SEQPACKET) {
+            protocol = APR_PROTO_SCTP;
+        } else {
+            /* Punt? */
+            protocol = 0;
+        }
+    } else {
+        /* Punt? */
+        protocol = 0;          
+    }
+    return apr_socket_create_protocol(new,family,type,protocol,cont);
+}
+
+apr_status_t apr_socket_create_protocol(apr_socket_t **new, int ofamily, 
+                                        int type,
+                                        int protocol, apr_pool_t *cont)
+{
     int family = ofamily;
 
     if (family == APR_UNSPEC) {
@@ -118,12 +151,12 @@
 
     alloc_socket(new, cont);
 
-    (*new)->socketdes = socket(family, type, 0);
+    (*new)->socketdes = socket(family, type, protocol);
 
 #if APR_HAVE_IPV6
     if ((*new)->socketdes < 0 && ofamily == APR_UNSPEC) {
         family = APR_INET;
-        (*new)->socketdes = socket(family, type, 0);
+        (*new)->socketdes = socket(family, type, protocol);
     }
 #endif
 
@@ -131,7 +164,7 @@
         return errno;
     }
     set_socket_vars(*new, family, type);
-
+    (*new)->protocol = protocol;
     (*new)->timeout = -1;
     (*new)->inherit = 0;
     apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), socket_cleanup,
@@ -325,6 +358,7 @@
     set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type);
     (*apr_sock)->timeout = -1;
     (*apr_sock)->socketdes = *os_sock_info->os_sock;
+    (*apr_sock)->protocol = os_sock_info->protocol;
     if (os_sock_info->local) {
         memcpy(&(*apr_sock)->local_addr->sa.sin, 
                os_sock_info->local, 
Index: network_io/unix/sockopt.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/unix/sockopt.c,v
retrieving revision 1.59
diff -u -r1.59 sockopt.c
--- network_io/unix/sockopt.c   15 Jul 2002 20:29:38 -0000      1.59
+++ network_io/unix/sockopt.c   17 Oct 2002 12:59:22 -0000
@@ -231,12 +231,28 @@
     } 
     if (opt & APR_TCP_NODELAY) {
 #if defined(TCP_NODELAY)
-        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on){
+#if  APR_HAVE_SCTP
+        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) {
+           if(sock->protocol == APR_PROTO_SCTP){
+                if (setsockopt(sock->socketdes, IPPROTO_SCTP, SCTP_NODELAY, 
(void *)&on, sizeof(int)) == -1) {
+                    return errno;
+                }
+           } else {
+                if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY, 
(void *)&on, sizeof(int)) == -1) {
+                    return errno;
+                }
+           }
+            apr_set_option(&sock->netmask, APR_TCP_NODELAY, on);
+        }
+#else
+
+        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) {
             if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY, (void 
*)&on, sizeof(int)) == -1) {
                 return errno;
             }
             apr_set_option(&sock->netmask, APR_TCP_NODELAY, on);
         }
+#endif
 #else
         /* BeOS pre-BONE has TCP_NODELAY set by default.
          * As it can't be turned off we might as well check if they're asking
@@ -252,18 +268,32 @@
     }
     if (opt & APR_TCP_NOPUSH){
 #if APR_TCP_NOPUSH_FLAG
-        if (apr_is_option_set(sock->netmask, APR_TCP_NOPUSH) != on){
+        if (apr_is_option_set(sock->netmask, APR_TCP_NOPUSH) != on) {
             /* OK we're going to change some settings here... */
             /* TCP_NODELAY is mutually exclusive, so do we have it set? */
-            if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) == 1 && on){
+            if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) == 1 && on) {
                 /* If we want to set NOPUSH then if we have the TCP_NODELAY
                  * flag set we need to switch it off...
                  */
                 int tmpflag = 0;
+#if APR_HAVE_SCTP
+               if(sock->protocol == APR_PROTO_SCTP){
+                    if (setsockopt(sock->socketdes, IPPROTO_SCTP, SCTP_NODELAY,
+                                   (void*)&tmpflag, sizeof(int)) == -1) {
+                        return errno;
+                    }
+               }else{
+                    if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY,
+                                   (void*)&tmpflag, sizeof(int)) == -1) {
+                        return errno;
+                    }
+               }
+#else
                 if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY,
-                               (void*)&tmpflag, sizeof(int)) == -1){
+                               (void*)&tmpflag, sizeof(int)) == -1) {
                     return errno;
                 }
+#endif
                 apr_set_option(&sock->netmask, APR_RESET_NODELAY, 1);
                 apr_set_option(&sock->netmask, APR_TCP_NODELAY, 0);
             } else if (on){
@@ -271,16 +301,31 @@
             }
             /* OK, now we can just set the TCP_NOPUSH flag accordingly...*/
             if (setsockopt(sock->socketdes, IPPROTO_TCP, APR_TCP_NOPUSH_FLAG,
-                           (void*)&on, sizeof(int)) == -1){
+                           (void*)&on, sizeof(int)) == -1) {
                 return errno;
             }
             apr_set_option(&sock->netmask, APR_TCP_NOPUSH, on);
-            if (!on && apr_is_option_set(sock->netmask, APR_RESET_NODELAY)){
+            if (!on && apr_is_option_set(sock->netmask, APR_RESET_NODELAY)) {
                 int tmpflag = 1;
+#if APR_HAVE_SCTP
+               if(sock->protocol == APR_PROTO_SCTP){
+                    if (setsockopt(sock->socketdes, IPPROTO_SCTP, SCTP_NODELAY,
+                                   (void*)&tmpflag, sizeof(int)) == -1) {
+                        return errno;
+                    }
+               }else{
+                    if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY,
+                                   (void*)&tmpflag, sizeof(int)) == -1) {
+                        return errno;
+                    }
+               }
+
+#else
                 if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY,
-                               (void*)&tmpflag, sizeof(int)) == -1){
+                               (void*)&tmpflag, sizeof(int)) == -1) {
                     return errno;
                 }
+#endif
                 apr_set_option(&sock->netmask, APR_RESET_NODELAY,0);
                 apr_set_option(&sock->netmask, APR_TCP_NODELAY, 1);
             }
Index: network_io/win32/sockets.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/win32/sockets.c,v
retrieving revision 1.85
diff -u -r1.85 sockets.c
--- network_io/win32/sockets.c  30 Jul 2002 13:56:17 -0000      1.85
+++ network_io/win32/sockets.c  17 Oct 2002 12:59:23 -0000
@@ -94,8 +94,41 @@
     (*new)->remote_addr->pool = p;
 }
 
-APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int family,
-                                            int type, apr_pool_t *cont)
+APR_DECLARE(apr_status_t) apr_socket_get_protocol(apr_socket_t *sock,
+                                                 int *protocol)
+{
+    *protocol = sock->protocol;
+    return APR_SUCCESS;
+}
+
+apr_status_t apr_socket_create(apr_socket_t **new, int family, int type,
+                               apr_pool_t *cont)
+{
+    /* Here we guess the protocol type based on the 
+     * family and type.
+     */
+    int protocol;
+    if ((family == APR_INET) || (family == APR_INET6)) {
+        if (type == SOCK_DGRAM) {
+            protocol = APR_PROTO_UDP;
+        } else if (type == SOCK_STREAM) {
+            protocol = APR_PROTO_TCP;
+        } else if (type == SOCK_SEQPACKET) {
+            protocol = APR_PROTO_SCTP;
+        } else {
+            /* Punt? */
+            protocol = 0;
+        }
+    } else {
+        /* Punt? */
+        protocol = 0;          
+    }
+    return apr_socket_create_protocol(new,family,type,protocol,cont);
+}
+
+
+APR_DECLARE(apr_status_t) apr_socket_create_protocol(apr_socket_t **new, int 
family,
+                                               int type, int protocol, 
apr_pool_t *cont)
 {
     int downgrade = (family == AF_UNSPEC);
 
@@ -112,11 +145,11 @@
     /* For right now, we are not using socket groups.  We may later.
      * No flags to use when creating a socket, so use 0 for that parameter as 
well.
      */
-    (*new)->socketdes = socket(family, type, 0);
+    (*new)->socketdes = socket(family, type, protocol);
 #if APR_HAVE_IPV6
     if ((*new)->socketdes == INVALID_SOCKET && downgrade) {
         family = AF_INET;
-        (*new)->socketdes = socket(family, type, 0);
+        (*new)->socketdes = socket(family, type, protocol);
     }
 #endif
 
@@ -161,6 +194,7 @@
 
     set_socket_vars(*new, family, type);
 
+    (*new)->protocol = protocol;
     (*new)->timeout = -1;
     (*new)->disconnected = 0;
 
@@ -412,6 +446,7 @@
     (*apr_sock)->timeout = -1;
     (*apr_sock)->disconnected = 0;
     (*apr_sock)->socketdes = *os_sock_info->os_sock;
+    (*apr_sock)->protocol = os_sock_info->protocol;
     if (os_sock_info->local) {
         memcpy(&(*apr_sock)->local_addr->sa.sin, 
                os_sock_info->local, 
Index: network_io/win32/sockopt.c
===================================================================
RCS file: /home/cvspublic/apr/network_io/win32/sockopt.c,v
retrieving revision 1.45
diff -u -r1.45 sockopt.c
--- network_io/win32/sockopt.c  15 Jul 2002 20:29:38 -0000      1.45
+++ network_io/win32/sockopt.c  17 Oct 2002 12:59:23 -0000
@@ -193,13 +193,32 @@
         break;
     }
     case APR_TCP_NODELAY:
-        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on){
+#if APR_HAVE_SCTP
+        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) {
+            if(sock->protocol == APR_PROTO_SCTP) {
+                if (setsockopt(sock->socketdes, IPPROTO_SCTP,
+                               SCTP_NODELAY, 
+                               (void *)&on, sizeof(int)) == -1 ) {
+                    return apr_get_netos_error();
+                }
+
+            } else {
+                if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY, 
+                               (void *)&on, sizeof(int)) == -1) {
+                    return apr_get_netos_error();
+                }
+            }
+            apr_set_option(&sock->netmask, APR_TCP_NODELAY, on);
+       }
+#else
+        if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) {
             if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY, 
                            (void *)&on, sizeof(int)) == -1) {
                 return apr_get_netos_error();
             }
             apr_set_option(&sock->netmask, APR_TCP_NODELAY, on);
         }
+#endif
         break;
     default:
         return APR_EINVAL;

Reply via email to