xref: /plan9-contrib/sys/src/cmd/ip/ipconfig/ppp.c (revision 5e1edbcac07f76f31a45db523e9d0245b4bb9b18)
1*e47528f3SDavid du Colombier #include <u.h>
2*e47528f3SDavid du Colombier #include <libc.h>
3*e47528f3SDavid du Colombier #include <ip.h>
4*e47528f3SDavid du Colombier #include <bio.h>
5*e47528f3SDavid du Colombier #include <ndb.h>
6*e47528f3SDavid du Colombier #include "../dhcp.h"
7*e47528f3SDavid du Colombier #include "ipconfig.h"
8*e47528f3SDavid du Colombier 
9*e47528f3SDavid du Colombier void
pppbinddev(void)10*e47528f3SDavid du Colombier pppbinddev(void)
11*e47528f3SDavid du Colombier {
12*e47528f3SDavid du Colombier 	int ac, pid;
13*e47528f3SDavid du Colombier 	char *av[12];
14*e47528f3SDavid du Colombier 	Waitmsg *w;
15*e47528f3SDavid du Colombier 
16*e47528f3SDavid du Colombier 	/* ppp does the binding */
17*e47528f3SDavid du Colombier 
18*e47528f3SDavid du Colombier 	/* start with an empty config file */
19*e47528f3SDavid du Colombier 	if(nip == 0)
20*e47528f3SDavid du Colombier 		writendb("", 0, 0);
21*e47528f3SDavid du Colombier 
22*e47528f3SDavid du Colombier 	switch(pid = rfork(RFPROC|RFFDG|RFMEM)){
23*e47528f3SDavid du Colombier 	case -1:
24*e47528f3SDavid du Colombier 		sysfatal("can't start ppp: %r");
25*e47528f3SDavid du Colombier 	case 0:
26*e47528f3SDavid du Colombier 		ac = 0;
27*e47528f3SDavid du Colombier 		av[ac++] = "ppp";
28*e47528f3SDavid du Colombier 		av[ac++] = "-uf";
29*e47528f3SDavid du Colombier 		av[ac++] = "-p";
30*e47528f3SDavid du Colombier 		av[ac++] = conf.dev;
31*e47528f3SDavid du Colombier 		av[ac++] = "-x";
32*e47528f3SDavid du Colombier 		av[ac++] = conf.mpoint;
33*e47528f3SDavid du Colombier 		if(conf.baud != nil){
34*e47528f3SDavid du Colombier 			av[ac++] = "-b";
35*e47528f3SDavid du Colombier 			av[ac++] = conf.baud;
36*e47528f3SDavid du Colombier 		}
37*e47528f3SDavid du Colombier 		av[ac] = nil;
38*e47528f3SDavid du Colombier 		exec("/bin/ip/ppp", av);
39*e47528f3SDavid du Colombier 		exec("/ppp", av);
40*e47528f3SDavid du Colombier 		sysfatal("execing /ppp: %r");
41*e47528f3SDavid du Colombier 	}
42*e47528f3SDavid du Colombier 
43*e47528f3SDavid du Colombier 	/* wait for ppp to finish connecting and configuring */
44*e47528f3SDavid du Colombier 	while((w = wait()) != nil){
45*e47528f3SDavid du Colombier 		if(w->pid == pid){
46*e47528f3SDavid du Colombier 			if(w->msg[0] != 0)
47*e47528f3SDavid du Colombier 				sysfatal("/ppp exited with status: %s", w->msg);
48*e47528f3SDavid du Colombier 			free(w);
49*e47528f3SDavid du Colombier 			break;
50*e47528f3SDavid du Colombier 		}
51*e47528f3SDavid du Colombier 		free(w);
52*e47528f3SDavid du Colombier 	}
53*e47528f3SDavid du Colombier 	if(w == nil)
54*e47528f3SDavid du Colombier 		sysfatal("/ppp disappeared");
55*e47528f3SDavid du Colombier 
56*e47528f3SDavid du Colombier 	/* ppp sets up the configuration itself */
57*e47528f3SDavid du Colombier 	noconfig = 1;
58*e47528f3SDavid du Colombier 	getndb();
59*e47528f3SDavid du Colombier }
60*e47528f3SDavid du Colombier 
61