version 1.1.1.11, 2018/04/24 19:31:04
|
version 1.1.1.12, 2018/04/24 19:51:41
|
Line 113 fork_exec(struct socket *so, const char
|
Line 113 fork_exec(struct socket *so, const char
|
struct sockaddr_in addr; |
struct sockaddr_in addr; |
socklen_t addrlen = sizeof(addr); |
socklen_t addrlen = sizeof(addr); |
int opt; |
int opt; |
int master = -1; |
|
const char *argv[256]; |
const char *argv[256]; |
/* don't want to clobber the original */ |
/* don't want to clobber the original */ |
char *bptr; |
char *bptr; |
Line 148 fork_exec(struct socket *so, const char
|
Line 147 fork_exec(struct socket *so, const char
|
case -1: |
case -1: |
lprint("Error: fork failed: %s\n", strerror(errno)); |
lprint("Error: fork failed: %s\n", strerror(errno)); |
close(s); |
close(s); |
if (do_pty == 2) |
|
close(master); |
|
return 0; |
return 0; |
|
|
case 0: |
case 0: |
setsid(); |
setsid(); |
|
|
/* Set the DISPLAY */ |
/* Set the DISPLAY */ |
if (do_pty == 2) { |
getsockname(s, (struct sockaddr *)&addr, &addrlen); |
(void) close(master); |
close(s); |
#ifdef TIOCSCTTY /* XXXXX */ |
/* |
ioctl(s, TIOCSCTTY, (char *)NULL); |
* Connect to the socket |
#endif |
* XXX If any of these fail, we're in trouble! |
} else { |
*/ |
getsockname(s, (struct sockaddr *)&addr, &addrlen); |
s = qemu_socket(AF_INET, SOCK_STREAM, 0); |
close(s); |
addr.sin_addr = loopback_addr; |
/* |
do { |
* Connect to the socket |
ret = connect(s, (struct sockaddr *)&addr, addrlen); |
* XXX If any of these fail, we're in trouble! |
} while (ret < 0 && errno == EINTR); |
*/ |
|
s = qemu_socket(AF_INET, SOCK_STREAM, 0); |
|
addr.sin_addr = loopback_addr; |
|
do { |
|
ret = connect(s, (struct sockaddr *)&addr, addrlen); |
|
} while (ret < 0 && errno == EINTR); |
|
} |
|
|
|
dup2(s, 0); |
dup2(s, 0); |
dup2(s, 1); |
dup2(s, 1); |
Line 210 fork_exec(struct socket *so, const char
|
Line 200 fork_exec(struct socket *so, const char
|
|
|
default: |
default: |
qemu_add_child_watch(pid); |
qemu_add_child_watch(pid); |
if (do_pty == 2) { |
/* |
close(s); |
* XXX this could block us... |
so->s = master; |
* XXX Should set a timer here, and if accept() doesn't |
} else { |
* return after X seconds, declare it a failure |
/* |
* The only reason this will block forever is if socket() |
* XXX this could block us... |
* of connect() fail in the child process |
* XXX Should set a timer here, and if accept() doesn't |
*/ |
* return after X seconds, declare it a failure |
do { |
* The only reason this will block forever is if socket() |
so->s = accept(s, (struct sockaddr *)&addr, &addrlen); |
* of connect() fail in the child process |
} while (so->s < 0 && errno == EINTR); |
*/ |
closesocket(s); |
do { |
opt = 1; |
so->s = accept(s, (struct sockaddr *)&addr, &addrlen); |
setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)); |
} while (so->s < 0 && errno == EINTR); |
opt = 1; |
closesocket(s); |
setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int)); |
opt = 1; |
socket_set_nonblock(so->s); |
setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); |
|
opt = 1; |
|
setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int)); |
|
} |
|
fd_nonblock(so->s); |
|
|
|
/* Append the telnet options now */ |
/* Append the telnet options now */ |
if (so->so_m != NULL && do_pty == 1) { |
if (so->so_m != NULL && do_pty == 1) { |
Line 282 u_sleep(int usec)
|
Line 267 u_sleep(int usec)
|
select(0, &fdset, &fdset, &fdset, &t); |
select(0, &fdset, &fdset, &fdset, &t); |
} |
} |
|
|
/* |
|
* Set fd blocking and non-blocking |
|
*/ |
|
|
|
void |
|
fd_nonblock(int fd) |
|
{ |
|
#ifdef FIONBIO |
|
#ifdef _WIN32 |
|
unsigned long opt = 1; |
|
#else |
|
int opt = 1; |
|
#endif |
|
|
|
ioctlsocket(fd, FIONBIO, &opt); |
|
#else |
|
int opt; |
|
|
|
opt = fcntl(fd, F_GETFL, 0); |
|
opt |= O_NONBLOCK; |
|
fcntl(fd, F_SETFL, opt); |
|
#endif |
|
} |
|
|
|
void |
|
fd_block(int fd) |
|
{ |
|
#ifdef FIONBIO |
|
#ifdef _WIN32 |
|
unsigned long opt = 0; |
|
#else |
|
int opt = 0; |
|
#endif |
|
|
|
ioctlsocket(fd, FIONBIO, &opt); |
|
#else |
|
int opt; |
|
|
|
opt = fcntl(fd, F_GETFL, 0); |
|
opt &= ~O_NONBLOCK; |
|
fcntl(fd, F_SETFL, opt); |
|
#endif |
|
} |
|
|
|
void slirp_connection_info(Slirp *slirp, Monitor *mon) |
void slirp_connection_info(Slirp *slirp, Monitor *mon) |
{ |
{ |
const char * const tcpstates[] = { |
const char * const tcpstates[] = { |
Line 348 void slirp_connection_info(Slirp *slirp,
|
Line 289 void slirp_connection_info(Slirp *slirp,
|
struct socket *so; |
struct socket *so; |
const char *state; |
const char *state; |
char buf[20]; |
char buf[20]; |
int n; |
|
|
|
monitor_printf(mon, " Protocol[State] FD Source Address Port " |
monitor_printf(mon, " Protocol[State] FD Source Address Port " |
"Dest. Address Port RecvQ SendQ\n"); |
"Dest. Address Port RecvQ SendQ\n"); |
Line 372 void slirp_connection_info(Slirp *slirp,
|
Line 312 void slirp_connection_info(Slirp *slirp,
|
dst_addr = so->so_faddr; |
dst_addr = so->so_faddr; |
dst_port = so->so_fport; |
dst_port = so->so_fport; |
} |
} |
n = snprintf(buf, sizeof(buf), " TCP[%s]", state); |
snprintf(buf, sizeof(buf), " TCP[%s]", state); |
memset(&buf[n], ' ', 19 - n); |
monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s, |
buf[19] = 0; |
|
monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s, |
|
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", |
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", |
ntohs(src.sin_port)); |
ntohs(src.sin_port)); |
monitor_printf(mon, "%15s %5d %5d %5d\n", |
monitor_printf(mon, "%15s %5d %5d %5d\n", |
Line 385 void slirp_connection_info(Slirp *slirp,
|
Line 323 void slirp_connection_info(Slirp *slirp,
|
|
|
for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) { |
for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) { |
if (so->so_state & SS_HOSTFWD) { |
if (so->so_state & SS_HOSTFWD) { |
n = snprintf(buf, sizeof(buf), " UDP[HOST_FORWARD]"); |
snprintf(buf, sizeof(buf), " UDP[HOST_FORWARD]"); |
src_len = sizeof(src); |
src_len = sizeof(src); |
getsockname(so->s, (struct sockaddr *)&src, &src_len); |
getsockname(so->s, (struct sockaddr *)&src, &src_len); |
dst_addr = so->so_laddr; |
dst_addr = so->so_laddr; |
dst_port = so->so_lport; |
dst_port = so->so_lport; |
} else { |
} else { |
n = snprintf(buf, sizeof(buf), " UDP[%d sec]", |
snprintf(buf, sizeof(buf), " UDP[%d sec]", |
(so->so_expire - curtime) / 1000); |
(so->so_expire - curtime) / 1000); |
src.sin_addr = so->so_laddr; |
src.sin_addr = so->so_laddr; |
src.sin_port = so->so_lport; |
src.sin_port = so->so_lport; |
dst_addr = so->so_faddr; |
dst_addr = so->so_faddr; |
dst_port = so->so_fport; |
dst_port = so->so_fport; |
} |
} |
memset(&buf[n], ' ', 19 - n); |
monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s, |
buf[19] = 0; |
|
monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s, |
|
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", |
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", |
ntohs(src.sin_port)); |
ntohs(src.sin_port)); |
monitor_printf(mon, "%15s %5d %5d %5d\n", |
monitor_printf(mon, "%15s %5d %5d %5d\n", |
Line 409 void slirp_connection_info(Slirp *slirp,
|
Line 345 void slirp_connection_info(Slirp *slirp,
|
} |
} |
|
|
for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so->so_next) { |
for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so->so_next) { |
n = snprintf(buf, sizeof(buf), " ICMP[%d sec]", |
snprintf(buf, sizeof(buf), " ICMP[%d sec]", |
(so->so_expire - curtime) / 1000); |
(so->so_expire - curtime) / 1000); |
src.sin_addr = so->so_laddr; |
src.sin_addr = so->so_laddr; |
dst_addr = so->so_faddr; |
dst_addr = so->so_faddr; |
memset(&buf[n], ' ', 19 - n); |
monitor_printf(mon, "%-19s %3d %15s - ", buf, so->s, |
buf[19] = 0; |
|
monitor_printf(mon, "%s %3d %15s - ", buf, so->s, |
|
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*"); |
src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*"); |
monitor_printf(mon, "%15s - %5d %5d\n", inet_ntoa(dst_addr), |
monitor_printf(mon, "%15s - %5d %5d\n", inet_ntoa(dst_addr), |
so->so_rcv.sb_cc, so->so_snd.sb_cc); |
so->so_rcv.sb_cc, so->so_snd.sb_cc); |