comparison tcp-accept.c @ 62:20563735e8b5

just checkpointing
author Matt Johnston <matt@ucc.asn.au>
date Tue, 10 Aug 2004 17:09:52 +0000
parents
children dcc43965928f
comparison
equal deleted inserted replaced
61:3a4f0ef1e8c3 62:20563735e8b5
1 #include "includes.h"
2 #include "ssh.h"
3 #include "tcp-accept.h"
4 #include "dbutil.h"
5 #include "session.h"
6 #include "buffer.h"
7 #include "packet.h"
8 #include "listener.h"
9 #include "runopts.h"
10
11 #ifndef DISABLE_TCP_ACCEPT
12
13 static void accept_tcp(struct Listener *listener, int sock) {
14
15 int fd;
16 struct sockaddr_storage addr;
17 int len;
18 char ipstring[NI_MAXHOST], portstring[NI_MAXSERV];
19 struct TCPListener *tcpinfo = (struct TCPListener*)(listener->typedata);
20
21 len = sizeof(addr);
22
23 fd = accept(sock, (struct sockaddr*)&addr, &len);
24 if (fd < 0) {
25 return;
26 }
27
28 if (getnameinfo((struct sockaddr*)&addr, len, ipstring, sizeof(ipstring),
29 portstring, sizeof(portstring),
30 NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
31 return;
32 }
33
34 if (send_msg_channel_open_init(fd, tcpinfo->chantype) == DROPBEAR_SUCCESS) {
35
36 buf_putstring(ses.writepayload, tcpinfo->addr, strlen(tcpinfo->addr));
37 buf_putint(ses.writepayload, tcpinfo->port);
38 buf_putstring(ses.writepayload, ipstring, strlen(ipstring));
39 buf_putint(ses.writepayload, atol(portstring));
40 encrypt_packet();
41
42 } else {
43 /* XXX debug? */
44 close(fd);
45 }
46 }
47
48 static void cleanup_tcp(struct Listener *listener) {
49
50 struct TCPListener *tcpinfo = (struct TCPListener*)(listener->typedata);
51
52 m_free(tcpinfo->addr);
53 m_free(tcpinfo);
54 }
55
56
57 int listen_tcpfwd(struct TCPListener* tcpinfo) {
58
59 char portstring[6]; /* "65535\0" */
60 int socks[DROPBEAR_MAX_SOCKS];
61 struct Listener *listener = NULL;
62 int nsocks;
63
64 TRACE(("enter listen_tcpfwd"));
65
66 /* first we try to bind, so don't need to do so much cleanup on failure */
67 snprintf(portstring, sizeof(portstring), "%d", tcpinfo->port);
68 nsocks = dropbear_listen(tcpinfo->addr, portstring, socks,
69 DROPBEAR_MAX_SOCKS, NULL, &ses.maxfd);
70 if (nsocks < 0) {
71 TRACE(("leave listen_tcpfwd: dropbear_listen failed"));
72 return DROPBEAR_FAILURE;
73 }
74
75 listener = new_listener(socks, nsocks, CHANNEL_ID_TCPFORWARDED, tcpinfo,
76 accept_tcp, cleanup_tcp);
77
78 if (listener == NULL) {
79 m_free(tcpinfo);
80 TRACE(("leave listen_tcpfwd: listener failed"));
81 return DROPBEAR_FAILURE;
82 }
83
84 TRACE(("leave listen_tcpfwd: success"));
85 return DROPBEAR_SUCCESS;
86 }
87
88 #endif /* DISABLE_REMOTETCPFWD */