Author: sobomax
Date: Sun Jul 24 18:03:02 2011
New Revision: 224292
URL: http://svn.freebsd.org/changeset/base/224292

Log:
  MFC: 220736, 220806, 220808
  
    If we can retrieve interface address sleep for one second and try again.
    This can happen during start-up, when natd starts before dhclient has a
    chance to receive IP address from the upstream provider. Do this only in
    background, dynamic mode.
  
  Reminded by:  brian

Modified:
  stable/8/sbin/natd/natd.c
Directory Properties:
  stable/8/sbin/natd/   (props changed)

Modified: stable/8/sbin/natd/natd.c
==============================================================================
--- stable/8/sbin/natd/natd.c   Sun Jul 24 17:52:35 2011        (r224291)
+++ stable/8/sbin/natd/natd.c   Sun Jul 24 18:03:02 2011        (r224292)
@@ -111,7 +111,7 @@ static void Usage (void);
 static char*   FormatPacket (struct ip*);
 static void    PrintPacket (struct ip*);
 static void    SyslogPacket (struct ip*, int priority, const char *label);
-static void    SetAliasAddressFromIfName (const char *ifName);
+static int     SetAliasAddressFromIfName (const char *ifName);
 static void    InitiateShutdown (int);
 static void    Shutdown (int);
 static void    RefreshAddr (int);
@@ -156,6 +156,7 @@ int main (int argc, char** argv)
        struct sockaddr_in      addr;
        fd_set                  readMask;
        int                     fdMax;
+       int                     rval;
 /* 
  * Initialize packet aliasing software.
  * Done already here to be able to alter option bits
@@ -301,8 +302,17 @@ int main (int argc, char** argv)
 
                                mip->assignAliasAddr = 1;
                        }
-                       else
-                               SetAliasAddressFromIfName (mip->ifName);
+                       else {
+                               do {
+                                       rval = SetAliasAddressFromIfName 
(mip->ifName);
+                                       if (background == 0 || dynamicMode == 0)
+                                               break;
+                                       if (rval == EAGAIN)
+                                               sleep(1);
+                               } while (rval == EAGAIN);
+                               if (rval != 0)
+                                       exit(1);
+                       }
                }
 
        }
@@ -531,7 +541,8 @@ static void DoGlobal (int fd)
 
 #if 0
        if (mip->assignAliasAddr) {
-               SetAliasAddressFromIfName (mip->ifName);
+               if (SetAliasAddressFromIfName (mip->ifName) != 0)
+                       exit(1);
                mip->assignAliasAddr = 0;
        }
 #endif
@@ -634,10 +645,18 @@ static void DoAliasing (int fd, int dire
        socklen_t               addrSize;
        struct ip*              ip;
        char                    msgBuf[80];
+       int                     rval;
 
        if (mip->assignAliasAddr) {
-
-               SetAliasAddressFromIfName (mip->ifName);
+               do {
+                       rval = SetAliasAddressFromIfName (mip->ifName);
+                       if (background == 0 || dynamicMode == 0)
+                               break;
+                       if (rval == EAGAIN)
+                               sleep(1);
+               } while (rval == EAGAIN);
+               if (rval != 0)
+                       exit(1);
                mip->assignAliasAddr = 0;
        }
 /*
@@ -867,7 +886,7 @@ static char* FormatPacket (struct ip* ip
        return buf;
 }
 
-static void
+static int
 SetAliasAddressFromIfName(const char *ifn)
 {
        size_t needed;
@@ -951,14 +970,19 @@ SetAliasAddressFromIfName(const char *if
                        }
                }
        }
-       if (sin == NULL)
-               errx(1, "%s: cannot get interface address", ifn);
+       if (sin == NULL) {
+               warnx("%s: cannot get interface address", ifn);
+               free(buf);
+               return EAGAIN;
+       }
 
        LibAliasSetAddress(mla, sin->sin_addr);
        syslog(LOG_INFO, "Aliasing to %s, mtu %d bytes",
               inet_ntoa(sin->sin_addr), mip->ifMTU);
 
        free(buf);
+
+       return 0;
 }
 
 void Quit (const char* msg)
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to