From b4469f1ed8941b481727ebf41b64764538d68ddc Mon Sep 17 00:00:00 2001 From: leitner Date: Mon, 18 Jan 2010 19:49:03 +0000 Subject: [PATCH] support SCTP in addition to TCP --- CHANGES | 1 + socket.h | 5 ++++ socket/socket_sctp4.3 | 26 ++++++++++++++++++++ socket/socket_sctp4.c | 10 ++++++++ socket/socket_sctp4b.3 | 26 ++++++++++++++++++++ socket/socket_sctp4b.c | 26 ++++++++++++++++++++ socket/socket_sctp6.3 | 26 ++++++++++++++++++++ socket/socket_sctp6.c | 10 ++++++++ socket/socket_sctp6b.3 | 26 ++++++++++++++++++++ socket/socket_sctp6b.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 212 insertions(+) create mode 100644 socket/socket_sctp4.3 create mode 100644 socket/socket_sctp4.c create mode 100644 socket/socket_sctp4b.3 create mode 100644 socket/socket_sctp4b.c create mode 100644 socket/socket_sctp6.3 create mode 100644 socket/socket_sctp6.c create mode 100644 socket/socket_sctp6b.3 create mode 100644 socket/socket_sctp6b.c diff --git a/CHANGES b/CHANGES index 14f37ee..ae156c9 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ save 8 bytes in taia.h for 64-bit systems add buffer_tosa (buffer writing to auto-growing stralloc) add iarray + support SCTP in addition to TCP 0.28: add uint64 pack and unpack routines diff --git a/socket.h b/socket.h index e53e508..8ae05db 100644 --- a/socket.h +++ b/socket.h @@ -13,6 +13,11 @@ int socket_tcp6(void); int socket_tcp6b(void); int socket_udp6(void); +int socket_sctp4(void); +int socket_sctp4b(void); +int socket_sctp6(void); +int socket_sctp6b(void); + #define socket_tcp() socket_tcp4() #define socket_udp() socket_udp4() diff --git a/socket/socket_sctp4.3 b/socket/socket_sctp4.3 new file mode 100644 index 0000000..36a7600 --- /dev/null +++ b/socket/socket_sctp4.3 @@ -0,0 +1,26 @@ +.TH socket_sctp4 3 +.SH NAME +socket_sctp4 \- create a non-blocking SCTP/IP stream socket +.SH SYNTAX +.B #include + +int \fBsocket_sctp4\fP(); +.SH DESCRIPTION +socket_sctp4 creates a non-blocking SCTP/IP stream socket and returns a +file descriptor pointing to that socket. If something goes wrong, +socket_sctp4 returns -1, setting errno appropriately, without allocating +any resources. + +.SH EXAMPLE + #include + + int \fIs\fR; + char \fIip\fR[4]; + uint16 \fIp\fR; + + \fIs\fR = socket_sctp4(); + socket_bind4(s,ip,p); + socket_connect4(s,ip,p); + +.SH "SEE ALSO" +socket_sctp4b(3), socket_bind4(3), socket_bind6(3) diff --git a/socket/socket_sctp4.c b/socket/socket_sctp4.c new file mode 100644 index 0000000..614af94 --- /dev/null +++ b/socket/socket_sctp4.c @@ -0,0 +1,10 @@ +#include +#include "socket.h" +#include "ndelay.h" + +int socket_sctp4(void) { + int s=socket_sctp4b(); + if (s==-1) return -1; + if (ndelay_on(s) == -1) { close(s); return -1; } + return s; +} diff --git a/socket/socket_sctp4b.3 b/socket/socket_sctp4b.3 new file mode 100644 index 0000000..8b77d43 --- /dev/null +++ b/socket/socket_sctp4b.3 @@ -0,0 +1,26 @@ +.TH socket_sctp4b 3 +.SH NAME +socket_sctp4b \- create a blocking SCTP/IP stream socket +.SH SYNTAX +.B #include + +int \fBsocket_sctp4b\fP(); +.SH DESCRIPTION +socket_sctp4b creates a blocking SCTP/IP stream socket and returns a +file descriptor pointing to that socket. If something goes wrong, +socket_sctp4b returns -1, setting errno appropriately, without allocating +any resources. + +.SH EXAMPLE + #include + + int \fIs\fR; + char \fIip\fR[4]; + uint16 \fIp\fR; + + \fIs\fR = socket_sctp4b(); + socket_bind4(s,ip,p); + socket_connect4(s,ip,p); + +.SH "SEE ALSO" +socket_sctp4(3), socket_bind4(3), socket_bind6(3) diff --git a/socket/socket_sctp4b.c b/socket/socket_sctp4b.c new file mode 100644 index 0000000..6d6b1cc --- /dev/null +++ b/socket/socket_sctp4b.c @@ -0,0 +1,26 @@ +#include +#ifndef __MINGW32__ +#include +#include +#include +#endif +#include "windoze.h" +#include "socket.h" +#include "ndelay.h" + +#ifndef EPROTONOSUPPORT +#define EPROTONOSUPPORT EINVAL +#endif + +int socket_sctp4b(void) { +#ifdef IPPROTO_SCTP + int s; + __winsock_init(); + s = winsock2errno(socket(PF_INET,SOCK_STREAM,IPPROTO_SCTP)); + if (s == -1) return -1; + return s; +#else + errno=EPROTONOSUPPORT; + return -1; +#endif +} diff --git a/socket/socket_sctp6.3 b/socket/socket_sctp6.3 new file mode 100644 index 0000000..7d223a5 --- /dev/null +++ b/socket/socket_sctp6.3 @@ -0,0 +1,26 @@ +.TH socket_sctp6 3 +.SH NAME +socket_sctp6 \- create a non-blocking IPv6 SCTP/IP stream socket +.SH SYNTAX +.B #include + +int \fBsocket_sctp6\fP(); +.SH DESCRIPTION +socket_sctp6 creates a non-blocking IPv6 SCTP/IP stream socket and returns a +file descriptor pointing to that socket. If something goes wrong, +socket_sctp6 returns -1, setting errno appropriately, without allocating +any resources. + +.SH EXAMPLE + #include + + int \fIs\fR; + char \fIip\fR[16]; + uint16 \fIp\fR; + + \fIs\fR = socket_sctp6(); + socket_bind6(s,ip,p); + socket_connect6(s,ip,p,0); + +.SH "SEE ALSO" +socket_bind4(3), socket_bind6(3) diff --git a/socket/socket_sctp6.c b/socket/socket_sctp6.c new file mode 100644 index 0000000..dba09c9 --- /dev/null +++ b/socket/socket_sctp6.c @@ -0,0 +1,10 @@ +#include +#include "socket.h" +#include "ndelay.h" + +int socket_sctp6(void) { + int s=socket_sctp6b(); + if (s==-1) return -1; + if (ndelay_on(s) == -1) { close(s); return -1; } + return s; +} diff --git a/socket/socket_sctp6b.3 b/socket/socket_sctp6b.3 new file mode 100644 index 0000000..a13a6e8 --- /dev/null +++ b/socket/socket_sctp6b.3 @@ -0,0 +1,26 @@ +.TH socket_sctp6b 3 +.SH NAME +socket_sctp6b \- create a blocking IPv6 SCTP/IP stream socket +.SH SYNTAX +.B #include + +int \fBsocket_sctp6b\fP(); +.SH DESCRIPTION +socket_sctp6b creates a blocking IPv6 SCTP/IP stream socket and returns a +file descriptor pointing to that socket. If something goes wrong, +socket_sctp6b returns -1, setting errno appropriately, without allocating +any resources. + +.SH EXAMPLE + #include + + int \fIs\fR; + char \fIip\fR[16]; + uint16 \fIp\fR; + + \fIs\fR = socket_sctp6b(); + socket_bind6(s,ip,p); + socket_connect6(s,ip,p,0); + +.SH "SEE ALSO" +socket_sctp6(3), socket_bind4(3), socket_bind6(3) diff --git a/socket/socket_sctp6b.c b/socket/socket_sctp6b.c new file mode 100644 index 0000000..8995eb8 --- /dev/null +++ b/socket/socket_sctp6b.c @@ -0,0 +1,56 @@ +#include +#ifndef __MINGW32__ +#include +#include +#include +#endif +#include "windoze.h" +#include +#include "haveip6.h" +#include "socket.h" +#include "ndelay.h" + +#ifndef EAFNOSUPPORT +#define EAFNOSUPPORT EINVAL +#endif +#ifndef EPFNOSUPPORT +#define EPFNOSUPPORT EAFNOSUPPORT +#endif +#ifndef EPROTONOSUPPORT +#define EPROTONOSUPPORT EAFNOSUPPORT +#endif + +int socket_sctp6b(void) +{ +#ifndef IPPROTO_SCTP + errno=EPROTONOSUPPORT; + return -1; +#else +#ifdef LIBC_HAS_IP6 + int s; + + __winsock_init(); + if (noipv6) goto compat; + s = winsock2errno(socket(PF_INET6,SOCK_STREAM,IPPROTO_SCTP)); + if (s == -1) { + if (errno == EINVAL || errno == EAFNOSUPPORT || errno == EPFNOSUPPORT || errno == EPROTONOSUPPORT) { +compat: + s=winsock2errno(socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP)); + noipv6=1; + if (s==-1) return -1; + } else + return -1; + } +#ifdef IPV6_V6ONLY + { + int zero=0; + winsock2errno(setsockopt(s,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&zero,sizeof(zero))); + } +#endif + return s; +#else + return socket_sctp4b(); +#endif +#endif +} +