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