static int etap_open(void *data) { struct ethertap_data *pri = data; char *output; int data_fds[2], control_fds[2], err, output_len; err = tap_open_common(pri->dev, pri->gate_addr); if (err) return err; err = socketpair(AF_UNIX, SOCK_DGRAM, 0, data_fds); if (err) { err = -errno; printk(UM_KERN_ERR "etap_open - data socketpair failed - " "err = %d\n", errno); return err; } err = socketpair(AF_UNIX, SOCK_STREAM, 0, control_fds); if (err) { err = -errno; printk(UM_KERN_ERR "etap_open - control socketpair failed - " "err = %d\n", errno); goto out_close_data; } err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], control_fds[1], data_fds[0], data_fds[1]); output_len = UM_KERN_PAGE_SIZE; output = uml_kmalloc(output_len, UM_GFP_KERNEL); read_output(control_fds[0], output, output_len); if (output == NULL) printk(UM_KERN_ERR "etap_open : failed to allocate output " "buffer\n"); else { printk("%s", output); kfree(output); } if (err < 0) { printk(UM_KERN_ERR "etap_tramp failed - err = %d\n", -err); goto out_close_control; } pri->data_fd = data_fds[0]; pri->control_fd = control_fds[0]; iter_addresses(pri->dev, etap_open_addr, &pri->control_fd); return data_fds[0]; out_close_control: close(control_fds[0]); close(control_fds[1]); out_close_data: close(data_fds[0]); close(data_fds[1]); return err; }
static void etap_close(int fd, void *data) { struct ethertap_data *pri = data; iter_addresses(pri->dev, etap_close_addr, &pri->control_fd); os_close_file(fd); os_shutdown_socket(pri->data_fd, 1, 1); os_close_file(pri->data_fd); pri->data_fd = -1; os_close_file(pri->control_fd); pri->control_fd = -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, 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 int etap_open(void *data) { struct ethertap_data *pri = data; char *output; int data_fds[2], control_fds[2], err, output_len; err = tap_open_common(pri->dev, pri->gate_addr); if(err) return(err); err = os_pipe(data_fds, 0, 0); if(err < 0){ printk("data os_pipe failed - err = %d\n", -err); return(err); } err = os_pipe(control_fds, 1, 0); if(err < 0){ printk("control os_pipe failed - err = %d\n", -err); return(err); } err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], control_fds[1], data_fds[0], data_fds[1]); output_len = page_size(); output = um_kmalloc(output_len); read_output(control_fds[0], output, output_len); if(output == NULL) printk("etap_open : failed to allocate output buffer\n"); else { printk("%s", output); kfree(output); } if(err < 0){ printk("etap_tramp failed - err = %d\n", -err); return(err); } pri->data_fd = data_fds[0]; pri->control_fd = control_fds[0]; iter_addresses(pri->dev, etap_open_addr, &pri->control_fd); return(data_fds[0]); }
static void etap_close(int fd, void *data) { struct ethertap_data *pri = data; iter_addresses(pri->dev, etap_close_addr, &pri->control_fd); close(fd); if (shutdown(pri->data_fd, SHUT_RDWR) < 0) printk(UM_KERN_ERR "etap_close - shutdown data socket failed, " "errno = %d\n", errno); if (shutdown(pri->control_fd, SHUT_RDWR) < 0) printk(UM_KERN_ERR "etap_close - shutdown control socket " "failed, errno = %d\n", errno); close(pri->data_fd); pri->data_fd = -1; close(pri->control_fd); pri->control_fd = -1; }
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; }