From: Philip Homburg Date: Fri, 29 Jul 2005 10:13:52 +0000 (+0000) Subject: Added shutdown. EBADIOCTL in connect. Chaned some debug output. X-Git-Tag: v3.1.0~501 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/man.rndc.html?a=commitdiff_plain;h=a7487a5c3ca9ca3d0458db89cb0e42dc7fdd0912;p=minix.git Added shutdown. EBADIOCTL in connect. Chaned some debug output. --- diff --git a/lib/ip/Makefile b/lib/ip/Makefile index fed1b163a..1634f1feb 100755 --- a/lib/ip/Makefile +++ b/lib/ip/Makefile @@ -53,6 +53,7 @@ OBJECTS = \ $(LIBRARY)(sethostent.o) \ $(LIBRARY)(setsockopt.o) \ $(LIBRARY)(servxcheck.o) \ + $(LIBRARY)(shutdown.o) \ $(LIBRARY)(socket.o) \ $(LIBRARY)(strcasecmp.o) \ @@ -192,6 +193,9 @@ $(LIBRARY)(setsockopt.o): setsockopt.c $(LIBRARY)(servxcheck.o): servxcheck.c $(CC1) servxcheck.c +$(LIBRARY)(shutdown.o): shutdown.c + $(CC1) shutdown.c + $(LIBRARY)(socket.o): socket.c $(CC1) socket.c diff --git a/lib/ip/connect.c b/lib/ip/connect.c index 295bb8c95..86ce310e4 100644 --- a/lib/ip/connect.c +++ b/lib/ip/connect.c @@ -23,7 +23,7 @@ int connect(int socket, const struct sockaddr *address, nwio_tcpconf_t tcpconf; r= ioctl(socket, NWIOGTCPCONF, &tcpconf); - if (r != -1 || errno != ENOTTY) + if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL)) { if (r == -1) { @@ -68,7 +68,7 @@ static int _tcp_connect(int socket, const struct sockaddr *address, { int t_errno= errno; - fprintf(stderr, "setconf failed: %s\n", strerror(errno)); + fprintf(stderr, "connect(tcp) failed: %s\n", strerror(errno)); errno= t_errno; @@ -82,7 +82,7 @@ static int _tcp_connect(int socket, const struct sockaddr *address, { int t_errno= errno; - fprintf(stderr, "connect failed: %s\n", strerror(errno)); + fprintf(stderr, "connect(tcp) failed: %s\n", strerror(errno)); errno= t_errno; } diff --git a/lib/ip/shutdown.c b/lib/ip/shutdown.c new file mode 100644 index 000000000..128ded527 --- /dev/null +++ b/lib/ip/shutdown.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#include +#include +#include + +#define DEBUG 1 + +static int _tcp_shutdown(int socket, int how); + +int shutdown(int socket, int how) +{ + 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_shutdown(socket, how); + } +#if DEBUG + fprintf(stderr, "shutdown: not implemented for fd %d\n", socket); +#endif + errno= ENOSYS; + return -1; +} + +static int _tcp_shutdown(int socket, int how) +{ + int r; + + if (how == SHUT_WR || how == SHUT_RDWR) + { + r= ioctl(socket, NWIOTCPSHUTDOWN, NULL); + if (r == -1) + return -1; + if (how == SHUT_WR) + return 0; + } + + /* We can't shutdown the read side of the socket. */ + errno= ENOSYS; + return -1; +} + + diff --git a/lib/ip/socket.c b/lib/ip/socket.c index 95a7fd0eb..70a812e1e 100644 --- a/lib/ip/socket.c +++ b/lib/ip/socket.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -12,6 +13,10 @@ static int _udp_socket(int protocol); int socket(int domain, int type, int protocol) { +#if DEBUG + fprintf(stderr, "socket: domain %d, type %d, protocol %d\n", + domain, type, protocol); +#endif if (domain != AF_INET) { #if DEBUG @@ -52,6 +57,7 @@ static int _tcp_socket(int protocol) static int _udp_socket(int protocol) { int fd; + if (protocol != 0) { #if DEBUG