[#11890] Ruby and Solaris door library — "Hiro Asari" <asari.ruby@...>

Hi, there. This is my first patch against ruby. I think I followed

19 messages 2007/08/13
[#11892] Re: Ruby and Solaris door library — Daniel Berger <djberg96@...> 2007/08/14

Hiro Asari wrote:

[#11899] pack/unpack 64bit Integers — Hadmut Danisch <hadmut@...>

Hi,

13 messages 2007/08/14
[#11903] Re: pack/unpack 64bit Integers — Brian Candler <B.Candler@...> 2007/08/15

On Wed, Aug 15, 2007 at 06:50:01AM +0900, Hadmut Danisch wrote:

[#11948] Fibers in Ruby 1.9? — David Flanagan <david@...>

I just noticed that my ruby1.9 build of August 17th includes a Fiber

22 messages 2007/08/22
[#11949] Re: Fibers in Ruby 1.9? — Daniel Berger <djberg96@...> 2007/08/22

David Flanagan wrote:

[#11950] Re: Fibers in Ruby 1.9? — "Francis Cianfrocca" <garbagecat10@...> 2007/08/22

On 8/22/07, Daniel Berger <djberg96@gmail.com> wrote:

[#11952] Re: Fibers in Ruby 1.9? — MenTaLguY <mental@...> 2007/08/22

On Wed, 22 Aug 2007 20:50:12 +0900, "Francis Cianfrocca" <garbagecat10@gmail.com> wrote:

[#11988] String#length not working properly in Ruby 1.9 — "Vincent Isambart" <vincent.isambart@...>

I saw that Matz just merged his M17N implementation in the trunk.

17 messages 2007/08/25
[#11991] Re: String#length not working properly in Ruby 1.9 — "Michael Neumann" <mneumann@...> 2007/08/25

On Sat, 25 Aug 2007 10:54:20 +0200, Yukihiro Matsumoto

[#11992] Re: String#length not working properly in Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/08/25

Hi,

[#12042] Encodings of string literals; explicit codepoint escapes? — David Flanagan <david@...>

This message contains queries that probably only Matz can answer:

16 messages 2007/08/31
[#12043] Re: Encodings of string literals; explicit codepoint escapes? — Yukihiro Matsumoto <matz@...> 2007/08/31

Hi,

Re: UDP sockets raise exception on MIPS platform

From: Brian Candler <B.Candler@...>
Date: 2007-08-28 09:01:33 UTC
List: ruby-core #12016
On Tue, Aug 14, 2007 at 06:07:01PM +0900, Brian Candler wrote:
> I am running ruby-1.8.6 under OpenWrt (*), which is a small MIPS platform
> (4MB flash, 16MB RAM) running linux-2.4.34 and uClibc.
> 
> Everything seems to work fine apart from UDP sockets. As soon as you try to
> read using 'recvfrom', an exception is raised:
> 
> root@OpenWrt:~# irb
> irb(main):001:0> require 'socket'
> => true
> irb(main):002:0> s = UDPSocket.new
> => #<UDPSocket:0x444000>
> irb(main):003:0> s.bind("0.0.0.0",1234)
> => 0
> irb(main):004:0> d = s.recvfrom(512)
> IOError: recv for buffered IO
>         from (irb):4:in `recvfrom'
>         from (irb):4
> irb(main):005:0>
> 
> But strangely, TCP sockets work just fine.
> 
> Now, the only place I can see this exception raised is here in
> etc/socket/socket.c:
> 
>     if (rb_read_pending(fptr->f)) {
>         rb_raise(rb_eIOError, "recv for buffered IO");
>     }

I have narrowed the problem down further to this line in io.c:

#  define READ_DATA_PENDING(fp) (!feof(fp))

With a FILE* wrapping a UDP socket, feof() always returns zero. This can be
demonstrated with the following test program:

---- 8< ----
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>

int main(void)
{
  int s;
  FILE *f1, *f2;

  /* udp_init */
  s = socket(AF_INET, SOCK_DGRAM, 0);
  if (s < 0) { perror("socket"); exit(1); }

  /* init_sock / rb_fdopen */
  f1 = fdopen(s, "r");
  if (!f1) { perror("fdopen r"); exit(1); }
  f2 = fdopen(s, "w");
  if (!f2) { perror("fdopen w"); exit(1); }

  printf("feof(f1)=%d\n", (int)feof(f1));
  printf("feof(f2)=%d\n", (int)feof(f2));
  return 0;
}
---- 8< ----

When I run it either on the OpenWrt target or a normal i386 Linux system, I
get

feof(f1)=0
feof(f2)=0

Now, when building Ruby under OpenWrt, the READ_DATA_PENDING macro is
defined as !feof() as shown above - and as a result, whenever you try to
call recvfrom on a UDP socket, you get an exception raised here in
ext/socket/socket.c:

    if (rb_read_pending(fptr->f)) {
        rb_raise(rb_eIOError, "recv for buffered IO");
    }

So my question is, what's the "right" way to fix this problem? Should I just
comment out these three lines when building under OpenWrt? Would there be
any undesired side-effects of this?

Thanks,

Brian.

In This Thread