|
|
|
@ -44,7 +44,7 @@
|
|
|
|
|
struct conn_t {
|
|
|
|
|
const char *name;
|
|
|
|
|
int sock;
|
|
|
|
|
telnet_t telnet;
|
|
|
|
|
telnet_t *telnet;
|
|
|
|
|
struct conn_t *remote;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -176,7 +176,7 @@ static void _event_handler(telnet_t *telnet, telnet_event_t *ev,
|
|
|
|
|
print_buffer(ev->buffer, ev->size);
|
|
|
|
|
printf(COLOR_NORMAL "\n");
|
|
|
|
|
|
|
|
|
|
telnet_send(&conn->remote->telnet, ev->buffer, ev->size);
|
|
|
|
|
telnet_send(conn->remote->telnet, ev->buffer, ev->size);
|
|
|
|
|
break;
|
|
|
|
|
/* data must be sent */
|
|
|
|
|
case TELNET_EV_SEND:
|
|
|
|
@ -193,33 +193,33 @@ static void _event_handler(telnet_t *telnet, telnet_event_t *ev,
|
|
|
|
|
printf("%s IAC %s" COLOR_NORMAL "\n", conn->name,
|
|
|
|
|
get_cmd(ev->command));
|
|
|
|
|
|
|
|
|
|
telnet_iac(&conn->remote->telnet, ev->command);
|
|
|
|
|
telnet_iac(conn->remote->telnet, ev->command);
|
|
|
|
|
break;
|
|
|
|
|
/* negotiation, WILL */
|
|
|
|
|
case TELNET_EV_WILL:
|
|
|
|
|
printf("%s IAC WILL %d (%s)" COLOR_NORMAL "\n", conn->name,
|
|
|
|
|
(int)ev->telopt, get_opt(ev->telopt));
|
|
|
|
|
telnet_negotiate(&conn->remote->telnet, TELNET_WILL,
|
|
|
|
|
telnet_negotiate(conn->remote->telnet, TELNET_WILL,
|
|
|
|
|
ev->telopt);
|
|
|
|
|
break;
|
|
|
|
|
/* negotiation, WONT */
|
|
|
|
|
case TELNET_EV_WONT:
|
|
|
|
|
printf("%s IAC WONT %d (%s)" COLOR_NORMAL "\n", conn->name,
|
|
|
|
|
(int)ev->telopt, get_opt(ev->telopt));
|
|
|
|
|
telnet_negotiate(&conn->remote->telnet, TELNET_WONT,
|
|
|
|
|
telnet_negotiate(conn->remote->telnet, TELNET_WONT,
|
|
|
|
|
ev->telopt);
|
|
|
|
|
break;
|
|
|
|
|
/* negotiation, DO */
|
|
|
|
|
case TELNET_EV_DO:
|
|
|
|
|
printf("%s IAC DO %d (%s)" COLOR_NORMAL "\n", conn->name,
|
|
|
|
|
(int)ev->telopt, get_opt(ev->telopt));
|
|
|
|
|
telnet_negotiate(&conn->remote->telnet, TELNET_DO,
|
|
|
|
|
telnet_negotiate(conn->remote->telnet, TELNET_DO,
|
|
|
|
|
ev->telopt);
|
|
|
|
|
break;
|
|
|
|
|
case TELNET_EV_DONT:
|
|
|
|
|
printf("%s IAC DONT %d (%s)" COLOR_NORMAL "\n", conn->name,
|
|
|
|
|
(int)ev->telopt, get_opt(ev->telopt));
|
|
|
|
|
telnet_negotiate(&conn->remote->telnet, TELNET_DONT,
|
|
|
|
|
telnet_negotiate(conn->remote->telnet, TELNET_DONT,
|
|
|
|
|
ev->telopt);
|
|
|
|
|
break;
|
|
|
|
|
/* subnegotiation */
|
|
|
|
@ -264,7 +264,7 @@ static void _event_handler(telnet_t *telnet, telnet_event_t *ev,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* forward */
|
|
|
|
|
telnet_subnegotiation(&conn->remote->telnet, ev->telopt,
|
|
|
|
|
telnet_subnegotiation(conn->remote->telnet, ev->telopt,
|
|
|
|
|
ev->buffer, ev->size);
|
|
|
|
|
break;
|
|
|
|
|
/* compression notification */
|
|
|
|
@ -389,9 +389,9 @@ int main(int argc, char **argv) {
|
|
|
|
|
client.remote = &server;
|
|
|
|
|
|
|
|
|
|
/* initialize telnet boxes */
|
|
|
|
|
telnet_init(&server.telnet, 0, _event_handler, TELNET_FLAG_PROXY,
|
|
|
|
|
server.telnet = telnet_init(0, _event_handler, TELNET_FLAG_PROXY,
|
|
|
|
|
&server);
|
|
|
|
|
telnet_init(&client.telnet, 0, _event_handler, TELNET_FLAG_PROXY,
|
|
|
|
|
client.telnet = telnet_init(0, _event_handler, TELNET_FLAG_PROXY,
|
|
|
|
|
&client);
|
|
|
|
|
|
|
|
|
|
/* initialize poll descriptors */
|
|
|
|
@ -406,7 +406,7 @@ int main(int argc, char **argv) {
|
|
|
|
|
/* read from server */
|
|
|
|
|
if (pfd[0].revents & POLLIN) {
|
|
|
|
|
if ((rs = recv(server.sock, buffer, sizeof(buffer), 0)) > 0) {
|
|
|
|
|
telnet_recv(&server.telnet, buffer, rs);
|
|
|
|
|
telnet_recv(server.telnet, buffer, rs);
|
|
|
|
|
} else if (rs == 0) {
|
|
|
|
|
printf("%s DISCONNECTED" COLOR_NORMAL "\n", server.name);
|
|
|
|
|
break;
|
|
|
|
@ -422,7 +422,7 @@ int main(int argc, char **argv) {
|
|
|
|
|
/* read from client */
|
|
|
|
|
if (pfd[1].revents & POLLIN) {
|
|
|
|
|
if ((rs = recv(client.sock, buffer, sizeof(buffer), 0)) > 0) {
|
|
|
|
|
telnet_recv(&client.telnet, buffer, rs);
|
|
|
|
|
telnet_recv(client.telnet, buffer, rs);
|
|
|
|
|
} else if (rs == 0) {
|
|
|
|
|
printf("%s DISCONNECTED" COLOR_NORMAL "\n", client.name);
|
|
|
|
|
break;
|
|
|
|
@ -437,8 +437,8 @@ int main(int argc, char **argv) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* clean up */
|
|
|
|
|
telnet_free(&server.telnet);
|
|
|
|
|
telnet_free(&client.telnet);
|
|
|
|
|
telnet_free(server.telnet);
|
|
|
|
|
telnet_free(client.telnet);
|
|
|
|
|
close(server.sock);
|
|
|
|
|
close(client.sock);
|
|
|
|
|
|
|
|
|
|