From f8f3ae7968207d59efefbb15f140dc5a26e83e42 Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Sun, 25 May 2014 19:08:07 -0700 Subject: [PATCH 01/27] first hack at telnet --- include/v/vere.h | 25 +++++++--- v/loop.c | 1 + v/term.c | 116 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 132 insertions(+), 10 deletions(-) diff --git a/include/v/vere.h b/include/v/vere.h index 2dd5ef790..9e233daea 100644 --- a/include/v/vere.h +++ b/include/v/vere.h @@ -409,15 +409,25 @@ /* u2_utim: unix timer control. */ typedef struct _u2_utim { - uv_timer_t wat_u; // libev timer control - u2_uwen* wen_u; // timers in ascending order + uv_timer_t wat_u; // timer control + u2_uwen* wen_u; // timers in ascending order }; #endif + /* u2_utel: unix telnet listener. + */ + typedef struct _u2_utel { + uv_tcp_t wax_u; + c3_s por_s; // file descriptor + } u2_utel; + /* u2_utty: unix tty. */ typedef struct _u2_utty { - uv_pipe_t pop_u; + union { + uv_pipe_t pop_u; + uv_tcp_t wax_u; + }; struct termios bak_u; // cooked terminal state struct termios raw_u; // raw terminal state c3_i fid_i; // file descriptor @@ -534,6 +544,7 @@ uv_loop_t* lup_u; // libuv event loop u2_http* htp_u; // http servers u2_cttp ctp_u; // http clients + u2_utel tel_u; // telnet listener u2_utty* uty_u; // all terminals u2_utty* tem_u; // main terminal (1) u2_ames sam_u; // packet interface @@ -569,9 +580,6 @@ c3_global u2_bean u2_Flag_Profile; c3_global u2_bean u2_Flag_Verbose; -# define u2_ve_at() ( &u2_Host.ver_e[u2_Host.kno_w] ) - - /** Functions. **/ /* Urbit time: 128 bits, leap-free. @@ -932,6 +940,11 @@ void u2_term_io_init(void); + /* u2_term_io_talk(): start terminal listener. + */ + void + u2_term_io_talk(void); + /* u2_term_io_exit(): terminate terminal I/O. */ void diff --git a/v/loop.c b/v/loop.c index c58d91cb4..18930fe69 100644 --- a/v/loop.c +++ b/v/loop.c @@ -178,6 +178,7 @@ _lo_talk() u2_unix_io_talk(); u2_ames_io_talk(); u2_http_io_talk(); + u2_term_io_talk(); } /* u2_lo_exit(): terminate I/O across the process. diff --git a/v/term.c b/v/term.c index 979001305..7032dac9e 100644 --- a/v/term.c +++ b/v/term.c @@ -208,6 +208,110 @@ u2_term_io_init() } } +void +_term_listen_cb(uv_stream_t *wax_u, int sas_i) +{ + u2_utty* tty_u = calloc(1, sizeof(*tty_u)); + uv_tcp_init(u2L, &tty_u->wax_u); + if ( 0 != uv_accept(wax_u, (uv_stream_t*)&tty_u->wax_u) ) { + uL(fprintf(uH, "term: accept: %s\n", + uv_strerror(uv_last_error(u2L)))); + + uv_close((uv_handle_t*)&tty_u->wax_u, 0); + free(tty_u); + } + else { + uv_read_start((uv_stream_t*)&tty_u->wax_u, + _term_alloc, + _term_read_cb); + + tty_u->ufo_u.out.clear_y = (const c3_y*)"\033[H\033[J"; + tty_u->ufo_u.out.el_y = (const c3_y*)"\033[K"; + tty_u->ufo_u.out.ed_y = (const c3_y*)"\033[J"; + tty_u->ufo_u.out.bel_y = (const c3_y*)"\007"; + tty_u->ufo_u.out.cub1_y = (const c3_y*)"\010"; + tty_u->ufo_u.out.cud1_y = (const c3_y*)"\033[B"; + tty_u->ufo_u.out.cuu1_y = (const c3_y*)"\033[A"; + tty_u->ufo_u.out.cuf1_y = (const c3_y*)"\033[C"; + + tty_u->ufo_u.inn.kcuu1_y = (const c3_y*)"\033[A"; + tty_u->ufo_u.inn.kcud1_y = (const c3_y*)"\033[B"; + tty_u->ufo_u.inn.kcuf1_y = (const c3_y*)"\033[C"; + tty_u->ufo_u.inn.kcub1_y = (const c3_y*)"\033[D"; + tty_u->ufo_u.inn.max_w = strlen("\033[D"); + + tty_u->fid_i = -1; + + tty_u->tat_u.mir.lin_w = 0; + tty_u->tat_u.mir.len_w = 0; + tty_u->tat_u.mir.cus_w = 0; + + tty_u->tat_u.esc.ape = u2_no; + tty_u->tat_u.esc.bra = u2_no; + + tty_u->tat_u.fut.len_w = 0; + tty_u->tat_u.fut.wid_w = 0; + + tty_u->tid_l = u2_Host.uty_u->tid_l + 1; + tty_u->nex_u = u2_Host.uty_u; + + u2_Host.uty_u = tty_u; + + { + u2_noun tid = u2_dc("scot", c3__ud, tty_u->tid_l); + u2_noun pax = u2nq(c3__gold, c3__term, tid, u2_nul); + u2_reck_plan(u2A, u2k(pax), u2nc(c3__blew, u2_term_get_blew(1))); + u2_reck_plan(u2A, u2k(pax), u2nc(c3__hail, u2_nul)); + u2z(pax); + } + } +} + +void +u2_term_io_talk(void) +{ + struct sockaddr_in add_u; + u2_utel* tel_u = &u2_Host.tel_u; + + uv_tcp_init(u2L, &tel_u->wax_u); + tel_u->por_s = 10023; + + memset(&add_u, 0, sizeof(add_u)); + add_u.sin_family = AF_INET; + add_u.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + /* Try ascending ports. + */ + while ( 1 ) { + add_u.sin_port = htons(tel_u->por_s); + + if ( 0 != uv_tcp_bind(&tel_u->wax_u, add_u) ) { + uv_err_t las_u = uv_last_error(u2L); + + if ( UV_EADDRINUSE == las_u.code ) { + tel_u->por_s++; + continue; + } + else { + uL(fprintf(uH, "term: bind: %s\n", uv_strerror(las_u))); + } + } + if ( 0 != uv_listen((uv_stream_t*)&tel_u->wax_u, 16, _term_listen_cb) ) { + uv_err_t las_u = uv_last_error(u2L); + + if ( UV_EADDRINUSE == las_u.code ) { + tel_u->por_s++; + continue; + } + else { + uL(fprintf(uH, "term: listen: %s\n", uv_strerror(las_u))); + } + } + uL(fprintf(uH, "term: live on %d\n", tel_u->por_s)); + break; + } +} + /* u2_term_io_exit(): clean up terminal. */ void @@ -220,6 +324,7 @@ u2_term_io_exit(void) u2_utty* uty_u; for ( uty_u = u2_Host.uty_u; uty_u; uty_u = uty_u->nex_u ) { + if ( uty_u->fid_i == -1 ) { continue; } if ( 0 != tcsetattr(uty_u->fid_i, TCSADRAIN, &uty_u->bak_u) ) { c3_assert(!"exit-tcsetattr"); } @@ -532,8 +637,7 @@ _term_io_suck_char(u2_utty* uty_u, c3_y cay_y) { u2_utat* tat_u = &uty_u->tat_u; - // uL(fprintf(uH, "suck-char %x\n", cay_y)); - + if ( cay_y == 10 ) { return; } if ( u2_yes == tat_u->esc.ape ) { if ( u2_yes == tat_u->esc.bra ) { switch ( cay_y ) { @@ -625,7 +729,11 @@ _term_read_cb(uv_stream_t* str_u, if ( siz_i < 0 ) { uv_err_t las_u = uv_last_error(u2L); - uL(fprintf(uH, "term: read: %s\n", uv_strerror(las_u))); + uL(fprintf(uH, "term %d: read: %s\n", uty_u->tid_l, uv_strerror(las_u))); + if ( uty_u->tid_l != 1 ) { + uv_close(str_u, 0); + + } } else { c3_i i; @@ -650,7 +758,7 @@ _term_main() u2_utty* uty_u; for ( uty_u = u2_Host.uty_u; uty_u; uty_u = uty_u->nex_u ) { - if ( uty_u->fid_i <= 2 ) { + if ( (uty_u->fid_i != -1) && (uty_u->fid_i <= 2) ) { return uty_u; } } From db0961f1716cf24267a45e5fa3e2b14aef4f56a2 Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Mon, 26 May 2014 11:02:39 -0700 Subject: [PATCH 02/27] free a failed-accept http conn asynchronously --- v/http.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/v/http.c b/v/http.c index 2264bda6a..c9b9f6851 100644 --- a/v/http.c +++ b/v/http.c @@ -260,6 +260,15 @@ _http_respond_request(u2_hreq* req_u, req_u->end = u2_yes; } +/* _http_conn_free_early(): free http connection on failure. +*/ +static void +_http_conn_free_early(uv_handle_t* han_t) +{ + u2_hcon* hon_u = (void*) han_t; + free(hon_u); +} + /* _http_conn_free(): free http connection on close. */ static void @@ -605,8 +614,7 @@ _http_conn_new(u2_http *htp_u) uL(fprintf(uH, "http: accept: %s\n", uv_strerror(uv_last_error(u2L)))); - uv_close((uv_handle_t*)&hon_u->wax_u, 0); - free(hon_u); + uv_close((uv_handle_t*)&hon_u->wax_u, _http_conn_free_early); } else { uv_read_start((uv_stream_t*)&hon_u->wax_u, From f186c44ad9ce3f6411338654e3bd206f6cd0239f Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Mon, 26 May 2014 11:55:02 -0700 Subject: [PATCH 03/27] further telnet hacks make C-d on an empty telnet terminal do nothing, don't suck in CRs --- v/term.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/v/term.c b/v/term.c index 7032dac9e..3a6b8b0b5 100644 --- a/v/term.c +++ b/v/term.c @@ -22,6 +22,7 @@ #include "all.h" #include "v/vere.h" +static void _term_read_tn_cb(uv_stream_t*, ssize_t, uv_buf_t); static void _term_read_cb(uv_stream_t*, ssize_t, uv_buf_t); /* _term_alloc(): libuv buffer allocator. @@ -223,7 +224,7 @@ _term_listen_cb(uv_stream_t *wax_u, int sas_i) else { uv_read_start((uv_stream_t*)&tty_u->wax_u, _term_alloc, - _term_read_cb); + _term_read_tn_cb); tty_u->ufo_u.out.clear_y = (const c3_y*)"\033[H\033[J"; tty_u->ufo_u.out.el_y = (const c3_y*)"\033[K"; @@ -637,7 +638,6 @@ _term_io_suck_char(u2_utty* uty_u, c3_y cay_y) { u2_utat* tat_u = &uty_u->tat_u; - if ( cay_y == 10 ) { return; } if ( u2_yes == tat_u->esc.ape ) { if ( u2_yes == tat_u->esc.bra ) { switch ( cay_y ) { @@ -715,10 +715,10 @@ _term_io_suck_char(u2_utty* uty_u, c3_y cay_y) } } -/* _term_read_cb(): server read callback. +/* _term_read_tn_cb(): telnet read callback. */ static void -_term_read_cb(uv_stream_t* str_u, +_term_read_tn_cb(uv_stream_t* str_u, ssize_t siz_i, uv_buf_t buf_u) { @@ -738,6 +738,39 @@ _term_read_cb(uv_stream_t* str_u, else { c3_i i; + for ( i=0; i < siz_i; i++ ) { + if ( 10 != buf_u.base[i] ) { + _term_io_suck_char(uty_u, buf_u.base[i]); + } + } + } + + if ( buf_u.base ) { + free(buf_u.base); + } + } + u2_lo_shut(u2_yes); +} + +/* _term_read_cb(): server read callback. +*/ +static void +_term_read_cb(uv_stream_t* str_u, + ssize_t siz_i, + uv_buf_t buf_u) +{ + u2_utty* uty_u = (u2_utty*)(void*)str_u; + + u2_lo_open(); + { + if ( siz_i < 0 ) { + uv_err_t las_u = uv_last_error(u2L); + + uL(fprintf(uH, "term %d: read: %s\n", uty_u->tid_l, uv_strerror(las_u))); + } + else { + c3_i i; + for ( i=0; i < siz_i; i++ ) { _term_io_suck_char(uty_u, buf_u.base[i]); } From b0472d9276109b76ba0ddca2b268edd56e0496f1 Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Tue, 27 May 2014 10:37:27 -0700 Subject: [PATCH 04/27] close terminals properly --- v/term.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/v/term.c b/v/term.c index 3a6b8b0b5..6986d692e 100644 --- a/v/term.c +++ b/v/term.c @@ -33,6 +33,15 @@ _term_alloc(uv_handle_t* had_u, size_t len_i) return uv_buf_init(c3_malloc(len_i), len_i); } +/* _term_close_cb(): free terminal. +*/ +static void +_term_close_cb(uv_handle_t* han_t) +{ + u2_utty* uty_u = (void*) han_t; + free(uty_u); +} + /* u2_term_io_init(): initialize terminal. */ void @@ -218,8 +227,7 @@ _term_listen_cb(uv_stream_t *wax_u, int sas_i) uL(fprintf(uH, "term: accept: %s\n", uv_strerror(uv_last_error(u2L)))); - uv_close((uv_handle_t*)&tty_u->wax_u, 0); - free(tty_u); + uv_close((uv_handle_t*)&tty_u->wax_u, _term_close_cb); } else { uv_read_start((uv_stream_t*)&tty_u->wax_u, @@ -719,8 +727,8 @@ _term_io_suck_char(u2_utty* uty_u, c3_y cay_y) */ static void _term_read_tn_cb(uv_stream_t* str_u, - ssize_t siz_i, - uv_buf_t buf_u) + ssize_t siz_i, + uv_buf_t buf_u) { u2_utty* uty_u = (u2_utty*)(void*)str_u; @@ -731,8 +739,7 @@ _term_read_tn_cb(uv_stream_t* str_u, uL(fprintf(uH, "term %d: read: %s\n", uty_u->tid_l, uv_strerror(las_u))); if ( uty_u->tid_l != 1 ) { - uv_close(str_u, 0); - + uv_close((uv_handle_t*)str_u, _term_close_cb); } } else { From 19ce1e5ffba8868a51139e761ddc64b063966c3e Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Tue, 27 May 2014 14:56:14 -0700 Subject: [PATCH 05/27] reorg tty struct --- include/v/vere.h | 11 ++++++----- v/term.c | 9 --------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/include/v/vere.h b/include/v/vere.h index 9e233daea..b80163fb5 100644 --- a/include/v/vere.h +++ b/include/v/vere.h @@ -428,15 +428,16 @@ uv_pipe_t pop_u; uv_tcp_t wax_u; }; - struct termios bak_u; // cooked terminal state - struct termios raw_u; // raw terminal state + struct _u2_utty* pre_u; // previous in host list + struct _u2_utty* nex_u; // next in host list c3_i fid_i; // file descriptor - c3_i cug_i; // blocking fcntl flags - c3_i nob_i; // nonblocking fcntl flags c3_w tid_l; // terminal identity number u2_utfo ufo_u; // terminfo strings + c3_i cug_i; // blocking fcntl flags + c3_i nob_i; // nonblocking fcntl flags u2_utat tat_u; // control state - struct _u2_utty* nex_u; // next in host list + struct termios bak_u; // cooked terminal state + struct termios raw_u; // raw terminal state } u2_utty; /* u2_raty: raft server type. diff --git a/v/term.c b/v/term.c index 6986d692e..beb4cbf8e 100644 --- a/v/term.c +++ b/v/term.c @@ -830,7 +830,6 @@ u2_term_get_blew(c3_l tid_l) u2_utty* uty_u = _term_ef_get(tid_l); c3_l col_l, row_l; -#if 1 struct winsize siz_u; if ( uty_u && (0 == ioctl(uty_u->fid_i, TIOCGWINSZ, &siz_u)) ) { col_l = siz_u.ws_col; @@ -839,15 +838,7 @@ u2_term_get_blew(c3_l tid_l) col_l = 80; row_l = 24; } -#else - { - c3_i col_i, row_i; - uv_tty_get_winsize(&uty_u->wax_u, &col_i, &row_i); - col_l = col_i; - row_l = row_i; - } -#endif if ( uty_u ) { uty_u->tat_u.siz.col_l = col_l; uty_u->tat_u.siz.row_l = row_l; From 1b20a22eef47b56b49c5bedfe723466c4d0658ee Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Mon, 2 Jun 2014 10:51:39 -0700 Subject: [PATCH 06/27] terminal hole card --- Makefile | 4 ++-- v/term.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d079546ee..5b548d960 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ RM=rm -f CC=gcc CXX=g++ CXXFLAGS=$(CFLAGS) -CLD=g++ -O -g -L/usr/local/lib -L/opt/local/lib +CLD=g++ -O2 -g -L/usr/local/lib -L/opt/local/lib ifeq ($(OS),osx) CLDOSFLAGS=-bind_at_load @@ -57,7 +57,7 @@ endif INCLUDE=include MDEFINES=-DU2_OS_$(OS) -DU2_OS_ENDIAN_$(ENDIAN) -D U2_LIB=\"$(LIB)\" -CFLAGS= -O3 \ +CFLAGS= -O2 -g \ -I/usr/local/include \ -I/opt/local/include \ -I$(INCLUDE) \ diff --git a/v/term.c b/v/term.c index beb4cbf8e..70e2356dc 100644 --- a/v/term.c +++ b/v/term.c @@ -888,6 +888,7 @@ u2_term_ef_boil(c3_l ono_l) u2_noun pax = u2nq(c3__gold, c3__term, '1', u2_nul); // u2_reck_plan(u2A, u2k(pax), u2nc(c3__init, u2k(u2h(u2A->own)))); + u2_reck_plan(u2A, u2k(pax), u2nc(c3__hole, u2_nul)); u2_reck_plan(u2A, u2k(pax), u2nc(c3__blew, u2_term_get_blew(1))); u2_reck_plan(u2A, u2k(pax), u2nc(c3__hail, u2_nul)); From c3727ee1207dac90c3341dcd130d635e1dee0b9e Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Wed, 4 Jun 2014 13:24:26 -0700 Subject: [PATCH 07/27] Don't overload the hole card --- include/c/motes.h | 1 + v/term.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/c/motes.h b/include/c/motes.h index d8e340b6b..1abbdd586 100644 --- a/include/c/motes.h +++ b/include/c/motes.h @@ -451,6 +451,7 @@ # define c3__hand c3_s4('h','a','n','d') # define c3__hang c3_s4('h','a','n','g') # define c3__hard c3_s4('h','a','r','d') +# define c3__harm c3_s4('h','a','r','m') # define c3__harp c3_s4('h','a','r','p') # define c3__have c3_s4('h','a','v','e') # define c3__head c3_s4('h','e','a','d') diff --git a/v/term.c b/v/term.c index 70e2356dc..e88a36cb5 100644 --- a/v/term.c +++ b/v/term.c @@ -888,7 +888,7 @@ u2_term_ef_boil(c3_l ono_l) u2_noun pax = u2nq(c3__gold, c3__term, '1', u2_nul); // u2_reck_plan(u2A, u2k(pax), u2nc(c3__init, u2k(u2h(u2A->own)))); - u2_reck_plan(u2A, u2k(pax), u2nc(c3__hole, u2_nul)); + u2_reck_plan(u2A, u2k(pax), u2nc(c3__harm, u2_nul)); u2_reck_plan(u2A, u2k(pax), u2nc(c3__blew, u2_term_get_blew(1))); u2_reck_plan(u2A, u2k(pax), u2nc(c3__hail, u2_nul)); From 4344e97cb89b0e6d1a063bab2e5553f5638d4aa9 Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Wed, 4 Jun 2014 15:15:22 -0700 Subject: [PATCH 08/27] crash less often with dead terminals --- include/v/vere.h | 4 +--- v/term.c | 54 +++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/include/v/vere.h b/include/v/vere.h index b80163fb5..2b47eae59 100644 --- a/include/v/vere.h +++ b/include/v/vere.h @@ -428,7 +428,6 @@ uv_pipe_t pop_u; uv_tcp_t wax_u; }; - struct _u2_utty* pre_u; // previous in host list struct _u2_utty* nex_u; // next in host list c3_i fid_i; // file descriptor c3_w tid_l; // terminal identity number @@ -546,8 +545,7 @@ u2_http* htp_u; // http servers u2_cttp ctp_u; // http clients u2_utel tel_u; // telnet listener - u2_utty* uty_u; // all terminals - u2_utty* tem_u; // main terminal (1) + u2_utty* uty_u; // linked terminal list u2_ames sam_u; // packet interface u2_save sav_u; // autosave u2_opts ops_u; // commandline options diff --git a/v/term.c b/v/term.c index e88a36cb5..a2444a8d5 100644 --- a/v/term.c +++ b/v/term.c @@ -38,8 +38,25 @@ _term_alloc(uv_handle_t* had_u, size_t len_i) static void _term_close_cb(uv_handle_t* han_t) { - u2_utty* uty_u = (void*) han_t; - free(uty_u); + u2_utty* tty_u = (void*) han_t; + if ( u2_Host.uty_u == tty_u ) { + u2_Host.uty_u = tty_u->nex_u; + } + else { + for (u2_utty* uty_u = u2_Host.uty_u; uty_u; uty_u = uty_u->nex_u ) { + if ( uty_u->nex_u == tty_u ) { + uty_u->nex_u = tty_u->nex_u; + break; + } + } + } + + { + u2_noun pax = u2nq(c3__gold, c3__term, tty_u->tid_l, u2_nul); + u2_reck_plan(u2A, u2k(pax), u2nc(c3__hook, u2_nul)); + u2z(pax); + } + free(tty_u); } /* u2_term_io_init(): initialize terminal. @@ -87,7 +104,6 @@ u2_term_io_init() uty_u->ufo_u.inn.max_w = 0; -#if 1 _utfo(inn, kcuu1); _utfo(inn, kcud1); _utfo(inn, kcub1); @@ -104,18 +120,6 @@ u2_term_io_init() _utfo(out, cud1); // _utfo(out, cub); // _utfo(out, cuf); -#else - // libuv hardcodes an ansi terminal - which doesn't seem to work... - // - uty_u->ufo_u.out.clear_y = "\033[H\033[J"; - uty_u->ufo_u.out.el_y = "\033[K"; - uty_u->ufo_u.out.ed_y = "\033[J"; - uty_u->ufo_u.out.bel_y = "\007"; - uty_u->ufo_u.out.cub1_y = "\010"; - uty_u->ufo_u.out.cud1_y = "\033[B"; - uty_u->ufo_u.out.cuu1_y = "\033[A"; - uty_u->ufo_u.out.cuf1_y = "\033[C"; -#endif // Terminfo chronically reports the wrong sequence for arrow // keys on xterms. Drastic fix for ridiculous unacceptable bug. @@ -152,7 +156,6 @@ u2_term_io_init() // Load old terminal state to restore. // -#if 1 { if ( 0 != tcgetattr(uty_u->fid_i, &uty_u->bak_u) ) { c3_assert(!"init-tcgetattr"); @@ -177,7 +180,6 @@ u2_term_io_init() uty_u->raw_u.c_cc[VMIN] = 0; uty_u->raw_u.c_cc[VTIME] = 0; } -#endif // Initialize mirror and accumulator state. // @@ -198,10 +200,8 @@ u2_term_io_init() // { uty_u->tid_l = 1; - - uty_u->nex_u = u2_Host.uty_u; + uty_u->nex_u = 0; u2_Host.uty_u = uty_u; - u2_Host.tem_u = uty_u; } if ( u2_no == u2_Host.ops_u.dem ) { @@ -227,7 +227,8 @@ _term_listen_cb(uv_stream_t *wax_u, int sas_i) uL(fprintf(uH, "term: accept: %s\n", uv_strerror(uv_last_error(u2L)))); - uv_close((uv_handle_t*)&tty_u->wax_u, _term_close_cb); + uv_close((uv_handle_t*)&tty_u->wax_u, NULL); + free(tty_u); } else { uv_read_start((uv_stream_t*)&tty_u->wax_u, @@ -263,7 +264,6 @@ _term_listen_cb(uv_stream_t *wax_u, int sas_i) tty_u->tid_l = u2_Host.uty_u->tid_l + 1; tty_u->nex_u = u2_Host.uty_u; - u2_Host.uty_u = tty_u; { @@ -738,9 +738,8 @@ _term_read_tn_cb(uv_stream_t* str_u, uv_err_t las_u = uv_last_error(u2L); uL(fprintf(uH, "term %d: read: %s\n", uty_u->tid_l, uv_strerror(las_u))); - if ( uty_u->tid_l != 1 ) { - uv_close((uv_handle_t*)str_u, _term_close_cb); - } + uv_close((uv_handle_t*)str_u, _term_close_cb); + goto err; } else { c3_i i; @@ -752,9 +751,8 @@ _term_read_tn_cb(uv_stream_t* str_u, } } - if ( buf_u.base ) { - free(buf_u.base); - } + err: + free(buf_u.base); } u2_lo_shut(u2_yes); } From 50efa32a2b80af9a26c8e1d17fea65832cf5cf4f Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Fri, 6 Jun 2014 09:54:27 -0700 Subject: [PATCH 09/27] remove wipe, change boil --- include/v/vere.h | 2 +- v/sist.c | 2 +- v/term.c | 17 +++-------------- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/include/v/vere.h b/include/v/vere.h index 2b47eae59..193f8b94e 100644 --- a/include/v/vere.h +++ b/include/v/vere.h @@ -911,7 +911,7 @@ /* u2_term_ef_boil(): initial effects for restored server. */ void - u2_term_ef_boil(c3_l ono_l); + u2_term_ef_boil(); /* u2_term_ef_winc(): window change. */ diff --git a/v/sist.c b/v/sist.c index 0c1b1299d..d3ac6f057 100644 --- a/v/sist.c +++ b/v/sist.c @@ -1176,7 +1176,7 @@ _sist_rest(u2_reck* rec_u) // Hey, fscker! It worked. { - u2_term_ef_boil(tno_l); + u2_term_ef_boil(); } } diff --git a/v/term.c b/v/term.c index a2444a8d5..7d7d3df43 100644 --- a/v/term.c +++ b/v/term.c @@ -52,7 +52,8 @@ _term_close_cb(uv_handle_t* han_t) } { - u2_noun pax = u2nq(c3__gold, c3__term, tty_u->tid_l, u2_nul); + u2_noun tid = u2_dc("scot", c3__ud, tty_u->tid_l); + u2_noun pax = u2nq(c3__gold, c3__term, tid, u2_nul); u2_reck_plan(u2A, u2k(pax), u2nc(c3__hook, u2_nul)); u2z(pax); } @@ -868,20 +869,8 @@ u2_term_ef_ctlc(void) /* u2_term_ef_boil(): initial effects for loaded servers. */ void -u2_term_ef_boil(c3_l ono_l) +u2_term_ef_boil(void) { - if ( ono_l ) { - u2_noun tid_l; - - for ( tid_l = 2; tid_l <= ono_l; tid_l++ ) { - u2_noun tin = u2_dc("scot", c3__ud, tid_l); - u2_noun pax = u2nq(c3__gold, c3__term, tin, u2_nul); - u2_noun hud = u2nc(c3__wipe, u2_nul); - - u2_reck_plan(u2A, pax, hud); - } - } - { u2_noun pax = u2nq(c3__gold, c3__term, '1', u2_nul); From 9000cabe488c4efa13038cc8c17a7b328bed858b Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Fri, 6 Jun 2014 21:58:44 -0700 Subject: [PATCH 10/27] minor cleanups --- v/reck.c | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/v/reck.c b/v/reck.c index 640a4c67c..559fbeb43 100644 --- a/v/reck.c +++ b/v/reck.c @@ -223,33 +223,6 @@ _reck_scot(u2_reck* rec_u, u2_noun dim) return u2_do("scot", dim); } -#if 0 -/* _reck_spoo(): noun path from c, kind of a hack. -*/ -static u2_noun -_reck_spoo(c3_c* pax_c) -{ - if ( !*pax_c ) { - return u2_nul; - } else { - c3_c* ash_c = strchr(pax_c, '/'); - - if ( !ash_c ) { - return u2nc(u2_ci_string(pax_c), u2_nul); - } - else { - u2_noun pan; - - *ash_c = 0; - pan = u2_ci_string(pax_c); - *ash_c = '/'; - - return u2nc(pan, _reck_spoo(ash_c + 1)); - } - } -} -#endif - /* u2_reck_time(): set the reck time. */ void From 7536d1406f7a2d8919b0a04f1ff5edcbddc9019a Mon Sep 17 00:00:00 2001 From: ~hatteb-mitlyd Date: Sat, 7 Jun 2014 13:59:16 -0700 Subject: [PATCH 11/27] Squashed 'outside/anachronism/' content from commit 02fa3b0 git-subtree-dir: outside/anachronism git-subtree-split: 02fa3b064112fa1d75209f123c07b5c7d58329b7 --- .gitignore | 1 + LICENSE | 19 ++ Makefile | 65 ++++ README.md | 158 +++++++++ doc/channels.md | 50 +++ doc/parser.png | Bin 0 -> 151838 bytes include/anachronism/common.h | 24 ++ include/anachronism/nvt.h | 214 ++++++++++++ include/anachronism/parser.h | 73 ++++ src/README.md | 6 + src/nvt.c | 631 +++++++++++++++++++++++++++++++++++ src/parser.c | 459 +++++++++++++++++++++++++ src/parser.rl | 211 ++++++++++++ src/parser_common.rl | 85 +++++ 14 files changed, 1996 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 doc/channels.md create mode 100644 doc/parser.png create mode 100644 include/anachronism/common.h create mode 100644 include/anachronism/nvt.h create mode 100644 include/anachronism/parser.h create mode 100644 src/README.md create mode 100644 src/nvt.c create mode 100644 src/parser.c create mode 100644 src/parser.rl create mode 100644 src/parser_common.rl diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..567609b12 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..72d4b706e --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Jonathan Castello + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..729a33dac --- /dev/null +++ b/Makefile @@ -0,0 +1,65 @@ +SHELL = sh + +CC = gcc +FLAGS = -c -fPIC -Iinclude/ +CFLAGS = --pedantic -Wall -Wextra -march=native -std=gnu99 +INCLUDE = include/anachronism + +VERSION_MAJOR = 0 +VERSION = $(VERSION_MAJOR).3.1 + +SO = libanachronism.so +SOFILE = $(SO).$(VERSION) +SONAME = $(SO).$(VERSION_MAJOR) + + +all: static shared +shared: build/ build/$(SOFILE) +static: build/ build/libanachronism.a + +build/: + mkdir build + +build/$(SOFILE): build/nvt.o build/parser.o + $(CC) -shared -Wl,-soname,$(SONAME) -o build/$(SOFILE) build/nvt.o build/parser.o + +build/libanachronism.a: build/nvt.o build/parser.o + ar rcs build/libanachronism.a build/nvt.o build/parser.o + +build/nvt.o: src/nvt.c $(INCLUDE)/nvt.h $(INCLUDE)/common.h + $(CC) $(FLAGS) $(CFLAGS) src/nvt.c -o build/nvt.o + +build/parser.o: src/parser.c $(INCLUDE)/parser.h $(INCLUDE)/common.h + $(CC) $(FLAGS) $(CFLAGS) src/parser.c -o build/parser.o + +src/parser.c: src/parser.rl src/parser_common.rl + ragel -C -G2 src/parser.rl -o src/parser.c + + +graph: doc/parser.png + +doc/parser.png: src/parser.rl src/parser_common.rl + ragel -V -p src/parser.rl | dot -Tpng > doc/parser.png + +install: all + install -D -d /usr/local/include/anachronism/ /usr/local/lib + install -D include/anachronism/* /usr/local/include/anachronism/ + install -D build/$(SOFILE) /usr/local/lib/$(SOFILE) + install -D build/libanachronism.a /usr/local/lib/libanachronism.a + ln -s -f /usr/local/lib/$(SOFILE) /usr/local/lib/$(SONAME) + ln -s -f /usr/local/lib/$(SOFILE) /usr/local/lib/$(SO) + +uninstall: + -rm -rf /usr/local/include/anachronism + -rm /usr/local/lib/libanachronism.a + -rm /usr/local/lib/$(SOFILE) + -rm /usr/local/lib/$(SONAME) + -rm /usr/local/lib/$(SO) + +clean: + -rm -f build/nvt.o build/router.o build/parser.o + +distclean: clean + -rm -f build/libanachronism.a build/$(SOFILE) + +.PHONY: all static shared clean distclean install uninstall diff --git a/README.md b/README.md new file mode 100644 index 000000000..894825e04 --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# Anachronism +Anachronism is a fully-compliant implementation of [the Telnet protocol][wiki-telnet]. Fallen +out of favor in this day and age, most people only know it as a command-line +tool for debugging HTTP. Today, Telnet is most commonly used in the realm of +[MUDs][wiki-muds], though there are still a few other niches filled by Telnet. + +Anachronism offers a simple API for translating between streams of data and +events, and is completely network-agnostic. Anachronism also offers **channels**, an +abstraction layer which treats Telnet as a data multiplexer. Channels make it +extremely easy to build reusable modules for Telnet sub-protocols such +as MCCP (MUD Client Compression Protocol), which can be written once and plugged +into any application that wants to include support. + +[wiki-telnet]: http://en.wikipedia.org/wiki/Telnet (Telnet at Wikipedia) +[wiki-muds]: http://en.wikipedia.org/wiki/MUD (MUDs at Wikipedia) + +## Installation +While Anachronism has no dependencies and is theoretically cross-platform, I've +only written a Makefile for Linux. Help would be appreciated for making this +work across more platforms. + + make + sudo make install + +This will install Anachronism's shared and static libraries to /usr/local/lib, +and its header files to /usr/local/include/anachronism/. You may also need to +run `ldconfig` to make Anachronism available to your project's compiler/linker. + +## Usage +The anachronism/nvt.h header can be consulted for more complete documentation. + +### Basic usage +The core type exposed by Anachronism is the telnet\_nvt, which represents the +Telnet RFC's "Network Virtual Terminal". An NVT is created using +telnet\_nvt\_new(). When creating an NVT, you must provide it with a set of +callbacks to send events to, and an optional void\* to store as the event +handler's context. You can use telnet\_recv() to process incoming data, and +the telnet\_send\_\*() set of functions to emit outgoing data. + + #include + #include + + void on_event(telnet_nvt* nvt, telnet_event* event) + { + switch (event->type) + { + // A data event (normal text received) + case TELNET_EV_DATA: + { + telnet_data_event* ev = (telnet_data_event*)event; + printf("[IN]: %.*s\n", ev->length, ev->data); + break; + } + + // Outgoing data emitted by the NVT + case TELNET_EV_SEND: + { + telnet_send_event* ev = (telnet_send_event*)event; + printf("[OUT]: %.*s\n", ev->length, ev->data); + break; + } + } + } + + int main() + { + // Create an NVT + telnet_nvt* nvt = telnet_nvt_new(NULL, &on_event, NULL, NULL); + + // Process some incoming data + const char* data = "foo bar baz"; + telnet_receive(nvt, (const telnet_byte*)data, strlen(data), NULL); + + // Free the NVT + telnet_nvt_free(nvt); + return 0; + } + +### Telopts +Anachronism provides an easy-to-use interface to Telnet's "telopt" functionality +via the telnet\_telopt\_*() set of functions. As telopts are negotiated and +utilized, events are sent to the telopt callback provided to telnet_nvt_new(). + + #include + #include + + void on_event(telnet_nvt* nvt, telnet_event* event) + { + switch (event->type) + { + // Outgoing data emitted by the NVT + case TELNET_EV_SEND: + { + telnet_send_event* ev = (telnet_send_event*)event; + printf("[OUT]: %.*s\n", ev->length, ev->data); + break; + } + } + } + + void on_telopt_event(telnet_nvt* nvt, telnet_byte telopt, telnet_telopt_event* event) + { + // telopt is the telopt this event was triggered for + + switch (event->type) + { + case TELNET_EV_TELOPT_TOGGLE: + telnet_telopt_toggle_event* ev = (telnet_telopt_toggle_event*)event; + // ev->where is TELNET_TELOPT_LOCAL or TELNET_TELOPT_REMOTE, + // corresponding to Telnet's WILL/WONT and DO/DONT commands. + // ev->status is TELNET_TELOPT_ON or TELNET_TELOPT_OFF. + break; + case TELNET_EV_TELOPT_FOCUS: + telnet_telopt_focus_event* ev = (telnet_telopt_focus_event*)event; + // ev->focus is 1 or 0 depending on if a subnegotiation packet has + // begun or ended. + break; + case TELNET_EV_TELOPT_DATA: + telnet_telopt_data_event* ev = (telnet_telopt_data_event*)event; + // ev->data is a pointer to the received data. + // ev->length is the length of the data buffer. + break; + } + } + + int main() + { + // Create an NVT + telnet_nvt* nvt = telnet_nvt_new(NULL, &on_event, &on_telopt_event, NULL); + + // Ask to enable a telopt locally (a WILL command) + telnet_request_enable(nvt, 230, TELNET_LOCAL); + + // Process some incoming data + const char* data = "\xFF\xFD\xE6" // IAC DO 230 (turn channel on) + "\xFF\xFA\xE6" // IAC SB 230 (switch to channel) + "foo bar baz" (send data) + "\xFF\xF0"; // IAC SE (switch to main) + telnet_receive(nvt, (const telnet_byte*)data, strlen(data), NULL); + + // Free the NVT + telnet_nvt_free(nvt); + return 0; + } + +### Interrupting + TODO: Explain how to interrupt the parser. + +## Alternatives +* [libtelnet][github-libtelnet], by Elanthis
+ It incorporates a number of (rather MUD-specific) protocols by default, + though its API is quite different. + +[github-libtelnet]: https://github.com/elanthis/libtelnet (libtelnet on GitHub) + +## Credits +Someone from #startups on Freenode IRC suggested the name (I'm sure as a joke). +If you read this, remind me who you are so I can credit you properly! diff --git a/doc/channels.md b/doc/channels.md new file mode 100644 index 000000000..bfcbf838c --- /dev/null +++ b/doc/channels.md @@ -0,0 +1,50 @@ +# Telnet + +## Channels +Telnet supports data multiplexing by way of 256 built-in sub-channels, each +identified by a byte in the interval [\x00-\xFF]. By switching between +channels, you can send completely separate streams of data through the same +connection. + +All channels start out closed by default. To open a channel, one host must +request or offer a channel using IAC WILL <id> or IAC DO <id>. The remote host +then responds with IAC DO <id> or IAC WILL <id>, respectively. Alternatively, +the request may be denied using IAC DONT <id> or IAC WONT <id>, respectively. + +In order to switch to a specific channel, the IAC SB <id> sequence must +be used. All data sent afterwards will be routed through that specific channel. +To switch back to the main channel, IAC SE must be used. Note that subchannels +do not support any IAC sequences except IAC IAC (an escaped \xFF byte) and +IAC SE (return to the main channel). In particular, you cannot switch directly +from one subchannel to another: you must revert to the main channel first. + +Due to the unbiased nature of Telnet, neither side of the connection is +automatically recognized as the server or the client. However, a host may either +request a channel (as a client) or offer a channel (as a server). The WILL/WONT +commands are used in the role of server ("I will", "I wont"), while DO/DONT +are used in the role of client ("You do", "You do not"). As such, a channel +may be opened twice (even simultaneously). + +As an example, lets assume a terminal is connected to a server using Telnet. The +server offers MCCP (data compression), but wants to know what the terminal's +window size is. The following communication might occur: + + IAC DO NAWS + IAC WILL MCCP + IAC WILL NAWS + IAC SB NAWS \x50 \x00 \x50 \x00 IAC SE + IAC DO MCCP + IAC SB MCCP IAC SE + (compressed data) + +Notice that MCCP was negotiated such that the server offers the compression. +Only the server-to-client flow of data is compressed; the client would not +compress its data unless the channel was negotiated in the other direction as +well. + +In general, a specific subchannel is tied to a specific Telnet subprotocol. For +example, the EXOPL subprotocol is assigned to channel 255, so that channel +should be avoided for any other purpose. A full list of registered subprotocols +can be found on the [IANA website][1]. + +[1]: http://www.iana.org/assignments/telnet-options diff --git a/doc/parser.png b/doc/parser.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5e05a9ee09a76d10f6a50413832b2ffc71c65 GIT binary patch literal 151838 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 L-t;KlWjp>4O^#+{ literal 0 HcmV?d00001 diff --git a/include/anachronism/common.h b/include/anachronism/common.h new file mode 100644 index 000000000..9dcc157a8 --- /dev/null +++ b/include/anachronism/common.h @@ -0,0 +1,24 @@ +#ifndef ANACHRONISM_COMMON_H +#define ANACHRONISM_COMMON_H + +#include /* for size_t */ + +// Telnet bytes must be unsigned +typedef unsigned char telnet_byte; + +// Error codes returned from API functions +// Positive codes are success/notice codes. +// Nonpositive codes are errors. +// ALLOC is 0 for parity with the NULL result from malloc(). +typedef enum telnet_error +{ + TELNET_E_NOT_SUBNEGOTIABLE = -4, // The telopt is not open for subnegotiation. + TELNET_E_BAD_PARSER = -3, // The telnet_parser* passed is NULL + TELNET_E_BAD_NVT = -2, // The telnet_nvt* passed is NULL + TELNET_E_INVALID_COMMAND = -1, // The telnet_byte passed is not an allowed command in this API method + TELNET_E_ALLOC = 0, // Not enough memory to allocate essential library structures + TELNET_E_OK = 1, // Huge Success! + TELNET_E_INTERRUPT = 2, // Parser interrupted by user code. +} telnet_error; + +#endif // ANACHRONISM_COMMON_H diff --git a/include/anachronism/nvt.h b/include/anachronism/nvt.h new file mode 100644 index 000000000..3ab5d5a57 --- /dev/null +++ b/include/anachronism/nvt.h @@ -0,0 +1,214 @@ +#ifndef ANACHRONISM_ANACHRONISM_H +#define ANACHRONISM_ANACHRONISM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +// predefined Telnet commands from 240-255 +enum +{ + IAC_SE = 240, + IAC_NOP, + IAC_DM, + IAC_BRK, + IAC_IP, + IAC_AO, + IAC_AYT, + IAC_EC, + IAC_EL, + IAC_GA, + IAC_SB, + IAC_WILL, + IAC_WONT, + IAC_DO, + IAC_DONT, + IAC_IAC, +}; + +typedef enum telnet_telopt_location +{ + TELNET_LOCAL, + TELNET_REMOTE, +} telnet_telopt_location; + + +/** + * NVT Events + */ + +typedef enum telnet_event_type +{ + TELNET_EV_DATA, /* A stretch of plain data was received. (data, length) */ + TELNET_EV_COMMAND, /* A simple IAC comamnd was recevied. (command) */ + TELNET_EV_WARNING, /* A non-fatal invalid sequence was received. (message, position) */ + TELNET_EV_SEND, /* Outgoing data to be sent. (data, length) */ +} telnet_event_type; + +typedef struct telnet_event +{ + telnet_event_type type; +} telnet_event; + +typedef struct telnet_data_event +{ + telnet_event SUPER_; + const telnet_byte* data; + size_t length; +} telnet_data_event; + +typedef struct telnet_command_event +{ + telnet_event SUPER_; + telnet_byte command; +} telnet_command_event; + +typedef struct telnet_warning_event +{ + telnet_event SUPER_; + const char* message; + size_t position; +} telnet_warning_event; + +typedef struct telnet_send_event +{ + telnet_event SUPER_; + const telnet_byte* data; + size_t length; +} telnet_send_event; + + +/** + * Telopt Events + */ + +typedef enum telnet_telopt_event_type +{ + TELNET_EV_TELOPT_TOGGLE, + TELNET_EV_TELOPT_FOCUS, + TELNET_EV_TELOPT_DATA, +} telnet_telopt_event_type; + +typedef struct telnet_telopt_event +{ + telnet_telopt_event_type type; +} telnet_telopt_event; + +typedef struct telnet_telopt_toggle_event +{ + telnet_telopt_event SUPER_; + telnet_telopt_location where; + unsigned char status; +} telnet_telopt_toggle_event; + +typedef struct telnet_telopt_focus_event +{ + telnet_telopt_event SUPER_; + unsigned char focus; +} telnet_telopt_focus_event; + +typedef struct telnet_telopt_data_event +{ + telnet_telopt_event SUPER_; + const telnet_byte* data; + size_t length; +} telnet_telopt_data_event; + + + +typedef struct telnet_nvt telnet_nvt; + + +typedef void (*telnet_nvt_event_callback)(telnet_nvt* nvt, telnet_event* event); +typedef void (*telnet_telopt_event_callback)(telnet_nvt* nvt, telnet_byte telopt, telnet_telopt_event* event); +typedef unsigned char (*telnet_negotiate_event_callback)(telnet_nvt* nvt, telnet_byte telopt, telnet_telopt_location where); + +/** + Creates a new Telnet NVT. + + Errors: + TELNET_E_ALLOC - Unable to allocate enough memory for the NVT. + */ +telnet_nvt* telnet_nvt_new(void* userdata, + telnet_nvt_event_callback nvt_callback, + telnet_telopt_event_callback telopt_callback, + telnet_negotiate_event_callback negotiate_callback); + +void telnet_nvt_free(telnet_nvt* nvt); + +/** + Every NVT can have some user-specific data attached, such as a user-defined struct. + This can be accessed (primarily by event callbacks) to differentiate between NVTs. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + + Example: + // assuming a FILE was passed to telnet_nvt_new(): + FILE out = NULL; + telnet_get_userdata(nvt, (void**)&out); + */ +telnet_error telnet_get_userdata(telnet_nvt* nvt, void** udata); + +/** + Processes incoming data. + If `bytes_used` is non-NULL, it will be set to the length of the string that + was read. This is generally only useful if you use telnet_halt() in a callback. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + TELNET_E_ALLOC - Unable to allocate destination buffer for incoming text. + TELNET_E_INTERRUPT - User code interrupted the parser. + */ +telnet_error telnet_receive(telnet_nvt* nvt, const telnet_byte* data, size_t length, size_t* bytes_used); + +/** + If currently parsing (i.e. telnet_recv() is running), interrupts the parser. + This is useful for things such as MCCP, where a Telnet sequence hails the start of + data that must be decompressed before being parsed. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + */ +telnet_error telnet_interrupt(telnet_nvt* nvt); + + +/** + Sends a string as a stream of escaped Telnet data. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + TELNET_E_ALLOC - Unable to allocate destination buffer for outgoing text. + */ +telnet_error telnet_send_data(telnet_nvt* nvt, const telnet_byte* data, const size_t length); + +/** + Sends a Telnet command. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + TELNET_E_INVALID_COMMAND - The command cannot be WILL, WONT, DO, DONT, SB, or SE. + */ +telnet_error telnet_send_command(telnet_nvt* nvt, const telnet_byte command); + +/** + Sends a subnegotiation packet. + + Errors: + TELNET_E_BAD_NVT - Invalid telnet_nvt* parameter. + TELNET_E_ALLOC - Unable to allocate destination buffer for outgoing text. + */ +telnet_error telnet_send_subnegotiation(telnet_nvt* nvt, const telnet_byte option, const telnet_byte* data, const size_t length); + + +telnet_error telnet_telopt_enable(telnet_nvt* nvt, const telnet_byte telopt, telnet_telopt_location where); +telnet_error telnet_telopt_disable(telnet_nvt* nvt, const telnet_byte telopt, telnet_telopt_location where); +telnet_error telnet_telopt_status(telnet_nvt* nvt, const telnet_byte telopt, telnet_telopt_location where, unsigned char* status); + +#ifdef __cplusplus +} +#endif + +#endif // ANACHRONISM_ANACHRONISM_H diff --git a/include/anachronism/parser.h b/include/anachronism/parser.h new file mode 100644 index 000000000..8309ee5ae --- /dev/null +++ b/include/anachronism/parser.h @@ -0,0 +1,73 @@ +#ifndef ANACHRONISM_PARSER_H +#define ANACHRONISM_PARSER_H + +#include + +typedef enum telnet_parser_event_type +{ + TELNET_EV_PARSER_DATA, + TELNET_EV_PARSER_COMMAND, + TELNET_EV_PARSER_OPTION, + TELNET_EV_PARSER_SUBNEGOTIATION, + TELNET_EV_PARSER_WARNING, +} telnet_parser_event_type; + +typedef struct telnet_parser_event +{ + telnet_parser_event_type type; +} telnet_parser_event; + +typedef struct telnet_parser_data_event +{ + telnet_parser_event SUPER_; + const telnet_byte* data; + size_t length; +} telnet_parser_data_event; + +typedef struct telnet_parser_command_event +{ + telnet_parser_event SUPER_; + telnet_byte command; +} telnet_parser_command_event; + +typedef struct telnet_parser_option_event +{ + telnet_parser_event SUPER_; + telnet_byte command; + telnet_byte option; +} telnet_parser_option_event; + +typedef struct telnet_parser_subnegotiation_event +{ + telnet_parser_event SUPER_; + int active; + telnet_byte option; +} telnet_parser_subnegotiation_event; + +typedef struct telnet_parser_warning_event +{ + telnet_parser_event SUPER_; + const char* message; + size_t position; +} telnet_parser_warning_event; + + + +typedef struct telnet_parser telnet_parser; + +typedef void (*telnet_parser_callback)(telnet_parser* parser, telnet_parser_event* event); + + +telnet_parser* telnet_parser_new(void* userdata, telnet_parser_callback callback); +void telnet_parser_free(telnet_parser* parser); + +telnet_error telnet_parser_get_userdata(telnet_parser* parser, void** userdata); + +telnet_error telnet_parser_parse(telnet_parser* parser, + const telnet_byte* data, + size_t length, + size_t* bytes_used); + +telnet_error telnet_parser_interrupt(telnet_parser* parser); + +#endif // ANACHRONISM_PARSER_H diff --git a/src/README.md b/src/README.md new file mode 100644 index 000000000..8ee680823 --- /dev/null +++ b/src/README.md @@ -0,0 +1,6 @@ +* parser_common.rl +
The language-agnostic Ragel grammar for the Telnet protocol. +* parser.rl +
The C implementation of the Ragel grammar. Compiled to parser.c by Ragel. +* nvt.c +
The core implementation of Anachronism's NVT and Channel constructs. diff --git a/src/nvt.c b/src/nvt.c new file mode 100644 index 000000000..f33d93f75 --- /dev/null +++ b/src/nvt.c @@ -0,0 +1,631 @@ +#include +#include +#include +#include + + +#define TELOPT_TOGGLE_CALLBACK(nvt, telopt, where_, status_) do { \ + if ((nvt)->telopt_callback) { \ + telnet_telopt_toggle_event ev; \ + ev.SUPER_.type = TELNET_EV_TELOPT_TOGGLE; \ + ev.where = (where_); \ + ev.status = (status_); \ + \ + (nvt)->telopt_callback((nvt), (telopt), (telnet_telopt_event*)&ev); \ + } \ +} while (0) + +#define TELOPT_FOCUS_CALLBACK(nvt, telopt, status_) do { \ + if ((nvt)->telopt_callback) { \ + telnet_telopt_focus_event ev; \ + ev.SUPER_.type = TELNET_EV_TELOPT_FOCUS; \ + ev.status = (status_); \ + \ + (nvt)->telopt_callback((nvt), (telopt), (telnet_telopt_event*)&ev); \ + } \ +} while (0) + +#define TELOPT_DATA_CALLBACK(nvt, telopt, data_, length_) do { \ + if ((nvt)->telopt_callback) { \ + telnet_telopt_data_event ev; \ + ev.SUPER_.type = TELNET_EV_TELOPT_DATA; \ + ev.data = (data_); \ + ev.length = (length_); \ + \ + (nvt)->telopt_callback((nvt), (telopt), (telnet_telopt_event*)&ev); \ + } \ +} while (0) + +#define SEND_CALLBACK(nvt, data_, length_) do { \ + if ((nvt)->callback) { \ + telnet_send_event ev; \ + ev.SUPER_.type = TELNET_EV_SEND; \ + ev.data = (data_); \ + ev.length = (length_); \ + \ + (nvt)->callback((nvt), (telnet_event*)&ev); \ + } \ +} while (0) + + +// Q Method of Implementing TELNET Option Negotiation +// ftp://ftp.rfc-editor.org/in-notes/rfc1143.txt +typedef enum qstate { + Q_NO = 0, Q_WANTYES, Q_WANTYESNO, + Q_YES, Q_WANTNO, Q_WANTNOYES, +} qstate; + +typedef struct telnet_qstate +{ + unsigned remote : 3; + unsigned local : 3; +} telnet_qstate; + +struct telnet_nvt +{ + telnet_parser* parser; + telnet_qstate options[256]; // track the state of each subnegotiation option + short current_remote; + + telnet_nvt_event_callback callback; + telnet_telopt_event_callback telopt_callback; + telnet_negotiate_event_callback negotiate_callback; + + void* userdata; +}; + +static unsigned char telopt_status(telnet_nvt* nvt, + telnet_byte telopt, + telnet_telopt_location where) +{ + unsigned int qval = (where == TELNET_LOCAL) ? + nvt->options[telopt].local : + nvt->options[telopt].remote; + + switch (qval) { + case Q_YES: case Q_WANTNO: case Q_WANTNOYES: + return 1; + default: + return 0; + } +} +#define telopt_subnegotiable(nvt, telopt) (telopt_status((nvt), (telopt), TELNET_REMOTE) || telopt_status((nvt), (telopt), TELNET_LOCAL)) + + +static void send_option(telnet_nvt* nvt, telnet_byte command, telnet_byte telopt) +{ + const telnet_byte buf[] = {IAC_IAC, command, telopt}; + SEND_CALLBACK(nvt, buf, 3); +} + +static void process_option_event(telnet_nvt* nvt, + telnet_byte command, + telnet_byte telopt) +{ + telnet_qstate* q = &nvt->options[telopt]; + // Every qstate begins zeroed-out, and Q_NO is 0. + + switch (command) + { + case IAC_WILL: + switch (q->remote) + { + case Q_NO: + if (nvt->negotiate_callback && nvt->negotiate_callback(nvt, telopt, TELNET_REMOTE)) { + send_option(nvt, IAC_DO, telopt); + q->remote = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_REMOTE, 1); + } else { + send_option(nvt, IAC_DONT, telopt); + } + break; + case Q_WANTNO: + // error + q->remote = Q_NO; + break; + case Q_WANTNOYES: + // error + q->remote = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_REMOTE, 1); + break; + case Q_WANTYES: + q->remote = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_REMOTE, 1); + break; + case Q_WANTYESNO: + send_option(nvt, IAC_DONT, telopt); + q->remote = Q_WANTNO; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_REMOTE, 1); + break; + } + break; + case IAC_WONT: + switch (q->remote) + { + case Q_YES: + send_option(nvt, IAC_DONT, telopt); + q->remote = Q_NO; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_REMOTE, 0); + break; + case Q_WANTNO: + q->remote = Q_NO; + break; + case Q_WANTNOYES: + send_option(nvt, IAC_DO, telopt); + q->remote = Q_WANTYES; + break; + case Q_WANTYES: + q->remote = Q_NO; + break; + case Q_WANTYESNO: + q->remote = Q_NO; + break; + } + break; + case IAC_DO: + switch (q->local) + { + case Q_NO: + if (nvt->negotiate_callback && nvt->negotiate_callback(nvt, telopt, TELNET_LOCAL)) { + send_option(nvt, IAC_WILL, telopt); + q->local = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_LOCAL, 1); + } else { + send_option(nvt, IAC_WONT, telopt); + } + break; + case Q_WANTNO: + // error + q->local = Q_NO; + break; + case Q_WANTNOYES: + // error + q->local = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_LOCAL, 1); + break; + case Q_WANTYES: + q->local = Q_YES; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_LOCAL, 1); + break; + case Q_WANTYESNO: + send_option(nvt, IAC_WONT, telopt); + q->local = Q_WANTNO; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_LOCAL, 1); + break; + } + break; + case IAC_DONT: + switch (q->local) + { + case Q_YES: + send_option(nvt, IAC_DONT, telopt); + q->local = Q_NO; + TELOPT_TOGGLE_CALLBACK(nvt, telopt, TELNET_LOCAL, 0); + break; + case Q_WANTNO: + q->local = Q_NO; + break; + case Q_WANTNOYES: + send_option(nvt, IAC_WILL, telopt); + q->local = Q_WANTYES; + break; + case Q_WANTYES: + q->local = Q_NO; + break; + case Q_WANTYESNO: + q->local = Q_NO; + break; + } + break; + } +} + +static void process_data_event(telnet_nvt* nvt, + const telnet_byte* data, + size_t length) +{ + if (nvt->current_remote == -1) { + // Main-line data + if (nvt->callback) { + telnet_data_event ev; + ev.SUPER_.type = TELNET_EV_DATA; + ev.data = data; + ev.length = length; + nvt->callback(nvt, (telnet_event*)&ev); + } + } else { + // Telopt data + telnet_byte telopt = (telnet_byte)nvt->current_remote; + + if (nvt->telopt_callback) { + // Make sure the telopt is enabled + if (telopt_subnegotiable(nvt, telopt)) { + telnet_telopt_data_event ev; + ev.SUPER_.type = TELNET_EV_TELOPT_DATA; + ev.data = data; + ev.length = length; + nvt->telopt_callback(nvt, telopt, (telnet_telopt_event*)&ev); + } + } + } +} + +static void process_subnegotiation_event(telnet_nvt* nvt, + int open, + telnet_byte telopt) +{ + if (open) { + nvt->current_remote = telopt; + } else { + nvt->current_remote = -1; + } + + if (nvt->telopt_callback) { + // Make sure the telopt is enabled + if (telopt_subnegotiable(nvt, telopt)) { + telnet_telopt_focus_event ev; + ev.SUPER_.type = TELNET_EV_TELOPT_FOCUS; + ev.focus = open; + nvt->telopt_callback(nvt, telopt, (telnet_telopt_event*)&ev); + } + } +} + +static void process_event(telnet_parser* parser, telnet_parser_event* event) +{ + telnet_nvt* nvt = NULL; + telnet_parser_get_userdata(parser, (void*)&nvt); + + switch (event->type) + { + case TELNET_EV_PARSER_DATA: + { + telnet_parser_data_event* ev = (telnet_parser_data_event*)event; + process_data_event(nvt, ev->data, ev->length); + break; + } + + case TELNET_EV_PARSER_OPTION: + { + telnet_parser_option_event* ev = (telnet_parser_option_event*)event; + process_option_event(nvt, ev->command, ev->option); + break; + } + + case TELNET_EV_PARSER_SUBNEGOTIATION: + { + telnet_parser_subnegotiation_event* ev = (telnet_parser_subnegotiation_event*)event; + process_subnegotiation_event(nvt, ev->active, ev->option); + break; + } + + case TELNET_EV_PARSER_COMMAND: + { + if (nvt->callback) { + telnet_parser_command_event* parser_ev = (telnet_parser_command_event*) event; + + telnet_command_event ev; + ev.SUPER_.type = TELNET_EV_COMMAND; + ev.command = parser_ev->command; + nvt->callback(nvt, (telnet_event*)&ev); + } + break; + } + + case TELNET_EV_PARSER_WARNING: + { + if (nvt->callback) { + telnet_parser_warning_event* parser_ev = (telnet_parser_warning_event*) event; + + telnet_warning_event ev; + ev.SUPER_.type = TELNET_EV_WARNING; + ev.message = parser_ev->message; + ev.position = parser_ev->position; + nvt->callback(nvt, (telnet_event*)&ev); + } + break; + } + + default: + break; + } +} + + +telnet_nvt* telnet_nvt_new(void* userdata, + telnet_nvt_event_callback nvt_callback, + telnet_telopt_event_callback telopt_callback, + telnet_negotiate_event_callback negotiate_callback) +{ + telnet_nvt* nvt = malloc(sizeof(telnet_nvt)); + if (nvt) + { + telnet_parser* parser = telnet_parser_new((void*)nvt, &process_event); + if (parser) + { + memset(nvt, 0, sizeof(*nvt)); + nvt->parser = parser; + nvt->callback = nvt_callback; + nvt->telopt_callback = telopt_callback; + nvt->negotiate_callback = negotiate_callback; + nvt->userdata = userdata; + nvt->current_remote = -1; + } + else + { + free(nvt); + nvt = NULL; + } + } + return nvt; +} + +void telnet_nvt_free(telnet_nvt* nvt) +{ + if (nvt) + { + telnet_parser_free(nvt->parser); + free(nvt); + } +} + +telnet_error telnet_get_userdata(telnet_nvt* nvt, void** userdata) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + + *userdata = nvt->userdata; + return TELNET_E_OK; +} + +telnet_error telnet_receive(telnet_nvt* nvt, const telnet_byte* data, size_t length, size_t* bytes_used) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + + return telnet_parser_parse(nvt->parser, data, length, bytes_used); +} + +telnet_error telnet_interrupt(telnet_nvt* nvt) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + + return telnet_parser_interrupt(nvt->parser); +} + + +static int safe_concat(const telnet_byte* in, size_t inlen, telnet_byte* out, size_t outlen) +{ + // Copy as much as possible into the buffer. + memcpy(out, in, (outlen < inlen) ? outlen : inlen); + + // true if everything could be copied, false otherwise + return outlen >= inlen; +} + +// Escapes any special characters in data, writing the result data to out. +// Returns -1 if not everything could be copied (and out is full). +// Otherwise returns the length of the data in out. +// +// To avoid potential -1 return values, pass in an out buffer double the length of the data buffer. +static size_t telnet_escape(const telnet_byte* data, size_t length, telnet_byte* out, size_t outsize) +{ + if (data == NULL || out == NULL) + return 0; + + size_t outlen = 0; + size_t left = 0; + size_t right = 0; + const char* seq = NULL; + for (; right < length; ++right) + { + switch (data[right]) + { + case IAC_IAC: + seq = "\xFF\xFF"; + break; + case '\r': + // Only escape \r if it doesn't immediately precede \n. + if (right + 1 >= length || data[right+1] != '\n') + { + seq = "\r\0"; + break; + } + // !!FALLTHROUGH!! + default: + continue; // Move to the next character + } + + // Add any normal data that hasn't been added yet. + if (safe_concat(data+left, right-left, out+outlen, outsize-outlen) == 0) + return -1; + outlen += right - left; + left = right + 1; + + // Add the escape sequence. + if (safe_concat((const telnet_byte*)seq, 2, out+outlen, outsize-outlen) == 0) + return -1; + outlen += 2; + } + + // Add any leftover normal data. + if (left < right) + { + if (safe_concat(data+left, right-left, out+outlen, outsize-outlen) == 0) + return -1; + outlen += right - left; + } + + return outlen; +} + +telnet_error telnet_send_data(telnet_nvt* nvt, const telnet_byte* data, const size_t length) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + else if (!nvt->callback) + return TELNET_E_OK; // immediate success since they apparently don't want the data to go anywhere + + // Due to the nature of the protocol, the most any one byte can be encoded as is two bytes. + // Hence, the smallest buffer guaranteed to contain any input is double the length of the source. + size_t bufsize = sizeof(telnet_byte) * length * 2; + telnet_byte* buf = malloc(bufsize); + if (!buf) + return TELNET_E_ALLOC; + + bufsize = telnet_escape(data, length, buf, bufsize); + + SEND_CALLBACK(nvt, buf, bufsize); + + free(buf); + buf = NULL; + + return TELNET_E_OK; +} + +telnet_error telnet_send_command(telnet_nvt* nvt, const telnet_byte command) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + else if (command >= IAC_SB || command == IAC_SE) + return TELNET_E_INVALID_COMMAND; // Invalid command + + const telnet_byte buf[] = {IAC_IAC, command}; + SEND_CALLBACK(nvt, buf, 2); + + return TELNET_E_OK; +} + +telnet_error telnet_send_subnegotiation(telnet_nvt* nvt, const telnet_byte option, const telnet_byte* data, const size_t length) +{ + if (!nvt) + return TELNET_E_BAD_NVT; + else if (!telopt_subnegotiable(nvt, option)) + return TELNET_E_NOT_SUBNEGOTIABLE; + else if (!nvt->callback) + return TELNET_E_OK; + + // length*2 is the maximum buffer size needed for an escaped string. + // The extra five bytes are for the IAC, SB,