From: Philip Homburg Date: Thu, 25 Aug 2005 15:10:57 +0000 (+0000) Subject: Added getsockname and getsockopt. X-Git-Tag: v3.1.0~273 X-Git-Url: http://zhaoyanbai.com/repos/dnssec-revoke.html?a=commitdiff_plain;h=b5abc91add0cf21575adc03cca3bbeb5b4104d7e;p=minix.git Added getsockname and getsockopt. --- diff --git a/lib/ip/Makefile b/lib/ip/Makefile index 1634f1feb..caf42e9b8 100755 --- a/lib/ip/Makefile +++ b/lib/ip/Makefile @@ -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 index 000000000..a58f97175 --- /dev/null +++ b/lib/ip/getsockname.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#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 index 000000000..9994f56d1 --- /dev/null +++ b/lib/ip/getsockopt.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#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; +} + diff --git a/lib/ip/setsockopt.c b/lib/ip/setsockopt.c index f6ddff06d..905ea9b94 100644 --- a/lib/ip/setsockopt.c +++ b/lib/ip/setsockopt.c @@ -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; }