summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/route.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-12-30 02:45:48 +0000
committerbrian <brian@FreeBSD.org>1997-12-30 02:45:48 +0000
commitf0d05aed36b5eb215274b4d1821f8d0ffd9394ca (patch)
treea201175cd48b221f6e508bd9021dfb5349d7dbec /usr.sbin/ppp/route.c
parentc4bd99c59d52a5c250f50814c56243013fd89b3e (diff)
downloadFreeBSD-src-f0d05aed36b5eb215274b4d1821f8d0ffd9394ca.zip
FreeBSD-src-f0d05aed36b5eb215274b4d1821f8d0ffd9394ca.tar.gz
Allow "add! dst mask gw" (note the ``!'') to do an
RTM_CHANGE if the RTM_ADD fails with an EEXIST. Allow "delete! dst" (note the ``!'') to silently fail if the RTM_DELETE fails with an ESRCH. Also, make the ESRCH and EEXIST error conditions more understandable to the casual observer.
Diffstat (limited to 'usr.sbin/ppp/route.c')
-rw-r--r--usr.sbin/ppp/route.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/usr.sbin/ppp/route.c b/usr.sbin/ppp/route.c
index 534af94..addf602 100644
--- a/usr.sbin/ppp/route.c
+++ b/usr.sbin/ppp/route.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: route.c,v 1.36 1997/12/27 13:45:57 brian Exp $
+ * $Id: route.c,v 1.37 1997/12/27 19:23:13 brian Exp $
*
*/
@@ -67,7 +67,8 @@ void
OsSetRoute(int cmd,
struct in_addr dst,
struct in_addr gateway,
- struct in_addr mask)
+ struct in_addr mask,
+ int bang)
{
struct rtmsg rtmes;
int s, nb, wb;
@@ -75,7 +76,10 @@ OsSetRoute(int cmd,
const char *cmdstr;
struct sockaddr_in rtdata;
- cmdstr = (cmd == RTM_ADD ? "Add" : "Delete");
+ if (bang)
+ cmdstr = (cmd == RTM_ADD ? "Add!" : "Delete!");
+ else
+ cmdstr = (cmd == RTM_ADD ? "Add" : "Delete");
s = ID0socket(PF_ROUTE, SOCK_RAW, 0);
if (s < 0) {
LogPrintf(LogERROR, "OsSetRoute: socket(): %s\n", strerror(errno));
@@ -145,25 +149,29 @@ OsSetRoute(int cmd,
LogPrintf(LogTCPIP, "OsSetRoute: Dst = %s\n", inet_ntoa(dst));
LogPrintf(LogTCPIP, "OsSetRoute: Gateway = %s\n", inet_ntoa(gateway));
LogPrintf(LogTCPIP, "OsSetRoute: Mask = %s\n", inet_ntoa(mask));
- switch (rtmes.m_rtm.rtm_errno) {
- case EEXIST:
- LogPrintf(LogWARN, "Add route failed: %s already exists\n",
- inet_ntoa(dst));
- break;
- case ESRCH:
- LogPrintf(LogWARN, "Del route failed: %s: Non-existent\n",
- inet_ntoa(dst));
- break;
- case 0:
+failed:
+ if (cmd == RTM_ADD && (rtmes.m_rtm.rtm_errno == EEXIST ||
+ (rtmes.m_rtm.rtm_errno == 0 && errno == EEXIST)))
+ if (!bang)
+ LogPrintf(LogWARN, "Add route failed: %s already exists\n",
+ inet_ntoa(dst));
+ else {
+ rtmes.m_rtm.rtm_type = cmd = RTM_CHANGE;
+ if ((wb = ID0write(s, &rtmes, nb)) < 0)
+ goto failed;
+ }
+ else if (cmd == RTM_DELETE &&
+ (rtmes.m_rtm.rtm_errno == ESRCH ||
+ (rtmes.m_rtm.rtm_errno == 0 && errno == ESRCH))) {
+ if (!bang)
+ LogPrintf(LogWARN, "Del route failed: %s: Non-existent\n",
+ inet_ntoa(dst));
+ } else if (rtmes.m_rtm.rtm_errno == 0)
LogPrintf(LogWARN, "%s route failed: %s: errno: %s\n", cmdstr,
inet_ntoa(dst), strerror(errno));
- break;
- case ENOBUFS:
- default:
+ else
LogPrintf(LogWARN, "%s route failed: %s: %s\n",
cmdstr, inet_ntoa(dst), strerror(rtmes.m_rtm.rtm_errno));
- break;
- }
}
LogPrintf(LogDEBUG, "wrote %d: cmd = %s, dst = %x, gateway = %x\n",
wb, cmdstr, dst.s_addr, gateway.s_addr);
@@ -502,7 +510,7 @@ DeleteIfRoutes(int all)
if ((pass == 0 && (rtm->rtm_flags & RTF_WASCLONED)) ||
(pass == 1 && !(rtm->rtm_flags & RTF_WASCLONED))) {
LogPrintf(LogDEBUG, "DeleteIfRoutes: Remove it (pass %d)\n", pass);
- OsSetRoute(RTM_DELETE, sa_dst, sa_none, sa_none);
+ OsSetRoute(RTM_DELETE, sa_dst, sa_none, sa_none, 0);
} else
LogPrintf(LogDEBUG, "DeleteIfRoutes: Skip it (pass %d)\n", pass);
} else
OpenPOWER on IntegriCloud