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 Colombierpppbinddev(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