]> Zhao Yanbai Git Server - minix.git/commitdiff
Added getsockname and getsockopt.
authorPhilip Homburg <philip@cs.vu.nl>
Thu, 25 Aug 2005 15:10:57 +0000 (15:10 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Thu, 25 Aug 2005 15:10:57 +0000 (15:10 +0000)
lib/ip/Makefile
lib/ip/getsockname.c [new file with mode: 0644]
lib/ip/getsockopt.c [new file with mode: 0644]
lib/ip/setsockopt.c

index 1634f1feb9fa4d19fe63752d9d1ec0ff7264465a..caf42e9b88ba478dc71ba3a2075c68e7387ac073 100755 (executable)
@@ -31,6 +31,8 @@ OBJECTS       = \
        $(LIBRARY)(getproto.o) \
        $(LIBRARY)(getprotoent.o) \
        $(LIBRARY)(getservent.o) \
+       $(LIBRARY)(getsockname.o) \
+       $(LIBRARY)(getsockopt.o) \
        $(LIBRARY)(getsrvbyname.o) \
        $(LIBRARY)(getsrvbyport.o) \
        $(LIBRARY)(hton.o) \
@@ -124,6 +126,12 @@ $(LIBRARY)(getprotoent.o): getprotoent.c
 $(LIBRARY)(getservent.o):      getservent.c
        $(CC1) getservent.c
 
+$(LIBRARY)(getsockname.o):     getsockname.c
+       $(CC1) getsockname.c
+
+$(LIBRARY)(getsockopt.o):      getsockopt.c
+       $(CC1) getsockopt.c
+
 $(LIBRARY)(getsrvbyname.o):    getsrvbyname.c
        $(CC1) getsrvbyname.c
 
diff --git a/lib/ip/getsockname.c b/lib/ip/getsockname.c
new file mode 100644 (file)
index 0000000..a58f971
--- /dev/null
@@ -0,0 +1,63 @@
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <net/gen/in.h>
+#include <net/gen/tcp.h>
+#include <net/gen/tcp_io.h>
+#include <net/gen/udp.h>
+#include <net/gen/udp_io.h>
+
+#define DEBUG 0
+
+static int _tcp_getsockname(int socket, struct sockaddr *_RESTRICT address,
+       socklen_t *_RESTRICT address_len, nwio_tcpconf_t *tcpconfp);
+
+int getsockname(int socket, struct sockaddr *_RESTRICT address,
+       socklen_t *_RESTRICT address_len)
+{
+       int r;
+       nwio_tcpconf_t tcpconf;
+
+       r= ioctl(socket, NWIOGTCPCONF, &tcpconf);
+       if (r != -1 || errno != ENOTTY)
+       {
+               if (r == -1)
+               {
+                       /* Bad file descriptor */
+                       return -1;
+               }
+               return _tcp_getsockname(socket, address, address_len,
+                       &tcpconf);
+       }
+
+#if DEBUG
+       fprintf(stderr, "getsockname: not implemented for fd %d\n", socket);
+#endif
+       errno= ENOSYS;
+       return -1;
+}
+
+static int _tcp_getsockname(int socket, struct sockaddr *_RESTRICT address,
+       socklen_t *_RESTRICT address_len, nwio_tcpconf_t *tcpconfp)
+{
+       socklen_t len;
+       struct sockaddr_in sin;
+
+       memset(&sin, '\0', sizeof(sin));
+       sin.sin_family= AF_INET;
+       sin.sin_addr.s_addr= tcpconfp->nwtc_locaddr;
+       sin.sin_port= tcpconfp->nwtc_locport;
+
+       len= *address_len;
+       if (len > sizeof(sin))
+               len= sizeof(sin);
+       memcpy(address, &sin, len);
+       *address_len= len;
+
+       return 0;
+}
+
diff --git a/lib/ip/getsockopt.c b/lib/ip/getsockopt.c
new file mode 100644 (file)
index 0000000..9994f56
--- /dev/null
@@ -0,0 +1,66 @@
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+#include <net/gen/in.h>
+#include <net/gen/tcp.h>
+#include <net/gen/tcp_io.h>
+
+#define DEBUG 0
+
+static int _tcp_getsockopt(int socket, int level, int option_name,
+       void *_RESTRICT option_value, socklen_t *_RESTRICT option_len);
+
+int getsockopt(int socket, int level, int option_name,
+        void *_RESTRICT option_value, socklen_t *_RESTRICT option_len)
+{
+       int r;
+       nwio_tcpopt_t tcpopt;
+
+       r= ioctl(socket, NWIOGTCPOPT, &tcpopt);
+       if (r != -1 || errno != ENOTTY)
+       {
+               if (r == -1)
+               {
+                       /* Bad file descriptor */
+                       return -1;
+               }
+               return _tcp_getsockopt(socket, level, option_name,
+                       option_value, option_len);
+       }
+
+#if DEBUG
+       fprintf(stderr, "getsockopt: not implemented for fd %d\n", socket);
+#endif
+       errno= ENOSYS;
+       return -1;
+}
+
+static int _tcp_getsockopt(int socket, int level, int option_name,
+       void *_RESTRICT option_value, socklen_t *_RESTRICT option_len)
+{
+       int i;
+
+       if (level == SOL_SOCKET && option_name == SO_KEEPALIVE)
+       {
+               i= 1;   /* Keepalive is always on */
+               if (*option_len < sizeof(i))
+                       memcpy(option_value, &i, *option_len);
+               else
+                       memcpy(option_value, &i, sizeof(i));
+               *option_len= sizeof(i);
+               return 0;
+       }
+#if DEBUG
+       fprintf(stderr, "_tcp_getsocketopt: level %d, name %d\n",
+               level, option_name);
+#endif
+
+       errno= ENOSYS;
+       return -1;
+}
+
index f6ddff06ddda07f63dd40c5c46f30b062bd75ca6..905ea9b94953a7c9378f8a182458f30bacf9772c 100644 (file)
@@ -62,9 +62,12 @@ static int _tcp_setsockopt(int socket, int level, int option_name,
                }
                return 0;
        }
+#if DEBUG
        fprintf(stderr, "_tcp_setsocketopt: level %d, name %d\n",
                level, option_name);
+#endif
 
-       assert(0);
+       errno= ENOSYS;
+       return -1;
 }