diff options
author | sobomax <sobomax@FreeBSD.org> | 2001-10-26 21:06:01 +0800 |
---|---|---|
committer | sobomax <sobomax@FreeBSD.org> | 2001-10-26 21:06:01 +0800 |
commit | 4ea42b23c8064eaeae269593d14fcc928108a11f (patch) | |
tree | 358ec517585bf2c8fe45dadbe3185eb16274e184 /devel/ORBit2/files | |
parent | 546b9e0e1c99f3432cf8959334bf3ec0564bf572 (diff) | |
download | freebsd-ports-gnome-4ea42b23c8064eaeae269593d14fcc928108a11f.tar.gz freebsd-ports-gnome-4ea42b23c8064eaeae269593d14fcc928108a11f.tar.zst freebsd-ports-gnome-4ea42b23c8064eaeae269593d14fcc928108a11f.zip |
Fix a rather weird incompatibility between ORBit and FreeBSD. It appears that
FreeBSD's writev(2) implementation is rather unreliable when large number of
vectors is submitted - it returns EINVAL despite the fact that all arguments
are pretty valid. This caused serious problems with GNOME's oaf and prevented
Nautilus from working properly. The problem disappeared when I've replaced
writev(2) call with appropriate loop based around ordinary write(2). Perhaps
this should be investigated and the real source of the problem fixed instead,
but I do not have a time for this right now. For those who interested I'm
ready to provide a step-by step instruction on how to reproduce the bug.
Special thanks to: andersca @ nautilus#irc.gnome.org
Diffstat (limited to 'devel/ORBit2/files')
-rw-r--r-- | devel/ORBit2/files/patch-src::IIOP::giop-msg-buffer.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/devel/ORBit2/files/patch-src::IIOP::giop-msg-buffer.c b/devel/ORBit2/files/patch-src::IIOP::giop-msg-buffer.c new file mode 100644 index 000000000000..a42320410527 --- /dev/null +++ b/devel/ORBit2/files/patch-src::IIOP::giop-msg-buffer.c @@ -0,0 +1,24 @@ + +$FreeBSD$ + +--- src/IIOP/giop-msg-buffer.c 2001/10/26 12:42:42 1.1 ++++ src/IIOP/giop-msg-buffer.c 2001/10/26 12:42:53 +@@ -197,7 +197,17 @@ + sum); + } + #endif +- res = writev(fd, curvec, nvecs); ++ for(sum = 0, t = 0; t < nvecs; t++) { ++ do { ++ res = write(fd, curvec[t].iov_base, curvec[t].iov_len); ++ } while (res < 0 && errno == EAGAIN); ++ if (res < 0) { ++ break; ++ } else ++ sum += res; ++ } ++ if (res >= 0) ++ res = sum; + + sum = (GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size + sizeof(GIOPMessageHeader)); + if(res < sum) { |