diff -c tf-50b8/src/expr.c tf-50b8-patched/src/expr.c *** tf-50b8/src/expr.c Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/expr.c Sat Aug 28 01:12:57 2010 *************** *** 972,977 **** --- 972,995 ---- (n>2 ? opdstd(n-2) : "")); return newint(i); + #if ENABLE_ATCP + case FN_atcp: + i = handle_atcp_function(opdstr(n), (n>1 ? opdstd(n-1) : NULL)); + return newint(i); + #endif + + #if ENABLE_GMCP + case FN_gmcp: + i = handle_gmcp_function(opdstr(n), (n>1 ? opdstd(n-1) : NULL)); + return newint(i); + #endif + + #if ENABLE_OPTION102 + case FN_option102: + i = handle_option102_function(opdstr(n), (n>1 ? opdstd(n-1) : NULL)); + return newint(i); + #endif + case FN_fake_recv: i = handle_fake_recv_function(opdstr(n), (n>1 ? opdstd(n-1) : NULL), (n>2 ? opdstd(n-2) : "")); diff -c tf-50b8/src/funclist.h tf-50b8-patched/src/funclist.h *** tf-50b8/src/funclist.h Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/funclist.h Sat Aug 28 01:14:08 2010 *************** *** 17,22 **** --- 17,25 ---- funccode(ascii, 1, 1, 1), funccode(asin, 1, 1, 1), funccode(atan, 1, 1, 1), + #if ENABLE_ATCP + funccode(atcp, 0, 1, 2), + #endif funccode(char, 1, 1, 1), funccode(columns, 0, 0, 0), funccode(cos, 1, 1, 1), *************** *** 36,41 **** --- 39,47 ---- funccode(gethostname, 0, 0, 0), funccode(getopts, 0, 1, 2), funccode(getpid, 1, 0, 0), + #if ENABLE_GMCP + funccode(gmcp, 0, 1, 2), + #endif funccode(idle, 0, 0, 1), funccode(is_connected, 0, 0, 1), funccode(is_open, 0, 0, 1), *************** *** 62,67 **** --- 68,76 ---- funccode(nlog, 0, 0, 0), funccode(nmail, 0, 0, 0), funccode(nread, 0, 0, 0), + #if ENABLE_OPTION102 + funccode(option102, 0, 1, 2), + #endif funccode(pad, 1, 1, (unsigned)-1), funccode(pow, 1, 2, 2), funccode(prompt, 0, 1, 1), diff -c tf-50b8/src/globals.h tf-50b8-patched/src/globals.h *** tf-50b8/src/globals.h Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/globals.h Sat Aug 28 01:15:00 2010 *************** *** 158,163 **** --- 158,166 ---- #define TFMAILPATH getstdvar(VAR_TFMAILPATH) #define alert_attr getattrvar(VAR_alert_attr) #define alert_time gettimevar(VAR_alert_time) + #define atcp getintvar(VAR_atcp) + #define gmcp getintvar(VAR_gmcp) + #define OPTION102 getintvar(VAR_OPTION102) #define auto_fg getintvar(VAR_auto_fg) #define background getintvar(VAR_background) #define backslash getintvar(VAR_backslash) diff -c tf-50b8/src/hooklist.h tf-50b8-patched/src/hooklist.h *** tf-50b8/src/hooklist.h Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/hooklist.h Sat Aug 28 01:16:12 2010 *************** *** 12,17 **** --- 12,20 ---- */ gencode(ACTIVITY, HT_ALERT | HT_XSOCK), + #if ENABLE_ATCP + gencode(ATCP, 0), + #endif gencode(BAMF, HT_WORLD | HT_XSOCK), gencode(BGTEXT, 0), gencode(BGTRIG, HT_ALERT | HT_XSOCK), *************** *** 19,24 **** --- 22,30 ---- gencode(CONFLICT, 0), gencode(CONNECT, HT_WORLD | HT_XSOCK), gencode(DISCONNECT, HT_WORLD | HT_XSOCK), + #if ENABLE_GMCP + gencode(GMCP, 0), + #endif gencode(ICONFAIL, HT_WORLD | HT_XSOCK), gencode(KILL, 0), gencode(LOAD, 0), *************** *** 28,33 **** --- 34,42 ---- gencode(MAIL, HT_ALERT), gencode(MORE, 0), gencode(NOMACRO, 0), + #if ENABLE_OPTION102 + gencode(OPTION102, 0), + #endif gencode(PENDING, HT_WORLD | HT_XSOCK), gencode(PREACTIVITY, 0), gencode(PROCESS, 0), diff -c tf-50b8/src/socket.c tf-50b8-patched/src/socket.c *** tf-50b8/src/socket.c Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/socket.c Fri Sep 24 02:39:49 2010 *************** *** 436,441 **** --- 436,447 ---- /* 85 & 86 are not standard. See http://www.randomly.org/projects/MCCP/ */ #define TN_COMPRESS ((char)85) /* MCCP v1 */ #define TN_COMPRESS2 ((char)86) /* MCCP v2 */ + /* 200 is not standard. See http://www.ironrealms.com/rapture/manual/files/FeatATCP-txt.html */ + #define TN_ATCP ((char)200) /* ATCP */ + /* 201 is not standard. See http://www.aardwolf.com/wiki/index.php/Clients/GMCP */ + #define TN_GMCP ((char)201) /* GMCP */ + /* 102 is not standard. See http://www.aardwolf.com/blog/category/technical */ + #define TN_102 ((char)102) /* Option 102 */ #define UCHAR unsigned char *************** *** 608,613 **** --- 614,622 ---- telnet_label[(UCHAR)TN_CHARSET] = "CHARSET"; telnet_label[(UCHAR)TN_COMPRESS] = "COMPRESS"; telnet_label[(UCHAR)TN_COMPRESS2] = "COMPRESS2"; + telnet_label[(UCHAR)TN_ATCP] = "ATCP"; + telnet_label[(UCHAR)TN_GMCP] = "GMCP"; + telnet_label[(UCHAR)TN_102] = "102"; telnet_label[(UCHAR)TN_EOR] = "EOR"; telnet_label[(UCHAR)TN_SE] = "SE"; telnet_label[(UCHAR)TN_NOP] = "NOP"; *************** *** 2439,2444 **** --- 2448,2492 ---- return result; } + #if ENABLE_ATCP + int handle_atcp_function(conString *string, const char *world) + { + Sock *old_xsock = xsock; + + xsock = (!world || !*world) ? xsock : find_sock(world); + Sprintf(telbuf, "%c%c%c%s%c%c", TN_IAC, TN_SB, TN_ATCP, string->data, TN_IAC, TN_SE); + telnet_send(telbuf); + xsock = old_xsock; + return 1; + } + #endif + + #if ENABLE_GMCP + int handle_gmcp_function(conString *string, const char *world) + { + Sock *old_xsock = xsock; + + xsock = (!world || !*world) ? xsock : find_sock(world); + Sprintf(telbuf, "%c%c%c%s%c%c", TN_IAC, TN_SB, TN_GMCP, string->data, TN_IAC, TN_SE); + telnet_send(telbuf); + xsock = old_xsock; + return 1; + } + #endif + + #if ENABLE_OPTION102 + int handle_option102_function(conString *string, const char *world) + { + Sock *old_xsock = xsock; + + xsock = (!world || !*world) ? xsock : find_sock(world); + Sprintf(telbuf, "%c%c%c%s%c%c", TN_IAC, TN_SB, TN_102, string->data, TN_IAC, TN_SE); + telnet_send(telbuf); + xsock = old_xsock; + return 1; + } + #endif + int handle_fake_recv_function(conString *string, const char *world, const char *flags) { *************** *** 2825,2830 **** --- 2873,2893 ---- } xsock->flags |= SOCKCOMPRESS; break; + #if ENABLE_ATCP + case TN_ATCP: + do_hook(H_ATCP, NULL, "%s", xsock->subbuffer->data + 3); + break; + #endif + #if ENABLE_GMCP + case TN_GMCP: + do_hook(H_GMCP, NULL, "%s", xsock->subbuffer->data + 3); + break; + #endif + #if ENABLE_OPTION102 + case TN_102: + do_hook(H_OPTION102, NULL, "%s", xsock->subbuffer->data + 3); + break; + #endif default: no_reply("unknown option"); break; *************** *** 2967,2972 **** --- 3030,3036 ---- case Z_STREAM_END: /* handle stuff inflated before stream end */ count = (char*)xsock->zstream->next_out - outbuffer; + if(count > 0) received += handle_socket_input(outbuffer, count); /* prepare to handle noncompressed stuff after stream end */ buffer = (char*)xsock->zstream->next_in; *************** *** 3072,3078 **** continue; /* avoid non-telnet processing */ } else if (xsock->fsastate == TN_SB) { ! if (xsock->subbuffer->len > 255) { /* It shouldn't take this long; server is broken. Abort. */ SStringcat(xsock->buffer, CS(xsock->subbuffer)); Stringtrunc(xsock->subbuffer, 0); --- 3136,3142 ---- continue; /* avoid non-telnet processing */ } else if (xsock->fsastate == TN_SB) { ! if (xsock->subbuffer->len > 1023) { /* It shouldn't take this long; server is broken. Abort. */ SStringcat(xsock->buffer, CS(xsock->subbuffer)); Stringtrunc(xsock->subbuffer, 0); *************** *** 3128,3133 **** --- 3192,3206 ---- (rawchar == TN_COMPRESS && mccp) || (rawchar == TN_COMPRESS2 && mccp) || #endif + #if ENABLE_ATCP + (rawchar == TN_ATCP && atcp) || + #endif + #if ENABLE_GMCP + (rawchar == TN_GMCP && gmcp) || + #endif + #if ENABLE_OPTION102 + (rawchar == TN_102 && 102) || + #endif rawchar == TN_ECHO || rawchar == TN_SEND_EOR || rawchar == TN_BINARY) /* accept any of these */ diff -c tf-50b8/src/socket.h tf-50b8-patched/src/socket.h *** tf-50b8/src/socket.h Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/socket.h Sat Aug 28 01:26:08 2010 *************** *** 45,50 **** --- 45,59 ---- extern int local_echo(int flag); extern int handle_send_function(conString *string, const char *world, const char *flags); + #if ENABLE_ATCP + extern int handle_atcp_function(conString *string, const char *world); + #endif + #if ENABLE_GMCP + extern int handle_gmcp_function(conString *string, const char *world); + #endif + #if ENABLE_OPTION102 + extern int handle_option102_function(conString *string, const char *world); + #endif extern int handle_fake_recv_function(conString *string, const char *world, const char *flags); extern int is_connected(const char *worldname); diff -c tf-50b8/src/tfconfig.h.in tf-50b8-patched/src/tfconfig.h.in *** tf-50b8/src/tfconfig.h.in Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/tfconfig.h.in Sat Aug 28 01:27:06 2010 *************** *** 94,99 **** --- 94,102 ---- #define NO_PROCESS 0 #define NO_FLOAT 0 #define NCOLORS 16 + #define ENABLE_ATCP 0 + #define ENABLE_GMCP 0 + #define ENABLE_OPTION102 0 #define HAVE_MCCP (HAVE_ZLIB_H && HAVE_LIBZ) diff -c tf-50b8/src/varlist.h tf-50b8-patched/src/varlist.h *** tf-50b8/src/varlist.h Sat Jan 13 18:12:39 2007 --- tf-50b8-patched/src/varlist.h Sat Aug 28 01:28:51 2010 *************** *** 43,48 **** --- 43,63 ---- varstrx(VAR_TZ, "TZ", NULL, ch_timezone) varstr (VAR_alert_attr, "alert_attr", "Br", ch_attr) vartime(VAR_alert_time, "alert_time", 5,0, NULL) + #if ENABLE_ATCP + varflag(VAR_atcp, "atcp", TRUE, NULL) + #else + varenum(VAR_atcp, "atcp", FALSE, NULL, enum_off) + #endif + #if ENABLE_GMCP + varflag(VAR_gmcp, "gmcp", TRUE, NULL) + #else + varenum(VAR_gmcp, "gmcp", FALSE, NULL, enum_off) + #endif + #if ENABLE_OPTION102 + varflag(VAR_OPTION102, "option102", TRUE, NULL) + #else + varenum(VAR_OPTION102, "option102", FALSE, NULL, enum_off) + #endif #if 0 varflag(VAR_auto_fg, "auto_fg", FALSE, NULL) #endif