]> Zhao Yanbai Git Server - minix.git/commitdiff
UDS: add support for FIONREAD
authorDavid van Moolenbroek <david@minix3.org>
Fri, 4 Oct 2013 16:41:21 +0000 (18:41 +0200)
committerLionel Sambuc <lionel@minix3.org>
Sat, 1 Mar 2014 08:04:58 +0000 (09:04 +0100)
Change-Id: I50030012b408242a86f8c55017429acdadff49d1

drivers/uds/ioc_uds.c
drivers/uds/uds.c
drivers/uds/uds.h

index af1f3d6b7a08afb2e412bb07835556c4001ea75e..b31bcd8775b3ce3c847412e7ebe118a4a75d9190 100644 (file)
@@ -2,11 +2,6 @@
  * Unix Domain Sockets Implementation (PF_UNIX, PF_LOCAL)
  * This code handles ioctl(2) commands to implement the socket API.
  * Some helper functions are also present.
- *
- * The entry points into this file are...
- *
- *   uds_do_ioctl:           process an IOCTL request.
- *   uds_clear_fds:          calls vfs_put_filp for undelivered FDs.
  */
 
 #include "uds.h"
@@ -919,6 +914,20 @@ do_recvmsg(devminor_t minor, endpoint_t endpt, cp_grant_id_t grant)
            sizeof(struct msg_control));
 }
 
+static int
+do_fionread(devminor_t minor, endpoint_t endpt, cp_grant_id_t grant)
+{
+       int rc;
+
+       rc = uds_perform_read(minor, NONE, GRANT_INVALID, UDS_BUF, 1);
+
+       /* What should we do on error?  Just set to zero for now. */
+       if (rc < 0)
+               rc = 0;
+
+       return sys_safecopyto(endpt, grant, 0, (vir_bytes) &rc, sizeof(rc));
+}
+
 int
 uds_do_ioctl(devminor_t minor, unsigned long request, endpoint_t endpt,
        cp_grant_id_t grant)
@@ -1046,6 +1055,14 @@ uds_do_ioctl(devminor_t minor, unsigned long request, endpoint_t endpt,
 
                break;
 
+       case FIONREAD:
+               /*
+                * Get the number of bytes immediately available for reading.
+                */
+               rc = do_fionread(minor, endpt, grant);
+
+               break;
+
        default:
                /*
                 * The IOCTL command is not valid for /dev/uds -- this happens
index f3a79d58d42cb877ea1403739fa969343bc52252..8283c5bae891ee195127ffd4efed97131e16609f 100644 (file)
@@ -2,20 +2,13 @@
  * Unix Domain Sockets Implementation (PF_UNIX, PF_LOCAL)
  * This code handles requests generated by operations on /dev/uds
  *
- * The entry points into this file are...
- *
- *   uds_unsuspend:    resume a previously suspended socket call
- *   main:             driver main loop
- *
- * The interface to unix domain sockets is similar to the interface to network
+ * The interface to UNIX domain sockets is similar to the interface to network
  * sockets. There is a character device (/dev/uds) and this server is a
  * 'driver' for that device.
  */
 
 #include "uds.h"
 
-static ssize_t uds_perform_read(devminor_t, endpoint_t, cp_grant_id_t, size_t,
-       int);
 static ssize_t uds_perform_write(devminor_t, endpoint_t, cp_grant_id_t, size_t,
        int);
 
@@ -244,7 +237,7 @@ uds_select(devminor_t minor, unsigned int ops, endpoint_t endpt)
        return ready_ops;
 }
 
-static ssize_t
+ssize_t
 uds_perform_read(devminor_t minor, endpoint_t endpt, cp_grant_id_t grant,
        size_t size, int pretend)
 {
index 202259970a86389ee57697ae9f4a85105a0a8d62..24fa88f974e2362a9c0b6f1b5cc68d9b6f6114a6 100644 (file)
@@ -197,6 +197,8 @@ int uds_do_ioctl(devminor_t minor, unsigned long request, endpoint_t endpt,
        cp_grant_id_t grant);
 
 /* uds.c */
+ssize_t uds_perform_read(devminor_t minor, endpoint_t endpt,
+       cp_grant_id_t grant, size_t size, int pretend);
 void uds_unsuspend(devminor_t minor);
 
 /* vfs_uds.c */