1/* 2 * ppp scripts 3 * 4 * Copyright (C) 2010, Broadcom Corporation. All Rights Reserved. 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 * $Id: ppp.c,v 1.19 2009/12/02 20:07:37 Exp $ 19 */ 20 21#include <stdio.h> 22#include <stdlib.h> 23#include <unistd.h> 24#include <string.h> 25#include <sys/ioctl.h> 26#include <sys/socket.h> 27#include <netinet/in.h> 28#include <arpa/inet.h> 29#include <errno.h> 30#include <ctype.h> 31 32#include <bcmnvram.h> 33#include <netconf.h> 34#include <shutils.h> 35#include <rc.h> 36 37/* 38* parse ifname to retrieve unit # 39*/ 40int 41ppp_ifunit(char *ifname) 42{ 43 if (strncmp(ifname, "ppp", 3)) 44 return -1; 45 if (!isdigit(ifname[3])) 46 return -1; 47 return atoi(&ifname[3]); 48} 49 50/* 51 * Called when link comes up 52 */ 53int 54ipup_main(int argc, char **argv) 55{ 56 FILE *fp; 57 char *wan_ifname = safe_getenv("IFNAME"); 58 char *value; 59 char buf[256]; 60 int unit; 61 char tmp[100], prefix[] = "wanXXXXXXXXXX_"; 62 63 dprintf("%s\n", argv[0]); 64 65 if ((unit = ppp_ifunit(wan_ifname)) < 0) 66 return -1; 67 68 snprintf(prefix, sizeof(prefix), "wan%d_", unit); 69 70 /* Touch connection file */ 71 if (!(fp = fopen(strcat_r("/tmp/ppp/link.", wan_ifname, tmp), "a"))) { 72 perror(tmp); 73 return errno; 74 } 75 fclose(fp); 76 77 if ((value = getenv("IPLOCAL"))) { 78 ifconfig(wan_ifname, IFUP, 79 value, "255.255.255.255"); 80 nvram_set(strcat_r(prefix, "ipaddr", tmp), value); 81 nvram_set(strcat_r(prefix, "netmask", tmp), "255.255.255.255"); 82 } 83 84 if ((value = getenv("IPREMOTE"))) 85 nvram_set(strcat_r(prefix, "gateway", tmp), value); 86 strcpy(buf, ""); 87 if (getenv("DNS1")) 88 sprintf(buf, "%s", getenv("DNS1")); 89 if (getenv("DNS2")) 90 sprintf(buf + strlen(buf), "%s%s", strlen(buf) ? " " : "", getenv("DNS2")); 91 nvram_set(strcat_r(prefix, "dns", tmp), buf); 92 93 wan_up(wan_ifname); 94 95 dprintf("done\n"); 96 return 0; 97} 98 99/* 100 * Called when link goes down 101 */ 102int 103ipdown_main(int argc, char **argv) 104{ 105 char *wan_ifname = safe_getenv("IFNAME"); 106 int unit; 107 char tmp[100], prefix[] = "wanXXXXXXXXXX_"; 108 109 if ((unit = ppp_ifunit(wan_ifname)) < 0) 110 return -1; 111 112 snprintf(prefix, sizeof(prefix), "wan%d_", unit); 113 114 wan_down(wan_ifname); 115 116 unlink(strcat_r("/tmp/ppp/link.", wan_ifname, tmp)); 117 118 preset_wan_routes(wan_ifname); 119 120 return 0; 121} 122