static int slip_open(void *data) { struct slip_data *pri = data; char version_buf[sizeof("nnnnn\0")]; char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf, NULL }; int sfd, mfd, disc, sencap, err; if((mfd = get_pty()) < 0){ printk("umn : Failed to open pty\n"); return(-1); } if((sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0)) < 0){ printk("Couldn't open tty for slip line\n"); return(-1); } if(set_up_tty(sfd)) return(-1); pri->slave = sfd; pri->pos = 0; pri->esc = 0; if(pri->gate_addr != NULL){ sprintf(version_buf, "%d", UML_NET_VERSION); strcpy(gate_buf, pri->gate_addr); err = slip_tramp(argv, sfd); if(err != 0){ printk("slip_tramp failed - errno = %d\n", err); return(-err); } if(ioctl(pri->slave, SIOCGIFNAME, pri->name) < 0){ printk("SIOCGIFNAME failed, errno = %d\n", errno); return(-errno); } iter_addresses(pri->dev, open_addr, pri->name); } else { disc = N_SLIP; if(ioctl(sfd, TIOCSETD, &disc) < 0){ printk("Failed to set slip line discipline - " "errno = %d\n", errno); return(-errno); } sencap = 0; if(ioctl(sfd, SIOCSIFENCAP, &sencap) < 0){ printk("Failed to set slip encapsulation - " "errno = %d\n", errno); return(-errno); } } return(mfd); }
static void slip_close(int fd, void *data) { struct slip_data *pri = data; char version_buf[sizeof("nnnnn\0")]; char *argv[] = { "uml_net", version_buf, "slip", "down", pri->name, NULL }; int err; if(pri->gate_addr != NULL) iter_addresses(pri->dev, close_addr, pri->name); sprintf(version_buf, "%d", UML_NET_VERSION); err = slip_tramp(argv, pri->slave); if(err != 0) printk("slip_tramp failed - errno = %d\n", -err); os_close_file(fd); os_close_file(pri->slave); pri->slave = -1; }
static int slip_open(void *data) { struct slip_data *pri = data; char version_buf[sizeof("nnnnn\0")]; char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf, NULL }; int sfd, mfd, err; err = get_pty(); if(err < 0){ printk("slip-open : Failed to open pty, err = %d\n", -err); goto out; } mfd = err; err = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); if(err < 0){ printk("Couldn't open tty for slip line, err = %d\n", -err); goto out_close; } sfd = err; if(set_up_tty(sfd)) goto out_close2; pri->slave = sfd; pri->slip.pos = 0; pri->slip.esc = 0; if(pri->gate_addr != NULL){ sprintf(version_buf, "%d", UML_NET_VERSION); strcpy(gate_buf, pri->gate_addr); err = slip_tramp(argv, sfd); if(err < 0){ printk("slip_tramp failed - err = %d\n", -err); goto out_close2; } err = os_get_ifname(pri->slave, pri->name); if(err < 0){ printk("get_ifname failed, err = %d\n", -err); goto out_close2; } iter_addresses(pri->dev, open_addr, pri->name); } else { err = os_set_slip(sfd); if(err < 0){ printk("Failed to set slip discipline encapsulation - " "err = %d\n", -err); goto out_close2; } } return(mfd); out_close2: os_close_file(sfd); out_close: os_close_file(mfd); out: return err; }