]> Zhao Yanbai Git Server - minix.git/commitdiff
Added EOPNOTSUPP and better error handling in accept.
authorPhilip Homburg <philip@cs.vu.nl>
Thu, 14 Sep 2006 13:48:41 +0000 (13:48 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Thu, 14 Sep 2006 13:48:41 +0000 (13:48 +0000)
include/errno.h
lib/ansi/errlist.c
lib/ip/accept.c

index bb79502d2acf9984fcc7270aefdf6c143ae00ac1..54ca0b373f63e22d4bf6455998601e35d900d9b7 100755 (executable)
@@ -102,6 +102,7 @@ extern int errno;             /* place where the error numbers go */
 #define EMSGSIZE      (_SIGN 73)  /* Message too long */
 #define ENOTSOCK      (_SIGN 74)  /* Socket operation on non-socket */
 #define ENOPROTOOPT   (_SIGN 75)  /* Protocol not available */
+#define EOPNOTSUPP    (_SIGN 76)  /* Operation not supported */
 
 /* The following are not POSIX errors, but they can still happen. 
  * All of these are generated by the kernel and relate to message passing.
index 962bf2111f0e838008299ff0a58f07e80724a0ea..f6caa0dcd45ed15e8451c58f00d6d3c3c650adca 100755 (executable)
@@ -85,6 +85,7 @@ const char *_sys_errlist[] = {
        "Message too long",             /* EMSGSIZE */
        "Socket operation on non-socket", /* ENOTSOCK */
        "Protocol not available",       /* ENOPROTOOPT */
+       "Operation not supported",      /* EOPNOTSUPP */
 };
 
 const int _sys_nerr = sizeof(_sys_errlist) / sizeof(_sys_errlist[0]);
index 28a543b7b62ac7652e1d4f0662b1666f12a115a6..c6fe2ee06766f08d0c52e5eb0584fd6ff7b25b52 100644 (file)
@@ -23,15 +23,30 @@ int accept(int socket, struct sockaddr *_RESTRICT address,
        socklen_t *_RESTRICT address_len)
 {
        int r;
+       nwio_udpopt_t udpopt;
 
        r= _tcp_accept(socket, address, address_len);
-       return r;
+       if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
+               return r;
 
-#if DEBUG
-       fprintf(stderr, "accept: not implemented for fd %d\n", socket);
-#endif
-       errno= ENOSYS;
-       return -1;
+       /* Unfortunately, we have to return EOPNOTSUPP for a socket that
+        * does not support accept (such as a UDP socket) and ENOTSOCK for
+        * filedescriptors that do not refer to a socket.
+        */
+       r= ioctl(socket, NWIOGUDPOPT, &udpopt);
+       if (r == 0)
+       {
+               /* UDP socket */
+               errno= EOPNOTSUPP;
+               return -1;
+       }
+       if ((errno == ENOTTY || errno == EBADIOCTL))
+       {
+               errno= ENOTSOCK;
+               return -1;
+       }
+
+       return r;
 }
 
 static int _tcp_accept(int socket, struct sockaddr *_RESTRICT address,