Blame view
arch/um/drivers/slirp_user.c
2.17 KB
cd1ae0e49 uml: network form... |
1 2 3 4 |
/* * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) * Licensed under the GPL. */ |
1da177e4c Linux-2.6.12-rc2 |
5 |
#include <unistd.h> |
1da177e4c Linux-2.6.12-rc2 |
6 |
#include <errno.h> |
cd1ae0e49 uml: network form... |
7 |
#include <string.h> |
1da177e4c Linux-2.6.12-rc2 |
8 |
#include <sys/wait.h> |
37185b332 um: get rid of po... |
9 10 |
#include <net_user.h> #include <os.h> |
cd1ae0e49 uml: network form... |
11 |
#include "slirp.h" |
1da177e4c Linux-2.6.12-rc2 |
12 |
|
f34d9d2dc uml: network inte... |
13 |
static int slirp_user_init(void *data, void *dev) |
1da177e4c Linux-2.6.12-rc2 |
14 15 16 17 |
{ struct slirp_data *pri = data; pri->dev = dev; |
f34d9d2dc uml: network inte... |
18 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 22 23 24 25 26 27 28 |
} struct slirp_pre_exec_data { int stdin; int stdout; }; static void slirp_pre_exec(void *arg) { struct slirp_pre_exec_data *data = arg; |
cd1ae0e49 uml: network form... |
29 30 31 32 |
if (data->stdin != -1) dup2(data->stdin, 0); if (data->stdout != -1) dup2(data->stdout, 1); |
1da177e4c Linux-2.6.12-rc2 |
33 34 35 36 37 38 39 40 41 |
} static int slirp_tramp(char **argv, int fd) { struct slirp_pre_exec_data pe_data; int pid; pe_data.stdin = fd; pe_data.stdout = fd; |
c43990162 uml: simplify hel... |
42 |
pid = run_helper(slirp_pre_exec, &pe_data, argv); |
1da177e4c Linux-2.6.12-rc2 |
43 |
|
cd1ae0e49 uml: network form... |
44 |
return pid; |
1da177e4c Linux-2.6.12-rc2 |
45 |
} |
1da177e4c Linux-2.6.12-rc2 |
46 47 48 |
static int slirp_open(void *data) { struct slirp_data *pri = data; |
a3c77c67a [PATCH] uml: slir... |
49 |
int fds[2], pid, err; |
1da177e4c Linux-2.6.12-rc2 |
50 |
|
a3c77c67a [PATCH] uml: slir... |
51 |
err = os_pipe(fds, 1, 1); |
cd1ae0e49 uml: network form... |
52 53 |
if (err) return err; |
1da177e4c Linux-2.6.12-rc2 |
54 |
|
a3c77c67a [PATCH] uml: slir... |
55 |
err = slirp_tramp(pri->argw.argv, fds[1]); |
cd1ae0e49 uml: network form... |
56 57 58 |
if (err < 0) { printk(UM_KERN_ERR "slirp_tramp failed - errno = %d ", -err); |
a3c77c67a [PATCH] uml: slir... |
59 |
goto out; |
1da177e4c Linux-2.6.12-rc2 |
60 |
} |
a3c77c67a [PATCH] uml: slir... |
61 62 63 64 65 66 |
pid = err; pri->slave = fds[1]; pri->slip.pos = 0; pri->slip.esc = 0; pri->pid = err; |
cd1ae0e49 uml: network form... |
67 |
return fds[0]; |
a3c77c67a [PATCH] uml: slir... |
68 |
out: |
cd1ae0e49 uml: network form... |
69 70 |
close(fds[0]); close(fds[1]); |
a3c77c67a [PATCH] uml: slir... |
71 |
return err; |
1da177e4c Linux-2.6.12-rc2 |
72 73 74 75 76 |
} static void slirp_close(int fd, void *data) { struct slirp_data *pri = data; |
4dbed85a3 uml: stop gdb fro... |
77 |
int err; |
1da177e4c Linux-2.6.12-rc2 |
78 |
|
cd1ae0e49 uml: network form... |
79 80 |
close(fd); close(pri->slave); |
1da177e4c Linux-2.6.12-rc2 |
81 82 |
pri->slave = -1; |
cd1ae0e49 uml: network form... |
83 84 85 86 |
if (pri->pid<1) { printk(UM_KERN_ERR "slirp_close: no child process to shut " "down "); |
1da177e4c Linux-2.6.12-rc2 |
87 88 89 90 |
return; } #if 0 |
cd1ae0e49 uml: network form... |
91 92 93 94 |
if (kill(pri->pid, SIGHUP)<0) { printk(UM_KERN_ERR "slirp_close: sending hangup to %d failed " "(%d) ", pri->pid, errno); |
1da177e4c Linux-2.6.12-rc2 |
95 96 |
} #endif |
1aa351a30 uml: tidy helper ... |
97 |
err = helper_wait(pri->pid); |
4dbed85a3 uml: stop gdb fro... |
98 |
if (err < 0) |
1da177e4c Linux-2.6.12-rc2 |
99 |
return; |
1da177e4c Linux-2.6.12-rc2 |
100 101 102 103 104 105 |
pri->pid = -1; } int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) { |
a3c77c67a [PATCH] uml: slir... |
106 |
return slip_proto_read(fd, buf, len, &pri->slip); |
1da177e4c Linux-2.6.12-rc2 |
107 108 109 110 |
} int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) { |
a3c77c67a [PATCH] uml: slir... |
111 |
return slip_proto_write(fd, buf, len, &pri->slip); |
1da177e4c Linux-2.6.12-rc2 |
112 |
} |
5e7672ec3 [PATCH] uml: cons... |
113 |
const struct net_user_info slirp_user_info = { |
1da177e4c Linux-2.6.12-rc2 |
114 115 116 117 |
.init = slirp_user_init, .open = slirp_open, .close = slirp_close, .remove = NULL, |
1da177e4c Linux-2.6.12-rc2 |
118 119 |
.add_address = NULL, .delete_address = NULL, |
b53f35a80 uml: network driv... |
120 121 |
.mtu = BUF_SIZE, .max_packet = BUF_SIZE, |
1da177e4c Linux-2.6.12-rc2 |
122 |
}; |