diff mbox

give some useful error messages when tap open fails

Message ID 20100422092826.EF03612B5C@gandalf.tls.msk.ru
State New
Headers show

Commit Message

Michael Tokarev April 22, 2010, 9:28 a.m. UTC
In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
(with fprintf) something like this:

  warning: could not open /dev/net/tun: no virtual network emulation

this has 2 issues:
 1) it is not a warning really, it's a fatal error (kvm exits after that),
 2) there's no indication as of what's actually wrong: printing errno there
    is helpful.

The patch below removes the "warning" prefix, uses %m (since it's linux,
%m is available as format modifier), and changes fprintf() to qemu_error().
Now it prints something like this instead:

 could not configure /dev/net/tun: Device or resource busy

(there are 2 messages like that in the same function)

This fixes Debian bug #578154, see
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=578154

Signed-Off-By: Michael Tokarev <mjt@tls.msk.ru>

Comments

Markus Armbruster April 22, 2010, 9:52 a.m. UTC | #1
Michael Tokarev <mjt@tls.msk.ru> writes:

> In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
> (with fprintf) something like this:
>
>   warning: could not open /dev/net/tun: no virtual network emulation
>
> this has 2 issues:
>  1) it is not a warning really, it's a fatal error (kvm exits after that),
>  2) there's no indication as of what's actually wrong: printing errno there
>     is helpful.
>
> The patch below removes the "warning" prefix, uses %m (since it's linux,
> %m is available as format modifier), and changes fprintf() to qemu_error().
> Now it prints something like this instead:
>
>  could not configure /dev/net/tun: Device or resource busy
>
> (there are 2 messages like that in the same function)
>
> This fixes Debian bug #578154, see
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=578154
>
> Signed-Off-By: Michael Tokarev <mjt@tls.msk.ru>
>
> diff --git a/net/tap-linux.c b/net/tap-linux.c
> index 6af9e82..dbcbe6f 100644
> --- a/net/tap-linux.c
> +++ b/net/tap-linux.c
> @@ -39,7 +39,7 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required
>  
>      TFR(fd = open("/dev/net/tun", O_RDWR));
>      if (fd < 0) {
> -        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
> +        qemu_error("could not open /dev/net/tun: %m\n");
>          return -1;
>      }
>      memset(&ifr, 0, sizeof(ifr));

This might apply to the stable branch (I haven't tried), but I don't
think it works on master.  There, it should look like this (untested):

+        error_report("could not open /dev/net/tun: %m");

[...]
Kevin Wolf April 23, 2010, 12:46 p.m. UTC | #2
Am 22.04.2010 11:52, schrieb Markus Armbruster:
> Michael Tokarev <mjt@tls.msk.ru> writes:
> 
>> In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
>> (with fprintf) something like this:
>>
>>   warning: could not open /dev/net/tun: no virtual network emulation
>>
>> this has 2 issues:
>>  1) it is not a warning really, it's a fatal error (kvm exits after that),
>>  2) there's no indication as of what's actually wrong: printing errno there
>>     is helpful.
>>
>> The patch below removes the "warning" prefix, uses %m (since it's linux,
>> %m is available as format modifier), and changes fprintf() to qemu_error().
>> Now it prints something like this instead:
>>
>>  could not configure /dev/net/tun: Device or resource busy
>>
>> (there are 2 messages like that in the same function)
>>
>> This fixes Debian bug #578154, see
>> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=578154
>>
>> Signed-Off-By: Michael Tokarev <mjt@tls.msk.ru>
>>
>> diff --git a/net/tap-linux.c b/net/tap-linux.c
>> index 6af9e82..dbcbe6f 100644
>> --- a/net/tap-linux.c
>> +++ b/net/tap-linux.c
>> @@ -39,7 +39,7 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required
>>  
>>      TFR(fd = open("/dev/net/tun", O_RDWR));
>>      if (fd < 0) {
>> -        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
>> +        qemu_error("could not open /dev/net/tun: %m\n");
>>          return -1;
>>      }
>>      memset(&ifr, 0, sizeof(ifr));
> 
> This might apply to the stable branch (I haven't tried), but I don't
> think it works on master.  There, it should look like this (untested):
> 
> +        error_report("could not open /dev/net/tun: %m");

I'm not sure where this %m is defined exactly (Linux specific? Maybe
BSDs, too?), but it doesn't seem to work with mingw.

Kevin
Michael Tokarev April 23, 2010, 12:52 p.m. UTC | #3
Kevin Wolf wrote:
> Am 22.04.2010 11:52, schrieb Markus Armbruster:
>> Michael Tokarev <mjt@tls.msk.ru> writes:
>>
>>> In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
>>> (with fprintf) something like this:
>>>
[]
>>>      TFR(fd = open("/dev/net/tun", O_RDWR));
>>>      if (fd < 0) {
>>> -        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
>>> +        qemu_error("could not open /dev/net/tun: %m\n");
>>>          return -1;
> 
> I'm not sure where this %m is defined exactly (Linux specific? Maybe
> BSDs, too?), but it doesn't seem to work with mingw.

The file being patched is tap-linux.c.
I noted this in my first email.

Thanks!

/mjt
Kevin Wolf April 23, 2010, 1:28 p.m. UTC | #4
Am 23.04.2010 14:52, schrieb Michael Tokarev:
> Kevin Wolf wrote:
>> Am 22.04.2010 11:52, schrieb Markus Armbruster:
>>> Michael Tokarev <mjt@tls.msk.ru> writes:
>>>
>>>> In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
>>>> (with fprintf) something like this:
>>>>
> []
>>>>      TFR(fd = open("/dev/net/tun", O_RDWR));
>>>>      if (fd < 0) {
>>>> -        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
>>>> +        qemu_error("could not open /dev/net/tun: %m\n");
>>>>          return -1;
>>
>> I'm not sure where this %m is defined exactly (Linux specific? Maybe
>> BSDs, too?), but it doesn't seem to work with mingw.
> 
> The file being patched is tap-linux.c.
> I noted this in my first email.

Sorry, I missed that. You're right, of course.

Kevin
Anthony Liguori April 26, 2010, 6:41 p.m. UTC | #5
On 04/23/2010 08:28 AM, Kevin Wolf wrote:
> Am 23.04.2010 14:52, schrieb Michael Tokarev:
>    
>> Kevin Wolf wrote:
>>      
>>> Am 22.04.2010 11:52, schrieb Markus Armbruster:
>>>        
>>>> Michael Tokarev<mjt@tls.msk.ru>  writes:
>>>>
>>>>          
>>>>> In net/tap-linux.c, when manipulation of /dev/net/tun fails, it prints
>>>>> (with fprintf) something like this:
>>>>>
>>>>>            
>> []
>>      
>>>>>       TFR(fd = open("/dev/net/tun", O_RDWR));
>>>>>       if (fd<  0) {
>>>>> -        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
>>>>> +        qemu_error("could not open /dev/net/tun: %m\n");
>>>>>           return -1;
>>>>>            
>>> I'm not sure where this %m is defined exactly (Linux specific? Maybe
>>> BSDs, too?), but it doesn't seem to work with mingw.
>>>        
>> The file being patched is tap-linux.c.
>> I noted this in my first email.
>>      
> Sorry, I missed that. You're right, of course.
>    

But from a consistency perspective, "%s", strerror(errno) would be nicer 
even if it's technically okay.

Regards,

Anthony Liguori

> Kevin
>
>
>
>
diff mbox

Patch

diff --git a/net/tap-linux.c b/net/tap-linux.c
index 6af9e82..dbcbe6f 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -39,7 +39,7 @@  int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required
 
     TFR(fd = open("/dev/net/tun", O_RDWR));
     if (fd < 0) {
-        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
+        qemu_error("could not open /dev/net/tun: %m\n");
         return -1;
     }
     memset(&ifr, 0, sizeof(ifr));
@@ -70,7 +70,7 @@  int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required
         pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
     ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
     if (ret != 0) {
-        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
+        qemu_error("could not configure /dev/net/tun: %m\n");
         close(fd);
         return -1;
     }