diff -ru freeciv-1.13.0-pl4/common/connection.h ../freeciv-1.13.0-pl4/common/connection.h --- freeciv-1.13.0-pl4/common/connection.h Sat May 18 16:11:01 2002 +++ ../freeciv-1.13.0-pl4/common/connection.h Fri Oct 11 14:55:43 2002 @@ -78,6 +78,16 @@ }; /*********************************************************** + The log connection struct... +***********************************************************/ + +struct log_connection { + int sock; + bool used; + char addr[MAX_LEN_ADDR]; +}; + +/*********************************************************** The connection struct represents a single client or server at the other end of a network connection. ***********************************************************/ diff -ru freeciv-1.13.0-pl4/common/log.c ../freeciv-1.13.0-pl4/common/log.c --- freeciv-1.13.0-pl4/common/log.c Thu Jun 27 16:41:12 2002 +++ ../freeciv-1.13.0-pl4/common/log.c Fri Oct 11 14:55:43 2002 @@ -28,6 +28,7 @@ static int log_level; static char *log_filename; static log_callback_fn log_callback; +static log_callback_fn logport_callback; int logd_init_counter = 1; struct logd_fileinfo { @@ -194,6 +195,14 @@ } /************************************************************************** +Set the logport callback. +**************************************************************************/ +void log_set_logport_callback(log_callback_fn callback) +{ + logport_callback=callback; +} + +/************************************************************************** Return an updated struct logdebug_afile_info: **************************************************************************/ struct logdebug_afile_info logdebug_update(const char *file) @@ -231,6 +240,9 @@ if (log_filename || (!log_callback)) { fprintf(fs, "%d: %s\n", level, message); } + if (logport_callback) { + logport_callback(level, message); + } } /************************************************************************** diff -ru freeciv-1.13.0-pl4/common/log.h ../freeciv-1.13.0-pl4/common/log.h --- freeciv-1.13.0-pl4/common/log.h Wed Jun 26 20:29:24 2002 +++ ../freeciv-1.13.0-pl4/common/log.h Fri Oct 11 14:55:43 2002 @@ -55,6 +55,7 @@ void log_init(char *filename, int initial_level, log_callback_fn callback); void log_set_level(int level); void log_set_callback(log_callback_fn callback); +void log_set_logport_callback(log_callback_fn callback); void real_freelog(int level, const char *message, ...) fc__attribute((format (printf, 2, 3))); diff -ru freeciv-1.13.0-pl4/server/civserver.c ../freeciv-1.13.0-pl4/server/civserver.c --- freeciv-1.13.0-pl4/server/civserver.c Thu Jun 20 16:51:28 2002 +++ ../freeciv-1.13.0-pl4/server/civserver.c Fri Oct 11 14:55:43 2002 @@ -91,6 +91,11 @@ showhelp = TRUE; break; } + } else if ((option = get_option("--Logport", argv, &inx, argc))) { + if (sscanf(option, "%d", &srvarg.logport) != 1) { + showhelp = TRUE; + break; + } } else if ((option = get_option("--read", argv, &inx, argc))) srvarg.script_filename = option; else if ((option = get_option("--quitidle", argv, &inx, argc))) { @@ -138,6 +143,7 @@ fprintf(stderr, _(" -h, --help\t\tPrint a summary of the options\n")); fprintf(stderr, _(" -i, --info INFO\tExtra info for the metaserver\n")); fprintf(stderr, _(" -l, --log FILE\tUse FILE as logfile\n")); + fprintf(stderr, _(" -L, --Logport PORT\tListen for log connections on port PORT\n")); fprintf(stderr, _(" -m, --meta\t\tnotify metaserver and send server's info\n")); fprintf(stderr, _(" -M, --Metaserver ADDR\tSet ADDR as metaserver address\n")); diff -ru freeciv-1.13.0-pl4/server/sernet.c ../freeciv-1.13.0-pl4/server/sernet.c --- freeciv-1.13.0-pl4/server/sernet.c Sun Jul 14 16:17:30 2002 +++ ../freeciv-1.13.0-pl4/server/sernet.c Fri Oct 11 15:51:04 2002 @@ -79,12 +79,14 @@ #include "sernet.h" static struct connection connections[MAX_NUM_CONNECTIONS]; +static struct log_connection log_connections[MAX_NUM_LOG_CONNECTIONS]; #ifdef GENERATING_MAC /* mac network globals */ TEndpointInfo serv_info; EndpointRef serv_ep; #else static int sock; +static int logsock; #endif #if defined(__VMS) @@ -183,6 +185,15 @@ /***************************************************************************** ... *****************************************************************************/ +static void close_log_connection(struct log_connection *lconn) +{ + my_closesocket(lconn->sock); + lconn->used = FALSE; +} + +/***************************************************************************** +... +*****************************************************************************/ void close_connections_and_socket(void) { int i; @@ -199,6 +210,13 @@ } } my_closesocket(sock); + + for(i=0; iused) { + printf("USED addr: '%s'\n", lconn->addr); + n = my_writesocket(lconn->sock, msg, strlen(msg)); + if (n < 0) { + close_log_connection(lconn); + freelog(LOG_VERBOSE, "log connection closed (%s)", lconn->addr); + } + } + } +} + +/***************************************************************************** +Check log connections +*****************************************************************************/ +static void check_log_connections(void) +{ + int i; + int max_desc; + fd_set readfs; + struct timeval tv; + char buf[512]; + int n; + + tv.tv_sec=0; + tv.tv_usec=0; + + MY_FD_ZERO(&readfs); + FD_SET(logsock, &readfs); + max_desc=logsock; + + for(i=0; i0) { + if(FD_ISSET(logsock, &readfs)) { /* new log connection */ + freelog(LOG_VERBOSE, "got new log connection"); + if(server_accept_connection(logsock)==-1) { + freelog(LOG_ERROR, "failed accepting connection"); + } + } + for(i=0; iused && FD_ISSET(lconn->sock, &readfs)) { + char *tmpchr; + + n = my_readsocket(lconn->sock, buf, 512); + if (n <= 0) { + close_log_connection(lconn); + freelog(LOG_VERBOSE, "log connection closed (%s)", lconn->addr); + continue; + } + + /* This really should be better, but hey this is the first version */ + tmpchr = strpbrk(buf, "\r\n"); + if (tmpchr != NULL) *tmpchr = '\0'; + + // todo: quit (close_log_connetion functio kans), show, help + if (strcmp(buf, "quit") == 0) { + my_writesocket(lconn->sock, "Bye bye.\n", 9); + close_log_connection(lconn); + continue; + } + + else if (strcmp(buf, "help") == 0) { + my_writesocket(lconn->sock, "help >> START\n", 14); + my_writesocket(lconn->sock, "help: quit (disconnect)\n", 24); + my_writesocket(lconn->sock, "help: help (this help)\n", 23); + my_writesocket(lconn->sock, "help: show (show rules)\n", 24); + my_writesocket(lconn->sock, "help: list (list players)\n", 26); + my_writesocket(lconn->sock, "help >> END\n", 12); + } + + else if (strcmp(buf, "show") == 0) { + my_writesocket(lconn->sock, "show >> START\n", 14); + my_writesocket(lconn->sock, "show: Not implemented\n", 22); + my_writesocket(lconn->sock, "show >> END\n", 12); + } + + // todo: show more info about player + else if (strcmp(buf, "list") == 0) { + my_writesocket(lconn->sock, "list >> START\n", 14); + players_iterate(pplayer) { + char *nation = "not set"; + + if (game.nation_count > 0) { + nation = get_nation_name(pplayer->nation); + } + + if (pplayer->ai.control == TRUE) { + char *skill; + + switch (pplayer->ai.skill_level) { + case 3: skill = "easy"; break; + case 5: skill = "normal"; break; + case 7: skill = "hard"; break; + default: skill = "unknown"; + } + + my_snprintf(buf, 512, "list: %s (AI, difficulty level %s, nation" + " %s)\n", pplayer->name, skill, nation); + + } else { + int username_len = 12 + strlen(pplayer->username); + char username[username_len]; + + memset(&username, '\0', username_len); + + if (strcmp(pplayer->name, pplayer->username) != 0) { + my_snprintf(username, username_len, + "username %s, ", pplayer->username); + } + + my_snprintf(buf, 512, "list: %s (%sHuman, nation %s) \n", + pplayer->name, username ? username : "", + nation); + + } + + my_writesocket(lconn->sock, buf, strlen(buf)); + } players_iterate_end; + my_writesocket(lconn->sock, "list >> END\n", 12); + } + + else { + my_writesocket(lconn->sock, "Unknown command. Use 'help' for help\n", + 37); + } + } + } + } +} + +/***************************************************************************** Get and handle: - new connections, - input from connections, @@ -420,6 +588,8 @@ return 0; } + check_log_connections(); + tv.tv_sec=1; tv.tv_usec=0; @@ -619,7 +789,7 @@ break; } con_prompt_off(); - + if (game.timeout != 0 && (time(NULL) > game.turn_start + game.timeout)) { return 0; } @@ -651,7 +821,8 @@ } } } - + + /******************************************************************** Server accepts connection from client: Low level socket stuff, and basic-initialize the connection struct. @@ -680,10 +851,31 @@ } my_nonblock(new_sock); - from=gethostbyaddr((char *)&fromend.sin_addr, sizeof(fromend.sin_addr), AF_INET); + /* Log connection */ + if (sockfd == logsock) { + for(i=0; iused) { + lconn->used = TRUE; + lconn->sock = new_sock; + sz_strlcpy(lconn->addr, + (from ? from->h_name : inet_ntoa(fromend.sin_addr))); + + freelog(LOG_VERBOSE, "log connection from %s", lconn->addr); + return 0; + } + } + + // rairai + my_writesocket(new_sock, "Too many connections!\n", 22); + my_closesocket(new_sock); + freelog(LOG_ERROR, "maximum number of log connections reached"); + return -1; + } + for(i=0; iused) { @@ -758,6 +950,30 @@ } close_socket_set_callback(close_socket_callback); + + /* Logging port */ + if (srvarg.logport != 0) { + if((logsock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + freelog(LOG_FATAL, "Log socket failed: %s", mystrerror(errno)); + exit(EXIT_FAILURE); + } + + memset(&src, 0, sizeof(src)); + src.sin_family = AF_INET; + src.sin_addr.s_addr = htonl(INADDR_ANY); + src.sin_port = htons(srvarg.logport); + + if(bind(logsock, (struct sockaddr *) &src, sizeof (src)) == -1) { + freelog(LOG_FATAL, "Log bind failed: %s", mystrerror(errno)); + exit(EXIT_FAILURE); + } + + if(listen(logsock, MAX_NUM_CONNECTIONS) == -1) { + freelog(LOG_FATAL, "Log listen failed: %s", mystrerror(errno)); + exit(EXIT_FAILURE); + } + } + return 0; } @@ -785,6 +1001,20 @@ #endif } +/******************************************************************** +... +********************************************************************/ +void init_log_connections(void) +{ + int i; + for(i=0; iused = FALSE; + lconn->sock = 0; + // lconn->addr = NULL; + } +} + /************************************************************************** ... **************************************************************************/ diff -ru freeciv-1.13.0-pl4/server/sernet.h ../freeciv-1.13.0-pl4/server/sernet.h --- freeciv-1.13.0-pl4/server/sernet.h Mon Sep 18 23:36:15 2000 +++ ../freeciv-1.13.0-pl4/server/sernet.h Fri Oct 11 14:55:43 2002 @@ -16,14 +16,18 @@ struct connection; #define MAX_NUM_CONNECTIONS (MAX_NUM_PLAYERS+MAX_NUM_BARBARIANS) +#define MAX_NUM_LOG_CONNECTIONS 10 #define DEFAULT_SOCK_PORT 5555 #define BUF_SIZE 512 int server_open_socket(void); void flush_packets(void); +void handle_logport_log(int level, char *message); int sniff_packets(void); void close_connections_and_socket(void); void init_connections(void); +void init_log_connections(void); void close_connection(struct connection *pconn); + #endif /* FC__SERNET_H */ diff -ru freeciv-1.13.0-pl4/server/srv_main.c ../freeciv-1.13.0-pl4/server/srv_main.c --- freeciv-1.13.0-pl4/server/srv_main.c Wed Aug 28 19:08:29 2002 +++ ../freeciv-1.13.0-pl4/server/srv_main.c Fri Oct 11 14:55:43 2002 @@ -165,8 +165,9 @@ srvarg.port = DEFAULT_SOCK_PORT; srvarg.loglevel = LOG_NORMAL; - srvarg.log_filename = NULL; + srvarg.logport = 0; + srvarg.gamelog_filename = NULL; srvarg.load_filename = NULL; srvarg.script_filename = NULL; @@ -443,7 +444,7 @@ marco_polo_make_contact(); make_history_report(); send_player_turn_notifications(NULL); - freelog(LOG_DEBUG, "Turn ended."); + freelog(LOG_NORMAL, "Turn ended."); game.turn_start = time(NULL); } @@ -892,10 +893,15 @@ **************************************************************************/ static void handle_turn_done(struct player *pplayer) { + struct connection *pconn = pplayer->current_conn; + pplayer->turn_done = TRUE; check_for_full_turn_done(); + freelog(LOG_NORMAL, "Player '%s' (%s) turn done", pplayer->name, + pconn->name); + send_player_info(pplayer, NULL); } @@ -1690,7 +1696,7 @@ while (sniff_packets() == 1) { /* nothing */ } - + /* After sniff, re-zero the timer: (read-out above on next loop) */ clear_timer_start(eot_timer); @@ -1756,6 +1762,7 @@ my_init_network(); con_log_init(srvarg.log_filename, srvarg.loglevel); + if (srvarg.logport != 0) log_set_logport_callback(handle_logport_log); gamelog_init(srvarg.gamelog_filename); gamelog_set_level(GAMELOG_FULL); gamelog(GAMELOG_NORMAL, _("Starting new log")); @@ -1802,6 +1809,7 @@ /* init network */ init_connections(); + init_log_connections(); server_open_socket(); if(!(srvarg.metaserver_no_send)) { diff -ru freeciv-1.13.0-pl4/server/srv_main.h ../freeciv-1.13.0-pl4/server/srv_main.h --- freeciv-1.13.0-pl4/server/srv_main.h Sat May 25 19:30:53 2002 +++ ../freeciv-1.13.0-pl4/server/srv_main.h Fri Oct 11 14:55:43 2002 @@ -31,6 +31,8 @@ int loglevel; /* filenames */ char *log_filename; + /* Logging port */ + int logport; char *gamelog_filename; char *load_filename; char *script_filename;