From owner-svn-src-stable@FreeBSD.ORG Sun Jul 24 18:03:03 2011 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 00B941065673; Sun, 24 Jul 2011 18:03:03 +0000 (UTC) (envelope-from sobomax@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DA62A8FC13; Sun, 24 Jul 2011 18:03:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p6OI32qA018758; Sun, 24 Jul 2011 18:03:02 GMT (envelope-from sobomax@svn.freebsd.org) Received: (from sobomax@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p6OI32ST018756; Sun, 24 Jul 2011 18:03:02 GMT (envelope-from sobomax@svn.freebsd.org) Message-Id: <201107241803.p6OI32ST018756@svn.freebsd.org> From: Maxim Sobolev Date: Sun, 24 Jul 2011 18:03:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r224292 - stable/8/sbin/natd X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Jul 2011 18:03:03 -0000 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)