Index: routing.c =================================================================== RCS file: /cvsroot/pptpclient/pptp-linux/routing.c,v retrieving revision 1.1 diff -u -r1.1 routing.c --- routing.c 2 Aug 2006 07:07:37 -0000 1.1 +++ routing.c 25 Mar 2009 13:58:28 -0000 @@ -23,9 +23,26 @@ #include #include #include "routing.h" +#include "config.h" +#if defined (__SVR4) && defined (__sun) /* Solaris */ +#include +#include +#include +#include +#include +#include "util.h" +/* PF_ROUTE socket*/ +int rts; +/* Destination and gateway addresses */ +struct sockaddr_in rdst, rgw; +/* Request sequence */ +int rseq; +int dorouting; +#else /* Solaris */ /* route to the server */ char *route; +#endif /* Solaris */ /* @@ -54,26 +71,113 @@ */ void routing_init(char *ip) { +#if defined (__SVR4) && defined (__sun) /* Solaris */ + rdst.sin_family = AF_INET; + if ( ! inet_pton(AF_INET, ip, &rdst.sin_addr) ) { + log("Cannot convert address: %s", strerror(errno)); + return; + } + + if ( (rts = socket(PF_ROUTE, SOCK_RAW, AF_INET )) < 0 ) { + log("Cannot open routing socket: %s", strerror(errno)); + return; + } + + struct rt_msg rtm = { + .hdr.rtm_msglen = sizeof(struct rt_msg), + .hdr.rtm_version = RTM_VERSION, + .hdr.rtm_type = RTM_GET, + .hdr.rtm_addrs = RTA_DST, + .hdr.rtm_pid = getpid(), + .hdr.rtm_seq = ++rseq, + .addrs[RTAX_DST] = rdst + }; + + if ( write(rts, &rtm, rtm.hdr.rtm_msglen) != rtm.hdr.rtm_msglen ) { + log("Error writing to routing socket: %s", strerror(errno)); + close(rts); + return; + } + + while ( read(rts, &rtm, sizeof(struct rt_msg)) > 0 ) + if ( rtm.hdr.rtm_pid == getpid() && rtm.hdr.rtm_seq == rseq) { + /* Check if host route already present */ + if ( ( rtm.hdr.rtm_flags & RTF_HOST ) != RTF_HOST ) { + rgw = rtm.addrs[RTAX_GATEWAY]; + dorouting = 1; + } + break; + } +#else /* Solaris */ char buf[256]; - snprintf(buf, 255, "/bin/ip route get %s", ip); - FILE *p = popen(buf, "r"); + FILE *p; + + snprintf(buf, 255, "%s route get %s", IP_BINARY, ip); + p = popen(buf, "r"); fgets(buf, 255, p); /* TODO: check for failure of fgets */ route = strdup(buf); pclose(p); /* TODO: check for failure of command */ +#endif /* Solaris */ } void routing_start() { +#if defined (__SVR4) && defined (__sun) /* Solaris */ + if ( ! dorouting ) + return; + + struct rt_msg rtm = { + .hdr.rtm_msglen = sizeof(struct rt_msg), + .hdr.rtm_version = RTM_VERSION, + .hdr.rtm_type = RTM_ADD, + .hdr.rtm_flags = RTF_HOST | RTF_GATEWAY | RTF_STATIC, + .hdr.rtm_addrs = RTA_DST | RTA_GATEWAY, + .hdr.rtm_pid = getpid(), + .hdr.rtm_seq = ++rseq, + .addrs[RTAX_DST] = rdst, + .addrs[RTAX_GATEWAY] = rgw + }; + + if ( write(rts, &rtm, rtm.hdr.rtm_msglen) != rtm.hdr.rtm_msglen ) { + log("Error adding route: %s", strerror(errno)); + } +#else /* Solaris */ char buf[256]; - snprintf(buf, 255, "/bin/ip route replace %s", route); - FILE *p = popen(buf, "r"); + FILE *p; + + snprintf(buf, 255, "%s route replace %s", IP_BINARY, route); + p = popen(buf, "r"); pclose(p); +#endif /* Solaris */ } void routing_end() { +#if defined (__SVR4) && defined (__sun) /* Solaris */ + if ( ! dorouting) + return; + + struct rt_msg rtm = { + .hdr.rtm_msglen = sizeof(struct rt_msg), + .hdr.rtm_version = RTM_VERSION, + .hdr.rtm_type = RTM_DELETE, + .hdr.rtm_flags = RTF_HOST | RTF_GATEWAY | RTF_STATIC, + .hdr.rtm_addrs = RTA_DST | RTA_GATEWAY, + .hdr.rtm_pid = getpid(), + .hdr.rtm_seq = ++rseq, + .addrs[RTAX_DST] = rdst, + .addrs[RTAX_GATEWAY] = rgw + }; + + if ( write(rts, &rtm, rtm.hdr.rtm_msglen) != rtm.hdr.rtm_msglen ) { + log("Error deleting route: %s", strerror(errno)); + } +#else /* Solaris */ char buf[256]; - snprintf(buf, 255, "/bin/ip route delete %s", route); - FILE *p = popen(buf, "r"); + FILE *p; + + snprintf(buf, 255, "%s route delete %s", IP_BINARY, route); + p = popen(buf, "r"); pclose(p); +#endif /* Solaris */ } Index: Makefile =================================================================== RCS file: /cvsroot/pptpclient/pptp-linux/Makefile,v retrieving revision 1.47 retrieving revision 1.49 diff -u -r1.47 -r1.49 --- Makefile 14 May 2008 06:32:52 -0000 1.47 +++ Makefile 24 Jul 2008 05:37:47 -0000 1.49 @@ -1,10 +1,13 @@ -# $Id: Makefile,v 1.47 2008/05/14 06:32:52 quozl Exp $ +# $Id: Makefile,v 1.49 2008/07/24 05:37:47 quozl Exp $ VERSION=1.7.2 RELEASE= ################################################################# -# CHANGE THIS LINE to point to the location of your pppd binary. +# CHANGE THIS LINE to point to the location of binaries PPPD = /usr/sbin/pppd +# Solaris +# PPPD = /usr/bin/pppd +IP = /bin/ip ################################################################# BINDIR=$(DESTDIR)/usr/sbin @@ -47,6 +52,7 @@ echo "/* text added by Makefile target config.h */" > config.h echo "#define PPTP_LINUX_VERSION \"$(VERSION)$(RELEASE)\"" >> config.h echo "#define PPPD_BINARY \"$(PPPD)\"" >> config.h + echo "#define IP_BINARY \"$(IP)\"" >> config.h vector_test: vector_test.o vector.o $(CC) -o vector_test vector_test.o vector.o