#include <eggdrop/eggdrop.h>
#include "telnetparty.h"
Go to the source code of this file.
Defines | |
#define | TELNET_FILTER_LEVEL SOCKBUF_LEVEL_TEXT_ALTERATION |
Functions | |
EXPORT_SCOPE int | telnetparty_LTX_start (egg_module_t *modinfo) |
static int | telnetparty_close (int why) |
static int | telnet_on_newclient (void *client_data, int idx, int newidx, const char *peer_ip, int peer_port) |
static int | telnet_on_read (void *client_data, int idx, char *data, int len) |
static int | telnet_on_eof (void *client_data, int idx, int err, const char *errmsg) |
static int | telnet_on_delete (event_owner_t *owner, void *client_data) |
static int | telnet_filter_read (void *client_data, int idx, char *data, int len) |
static int | telnet_filter_write (void *client_data, int idx, const char *data, int len) |
static int | telnet_filter_delete (void *client_data, int idx) |
static int | ident_result (void *client_data, const char *ip, int port, const char *reply) |
static int | dns_result (void *client_data, const char *ip, char **hosts) |
static int | process_results (telnet_session_t *session) |
static int | telnet_pm_delete (event_owner_t *owner, void *client_data) |
int | telnet_init () |
void | telnet_code (int idx, int cmd, int what) |
void | convert_ansi_code_to_mirc (int *tokens, int ntokens, char **dest, int *cur, int *max) |
int | get_2 (const char *data, int len, int *val) |
int | convert_mirc_color_to_ansi (const char *data, int len, char **newline, int *cur, int *max) |
void | handle_ansi_code (const char **src, char **dest, int *cur, int *max) |
char * | telnet_fix_line (const char *line) |
static void | kill_session (telnet_session_t *session) |
Variables | |
static const char | rcsid [] = "$Id: telnetparty.c,v 1.27 2007-11-06 00:05:40 sven Exp $" |
telnet_config_t | telnet_config = {0} |
static config_var_t | telnet_config_vars [] |
partyline_event_t | telnet_party_handler |
static int | telnet_idx = -1 |
static int | telnet_port = 0 |
static event_owner_t | telnet_generic_owner |
static event_owner_t | telnet_sockbuf_owner |
static event_owner_t | telnet_partymember_owner |
static sockbuf_handler_t | server_handler |
static sockbuf_filter_t | telnet_filter |
static sockbuf_handler_t | client_handler |
#define TELNET_FILTER_LEVEL SOCKBUF_LEVEL_TEXT_ALTERATION |
Definition at line 84 of file telnetparty.c.
Referenced by telnet_code(), telnet_filter_read(), and telnet_filter_write().
void convert_ansi_code_to_mirc | ( | int * | tokens, | |
int | ntokens, | |||
char ** | dest, | |||
int * | cur, | |||
int * | max | |||
) |
Definition at line 126 of file telnetparty.c.
References egg_append_str().
Referenced by handle_ansi_code().
00127 { 00128 int ansi_to_mirc_colors[] = {1, 4, 3, 8, 2, 5, 10, 0}; 00129 int i, in_bold, in_uline, in_reverse, fg, bg; 00130 char *newline; 00131 char buf[64]; 00132 00133 /* User inserted some color stuff... */ 00134 in_bold = in_uline = in_reverse = 0; 00135 fg = bg = -1; 00136 for (i = 0; i < ntokens; i++) { 00137 if (tokens[i] == 0) in_bold = in_uline = in_reverse = 0; 00138 else if (tokens[i] == 1) in_bold = 1; 00139 else if (tokens[i] == 4) in_uline = 1; 00140 else if (tokens[i] == 7) in_reverse = 1; 00141 else if (tokens[i] == 8) fg = bg = 99; 00142 else if (tokens[i] >= 30 && tokens[i] <= 37) { 00143 fg = ansi_to_mirc_colors[tokens[i] - 30]; 00144 } 00145 else if (tokens[i] >= 40 && tokens[i] <= 47) { 00146 bg = ansi_to_mirc_colors[tokens[i] - 40]; 00147 } 00148 } 00149 if (*max - *cur < 10) { 00150 *dest = realloc(*dest, *max + 10); 00151 *max += 10; 00152 } 00153 newline = buf; 00154 if (in_bold) *newline++ = '\002'; 00155 if (in_uline) *newline++ = '\037'; 00156 if (in_reverse) *newline++ = '\026'; 00157 if (fg != -1 || bg != -1) { 00158 *newline++ = '\003'; 00159 if (fg == -1) fg = 99; 00160 sprintf(newline, "%02d", fg); 00161 newline += 2; 00162 if (bg != -1) { 00163 sprintf(newline, ",%02d", bg); 00164 newline += 3; 00165 } 00166 } 00167 *newline = 0; 00168 egg_append_str(dest, cur, max, buf); 00169 }
int convert_mirc_color_to_ansi | ( | const char * | data, | |
int | len, | |||
char ** | newline, | |||
int * | cur, | |||
int * | max | |||
) |
Definition at line 187 of file telnetparty.c.
References egg_append_str(), and get_2().
Referenced by telnet_filter_write().
00188 { 00189 const char *orig; 00190 char add[64], temp[64]; 00191 /* Convert a mirc color (0-15) to an ansi escape color (0-7). */ 00192 int mirc_to_ansi[] = {7, 0, 4, 2, 1, 1, 5, 1, 3, 2, 6, 6, 4, 5, 0, 0}; 00193 int c1, c2, n; 00194 00195 orig = data; 00196 c1 = c2 = -1; 00197 n = get_2(data, len, &c1); 00198 if (n) { 00199 data += n; len -= n; 00200 if (len && *data == ',') { 00201 len--; 00202 data++; 00203 n = get_2(data, len, &c2); 00204 data += n; 00205 len -= n; 00206 } 00207 } 00208 strcpy(add, "\033["); 00209 if (c1 != -1) { 00210 if (c1 != 99) { 00211 c1 %= 16; 00212 sprintf(temp, "%d", 30+mirc_to_ansi[c1]); 00213 strcat(add, temp); 00214 } 00215 if (c2 != -1 && c2 != 99) { 00216 c2 %= 16; 00217 sprintf(temp, "%d", 40+mirc_to_ansi[c2]); 00218 if (c1 != 99) strcat(add, ";"); 00219 strcat(add, temp); 00220 } 00221 strcat(add, "m"); 00222 } 00223 else strcat(add, "0m"); 00224 egg_append_str(newline, cur, max, add); 00225 return data - orig; 00226 }
static int dns_result | ( | void * | client_data, | |
const char * | ip, | |||
char ** | hosts | |||
) | [static] |
Definition at line 361 of file telnetparty.c.
References telnet_session_t::dns_id, telnet_session_t::host, and process_results().
00362 { 00363 telnet_session_t *session = client_data; 00364 const char *host; 00365 00366 session->dns_id = -1; 00367 if (!hosts || !hosts[0]) host = ip; 00368 else host = hosts[0]; 00369 00370 session->host = strdup(host); 00371 process_results(session); 00372 return(0); 00373 }
int get_2 | ( | const char * | data, | |
int | len, | |||
int * | val | |||
) |
Definition at line 173 of file telnetparty.c.
Referenced by convert_mirc_color_to_ansi().
00174 { 00175 if (isdigit(*data)) { 00176 *val = *data++ - '0'; 00177 if (len > 1 && isdigit(*data)) { 00178 *val *= 10; 00179 *val += *data - '0'; 00180 return(2); 00181 } 00182 return(1); 00183 } 00184 return(0); 00185 }
void handle_ansi_code | ( | const char ** | src, | |
char ** | dest, | |||
int * | cur, | |||
int * | max | |||
) |
Definition at line 228 of file telnetparty.c.
References convert_ansi_code_to_mirc(), and NULL.
Referenced by telnet_fix_line().
00229 { 00230 const char *line = *src; 00231 int token, ntokens, *tokens; 00232 00233 if (*line++ != 27) return; 00234 *src = line; 00235 if (*line++ != '[') return; 00236 00237 /* Now get stuff in the form <num>;<num>;<num><alpha> */ 00238 token = 0; 00239 ntokens = 0; 00240 tokens = NULL; 00241 while (*line) { 00242 if (*line >= '0' && *line <= '9') { 00243 /* Building this token still. */ 00244 token *= 10; 00245 token += (*line - '0'); 00246 } 00247 else if (*line == ';' || isalpha(*line)) { 00248 /* Done with this token. */ 00249 tokens = realloc(tokens, sizeof(int) * (ntokens+1)); 00250 tokens[ntokens++] = token; 00251 token = 0; 00252 if (isalpha(*line)) break; 00253 } 00254 else break; 00255 line++; 00256 } 00257 00258 if (*line == 'm') { 00259 /* Graphic rendition (color, underline, etc)... */ 00260 convert_ansi_code_to_mirc(tokens, ntokens, dest, cur, max); 00261 *src = line+1; 00262 } 00263 00264 if (tokens) free(tokens); 00265 }
static int ident_result | ( | void * | client_data, | |
const char * | ip, | |||
int | port, | |||
const char * | reply | |||
) | [static] |
Definition at line 350 of file telnetparty.c.
References telnet_session_t::ident, telnet_session_t::ident_id, and process_results().
00351 { 00352 telnet_session_t *session = client_data; 00353 00354 session->ident_id = -1; 00355 if (reply) session->ident = strdup(reply); 00356 else session->ident = strdup("~telnet"); 00357 process_results(session); 00358 return(0); 00359 }
static void kill_session | ( | telnet_session_t * | session | ) | [static] |
Definition at line 305 of file telnetparty.c.
References telnet_session_t::dns_id, egg_dns_cancel(), egg_ident_cancel(), telnet_session_t::host, telnet_session_t::ident, telnet_session_t::ident_id, telnet_session_t::ip, and telnet_session_t::nick.
00306 { 00307 if (session->ident_id != -1) egg_ident_cancel(session->ident_id, 0); 00308 if (session->dns_id != -1) egg_dns_cancel(session->dns_id, 0); 00309 if (session->ip) free(session->ip); 00310 if (session->host) free(session->host); 00311 if (session->ident) free(session->ident); 00312 if (session->nick) free(session->nick); 00313 free(session); 00314 }
static int process_results | ( | telnet_session_t * | session | ) | [static] |
Definition at line 375 of file telnetparty.c.
References telnet_session_t::flags, telnet_session_t::host, telnet_session_t::ident, telnet_session_t::idx, telnet_session_t::party, partyline_update_info(), sockbuf_delete(), sockbuf_write(), telnet_session_t::state, STATE_NICKNAME, STATE_PARTYLINE, STEALTH_LOGIN, and user_lookup_by_irchost().
00376 { 00377 char fakehost[512]; 00378 00379 if (!session->ident || !session->host) return(0); 00380 00381 if (session->state == STATE_PARTYLINE) { 00382 partyline_update_info(session->party, session->ident, session->host); 00383 return(0); 00384 } 00385 if (session->flags & STEALTH_LOGIN) { 00386 snprintf(fakehost, sizeof(fakehost), "-telnet!%s@%s", session->ident, session->host); 00387 fakehost[sizeof(fakehost)-1] = 0; 00388 if (!user_lookup_by_irchost(fakehost)) { 00389 sockbuf_delete(session->idx); 00390 return(0); 00391 } 00392 sockbuf_write(session->idx, "\r\nPlease enter your nickname.\r\n", -1); 00393 session->state = STATE_NICKNAME; 00394 } 00395 return(0); 00396 }
void telnet_code | ( | int | idx, | |
int | cmd, | |||
int | what | |||
) |
Definition at line 117 of file telnetparty.c.
References sockbuf_on_write(), TELNET_CMD, and TELNET_FILTER_LEVEL.
Referenced by telnet_filter_read(), and telnet_on_read().
00118 { 00119 char temp[3]; 00120 temp[0] = TELNET_CMD; 00121 temp[1] = cmd; 00122 temp[2] = what; 00123 sockbuf_on_write(idx, TELNET_FILTER_LEVEL, temp, 3); 00124 }
static int telnet_filter_delete | ( | void * | client_data, | |
int | idx | |||
) | [static] |
Definition at line 631 of file telnetparty.c.
00632 { 00633 /* The client data is a telnet_session_t, which will be freed 00634 * by telnet_on_delete. So we do nothing. */ 00635 return(0); 00636 }
static int telnet_filter_read | ( | void * | client_data, | |
int | idx, | |||
char * | data, | |||
int | len | |||
) | [static] |
Definition at line 478 of file telnetparty.c.
References cmd, telnet_session_t::flags, sockbuf_on_read(), sockbuf_on_write(), sockbuf_write(), TELNET_AYT, TELNET_CMD, telnet_code(), TELNET_DO, TELNET_DONT, TELNET_ECHO, TELNET_FILTER_LEVEL, TELNET_WILL, TELNET_WONT, TFLAG_ECHO, and TFLAG_PASSWORD.
00479 { 00480 unsigned char *cmd; 00481 int type, arg, remove; 00482 telnet_session_t *session = client_data; 00483 00484 cmd = (unsigned char *) data; 00485 while ((cmd = memchr(cmd, TELNET_CMD, len))) { 00486 type = *(cmd+1); 00487 switch (type) { 00488 case TELNET_AYT: 00489 sockbuf_write(idx, "[YES]\r\n", 7); 00490 remove = 1; 00491 break; 00492 case TELNET_CMD: 00493 cmd++; 00494 remove = 1; 00495 break; 00496 case TELNET_DO: 00497 arg = *(cmd+2); 00498 if (arg == TELNET_ECHO) { 00499 if (!(session->flags & TFLAG_ECHO)) { 00500 telnet_code(idx, TELNET_WILL, arg); 00501 session->flags |= TFLAG_ECHO; 00502 } 00503 } 00504 else telnet_code(idx, TELNET_WONT, arg); 00505 remove = 3; 00506 break; 00507 case TELNET_DONT: 00508 arg = *(cmd+2); 00509 if (arg == TELNET_ECHO) { 00510 if (session->flags & TFLAG_ECHO) { 00511 telnet_code(idx, TELNET_WONT, arg); 00512 session->flags &= ~TFLAG_ECHO; 00513 } 00514 } 00515 remove = 3; 00516 break; 00517 case TELNET_WILL: 00518 remove = 3; 00519 break; 00520 case TELNET_WONT: 00521 remove = 3; 00522 break; 00523 default: 00524 remove = 2; 00525 } 00526 memmove(cmd, cmd+remove, len - (cmd - (unsigned char *)data) - remove + 1); 00527 len -= remove; 00528 } 00529 00530 if (len) { 00531 if (session->flags & TFLAG_ECHO && !(session->flags & TFLAG_PASSWORD)) sockbuf_on_write(idx, TELNET_FILTER_LEVEL, data, len); 00532 sockbuf_on_read(idx, TELNET_FILTER_LEVEL, data, len); 00533 } 00534 return(0); 00535 }
static int telnet_filter_write | ( | void * | client_data, | |
int | idx, | |||
const char * | data, | |||
int | len | |||
) | [static] |
Definition at line 538 of file telnetparty.c.
References convert_mirc_color_to_ansi(), egg_append_str(), sockbuf_on_write(), and TELNET_FILTER_LEVEL.
00539 { 00540 char *newline; 00541 const char *filterchars = "\n\r\003\002\007\017\026\037\255"; 00542 char temp[64]; 00543 int i, cur, max, n, code, esc; 00544 00545 cur = 0; 00546 max = 128; 00547 newline = malloc(max+1); 00548 00549 code = 0; 00550 esc = -1; 00551 while (len > 0) { 00552 switch (*data) { 00553 case '\002': 00554 esc = 1; 00555 break; 00556 case '\003': 00557 code = 1; 00558 data++; len--; 00559 n = convert_mirc_color_to_ansi(data, len, &newline, &cur, &max); 00560 data += n; 00561 len -= n; 00562 break; 00563 case '\007': 00564 /* Skip. */ 00565 data++; len--; 00566 break; 00567 case '\017': 00568 esc = 0; 00569 break; 00570 case '\026': 00571 esc = 7; 00572 break; 00573 case '\037': 00574 esc = 4; 00575 break; 00576 case '\r': 00577 case '\n': 00578 if (code) { 00579 /* If we've used an escape code, we 00580 * append the 'reset' code right before 00581 * the end of the line. */ 00582 egg_append_str(&newline, &cur, &max, "\033[0m"); 00583 code = 0; 00584 } 00585 if (*data != '\r') { 00586 /* Skip \r and wait for \n, where we 00587 * add both (prevents stray \r's). */ 00588 egg_append_str(&newline, &cur, &max, "\r\n"); 00589 } 00590 data++; 00591 len--; 00592 break; 00593 case '\255': 00594 /* This is the telnet command char, so we have 00595 * to escape it. */ 00596 egg_append_str(&newline, &cur, &max, "\255\255"); 00597 data++; 00598 len--; 00599 break; 00600 default: 00601 for (i = 0; i < sizeof(temp)-1 && i < len; i++) { 00602 if (strchr(filterchars, *data)) break; 00603 temp[i] = *data++; 00604 } 00605 temp[i] = 0; 00606 egg_append_str(&newline, &cur, &max, temp); 00607 len -= i; 00608 } 00609 00610 if (esc != -1) { 00611 /* Add the escape code to the line. */ 00612 sprintf(temp, "\033[%dm", esc); 00613 egg_append_str(&newline, &cur, &max, temp); 00614 data++; len--; 00615 esc = -1; 00616 00617 /* Remember that we're in a code so we can reset it 00618 * at the end of the line. */ 00619 code = 1; 00620 } 00621 } 00622 newline[cur] = 0; 00623 if (cur > 0) { 00624 n = sockbuf_on_write(idx, TELNET_FILTER_LEVEL, newline, cur); 00625 } 00626 else n = 0; 00627 free(newline); 00628 return(n); 00629 }
char* telnet_fix_line | ( | const char * | line | ) |
Definition at line 268 of file telnetparty.c.
References handle_ansi_code().
Referenced by telnet_on_read().
00269 { 00270 char *newline; 00271 int cur, max; 00272 00273 cur = 0; 00274 max = 128; 00275 newline = malloc(max+1); 00276 00277 while (*line) { 00278 switch (*line) { 00279 case 7: 00280 /* Get rid of beeps. */ 00281 line++; 00282 break; 00283 case 8: 00284 /* Fix backspaces. */ 00285 if (cur > 0) cur--; 00286 line++; 00287 break; 00288 case 27: 00289 /* Handle ansi escape sequences if possible. */ 00290 handle_ansi_code(&line, &newline, &cur, &max); 00291 break; 00292 default: 00293 if (cur >= max) { 00294 newline = realloc(newline, max+128); 00295 max += 128; 00296 } 00297 newline[cur++] = *line++; 00298 } 00299 } 00300 newline[cur] = 0; 00301 00302 return(newline); 00303 }
int telnet_init | ( | ) |
Definition at line 99 of file telnetparty.c.
References egg_server(), NULL, telnet_config_t::port, sockbuf_set_handler(), telnet_idx, telnet_port, and telnet_config_t::vhost.
Referenced by telnetparty_LTX_start().
00100 { 00101 /* Open our listening socket. */ 00102 telnet_idx = egg_server(telnet_config.vhost, telnet_config.port, &telnet_port); 00103 sockbuf_set_handler(telnet_idx, &server_handler, NULL, NULL); 00104 00105 return(0); 00106 }
static int telnet_on_delete | ( | event_owner_t * | owner, | |
void * | client_data | |||
) | [static] |
Definition at line 466 of file telnetparty.c.
References kill_session(), NULL, telnet_session_t::party, and partymember_delete().
00467 { 00468 telnet_session_t *session = client_data; 00469 00470 if (session->party) { 00471 partymember_delete(session->party, NULL, "Deleted!"); 00472 session->party = NULL; 00473 } 00474 kill_session(session); 00475 return(0); 00476 }
static int telnet_on_eof | ( | void * | client_data, | |
int | idx, | |||
int | err, | |||
const char * | errmsg | |||
) | [static] |
Definition at line 449 of file telnetparty.c.
References NULL, telnet_session_t::party, partymember_delete(), and sockbuf_delete().
00450 { 00451 telnet_session_t *session = client_data; 00452 00453 if (session->party) { 00454 if (!err) errmsg = "Client disconnected"; 00455 else if (!errmsg) errmsg = "Unknown error"; 00456 partymember_delete(session->party, NULL, errmsg); 00457 /* This will call our on_quit handler which will delete the sockbuf 00458 * which will call our on_delete handler which will kill the session. 00459 * Summery: All the data is gone, don't touch any of the variables */ 00460 } else { 00461 sockbuf_delete(idx); 00462 } 00463 return(0); 00464 }
static int telnet_on_newclient | ( | void * | client_data, | |
int | idx, | |||
int | newidx, | |||
const char * | peer_ip, | |||
int | peer_port | |||
) | [static] |
Definition at line 316 of file telnetparty.c.
References telnet_session_t::count, telnet_session_t::dns_id, dns_result(), egg_dns_reverse(), egg_ident_lookup(), egg_iprintf(), telnet_session_t::flags, telnet_session_t::ident_id, ident_result(), telnet_session_t::idx, telnet_session_t::ip, linemode_on(), NULL, telnet_session_t::port, sockbuf_attach_filter(), sockbuf_set_handler(), sockbuf_write(), socktimer_on(), telnet_session_t::state, STATE_NICKNAME, STATE_RESOLVE, telnet_config_t::stealth, STEALTH_LOGIN, and telnet_port.
00317 { 00318 telnet_session_t *session; 00319 00320 session = calloc(1, sizeof(*session)); 00321 session->ip = strdup(peer_ip); 00322 session->port = peer_port; 00323 session->idx = newidx; 00324 00325 sockbuf_set_handler(newidx, &client_handler, session, &telnet_sockbuf_owner); 00326 sockbuf_attach_filter(newidx, &telnet_filter, session); 00327 socktimer_on(newidx, 60, 0, NULL, NULL, &telnet_generic_owner); 00328 linemode_on(newidx); 00329 00330 /* Stealth logins are where we don't say anything until we know they 00331 * are a valid user. */ 00332 if (telnet_config.stealth) { 00333 session->state = STATE_RESOLVE; 00334 session->flags |= STEALTH_LOGIN; 00335 } 00336 else { 00337 egg_iprintf(newidx, "Hello %s/%d!\r\n", peer_ip, peer_port); 00338 sockbuf_write(newidx, "\r\nPlease enter your nickname.\r\n", -1); 00339 session->state = STATE_NICKNAME; 00340 session->count = 0; 00341 } 00342 00343 /* Start lookups. */ 00344 session->ident_id = egg_ident_lookup(peer_ip, peer_port, telnet_port, -1, ident_result, session, &telnet_generic_owner); 00345 session->dns_id = egg_dns_reverse(peer_ip, -1, dns_result, session, &telnet_generic_owner); 00346 00347 return(0); 00348 }
static int telnet_on_read | ( | void * | client_data, | |
int | idx, | |||
char * | data, | |||
int | len | |||
) | [static] |
Definition at line 398 of file telnetparty.c.
References telnet_session_t::count, egg_iprintf(), telnet_session_t::flags, telnet_session_t::host, telnet_session_t::ident, telnet_session_t::idx, telnet_session_t::ip, telnet_config_t::max_retries, telnet_session_t::nick, NULL, telnet_session_t::party, partychan_join_name(), partyline_on_input(), partymember_new(), sockbuf_delete(), sockbuf_write(), socktimer_off(), telnet_session_t::state, STATE_NICKNAME, STATE_PARTYLINE, STATE_PASSWORD, telnet_code(), TELNET_ECHO, telnet_fix_line(), TELNET_WILL, TELNET_WONT, TFLAG_PASSWORD, telnet_session_t::user, and user_lookup_authed().
00399 { 00400 telnet_session_t *session = client_data; 00401 char *newline; 00402 00403 switch (session->state) { 00404 case STATE_PARTYLINE: 00405 newline = telnet_fix_line(data); 00406 if (newline) { 00407 partyline_on_input(NULL, session->party, newline, strlen(newline)); 00408 free(newline); 00409 } 00410 break; 00411 case STATE_NICKNAME: 00412 session->nick = strdup(data); 00413 session->state = STATE_PASSWORD; 00414 session->flags |= TFLAG_PASSWORD; 00415 telnet_code(session->idx, TELNET_WILL, TELNET_ECHO); 00416 sockbuf_write(session->idx, "Please enter your password.\r\n", -1); 00417 break; 00418 case STATE_PASSWORD: 00419 session->flags &= ~TFLAG_PASSWORD; 00420 telnet_code(session->idx, TELNET_WONT, TELNET_ECHO); 00421 session->user = user_lookup_authed(session->nick, data); 00422 if (!session->user) { 00423 sockbuf_write(session->idx, "Invalid username/password.\r\n\r\n", -1); 00424 session->count++; 00425 if (session->count > telnet_config.max_retries) { 00426 sockbuf_delete(session->idx); 00427 break; 00428 } 00429 free(session->nick); 00430 session->nick = NULL; 00431 sockbuf_write(session->idx, "Please enter your nickname.\r\n", -1); 00432 session->state = STATE_NICKNAME; 00433 } 00434 else { 00435 socktimer_off(idx); 00436 session->party = partymember_new(-1, session->user, NULL, session->nick, session->ident ? session->ident : "~telnet", session->host ? session->host : session->ip, &telnet_party_handler, session, &telnet_partymember_owner); 00437 session->state = STATE_PARTYLINE; 00438 egg_iprintf(idx, "\r\nWelcome to the telnet partyline interface!\r\n"); 00439 if (session->ident) egg_iprintf(idx, "Your ident is: %s\r\n", session->ident); 00440 if (session->host) egg_iprintf(idx, "Your hostname is: %s\r\n", session->host); 00441 /* Put them on the main channel. */ 00442 partychan_join_name("*", session->party, 0); 00443 } 00444 break; 00445 } 00446 return(0); 00447 }
static int telnet_pm_delete | ( | event_owner_t * | owner, | |
void * | client_data | |||
) | [static] |
Definition at line 108 of file telnetparty.c.
References telnet_session_t::idx, and sockbuf_delete().
00109 { 00110 telnet_session_t *session = client_data; 00111 00112 sockbuf_delete(session->idx); 00113 00114 return 0; 00115 }
static int telnetparty_close | ( | int | why | ) | [static] |
Definition at line 638 of file telnetparty.c.
References config_get_root(), config_root, config_unlink_table(), NULL, sockbuf_delete(), and telnet_idx.
Referenced by telnetparty_LTX_start().
00639 { 00640 void *config_root; 00641 00642 config_root = config_get_root("eggdrop"); 00643 config_unlink_table(telnet_config_vars, config_root, "telnetparty", 0, NULL); 00644 00645 sockbuf_delete(telnet_idx); 00646 return(0); 00647 }
int telnetparty_LTX_start | ( | egg_module_t * | modinfo | ) |
Definition at line 649 of file telnetparty.c.
References egg_module::author, egg_module::close_func, config_get_root(), config_link_table(), config_root, config_update_table(), egg_module::description, telnet_config_t::max_retries, event_owner_b::module, egg_module::name, NULL, telnet_init(), telnetparty_close(), and egg_module::version.
00650 { 00651 void *config_root; 00652 00653 telnet_generic_owner.module = telnet_sockbuf_owner.module = telnet_partymember_owner.module = modinfo; 00654 modinfo->name = "telnetparty"; 00655 modinfo->author = "eggdev"; 00656 modinfo->version = "1.0.0"; 00657 modinfo->description = "telnet support for the partyline"; 00658 modinfo->close_func = telnetparty_close; 00659 00660 /* Set defaults. */ 00661 memset(&telnet_config, 0, sizeof(telnet_config)); 00662 telnet_config.max_retries = 3; 00663 00664 /* Link our vars in. */ 00665 config_root = config_get_root("eggdrop"); 00666 config_link_table(telnet_config_vars, config_root, "telnetparty", 0, NULL); 00667 config_update_table(telnet_config_vars, config_root, "telnetparty", 0, NULL); 00668 00669 telnet_init(); 00670 return(0); 00671 }
sockbuf_handler_t client_handler [static] |
Initial value:
{ "telnet", NULL, telnet_on_eof, NULL, telnet_on_read, NULL }
Definition at line 93 of file telnetparty.c.
const char rcsid[] = "$Id: telnetparty.c,v 1.27 2007-11-06 00:05:40 sven Exp $" [static] |
Definition at line 21 of file telnetparty.c.
sockbuf_handler_t server_handler [static] |
Initial value:
{ "telnet server", NULL, NULL, telnet_on_newclient, NULL, NULL }
Definition at line 78 of file telnetparty.c.
telnet_config_t telnet_config = {0} |
Definition at line 28 of file telnetparty.c.
config_var_t telnet_config_vars[] [static] |
Initial value:
{ {"vhost", &telnet_config.vhost, CONFIG_STRING}, {"port", &telnet_config.port, CONFIG_INT}, {"stealth", &telnet_config.stealth, CONFIG_INT}, {"max_retries", &telnet_config.max_retries, CONFIG_INT}, {0} }
Definition at line 30 of file telnetparty.c.
sockbuf_filter_t telnet_filter [static] |
Initial value:
{ "telnet filter", TELNET_FILTER_LEVEL, NULL, NULL, NULL, telnet_filter_read, telnet_filter_write, NULL, NULL, telnet_filter_delete }
Definition at line 86 of file telnetparty.c.
event_owner_t telnet_generic_owner [static] |
int telnet_idx = -1 [static] |
event_owner_t telnet_partymember_owner [static] |
Initial value:
{ "telnetparty", 0, 0, 0, telnet_pm_delete }
Definition at line 72 of file telnetparty.c.
int telnet_port = 0 [static] |
Definition at line 45 of file telnetparty.c.
Referenced by telnet_init(), and telnet_on_newclient().
event_owner_t telnet_sockbuf_owner [static] |
Initial value:
{ "telnetparty", 0, 0, 0, telnet_on_delete }
Definition at line 66 of file telnetparty.c.