On Thu, Jul 21, 2011 at 10:20:38PM +0200, Claudio Jeker wrote:
> On Thu, Jul 21, 2011 at 01:57:10PM -0500, Josh Hoppes wrote:
> > Thanks for the help and for the better understanding of routing
> > domains and tables. In the end I was over thinking the problem and
> > didn't actually need the additional routing table.
> >
> > On Thu, Jul 21, 2011 at 10:17 AM, Claudio Jeker
> > <[email protected]> wrote:
> > > On Thu, Jul 21, 2011 at 09:40:44AM +0300, Gregory Edigarov wrote:
> > >> Josh,
> > >>
> > >> the table needs to be created and an interface need to be assigned to
> > >> the rdomain like:
> > >>
> > >> ifconfig em0 a.b.c.d/24 rdomain 1
> > >>
> > >> then you can use it like, just for example, this:
> > >> route -T 1 add e.f.g.h/24 a.b.c.x
> > >>
> > >> that does the trick.
> > >
> > > Nope. Something sneaked in that makes it impossible to create alternative
> > > tables. I will have a look.
> > >
> > > --
> > > :wq Claudio
> >
>
> Still here is a diff to fix the porblem. route(8) was failing too early.
> Maybe someone has a better idea on how to solve the gettable() issue in a
> nicer way.
>
Is nobody interested in this?
route -T 1 add 127.0.0.1 127.0.0.1 should work. This is how routing tables
are supposed to be created. It would suck to be unable to do this.
Sending it to tech@ as well.
--
:wq Claudio
Index: route.c
===================================================================
RCS file: /cvs/src/sbin/route/route.c,v
retrieving revision 1.155
diff -u -p -r1.155 route.c
--- route.c 4 Jul 2011 22:48:31 -0000 1.155
+++ route.c 21 Jul 2011 20:16:45 -0000
@@ -102,7 +102,7 @@ void set_metric(char *, int);
void inet_makenetandmask(u_int32_t, struct sockaddr_in *, int);
void interfaces(void);
void getlabel(char *);
-void gettable(const char *);
+int gettable(const char *);
int rdomain(int, char **);
__dead void
@@ -130,6 +130,7 @@ main(int argc, char **argv)
int ch;
int rval = 0;
int kw;
+ int Terr = 0;
if (argc < 2)
usage(NULL);
@@ -150,7 +151,7 @@ main(int argc, char **argv)
tflag = 1;
break;
case 'T':
- gettable(optarg);
+ Terr = gettable(optarg);
Tflag = 1;
break;
case 'd':
@@ -169,6 +170,10 @@ main(int argc, char **argv)
usage(NULL);
kw = keyword(*argv);
+ if (Tflag && Terr != 0 && kw != K_ADD) {
+ errno = Terr;
+ err(1, "routing table %i", tableid);
+ }
switch (kw) {
case K_EXEC:
break;
@@ -183,7 +188,8 @@ main(int argc, char **argv)
if (s == -1)
err(1, "socket");
/* force socket onto table user requested */
- if (Tflag && setsockopt(s, AF_ROUTE, ROUTE_TABLEFILTER,
+ if (Tflag == 1 && Terr == 0 &&
+ setsockopt(s, AF_ROUTE, ROUTE_TABLEFILTER,
&tableid, sizeof(tableid)) == -1)
err(1, "setsockopt(ROUTE_TABLEFILTER)");
break;
@@ -1630,7 +1636,7 @@ getlabel(char *name)
rtm_addrs |= RTA_LABEL;
}
-void
+int
gettable(const char *s)
{
const char *errstr;
@@ -1651,7 +1657,9 @@ gettable(const char *s)
len = sizeof(info);
if (sysctl(mib, 6, &info, &len, NULL, 0) == -1)
- err(1, "routing table %i", tableid);
+ return (errno);
+ else
+ return (0);
}
int