/* A listener port, by Tim of The Eternal Fantasy and TimMUD
This will accept connections and then display what comes in, doesn't send anything back.
It will looks like this:
LISTENER Got a message of size [35] from fd [3]...
0 [ 70: F] [111: o] [117: u] [114: r] [ 32: ] [115: s] [ 99: c] [111: o]
8 [114: r] [101: e] [ 32: ] [ 97: a] [110: n] [100: d] [ 32: ] [115: s]
16 [101: e] [118: v] [101: e] [110: n] [ 32: ] [121: y] [101: e] [ 97: a]
24 [114: r] [115: s] [ 32: ] [ 97: a] [103: g] [111: o] [ 46: .] [ 46: .]
32 [ 46: .] [ 13:\r] [ 10:\n]
*/
#ifndef STREAM_BINARY
#define STREAM_BINARY 3
#endif
#define PORT_NUMBER 12345
#define DEBUGGER "tim"
static private int listener_socket; // socket that the listener is using
void debug(string str){
if(find_player(DEBUGGER)) tell_object(find_player(DEBUGGER),"LISTENER "+str);
// log_file("server",str);
}
static void create(){
seteuid(getuid());
call_out("setup", 5);
}
static void setup(){
int i;
debug("Setting up sniffer at "+ctime(time())+"\n");
if ((i=(listener_socket = socket_create(STREAM_BINARY, "read_callback", "close_callback"))) < 0){
debug("setup: Failed to create socket, error:"+i+"\n");
return;
}
debug("setup: created socket\n");
if ((i=socket_bind(listener_socket, PORT_NUMBER)) < 0) {
socket_close(listener_socket);
debug("setup: Failed to bind socket to port, error:"+i+"\n");
return;
}
debug("setup: bound socket, should be ready to connect to now\n");
if ((i=socket_listen(listener_socket, "listen_callback")) < 0) {
socket_close(listener_socket);
debug("setup: Failed to listen to socket, error:"+i+"\n");
}
}
static void listen_callback(int fd){
int nfd;
if ((nfd = socket_accept(fd, "read_callback", "write_callback")) < 0) {
debug("listen_callback: socket_accept failed.\n");
return;
}
debug("listen_callback: Accepted connection by fd:"+fd+"\n");
}
static void close_callback(int fd){
debug("close_callback: Closed socket fd:"+fd+"\n");
}
string esc_char(int i){
switch(i){
case '\t': return "\\t";
case '\a': return "\\a";
case '\r': return "\\r";
case '\n': return "\\n";
default: return sprintf("%c",i);
}
}
static void read_callback(int fd, buffer info){
int i; string output="";
output = "Got a message of size ["+sizeof(info)+"] from fd ["+fd+"]...";
for(i=0;i<sizeof(info);i++){
if(!(i%8)) output += sprintf("\n%4d ",i);
output += sprintf("[%3d:%2s] ",info[i],esc_char(info[i]) );
}
output += "\n";
debug(output);
// socket_write(fd,info); //Uncomment this line if you want an echo server.
return;
}
int query_prevent_shadow(object ob){ return 1; }