Re: sockets availability during build

2015-01-24 Thread Federico Beffa
On Fri, Jan 23, 2015 at 10:31 PM, Ludovic Courtès l...@gnu.org wrote:
 Yeah https://bugzilla.redhat.com/show_bug.cgi?id=172350 suggests that
 ENODEV is due to the lack of a default route.

 Indeed, running that fails:

 --8---cut here---start-8---
 (use-modules (guix))

 (define build
   #~(begin
   (define %upnp-ipv4-multicast-address
 (inet-pton AF_INET 239.255.255.250))

   (define %upnp-multicast-port 1900)

   (define %upnp-ipv4-multicast-socket-address
 (make-socket-address AF_INET
  %upnp-ipv4-multicast-address
  %upnp-multicast-port))

   (define (open-upnp-socket)
 (let ((s (socket PF_INET SOCK_DGRAM 0)))
   (setsockopt s IPPROTO_IP IP_ADD_MEMBERSHIP
   (cons %upnp-ipv4-multicast-address INADDR_ANY))
   s))

   (pk (open-upnp-socket))
   (flush-all-ports)
   (mkdir #$output)))

 (with-store store
   (run-with-store store
 (mlet %store-monad ((drv (gexp-derivation test build)))
   (built-derivations (list drv)
 --8---cut here---end---8---

 If we add, before the ‘open-upnp-socket’ call, this line:

 --8---cut here---start-8---
   (system* (string-append #$net-tools /sbin/route)
add -net default)
 --8---cut here---end---8---

 ‘route’ simply fails with:

   SIOCADDRT: Operation not permitted

 I don’t know how to work around it.  You may need to disable the tests.

I think I will disable the tests then.

Thanks for taking the time to look into this!

Regards,
Fede



Re: sockets availability during build

2015-01-23 Thread Federico Beffa
On Fri, Jan 23, 2015 at 9:38 AM, Ludovic Courtès l...@gnu.org wrote:
 I suspect the IP shown above is the result of:

   (getaddrinfo (gethostname))

 or something like that.  DNS lookups don’t work in the chroot, except
 for “localhost”, so you may have to patch tests that rely on this.
 Sockets themselves should work fine.

The error is produced by the system call setsockopt. Here is the
part of the strace log showing the error:

...
write(4, UpnpInit with HostIP=, DestPort=..., 35) = 35
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 6
ioctl(6, SIOCGIFCONF, {40, {{lo, {AF_INET, inet_addr(127.0.0.1)) = 0
ioctl(6, SIOCGIFFLAGS, {ifr_name=lo,
ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0

...

bind(8, {sa_family=AF_INET, sin_port=htons(0),
sin_addr=inet_addr(127.0.0.1)}, 16) = 0
getsockname(8, {sa_family=AF_INET, sin_port=htons(42159),
sin_addr=inet_addr(127.0.0.1)}, [16]) = 0
write(4, \n***..., 326) = 326
write(4, sockfd = 8,  port = 42159\n, 30) = 30
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 9
setsockopt(9, SOL_IP, IP_MULTICAST_TTL, \4, 1) = 0
fcntl(9, F_GETFL)   = 0x2 (flags O_RDWR)
fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK)= 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 10
setsockopt(10, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(10, {sa_family=AF_INET, sin_port=htons(1900),
sin_addr=inet_addr(0.0.0.0)}, 16) = 0
setsockopt(10, SOL_IP, IP_ADD_MEMBERSHIP, \357\377\377\372\0\0\0\0,
8) = -1 ENODEV (No such device)
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x7f551880b000
write(3, \n***..., 326) = 326
write(3, Error in setsockopt() IP_ADD_MEM..., 79) = 79
shutdown(10, SHUT_RDWR) = -1 ENOTCONN (Transport
endpoint is not connected)
...

Outside of the build environment, when the test passes, I see the same
system call with the same parameters, but the call succeeds. The only
difference seems to be in the first part which looks like this

...
write(4, UpnpInit with HostIP=, DestPort=..., 35) = 35
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 5
ioctl(5, SIOCGIFCONF, {80, {{lo, {AF_INET, inet_addr(127.0.0.1)}},
{eth0, {AF_INET, inet_addr(192.168.0.5)) = 0
ioctl(5, SIOCGIFFLAGS, {ifr_name=lo,
ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
ioctl(5, SIOCGIFFLAGS, {ifr_name=eth0,
ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
close(5)= 0
...

and shows the additional device eth0.

From the above I understand that libupnp embedded server wants to
setup multicast, but, as far as I know, this doesn't work with the
lo interface and fails. I do not see a workaround. Anyone?

Regards,
Fede



Re: sockets availability during build

2015-01-23 Thread Ludovic Courtès
Federico Beffa be...@ieee.org skribis:

 The error is produced by the system call setsockopt. Here is the
 part of the strace log showing the error:

[...]

 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 9
 setsockopt(9, SOL_IP, IP_MULTICAST_TTL, \4, 1) = 0
 fcntl(9, F_GETFL)   = 0x2 (flags O_RDWR)
 fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK)= 0
 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 10
 setsockopt(10, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
 bind(10, {sa_family=AF_INET, sin_port=htons(1900),
 sin_addr=inet_addr(0.0.0.0)}, 16) = 0
 setsockopt(10, SOL_IP, IP_ADD_MEMBERSHIP, \357\377\377\372\0\0\0\0,
 8) = -1 ENODEV (No such device)

[...]

 From the above I understand that libupnp embedded server wants to
 setup multicast, but, as far as I know, this doesn't work with the
 lo interface and fails. I do not see a workaround. Anyone?

Yeah https://bugzilla.redhat.com/show_bug.cgi?id=172350 suggests that
ENODEV is due to the lack of a default route.

Indeed, running that fails:

--8---cut here---start-8---
(use-modules (guix))

(define build
  #~(begin
  (define %upnp-ipv4-multicast-address
(inet-pton AF_INET 239.255.255.250))

  (define %upnp-multicast-port 1900)

  (define %upnp-ipv4-multicast-socket-address
(make-socket-address AF_INET
 %upnp-ipv4-multicast-address
 %upnp-multicast-port))

  (define (open-upnp-socket)
(let ((s (socket PF_INET SOCK_DGRAM 0)))
  (setsockopt s IPPROTO_IP IP_ADD_MEMBERSHIP
  (cons %upnp-ipv4-multicast-address INADDR_ANY))
  s))

  (pk (open-upnp-socket))
  (flush-all-ports)
  (mkdir #$output)))

(with-store store
  (run-with-store store
(mlet %store-monad ((drv (gexp-derivation test build)))
  (built-derivations (list drv)
--8---cut here---end---8---

If we add, before the ‘open-upnp-socket’ call, this line:

--8---cut here---start-8---
  (system* (string-append #$net-tools /sbin/route)
   add -net default)
--8---cut here---end---8---

‘route’ simply fails with:

  SIOCADDRT: Operation not permitted

I don’t know how to work around it.  You may need to disable the tests.

Thanks,
Ludo’.



Re: sockets availability during build

2015-01-23 Thread Ludovic Courtès
Federico Beffa be...@ieee.org skribis:

 I'm working on libupnp. The 'check phase gives the following error:

 Initializing UPnP ...
 ** ERROR UpnpInit(): -208 UPNP_E_SOCKET_ERROR
 FAIL: test_init

 In spite of this, if I guix environment and run the test binary it succeeds:

 Initializing UPnP ...
 UPnP Initialized OK ip=192.168.0.5, port=49152

I suspect the IP shown above is the result of:

  (getaddrinfo (gethostname))

or something like that.  DNS lookups don’t work in the chroot, except
for “localhost”, so you may have to patch tests that rely on this.
Sockets themselves should work fine.

HTH,
Ludo’.



Re: sockets availability during build

2015-01-22 Thread John Darrington
On Thu, Jan 22, 2015 at 08:54:11PM +0100, Federico Beffa wrote:
 Hi,
 
 I'm working on libupnp. The 'check phase gives the following error:
 
 Initializing UPnP ...
 ** ERROR UpnpInit(): -208 UPNP_E_SOCKET_ERROR
 FAIL: test_init
 
 In spite of this, if I guix environment and run the test binary it 
succeeds:
 
 Initializing UPnP ...
 UPnP Initialized OK ip=192.168.0.5, port=49152
 
 I suppose that sockets can't be accessed during the build phase. Is
 that correct?

local sockets (AF_UNIX) can be.  But the only Internet sockets accessible are 
those on the local (lo) interface.
All other interfaces are disabled.

J'

-- 
PGP Public key ID: 1024D/2DE827B3 
fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
See http://sks-keyservers.net or any PGP keyserver for public key.



signature.asc
Description: Digital signature