/*
* Telent.c For Lurking Fear
*/
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <glib.h>
#include <merc.h>
#include <telnet.h>
bool get_telnet_optns(unsigned char option)
{
bool supported = FALSE;
switch (option)
{
case TELOPT_ECHO:
supported = TRUE;
break;
default:
supported = FALSE;
break;
}
return supported;
}
/*
* Send back a standard reply to client
*/
void send_reply(DESCRIPTOR_DATA *d,unsigned char cmd, unsigned char option)
{
char reply[3];
reply[0] = IAC;
reply[1] = cmd;
reply[2] = option;
write_to_descriptor(d->descriptor,(char *)reply,3);
}
//
//Send all the options we want to support to the client
void init_telnet_optns(DESCRIPTOR_DATA *d)
{
//send_reply(d,TC_DO,option);
}
//Client is asking for a option
void process_do(DESCRIPTOR_DATA *d, unsigned char option)
{
if (get_telnet_optns(option))
{
if (d->telnet_option[option] != ACTIVE)
{
d->telnet_option[option] = ACTIVE;
send_reply(d,TC_WILL,option);
}
}
else
{
send_reply(d,TC_WONT,option);
}
}
void process_dont(DESCRIPTOR_DATA *d, unsigned char option)
{
if (d->telnet_option[option] != INACTIVE)
{
d->telnet_option[option] = INACTIVE;
send_reply(d,TC_WONT,option);
}
}
void process_will(DESCRIPTOR_DATA *d, unsigned char option)
{
}
void process_wont(DESCRIPTOR_DATA *d, unsigned char option)
{
}
int parse_telnetcommand(DESCRIPTOR_DATA *d)
{
GString *intel;
int i;
int offset;
unsigned char c;
intel = g_string_new("");
intel = g_string_assign(intel,d->inbuf);
offset = 0;
for (i = 0; i < intel->len; i++)
{
c = intel->str[i];
switch (d->s_state)
{
case TOP_LEVEL:
if (c == IAC)
d->s_state = SEEN_IAC;
break;
case SEEN_SB:
d->s_state = SUBNEGOT;
break;
case SUBNEGOT:
if (c == TC_SE)
d->s_state = TOP_LEVEL;
break;
case SEEN_SE:
d->s_state = TOP_LEVEL;
break;
case SEEN_IAC:
if (c == TC_DO)
d->s_state = SEEN_DO;
else if (c == TC_DONT)
d->s_state = SEEN_DONT;
else if (c == TC_WILL)
d->s_state = SEEN_WILL;
else if (c == TC_WONT)
d->s_state = SEEN_WONT;
else if (c == TC_SB)
d->s_state = SEEN_SB;
break;
case SEEN_DO:
process_do(d,c);
d->s_state = TOP_LEVEL;
offset = i;
offset++;
break;
case SEEN_DONT:
process_dont(d,c);
d->s_state = TOP_LEVEL;
offset = i;
offset++;
break;
case SEEN_WILL:
process_will(d,c);
d->s_state = TOP_LEVEL;
offset = i;
offset++;
break;
case SEEN_WONT:
process_wont(d,c);
d->s_state = TOP_LEVEL;
offset = i;
offset++;
break;
default:
break;
}
}
g_string_free(intel,TRUE);
return offset;
}