views:

808

answers:

3

I am writing a daemon running on an embedded platform that needs to change the default route of the device according to which interface it is connecting on at a given time. How can I do this programatically? I know I can use system("route del default && route add default gateway blah"); etc but is there a more direct way?

UPDATE: I solved my particular problem by discovering a patch to pppd that allows a replacedefaultroute option. The patch also includes code for programmatically modifying the routing table. It is included in this gentoo bug report http://bugs.gentoo.org/227321

+1  A: 

I would recommend just using that route command. Thats what it's there for, and anything else will just be a hack.

Nick Whaley
+4  A: 

Check out SIOCADDRT/SIOCDELRT ioctls (Stevens' "Unix Network Programming" would be a good reference.)

Lance Richardson
Awesome, I get either shell level access or I have to parse /proc/net/route and use ioctls! I suppose I can rip some code from other projects. Currently looking at how pppd does it.
MattSmith
+1  A: 

I typed

man route

cause I know sometimes I can get a hint in the "see also" section for how to do the same thing programatically. I saw there was a man page on page 4 for "route" (route(4) was in the see also section). So tried

man 4 route

and it looked promising for doing what the route command can do programmitically.

Note I just noticed this is only for BSD systems. Here is a URL with the manpage http://www.manpagez.com/man/4/route/. This may or may not be helpful. Maybe you can google some of the stuff in here and add the word "linux".

Doug T.
I have man route but not man 4 route. Can you tell me which library or header file I need?
MattSmith
You're right, my fault. I was checking on a BSD system. Does your man route have a "see also" that looks promising at all?
Doug T.
It would be handy as it seems on linux you have to use ioctls and parse the route table in /proc
MattSmith