On Fri, Jun 28, 2013 at 09:00:51PM +0200, Geert Uytterhoeven wrote:
> On Fri, Jun 28, 2013 at 7:35 PM, Thomas Klausner <w...@netbsd.org> wrote:
> > -       if (atomicio(write, fd, msg, sizeof(msg)) != sizeof(msg)) {
> > +       if (atomicio((ssize_t (*)(int, void *, size_t))write, fd, msg, 
> > sizeof(msg)) != sizeof(msg)) {
> 
> This cast looks really gross to me...
> 
> What about wrapping write() in a function that takes care of casting the 
> second
> parameter of the function?

Sure, that's also possible. New version of the patch attached.
 Thomas

>From f64e6445f2aed6e7c7ebb1ba26914009441cf5f6 Mon Sep 17 00:00:00 2001
From: Thomas Klausner <w...@netbsd.org>
Date: Sun, 2 Jun 2013 22:20:41 +0200
Subject: [PATCH:xdm 2/2] Add wrapper function for write.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

gcc-4.5.4 on NetBSD complains:
xdm/prngc.c: In function ‘get_prngd_bytes’:
xdm/prngc.c:133:2: error: passing argument 1 of ‘atomicio’ from incompatible 
pointer type
xdm/prngc.c:46:16: note: expected ‘ssize_t (*)(int,  void *, size_t)’ but 
argument is of type ‘ssize_t (*)(int,  const void *, size_t)’

The problem is that the read(2) and write(2) syscalls differ
in the const-ness of their second argument. The wrapper
function gets rid of the difference.
---
 xdm/prngc.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/xdm/prngc.c b/xdm/prngc.c
index f0db8eb..535a59e 100644
--- a/xdm/prngc.c
+++ b/xdm/prngc.c
@@ -44,6 +44,7 @@
 #endif
 
 static ssize_t atomicio(ssize_t (*)(int, void *, size_t), int, void *, size_t);
+static ssize_t voidwrite(int, void *, size_t);
 
 #ifndef offsetof
 # define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
@@ -130,7 +131,7 @@ reopen:
        msg[0] = 0x02;
        msg[1] = len;
 
-       if (atomicio(write, fd, msg, sizeof(msg)) != sizeof(msg)) {
+       if (atomicio(voidwrite, fd, msg, sizeof(msg)) != sizeof(msg)) {
                if (errno == EPIPE && errors < 10) {
                        close(fd);
                        errors++;
@@ -188,3 +189,9 @@ atomicio(ssize_t (*f)(int, void *, size_t), int fd, void 
*_s, size_t n)
        }
        return (pos);
 }
+
+static ssize_t
+voidwrite(int d, void *buf, size_t nbytes)
+{
+       return write(d, (const char *)buf, nbytes);
+}
-- 
1.8.3.1

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to