static int message_bot_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags) { char * msgtemp; if (!packet) { eventlog(eventlog_level_error,"message_bot_format","got NULL packet"); return -1; } /* special-case the login banner so it doesn't have numbers * at the start of each line */ if (me && conn_get_state(me)!=conn_state_loggedin && conn_get_state(me)!=conn_state_destroy && type!=message_type_null) /* this does not apply for NULL messages */ { if (!text) { #if 0 /* battle.net actually sends them during login */ if (type==message_type_null) return 0; /* don't display null messages during the login */ #endif eventlog(eventlog_level_error,"message_bot_format","got NULL text for non-loggedin state"); return -1; } if (!(msgtemp = malloc(strlen(text)+4))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%s\r\n",text); } else switch (type) { case message_type_null: if (!(msgtemp = malloc(32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s\r\n",EID_NULL,"NULL"); break; case message_type_uniqueid: /* FIXME: need to send this for some bots, also needed to support guest accounts */ if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(strlen(text)+32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s\r\n",EID_UNIQUENAME,"NAME",text); break; case message_type_adduser: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_SHOWUSER,"USER",tname,conn_get_flags(me)|dstflags,conn_get_fake_clienttag(me)); conn_unget_chatcharname(me,tname); } break; case message_type_join: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x [%s]\r\n",EID_JOIN,"JOIN",tname,conn_get_flags(me)|dstflags,conn_get_fake_clienttag(me)); conn_unget_chatcharname(me,tname); } break; case message_type_part: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x\r\n",EID_LEAVE,"LEAVE",tname,conn_get_flags(me)|dstflags); conn_unget_chatcharname(me,tname); } break; case message_type_whisper: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_WHISPER,"WHISPER",tname,conn_get_flags(me)|dstflags,text); conn_unget_chatcharname(me,tname); } break; case message_type_talk: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */ return -1; if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_TALK,"TALK",tname,conn_get_flags(me)|dstflags,text); conn_unget_chatcharname(me,tname); } break; case message_type_broadcast: if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ if (!(msgtemp = malloc(32+32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_BROADCAST,"_",text); /* FIXME: what does this look like on Battle.net? */ break; case message_type_channel: if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_CHANNEL,"CHANNEL",text); break; case message_type_userflags: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+16))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x\r\n",EID_USERFLAGS,"USER",tname,conn_get_flags(me)|dstflags); conn_unget_chatcharname(me,tname); } break; case message_type_whisperack: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_WHISPERSENT,"WHISPER",tname,conn_get_flags(me)|dstflags,text); conn_unget_chatcharname(me,tname); } break; case message_type_channelfull: if (!(msgtemp = malloc(32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u \r\n",EID_CHANNELFULL); /* FIXME */ break; case message_type_channeldoesnotexist: if (!(msgtemp = malloc(32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u \r\n",EID_CHANNELDOESNOTEXIST); /* FIXME */ break; case message_type_channelrestricted: if (!(msgtemp = malloc(32))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u \r\n",EID_CHANNELRESTRICTED); /* FIXME */ break; case message_type_info: if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(32+16+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_INFO,"INFO",text); break; case message_type_error: if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(32+16+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s \"%s\"\r\n",EID_ERROR,"ERROR",text); break; case message_type_emote: if (!me) { eventlog(eventlog_level_error,"message_bot_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_bot_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */ return -1; if (!(msgtemp = malloc(32+strlen(tname)+32+strlen(text)))) { eventlog(eventlog_level_error,"message_bot_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%u %s %s %04x \"%s\"\r\n",EID_EMOTE,"EMOTE",tname,conn_get_flags(me)|dstflags,text); conn_unget_chatcharname(me,tname); } break; default: eventlog(eventlog_level_error,"message_bot_format","got bad message type %d",(int)type); return -1; } if (strlen(msgtemp)>=MAX_MESSAGE_LEN) { msgtemp[MAX_MESSAGE_LEN] = '\0'; /* now truncate to max size */ msgtemp[MAX_MESSAGE_LEN-1] = '\n'; /* and add EOL signs - message have to be send properly */ msgtemp[MAX_MESSAGE_LEN-2] = '\r'; } { int retval; retval = packet_append_ntstring(packet,msgtemp); free(msgtemp); return retval; } }
extern int handle_bot_packet(t_connection * c, t_packet const * const packet) { t_packet * rpacket; if (!c) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL connection",conn_get_socket(c)); return -1; } if (!packet) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL packet",conn_get_socket(c)); return -1; } if (packet_get_class(packet)!=packet_class_raw) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got bad packet (class %d)",conn_get_socket(c),(int)packet_get_class(packet)); return -1; } { char const * const linestr=packet_get_str_const(packet,0,MAX_MESSAGE_LEN); if (packet_get_size(packet)<2) /* empty line */ return 0; if (!linestr) { eventlog(eventlog_level_warn,__FUNCTION__,"[%d] line too long",conn_get_socket(c)); return 0; } switch (conn_get_state(c)) { case conn_state_connected: conn_add_flags(c,MF_PLUG); conn_set_clienttag(c,CLIENTTAG_BNCHATBOT_UINT); { char const * temp=linestr; if (temp[0]=='\004') /* FIXME: no echo, ignore for now (we always do no echo) */ temp = &temp[1]; if (temp[0]=='\0') /* empty line */ { conn_set_state(c,conn_state_bot_username); /* don't look for ^D or reset tag and flags */ break; } conn_set_state(c,conn_state_bot_password); if (conn_set_loggeduser(c,temp)<0) eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),temp); { char const * const msg="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } #if 1 /* don't echo */ packet_append_ntstring(rpacket,conn_get_loggeduser(c)); #endif packet_append_ntstring(rpacket,msg); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } } break; case conn_state_bot_username: conn_set_state(c,conn_state_bot_password); if (conn_set_loggeduser(c,linestr)<0) eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),linestr); { char const * const temp="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } #if 1 /* don't echo */ packet_append_ntstring(rpacket,linestr); #endif packet_append_ntstring(rpacket,temp); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } break; case conn_state_bot_password: { char const * const tempa="\r\nLogin failed.\r\n\r\nUsername: "******"\r\nAccount has no bot access.\r\n\r\nUsername: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (connlist_find_connection_by_accountname(loggeduser)) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (already logged in)",conn_get_socket(c),loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (!(account = accountlist_find_account(loggeduser))) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (bad account)",conn_get_socket(c),loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if ((oldstrhash1 = account_get_pass(account))) { if (hash_set_str(&oldpasshash1,oldstrhash1)<0) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (corrupted passhash1?)",conn_get_socket(c),loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } testpass = xstrdup(linestr); { unsigned int i; for (i=0; i<strlen(testpass); i++) if (isupper((int)testpass[i])) testpass[i] = tolower((int)testpass[i]); } if (bnet_hash(&trypasshash1,strlen(testpass),testpass)<0) /* FIXME: force to lowercase */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (unable to hash password)",conn_get_socket(c), loggeduser); conn_set_state(c,conn_state_bot_username); xfree((void *)testpass); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } xfree((void *)testpass); if (hash_eq(trypasshash1,oldpasshash1)!=1) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (wrong password)",conn_get_socket(c), loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (account_get_auth_botlogin(account)!=1) /* default to false */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (no bot access)",conn_get_socket(c), loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempb); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } else if (account_get_auth_lock(account)==1) /* default to false */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (this account is locked)",conn_get_socket(c), loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempb); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (correct password)",conn_get_socket(c), loggeduser); } else { eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (no password)",conn_get_socket(c), loggeduser); } if (!(rpacket = packet_create(packet_class_raw))) /* if we got this far, let them log in even if this fails */ eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); else { packet_append_ntstring(rpacket,"\r\n"); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } bnetd_log(loggeduser, addr_num_to_ip_str(conn_get_addr(c)), "BOT", "LOGIN", NULL, 1, 0); conn_login(c,account,loggeduser); message_send_text(c,message_type_uniqueid,c,loggeduser); if (conn_set_channel(c,CHANNEL_NAME_CHAT)<0) conn_set_channel(c,CHANNEL_NAME_BANNED); /* should not fail */ } break; case conn_state_loggedin: { t_channel const * channel; conn_set_idletime(c); if ((channel = conn_get_channel(c))) channel_message_log(channel,c,1,linestr); /* we don't log game commands currently */ if (linestr[0]=='/') handle_command(c,linestr); else if (channel && !conn_quota_exceeded(c,linestr)) channel_message_send(channel,message_type_talk,c,linestr); /* else discard */ } break; default: eventlog(eventlog_level_error,__FUNCTION__,"[%d] unknown bot connection state %d",conn_get_socket(c),(int)conn_get_state(c)); } } return 0; }
static int message_telnet_format(t_packet * packet, t_message_type type, t_connection * me, t_connection * dst, char const * text, unsigned int dstflags) { char * msgtemp; if (!packet) { eventlog(eventlog_level_error,"message_telnet_format","got NULL packet"); return -1; } switch (type) { case message_type_uniqueid: if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(strlen(text)+32))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"Your unique name: %s\r\n",text); break; case message_type_adduser: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(strlen(tname)+32))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"[%s is here]\r\n",tname); conn_unget_chatcharname(me,tname); } break; case message_type_join: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if (!(msgtemp = malloc(strlen(tname)+32))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"[%s enters]\r\n",tname); conn_unget_chatcharname(me,tname); } break; case message_type_part: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } { char const * tname; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if(!(msgtemp = malloc(strlen(tname)+32))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"[%s leaves]\r\n",tname); conn_unget_chatcharname(me,tname); } break; case message_type_whisper: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; char const * newtext; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(strlen(tname)+8+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); free((void *)newtext); /* avoid warning */ return -1; } sprintf(msgtemp,"<from %s> %s\r\n",tname,newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(16+strlen(tname)))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<from %s> \r\n",tname); } conn_unget_chatcharname(me,tname); } break; case message_type_talk: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; char const * newtext; if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */ return -1; if((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(strlen(tname)+4+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<%s> %s\r\n",tname,newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(strlen(tname)+8))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<%s> \r\n",tname); } conn_unget_chatcharname(me,tname); } break; case message_type_broadcast: if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * newtext; if ((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(16+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"Broadcast: %s\r\n",newtext); /* FIXME: show source? */ free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(16))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"Broadcast: \r\n"); /* FIXME: show source? */ } } break; case message_type_channel: if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (!(msgtemp = malloc(strlen(text)+32))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"Joining channel: \"%s\"\r\n",text); break; case message_type_userflags: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } /* FIXME: should we show any of these? */ if (!(msgtemp = strdup(""))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } break; case message_type_whisperack: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } { char const * tname; char const * newtext; if(!(tname = conn_get_chatcharname(me, dst))) return -1; if ((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(strlen(tname)+8+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<to %s> %s\r\n",tname,newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(strlen(tname)+8+strlen(text)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<to %s> %s\r\n",tname,text); } conn_unget_chatcharname(me,tname); } break; case message_type_channelfull: /* FIXME */ if (!(msgtemp = strdup(""))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } break; case message_type_channeldoesnotexist: /* FIXME */ if (!(msgtemp = strdup(""))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } break; case message_type_channelrestricted: /* FIXME */ if (!(msgtemp = strdup(""))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } break; case message_type_info: if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } { char const * newtext; if ((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%s\r\n",newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(strlen(text)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"%s\r\n",text); } } break; case message_type_error: if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } { char const * newtext; if ((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(8+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"ERROR: %s\r\n",newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(8+strlen(text)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"ERROR: %s\r\n",text); } } break; case message_type_emote: if (!me) { eventlog(eventlog_level_error,"message_telnet_format","got NULL connection for %s",message_type_get_str(type)); return -1; } if (!text) { eventlog(eventlog_level_error,"message_telnet_format","got NULL text for %s",message_type_get_str(type)); return -1; } if (dstflags&MF_X) return -1; /* player is ignored */ { char const * tname; char const * newtext; if(!(tname = conn_get_chatcharname(me, me))) /* FIXME: second should be dst but cache gets in the way */ return -1; if ((newtext = escape_chars(text,strlen(text)))) { if (!(msgtemp = malloc(strlen(tname)+4+strlen(newtext)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<%s %s>\r\n",tname,newtext); free((void *)newtext); /* avoid warning */ } else { if (!(msgtemp = malloc(strlen(tname)+4+strlen(text)+4))) { eventlog(eventlog_level_error,"message_telnet_format","could not allocate memory for msgtemp"); return -1; } sprintf(msgtemp,"<%s %s>\r\n",tname,text); } conn_unget_chatcharname(me,tname); } break; default: eventlog(eventlog_level_error,"message_telnet_format","got bad message type %d",(int)type); return -1; } { int retval; retval = packet_append_ntstring(packet,msgtemp); free(msgtemp); return retval; } }