LibXenon
Bare-metal Xbox 360 homebrew library
Loading...
Searching...
No Matches
telnet_console.c
Go to the documentation of this file.
1#include "telnet_console.h"
2
3#include <lwip/mem.h>
4#include <lwip/memp.h>
5#include <lwip/sys.h>
6
7#include <lwip/stats.h>
8
9#include <lwip/ip.h>
10#include <lwip/udp.h>
11#include <lwip/tcp.h>
12#include <lwip/dhcp.h>
13#include <netif/etharp.h>
14#include <network/network.h>
15#include <time.h>
16#include <xetypes.h>
17
18/*===========================================================================*/
19/* Module Definitions */
20/*===========================================================================*/
21
22#define BUFSIZE 65536
23#define PORT_TEL 23
24
25typedef struct {
26 int len;
27 char buf[BUFSIZE];
28} TEL_TXST;
29
34};
35
36static TEL_TXST tel_st;
37
38static int session_states = TELNET_DISCONNECTED;
39
40static struct tcp_pcb *tel_pcb;
41
42extern void (*stdout_hook)(const char *buf, int len);
43
45/* Forward Declarations */
46/*===========================================================================*/
47
48static void telnet_send(struct tcp_pcb *pcb, TEL_TXST *st);
49static err_t telnet_accept(void *arg, struct tcp_pcb *pcb, err_t err);
50static void telnet_close(struct tcp_pcb *pcb);
51void telnet_process(void);
52
54/* Routines */
55/*===========================================================================*/
56
58 err_t err;
59
60
61 tel_pcb = tcp_new(); /* new tcp pcb */
62
63 if (tel_pcb != NULL) {
64 err = tcp_bind(tel_pcb, IP_ADDR_ANY, PORT_TEL); /* bind to port */
65
66 if (err == ERR_OK) {
67 tel_pcb = tcp_listen(tel_pcb); /* set listerning */
68 tcp_accept(tel_pcb, telnet_accept); /* register callback */
69
71 }
72 }
73}
74
75/*===========================================================================*/
78
79 session_states = TELNET_CLOSING;
80
81 telnet_close(tel_pcb); /* close telnet session */
82}
83
84/*===========================================================================*/
85void telnet_console_tx_print(const char *buf, int bc) {
86 TEL_TXST *st;
87
88 if (session_states != TELNET_CONNECTED) {
90 return;
91 }
92
93 if (buf == NULL || !bc ) {
94 return;
95 }
96
97 st = &tel_st;
98 memcpy(st->buf , buf, bc); /* copy data */
99 st->len = bc; /* length */
100
101 telnet_send(tel_pcb, st); /* send telnet data */
102 network_poll();
103}
104
105
106/*===========================================================================*/
107static void telnet_close(struct tcp_pcb *pcb) {
108
109 tcp_arg(pcb, NULL); /* clear arg/callbacks */
110 tcp_err(pcb, NULL);
111 tcp_sent(pcb, NULL);
112 tcp_recv(pcb, NULL);
113 tcp_close(pcb);
114
115 session_states = TELNET_DISCONNECTED;
116}
117
118/*===========================================================================*/
119static void telnet_send(struct tcp_pcb *pcb, TEL_TXST *st) {
120 err_t err;
121 u16_t len;
122
123
124 if (tcp_sndbuf(pcb) < st->len) {
125 len = tcp_sndbuf(pcb);
126 } else {
127 len = st->len;
128 }
129
130 do {
131 err = tcp_write(pcb, st->buf, len, 1);
132 if (err == ERR_MEM) {
133 len /= 2;
134 }
135 } while (err == ERR_MEM && len > 1);
136
137 if (err == ERR_OK) {
138 st->len -= len;
139 }
140}
141
142//recv buffer ...
144unsigned char recv_buf[512];
145
146/*===========================================================================*/
147static err_t telnet_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {
148
149#if 0
150 if (err == ERR_OK && p != NULL) {
151 unsigned char * payload = (unsigned char*) p->payload;
152
153 tcp_recved(pcb, p->tot_len); /* some recieved data */
154
155 //caractere par caractere
156 if (p->tot_len == 1) {
157 recv_buf[recv_len] = payload[0];
158 recv_len++;
159 }//par block
160 else {
161 memcpy(recv_buf + recv_len, payload, p->tot_len);
162 recv_len += p->tot_len;
163 }
164
165 if (recv_len > 2) {
166 if ((recv_buf[recv_len - 2] == '\r')&(recv_buf[recv_len - 1] == '\n')) {
167 ParseArgs(recv_buf, recv_len);
168 //DebugBreak();
169 //tel_tx_str(recv_buf, recv_len);
170 //efface
171 recv_len = 0;
172 memset(recv_buf, 0, 512);
173 }
174 }
175 }
176
177 pbuf_free(p); /* dealloc mem */
178 if (err == ERR_OK && p == NULL) {
179 telnet_close(pcb);
180 }
181#endif
182
183 return ERR_OK;
184}
185
186/*===========================================================================*/
187static void telnet_err(void *arg, err_t err) {
188 printf("telnet_err : %08x\r\n",err);
189}
190
191/*===========================================================================*/
192static err_t telnet_accept(void *arg, struct tcp_pcb *pcb, err_t err) {
193 //Client connected
194 session_states = TELNET_CONNECTED;
195
196 tel_pcb = pcb;
197 tel_st.len = 0; /* reset length */
198 tcp_arg(pcb, &tel_st); /* argument passed to callbacks */
199 tcp_err(pcb, telnet_err); /* register error callback */
200 tcp_recv(pcb, telnet_recv); /* register recv callback */
201
202 return ERR_OK;
203}
204
205/*===========================================================================*/
206/* End of Module */
unsigned short u16_t
Definition: cc.h:40
#define NULL
Definition: def.h:47
#define ERR_MEM
Definition: err.h:53
#define ERR_OK
Definition: err.h:52
s8_t err_t
Definition: err.h:47
#define IP_ADDR_ANY
Definition: ip_addr.h:92
void network_poll()
Definition: network.c:92
u8_t pbuf_free(struct pbuf *p)
Definition: pbuf.c:618
char buf[BUFSIZE]
Definition: pbuf.h:79
u16_t tot_len
Definition: pbuf.h:93
void * payload
Definition: pbuf.h:84
void telnet_console_tx_print(const char *buf, int bc)
unsigned char recv_buf[512]
void(* stdout_hook)(const char *buf, int len)
Definition: newlib.c:19
void telnet_process(void)
#define PORT_TEL
int recv_len
CONNECTION_STATES
@ TELNET_DISCONNECTED
@ TELNET_CLOSING
@ TELNET_CONNECTED
void telnet_console_close(void)
void telnet_console_init(void)
#define BUFSIZE