00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef lint
00021 static const char rcsid[] = "$Id: terminal.c,v 1.11 2007-09-13 22:20:58 sven Exp $";
00022 #endif
00023
00024 #include <eggdrop/eggdrop.h>
00025 #include <unistd.h>
00026 #include "terminal.h"
00027
00028 extern int terminal_enabled;
00029
00030 static int on_privmsg(void *client_data, partymember_t *dest, botnet_entity_t *src, const char *text, int len);
00031 static int on_nick(void *client_data, partymember_t *src, const char *oldnick, const char *newnick);
00032 static int on_quit(void *client_data, partymember_t *src, const botnet_bot_t *lostbot, const char *text, int len);
00033 static int on_chanmsg(void *client_data, partychan_t *chan, botnet_entity_t *src, const char *text, int len);
00034 static int on_join(void *client_data, partychan_t *chan, partymember_t *src, int linking);
00035 static int on_part(void *client_data, partychan_t *chan, partymember_t *src, const char *text, int len);
00036 static int on_read(void *client_data, int idx, char *data, int len);
00037
00038 static sockbuf_handler_t terminal_sockbuf_handler = {
00039 "terminal",
00040 NULL,
00041 NULL,
00042 NULL,
00043 on_read,
00044 NULL
00045 };
00046
00047 static partyline_event_t terminal_party_handler = {
00048 on_privmsg,
00049 on_nick,
00050 on_quit,
00051 on_chanmsg,
00052 on_join,
00053 on_part
00054 };
00055
00056 struct {
00057 int in_idx, out_idx;
00058 partymember_t *party;
00059 } terminal_session = {-1, -1, NULL};
00060
00061 static user_t *terminal_user = NULL;
00062
00063 int terminal_init(void)
00064 {
00065 if (terminal_user == NULL) {
00066 terminal_user = user_lookup_by_handle(TERMINAL_HANDLE);
00067 if (terminal_user == NULL) {
00068 terminal_user = user_new(TERMINAL_HANDLE);
00069 user_set_flags_str(terminal_user, NULL, "n");
00070 }
00071 }
00072
00073
00074 terminal_session.in_idx = sockbuf_new();
00075 sockbuf_set_sock(terminal_session.in_idx, dup(fileno(stdin)), SOCKBUF_CLIENT);
00076 sockbuf_set_handler(terminal_session.in_idx, &terminal_sockbuf_handler, NULL, NULL);
00077 linemode_on(terminal_session.in_idx);
00078
00079
00080 terminal_session.out_idx = sockbuf_new();
00081 sockbuf_set_sock(terminal_session.out_idx, dup(fileno(stdout)), SOCKBUF_NOREAD);
00082
00083 putlog(LOG_MISC, "*", _("Entering terminal mode."));
00084
00085 terminal_session.party = partymember_new(-1,
00086 terminal_user, NULL, TERMINAL_NICK, TERMINAL_USER,
00087 TERMINAL_HOST, &terminal_party_handler, NULL, NULL);
00088
00089
00090 partychan_join_name("*", terminal_session.party, 0);
00091
00092 return (0);
00093 }
00094
00095 #define RUNMODE_RESTART 3
00096
00097 int terminal_shutdown(int runmode)
00098 {
00099 if (runmode == RUNMODE_RESTART) {
00100 terminal_user = NULL;
00101 return(0);
00102 }
00103
00104 if (terminal_session.party) {
00105 partymember_delete(terminal_session.party, NULL, _("Shutdown"));
00106 terminal_session.party = NULL;
00107 }
00108
00109 if (terminal_session.in_idx != -1) {
00110 sockbuf_set_sock(terminal_session.in_idx, -1, 0);
00111 sockbuf_delete(terminal_session.in_idx);
00112 terminal_session.in_idx = -1;
00113 }
00114
00115 if (terminal_session.out_idx != -1) {
00116 sockbuf_set_sock(terminal_session.out_idx, -1, 0);
00117 sockbuf_delete(terminal_session.out_idx);
00118 terminal_session.out_idx = -1;
00119 }
00120
00121 if (terminal_user) {
00122 user_delete(terminal_user);
00123 terminal_user = NULL;
00124 }
00125
00126
00127
00128 terminal_enabled = 0;
00129
00130 putlog(LOG_MISC, "*", _("Leaving terminal mode."));
00131
00132 return (0);
00133 }
00134
00135 static int on_read(void *client_data, int idx, char *data, int len)
00136 {
00137 partyline_on_input(NULL, terminal_session.party, data, len);
00138 return 0;
00139 }
00140
00141 static int on_privmsg(void *client_data, partymember_t *dest, botnet_entity_t *src, const char *text, int len)
00142 {
00143 return partyline_idx_privmsg(terminal_session.out_idx, dest, src, text, len);
00144 }
00145
00146 static int on_nick(void *client_data, partymember_t *src, const char *oldnick, const char *newnick)
00147 {
00148 return partyline_idx_nick (terminal_session.out_idx, src, oldnick, newnick);
00149 }
00150
00151 static int on_quit(void *client_data, partymember_t *src, const botnet_bot_t *lostbot, const char *text, int len)
00152 {
00153 if (lostbot) return 0;
00154 partyline_idx_quit(terminal_session.out_idx, src, text, len);
00155
00156
00157 if (src == terminal_session.party)
00158 sockbuf_delete(terminal_session.out_idx);
00159
00160 return(0);
00161 }
00162
00163 static int on_chanmsg(void *client_data, partychan_t *chan, botnet_entity_t *src, const char *text, int len)
00164 {
00165 return partyline_idx_chanmsg(terminal_session.out_idx, chan, src, text, len);
00166 }
00167
00168 static int on_join(void *client_data, partychan_t *chan, partymember_t *src, int linking)
00169 {
00170 if (linking) return 0;
00171 return partyline_idx_join(terminal_session.out_idx, chan, src);
00172 }
00173
00174 static int on_part(void *client_data, partychan_t *chan, partymember_t *src, const char *text, int len)
00175 {
00176 return partyline_idx_part(terminal_session.out_idx, chan, src, text, len);
00177 }