On 09/03/2011, Gert Doering wrote: > I can understand why this feature is desirable - there are a couple > of problems with the implementation, though. > - From a code modularity point of view, socket stuff should not go > to options.c, but to socket.c
I understand that with "socket stuff" you probably mean "socket
operations". Actually, my first implementation of this feature
(attached) was entirely confined to socket.c, amd simply accepted an
interface name as a possible value. The reason I didn't like it was
because because I couldn't easily identify a spot in socket.c that
would confine this behaviour to just the local interface.
> - your code is likely to work on Linux and *BSD, but will it work
> "as is" on Solaris and Windows? I don't expect it to, so
> additional #ifdef's are needed --> and that's why it should go to
> one of the more system-dependent (and already #ifdef-filled)
> source files
I'll need help from people with access to those systems to place the
appropriate #ifdefs...
> In general, I wonder why binding to the interface is really needed
> - what happens if you don't specify "local" at all? It should pick
> the proper source address automatically.
It does, unless you have more than one interface, and you need
OpenVPN to bind to only one of them.
Fede
diff -r 66ad68054f67 socket.c
--- a/socket.c Tue Mar 01 10:21:42 2011 +0100
+++ b/socket.c Wed Mar 09 08:49:20 2011 -0300
@@ -32,6 +32,7 @@
#include "ps.h"
#include "manage.h"
#include "misc.h"
+#include <net/if.h>
#include "memdbg.h"
@@ -129,6 +130,24 @@
status = openvpn_inet_aton (hostname, &ia); /* parse ascii IP address */
+ if (status != OIA_IP) /* Attempt to parse as interface name */
+ {
+ int fd;
+ struct ifreq ifr;
+
+ ifr.ifr_addr.sa_family = AF_INET;
+ strncpy(ifr.ifr_name, hostname, IFNAMSIZ-1);
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0))>= 0)
+ {
+ if (ioctl(fd, SIOCGIFADDR, &ifr) >= 0)
+ {
+ ia = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
+ status = OIA_IP;
+ }
+ close(fd);
+ }
+ }
+
if (status != OIA_IP) /* parse as IP address failed? */
{
const int fail_wait_interval = 5; /* seconds */
signature.asc
Description: PGP signature
