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 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]); }