diff options
author | Markus Uhlin <markus@nifty-networks.net> | 2023-12-09 15:35:22 +0100 |
---|---|---|
committer | Markus Uhlin <markus@nifty-networks.net> | 2023-12-09 15:35:22 +0100 |
commit | a112b7c968921ee6e3c35c4ee2bb90008c89246a (patch) | |
tree | b1c12a64bdbe29bafd752fb79d1a5f5fe676943b | |
parent | 223dd8ae2796a226f612bae60f0d56cdd71efa89 (diff) |
Deleted *.orig
-rw-r--r-- | FICS/Makefile.in.orig | 110 | ||||
-rw-r--r-- | FICS/acconfig.h.orig | 49 | ||||
-rw-r--r-- | FICS/command.h.orig | 135 | ||||
-rw-r--r-- | FICS/comproc.c.orig | 1625 | ||||
-rw-r--r-- | FICS/ficsmain.c.orig | 171 | ||||
-rw-r--r-- | FICS/gameproc.c.orig | 2826 | ||||
-rw-r--r-- | FICS/multicol.c.orig | 153 | ||||
-rw-r--r-- | FICS/network.c.orig | 657 | ||||
-rw-r--r-- | FICS/ratings.c.orig | 1432 | ||||
-rw-r--r-- | FICS/stdinclude.h.orig | 164 | ||||
-rw-r--r-- | FICS/utils.c.orig | 991 | ||||
-rw-r--r-- | FICS/utils.h.orig | 115 | ||||
-rw-r--r-- | FICS/vers.h.orig | 31 |
13 files changed, 0 insertions, 8459 deletions
diff --git a/FICS/Makefile.in.orig b/FICS/Makefile.in.orig deleted file mode 100644 index 7b3bff1..0000000 --- a/FICS/Makefile.in.orig +++ /dev/null @@ -1,110 +0,0 @@ -## -## fics - An internet chess server. -## Copyright (C) 1993 Richard V. Nash -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## -## This is the Makefile template; see machine dependant config.h for -## more configuration options. - - -SHELL = /bin/sh -srcdir = @srcdir@ -VPATH = @srcdir@ - - -## -## Where to install FICS -## -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = ${exec_prefix}/bin - - -## -## Binaries and Options to use -## -CC = @CC@ -CFLAGS = @CFLAGS@ -DTIMESEAL -I${srcdir} -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -LIBS = @LIBS@ -LNFLAGS = @LDFLAGS@ ${LIBS} - - -## -## Version information -## -VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.3";' - - -SRCS=adminproc.c algcheck.c board.c channel.c command.c talkproc.c comproc.c \ - fics_addplayer.c ficsmain.c formula.c gamedb.c gameproc.c \ - get_tcp_conn.c legal.c lists.c makerank.c \ - movecheck.c multicol.c network.c playerdb.c ratings.c \ - rmalloc.c utils.c variable.c vers.c eco.c matchproc.c \ - timeseal.c ${MORESRCS} - -OBJS=network.o lists.o formula.o playerdb.o command.o talkproc.o comproc.o movecheck.o \ - ratings.o gamedb.o channel.o utils.o rmalloc.o legal.o vers.o variable.o \ - board.o gameproc.o algcheck.o adminproc.o \ - get_tcp_conn.o multicol.o eco.o matchproc.o timeseal.o ${MOREOBJS} - -VERSION=echo 'char SGS_VERS[]=""; char VERS_NUM[]="1.2.18"; char COMP_DATE[]="'`date`'";' - -PROGRAM=fics -ADDPLAYER=fics_addplayer -#DELPLAYER=fics_delplayer -#MAILSERVER=fics_mailproc -#MAILPROC=mailproc -MAKERANK=makerank - -ALL= ${PROGRAM} ${ADDPLAYER} ${MAKERANK} - -#all: ${PROGRAM} ${MAILSERVER} ${ADDPLAYER} ${DELPLAYER} ${MAILPROC} -all: ${ALL} - -${PROGRAM}: ficsmain.o $(OBJS) - $(CC) ficsmain.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${PROGRAM} - -#${MAILSERVER}: fics_mailproc.o $(OBJS) -# $(CC) fics_mailproc.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${MAILSERVER} - -${ADDPLAYER}: fics_addplayer.o $(OBJS) - $(CC) fics_addplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${ADDPLAYER} - -#${DELPLAYER}: fics_delplayer.o $(OBJS) -# $(CC) fics_delplayer.o $(CFLAGS) $(OBJS) $(LNFLAGS) -o ${DELPLAYER} - -#${MAILPROC}: mailproc.o lock.o network.o rmalloc.o -# $(CC) mailproc.o lock.o network.o rmalloc.o $(CFLAGS) -o ${MAILPROC} -# $(CC) mailproc.o lock.o network.o rmalloc.o memmove.o $(CFLAGS) -o ${MAILPROC} - -${MAKERANK}: makerank.o - $(CC) makerank.o $(CFLAGS) $(LNFLAGS) -o ${MAKERANK} - -vers.c: - ${VERSION} >vers.c - -depend: - makedepend -- ${CFLAGS} ${MAKEDEPMORECFLAGS} -- ${SRCS} - -clean: - rm -f *.o ${ALL} *~ vers.c - @ echo "Project cleaned." - -distclean: clean - rm -rf Makefile autoconfig.h config.h config.status config.cache \ - config.log - -install: - for f in ${ALL}; do ${INSTALL} $$f ${bindir}; done diff --git a/FICS/acconfig.h.orig b/FICS/acconfig.h.orig deleted file mode 100644 index a7f3dd8..0000000 --- a/FICS/acconfig.h.orig +++ /dev/null @@ -1,49 +0,0 @@ -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - - This file contains descriptive text for the C preprocessor macros - that are missing in the original acconfig.h of the autoconf - distribution, but used in the configure.in of the FICS distribution. - - It is used *only* by the autoheader program contained in the - autoconf distribution. - - - Leave the following blank line there!! Autoheader needs it. */ - - -/* Define this to be the return value of the time() function. */ -#undef time_t - -/* Undefine, if your compiler doesn't support prototypes */ -#undef HAVE_PROTOTYPES - -/* Define, if you have a statfs() function which fills a struct - statfs, declared in sys/vfs.h. (NeXTStep) */ -#undef HAVE_STATFS_FILLING_STRUCT_STATFS - -/* Define, if you have a statfs() function which fills a struct - fs_data, declared in sys/mount.h. (Ultrix) */ -#undef HAVE_STATFS_FILLING_STRUCT_FS_DATA - -/* Define, if you have crypt() and it is declared in either - crypt.h or unistd.h. */ -#undef HAVE_CRYPT_DECLARED - -/* Define this to be tv_usec, if your struct rusage has - a member ru_utime.tv_usec. - Define this to be tv_nsec, if your struct rusage has - a member ru_utime.tv_nsec. */ -#undef TV_USEC diff --git a/FICS/command.h.orig b/FICS/command.h.orig deleted file mode 100644 index 1d5d47f..0000000 --- a/FICS/command.h.orig +++ /dev/null @@ -1,135 +0,0 @@ -/* command.h - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#include "variable.h" -#ifndef _COMMAND_H -#define _COMMAND_H - -extern char *mess_dir; -extern char *index_dir; -extern char *help_dir[NUM_LANGS]; -extern char *comhelp_dir; -extern char *info_dir; -extern char *adhelp_dir; -extern char *stats_dir; -extern char *config_dir; -extern char *player_dir; -extern char *adj_dir; -extern char *hist_dir; -extern char *board_dir; -extern char *def_prompt; -extern char *source_dir; -extern char *lists_dir; -extern char *news_dir; - -extern char *hadmin_handle; - -extern int startuptime; -extern char fics_hostname[81]; -extern int player_high; -extern int game_high; -extern int MailGameResult; - -/* Maximum length of a login name */ -#define MAX_LOGIN_NAME 20 - -/* Maximum number of parameters per command */ -#define MAXNUMPARAMS 10 - -/* Maximum string length of a single command word */ -#define MAX_COM_LENGTH 50 - -/* Maximum string length of the whole command line */ -#define MAX_STRING_LENGTH 1024 - -#define COM_OK 0 -#define COM_FAILED 1 -#define COM_ISMOVE 2 -#define COM_AMBIGUOUS 3 -#define COM_BADPARAMETERS 4 -#define COM_BADCOMMAND 5 -#define COM_LOGOUT 6 -#define COM_FLUSHINPUT 7 -#define COM_RIGHTS 8 -#define COM_OK_NOPROMPT 9 - -#define ADMIN_USER 0 -#define ADMIN_ADMIN 10 -#define ADMIN_MASTER 20 -#define ADMIN_DEMIGOD 60 -#define ADMIN_GOD 100 - -#define TYPE_NULL 0 -/*#define TYPE_NULL NULL <-- this is WRONG WRONG WRONG! --mann 5/10/95 */ -#define TYPE_WORD 1 -#define TYPE_STRING 2 -#define TYPE_INT 3 -typedef struct u_parameter { - int type; - union { - char *word; - char *string; - int integer; - } val; -} parameter; - -typedef parameter param_list[MAXNUMPARAMS]; - -typedef struct s_command_type { - char *comm_name; - char *param_string; - int (*comm_func)(); - int adminLevel; -} command_type; - -typedef struct s_alias_type { - char *comm_name; - char *alias; -} alias_type; - -extern int commanding_player; /* The player whose command you're in */ - -extern int process_input(int, char *); -extern int process_new_connection(int, unsigned int); -extern int process_disconnection(int); -/* extern int process_incomplete(int, char *); */ -extern int process_heartbeat(int *); - -extern void commands_init(void); - -extern void TerminateCleanup(void); -extern int process_command(int, char *, char **); - - -extern int alias_lookup(); -extern int gethostname(); - -#if defined(SGI) -#else -extern int wait3(); -/* extern char tolower(); */ -/* extern int sscanf(); */ -#endif - -#endif /* _COMMAND_H */ diff --git a/FICS/comproc.c.orig b/FICS/comproc.c.orig deleted file mode 100644 index 2ec74e3..0000000 --- a/FICS/comproc.c.orig +++ /dev/null @@ -1,1625 +0,0 @@ -/* comproc.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created - foxbat 95/03/11 added filters in cmatch. -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "talkproc.h" -#include "comproc.h" -#include "command.h" -#include "utils.h" -#include "ficsmain.h" -#include "config.h" -#include "playerdb.h" -#include "network.h" -#include "rmalloc.h" -#include "channel.h" -#include "variable.h" -#include "gamedb.h" -#include "gameproc.h" -#include "board.h" -/* #include "hostinfo.h" */ -#include "multicol.h" -#include "ratings.h" -#include "formula.h" -#include "lists.h" -#include "eco.h" -#include "network.h" -#include <string.h> - -#include <sys/resource.h> - -/* grimm */ -#if defined(SGI) -#else -/* int system(char *arg); */ -#endif - -const none = 0; -const blitz_rat = 1; -const std_rat = 2; -const wild_rat = 3; - - -PUBLIC int com_rating_recalc(int p, param_list param) -{ - ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); - rating_recalc(); - return COM_OK; -} - -PUBLIC int com_more(int p, param_list param) -{ -/* in_push(IN_HELP); */ - pmore_file(p); - return COM_OK; -} - -PUBLIC int num_news = -1; - -PUBLIC int com_news(int p, param_list param) -{ - FILE *fp; - char filename[MAX_FILENAME_SIZE]; - char junk[MAX_LINE_SIZE]; - char *junkp; - int crtime, found = 0; - char count[10]; - - if (num_news == -1) { - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Cant find news index.\n"); - return COM_OK; - } - num_news = count_lines(fp); - fclose(fp); /* It's customary to close files after use! */ - } - - if (param[0].type == 0) { - /* no params - then just display index over news */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - pprintf(p,"Index of recent news items:\n"); - while (!feof(fp)) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - if (atoi(count) > num_news - 10) { - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); - } - } - } - fclose(fp); - } else if ((param[0].type == TYPE_WORD) && !strcmp(param[0].val.word, "all")) { - /* param all - displays all news items */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - pprintf(p, "Index of all news items:\n"); - while (!feof(fp)) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); - } - } - fclose(fp); /* It's customary to close files after use! */ - } else { /* check if the specific news file exist in index */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - while (!feof(fp) && !found) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - if (!strcmp(count, param[0].val.word)) { - found = 1; - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "NEWS %3s (%s) %s\n", count, strltime(&crtime), junkp); - } - } - } - fclose(fp); - if (!found) { - pprintf(p, "Bad index number!\n"); - return COM_OK; - } - /* file exists - show it */ - sprintf(filename, "%s/news.%s", news_dir, param[0].val.word); - fp = fopen(filename, "r"); - if (!fp) { - pprintf(p, "No more info.\n"); - return COM_OK; - } - fclose(fp); - sprintf(filename, "news.%s", param[0].val.word); - if (psend_file(p, news_dir, filename) < 0) { - pprintf(p, "Internal error - couldn't send news file!\n"); - } - } - return COM_OK; -} - -PUBLIC int com_quit(int p, param_list param) -{ - if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { - pcommand(p, "unexamine"); - } - - if (parray[p].game >= 0) { - pprintf(p, "You can't quit while you are playing a game.\nType 'resign' to resign the game, or you can request an abort with 'abort'.\n"); - return COM_OK; - } - psend_logoutfile(p, mess_dir, MESS_LOGOUT); - return COM_LOGOUT; -} - -PUBLIC int com_set(int p, param_list param) -{ - int result; - int which; - char *val; - - if (param[1].type == TYPE_NULL) - val = NULL; - else - val = param[1].val.string; - result = var_set(p, param[0].val.word, val, &which); - switch (result) { - case VAR_OK: - break; - case VAR_BADVAL: - pprintf(p, "Bad value given for variable %s.\n", param[0].val.word); - break; - case VAR_NOSUCH: - pprintf(p, "No such variable name %s.\n", param[0].val.word); - break; - case VAR_AMBIGUOUS: - pprintf(p, "Ambiguous variable name %s.\n", param[0].val.word); - break; - } - player_save(p); - return COM_OK; -} - -PUBLIC int FindPlayer(int p, parameter * param, int *p1, int *connected) -{ - if (param->type == TYPE_WORD) { - *p1 = player_search(p, param->val.word); - if (*p1 == 0) - return 0; - if (*p1 < 0) { /* player had to be connected and will be - removed later */ - *connected = 0; - *p1 = (-*p1) - 1; - } else { - *connected = 1; - *p1 = *p1 - 1; - } - } else { - *p1 = p; - *connected = 1; - } - return 1; -} - -PRIVATE void com_stats_andify(int *numbers, int howmany, char *dest) -{ - char tmp[10]; - - *dest = '\0'; - while (howmany--) { - sprintf(tmp, "%d", numbers[howmany]); - strcat(dest, tmp); - if (howmany > 1) - sprintf(tmp, ", "); - else if (howmany == 1) - sprintf(tmp, " and "); - else - sprintf(tmp, ".\n"); - strcat(dest, tmp); - } - return; -} - -PRIVATE void com_stats_rating(char *hdr, statistics * stats, char *dest) -{ - char tmp[100]; - - sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", - hdr, ratstr(stats->rating), stats->sterr, stats->win, stats->los, stats->dra, stats->num); - if (stats->whenbest) { - sprintf(tmp, " %d", stats->best); - strcat(dest, tmp); - strftime(tmp, sizeof(tmp), " (%d-%b-%y)", localtime((time_t *) & stats->whenbest)); - strcat(dest, tmp); - } - strcat(dest, "\n"); - return; -} - -PUBLIC int com_stats(int p, param_list param) -{ - int g, i, t; - int p1, connected; - char line[255], tmp[255]; - int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; - int days, hours, mins, secs, onTime; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - sprintf(line, "\nStatistics for %-11s ", parray[p1].name); - if ((connected) && (parray[p1].status == PLAYER_PROMPT)) { - sprintf(tmp, "On for: %s", hms(player_ontime(p1), 0, 0, 0)); - strcat(line, tmp); - sprintf(tmp, " Idle: %s\n", hms(player_idle(p1), 0, 0, 0)); - } else { - if ((t = player_lastdisconnect(p1))) - sprintf(tmp, "(Last disconnected %s):\n", strltime(&t)); - else - sprintf(tmp, "(Never connected.)\n"); - } - strcat(line, tmp); - pprintf(p, "%s", line); - if (parray[p1].simul_info.numBoards) { - for (i = 0, t = 0; i < parray[p1].simul_info.numBoards; i++) { - if ((numbers[t] = parray[p1].simul_info.boards[i] + 1) != 0) - t++; - } - pprintf(p, "%s is giving a simul: game%s ", parray[p1].name, ((t > 1) ? "s" : "")); - com_stats_andify(numbers, t, tmp); - pprintf(p, tmp); - } else if (parray[p1].game >= 0) { - g = parray[p1].game; - if (garray[g].status == GAME_EXAMINE) { - pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, - garray[g].white_name, garray[g].black_name); - } else { - pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, - parray[garray[g].white].name, parray[garray[g].black].name); - } - } - if (parray[p1].num_observe) { - for (i = 0, t = 0; i < parray[p1].num_observe; i++) { - g = parray[p1].observe_list[i]; - if ((g != -1) && ((parray[p].adminLevel >= ADMIN_ADMIN) || (garray[g].private == 0))) - numbers[t++] = g + 1; - } - if (t) { - pprintf(p, "%s is observing game%s ", parray[p1].name, ((t > 1) ? "s" : "")); - com_stats_andify(numbers, t, tmp); - pprintf(p, tmp); - } - } - if (parray[p1].busy[0]) { - pprintf(p, "(%s %s)\n", parray[p1].name, parray[p1].busy); - } - if (!parray[p1].registered) { - pprintf(p, "%s is NOT a registered player.\n\n", parray[p1].name); - } else { - pprintf(p, "\n rating RD win loss draw total best\n"); - com_stats_rating("Blitz", &parray[p1].b_stats, tmp); - pprintf(p, tmp); - com_stats_rating("Standard", &parray[p1].s_stats, tmp); - pprintf(p, tmp); - com_stats_rating("Wild", &parray[p1].w_stats, tmp); - pprintf(p, tmp); - } - pprintf(p, "\n"); - if (parray[p1].adminLevel > 0) { - pprintf(p, "Admin Level: "); - switch (parray[p1].adminLevel) { -/* - case 0: - pprintf(p, "Normal User\n"); - break; - case 5: - pprintf(p, "Extra Cool User\n"); vek wants to be 5 - break; - - Forget it - you can do some admin stuff if your level is > than 0 - DAV - -*/ - case 5: - pprintf(p, "Authorized Helper Person\n"); - break; - case 10: - pprintf(p, "Administrator\n"); - break; - case 15: - pprintf(p, "Help File Librarian/Administrator\n"); - break; - case 20: - pprintf(p, "Master Administrator\n"); - break; - case 50: - pprintf(p, "Master Help File Librarian/Administrator\n"); - break; - case 60: - pprintf(p, "Assistant Super User\n"); - break; - case 100: - pprintf(p, "Super User\n"); - break; - default: - pprintf(p, "%d\n", parray[p1].adminLevel); - break; - } - } - if (parray[p].adminLevel > 0) - pprintf(p, "Full Name : %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); - if (((p1 == p) && (parray[p1].registered)) || (parray[p].adminLevel > 0)) - pprintf(p, "Address : %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); - if (parray[p].adminLevel > 0) { - pprintf(p, "Host : %s\n", -/* - ((hp = gethostbyaddr((const char*) (connected ? &parray[p1].thisHost : &parray[p1].lastHost), sizeof(parray[p1].thisHost), AF_INET)) == 0) ? "" : hp->h_name, -*/ - dotQuad(connected ? parray[p1].thisHost : parray[p1].lastHost)); - } - if ((parray[p].adminLevel > 0) && (parray[p1].registered)) - if (parray[p1].num_comments) - pprintf(p, "Comments : %d\n", parray[p1].num_comments); - - if (connected && parray[p1].registered && (p==p1 || - (parray[p].adminLevel > 0))) { - char *timeToStr = ctime((time_t *) &parray[p1].timeOfReg); - - timeToStr[strlen(timeToStr)-1]='\0'; - pprintf(p, "\n"); - onTime = (time(0) - parray[p1].logon_time) + parray[p1].totalTime; - days = (onTime / (60*60*24)); - hours = ((onTime % (60*60*24)) / (60*60)); - mins = (((onTime % (60*60*24)) % (60*60)) / 60); - secs = (((onTime % (60*60*24)) % (60*60)) % 60); - if ((days==0) && (hours==0) && (mins==0)) { - pprintf(p, "Total time on-line: %d second%s\n", - secs, (secs==1) ? "" : "s"); - } else if ((days==0) && (hours==0)) { - pprintf(p, "Total time on-line: %d minute%s and %d second%s\n", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else if (days==0) { - pprintf(p, "Total time on-line: %d hour%s, %d minute%s and %d " - "second%s\n", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else { - pprintf(p, "Total time on-line: %d day%s, %d hour%s, %d minute%s " - "and %d second%s\n", - days, (days==1) ? "" : "s", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } - pprintf(p, "%% of life on-line: %3.1f (since %s)\n", - (double)((onTime*100)/(double)(time(0)-parray[p1].timeOfReg)), - timeToStr); - } - -#ifdef TIMESEAL - - if (connected) - pprintf(p, "\nTimeseal : %s\n", (con[parray[p1].socket].timeseal) -? "On" : "Off"); - if ((parray[p].adminLevel > 0) && (connected)) { - if (findConnection(parray[p1].socket)) { - pprintf(p, "Unix acc : %s\nSystem/OS : %s\n", - con[parray[p1].socket].user, - con[parray[p1].socket].sys); - } - } - -#endif - - if (parray[p1].num_plan) { - pprintf(p, "\n"); - for (i = 0; i < parray[p1].num_plan; i++) - pprintf(p, "%2d: %s\n", i + 1, (parray[p1].planLines[i] != NULL) ? parray[p1].planLines[i] : ""); - } - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_variables(int p, param_list param) -{ - int p1, connected; - int i; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - pprintf(p, "Variable settings of %s:\n", parray[p1].name); -/* if (parray[p1].fullName) - pprintf(p, " Realname: %s\n", parray[p1].fullName); -*/ - if (parray[p1].uscfRating) - pprintf(p, " USCF: %d\n", parray[p1].uscfRating); - pprintf(p, " time=%-3d inc=%-3d private=%d Lang=%s\n", - parray[p1].d_time, parray[p1].d_inc, parray[p1].private, - Language(parray[p1].language)); - pprintf(p, " rated=%d ropen=%d open=%d simopen=%d\n", - parray[p1].rated, parray[p1].ropen, parray[p1].open, parray[p1].sopen); - pprintf(p, " shout=%d cshout=%d kib=%d tell=%d notifiedby=%d\n", - parray[p1].i_shout, parray[p1].i_cshout, parray[p1].i_kibitz, parray[p1].i_tell, parray[p1].notifiedby); - pprintf(p, " pin=%d gin=%d style=%-3d flip=%d\n", - parray[p1].i_login, parray[p1].i_game, parray[p1].style + 1, parray[p1].flip); - pprintf(p, " highlight=%d bell=%d auto=%d mailmess=%d pgn=%d\n", - parray[p1].highlight, parray[p1].bell, parray[p1].automail, parray[p1].i_mailmess, parray[p1].pgn); - pprintf(p, " width=%-3d height=%-3d\n", - parray[p1].d_width, parray[p1].d_height); - if (parray[p1].prompt && parray[p1].prompt != def_prompt) - pprintf(p, " Prompt: %s\n", parray[p1].prompt); - - { /* added code to print channels */ - int count = 0; - for (i = 0; i < MAX_CHANNELS; i++) { - if (on_channel(i, p1)) { - if (!count) - pprintf(p, "\n Channels:"); - pprintf(p, " %d", i); - count++; - } - } - if (count) - pprintf(p, "\n"); - } -/* if (parray[p1].numAlias && (p == p1)) { - pprintf(p, "\n Aliases:\n"); - for (i = 0; i < parray[p1].numAlias; i++) { - pprintf(p, " %s %s\n", parray[p1].alias_list[i].comm_name, - parray[p1].alias_list[i].alias); - } - } -*/ - if (parray[p1].num_formula) { - pprintf(p, "\n"); - for (i = 0; i < parray[p1].num_formula; i++) { - if (parray[p1].formulaLines[i] != NULL) - pprintf(p, " f%d: %s\n", i + 1, parray[p1].formulaLines[i]); - else - pprintf(p, " f%d:\n", i + 1); - } - } - if (parray[p1].formula != NULL) - pprintf(p, "\nFormula: %s\n", parray[p1].formula); - - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_password(int p, param_list param) -{ - char *oldpassword = param[0].val.word; - char *newpassword = param[1].val.word; - char salt[3]; - - if (!parray[p].registered) { - pprintf(p, "Setting a password is only for registered players.\n"); - return COM_OK; - } - if (parray[p].passwd) { - salt[0] = parray[p].passwd[0]; - salt[1] = parray[p].passwd[1]; - salt[2] = '\0'; - if (strcmp(crypt(oldpassword, salt), parray[p].passwd)) { - pprintf(p, "Incorrect password, password not changed!\n"); - return COM_OK; - } - rfree(parray[p].passwd); - parray[p].passwd = NULL; - } - salt[0] = 'a' + rand() % 26; - salt[1] = 'a' + rand() % 26; - salt[2] = '\0'; - parray[p].passwd = strdup(crypt(newpassword, salt)); - pprintf(p, "Password changed to \"%s\".\n", newpassword); - return COM_OK; -} - -PUBLIC int com_uptime(int p, param_list param) -{ - unsigned long uptime = time(0) - startuptime; - struct rusage ru; - int days = (uptime / (60*60*24)); - int hours = ((uptime % (60*60*24)) / (60*60)); - int mins = (((uptime % (60*60*24)) % (60*60)) / 60); - int secs = (((uptime % (60*60*24)) % (60*60)) % 60); - - pprintf(p, "Server location: %s Server version : %s\n", fics_hostname,VERS_NUM); - pprintf(p, "The server has been up since %s.\n", strltime(&startuptime)); - if ((days==0) && (hours==0) && (mins==0)) { - pprintf(p, "(Up for %d second%s)\n", - secs, (secs==1) ? "" : "s"); - } else if ((days==0) && (hours==0)) { - pprintf(p, "(Up for %d minute%s and %d second%s)\n", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else if (days==0) { - pprintf(p, "(Up for %d hour%s, %d minute%s and %d second%s)\n", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else { - pprintf(p, "(Up for %d day%s, %d hour%s, %d minute%s and %d second%s)\n", - days, (days==1) ? "" : "s", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } - pprintf(p, "\nAllocs: %u Frees: %u Allocs In Use: %u\n", - malloc_count, free_count, malloc_count - free_count); - if (parray[p].adminLevel >= ADMIN_ADMIN) { - pprintf(p, "\nplayer size:%d, game size:%d, con size:%d, g_num:%d\n", - sizeof(player), sizeof(game), net_consize(), g_num); - getrusage(RUSAGE_SELF, &ru); - pprintf(p, "pagesize = %d, maxrss = %d, total = %d\n", getpagesize(), ru.ru_maxrss, getpagesize() * ru.ru_maxrss); - } - pprintf(p, "\nPlayer limit: %d\n", max_connections); - pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(), player_high); - pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), game_high); - pprintf(p, "\nCompiled on %s\n", COMP_DATE); - return COM_OK; -} - -PUBLIC int com_date(int p, param_list param) -{ - int t = time(0); - pprintf(p, "Local time - %s\n", strltime(&t)); - pprintf(p, "Greenwich time - %s\n", strgtime(&t)); - return COM_OK; -} - -char *inout_string[] = { - "login", "logout" -}; - -PRIVATE int plogins(p, fname) -int p; -char *fname; -{ - FILE *fp; - int inout, thetime, registered; - char loginName[MAX_LOGIN_NAME + 1]; - char ipstr[20]; - - fp = fopen(fname, "r"); - if (!fp) { - pprintf(p, "Sorry, no login information available.\n"); - return COM_OK; - } - while (!feof(fp)) { - if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, - ®istered, ipstr) != 5) { - fprintf(stderr, "FICS: Error in login info format. %s\n", fname); - fclose(fp); - return COM_OK; - } - pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, - inout_string[inout]); - if (parray[p].adminLevel > 0) { - pprintf(p, " from %s\n", ipstr); - } else - pprintf(p, "\n"); - } - fclose(fp); - return COM_OK; -} - -PUBLIC int com_llogons(int p, param_list param) -{ - char fname[MAX_FILENAME_SIZE]; - - sprintf(fname, "%s/%s", stats_dir, STATS_LOGONS); - return plogins(p, fname); -} - -PUBLIC int com_logons(int p, param_list param) -{ - char fname[MAX_FILENAME_SIZE]; - - if (param[0].type == TYPE_WORD) { - sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, param[0].val.word[0], param[0].val.word, STATS_LOGONS); - } else { - sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].login, STATS_LOGONS); - } - return plogins(p, fname); -} - -#define WHO_OPEN 0x01 -#define WHO_CLOSED 0x02 -#define WHO_RATED 0x04 -#define WHO_UNRATED 0x08 -#define WHO_FREE 0x10 -#define WHO_PLAYING 0x20 -#define WHO_REGISTERED 0x40 -#define WHO_UNREGISTERED 0x80 - -PRIVATE void who_terse(int p, int num, int *plist, int type) -{ - char ptmp[80 + 20]; /* for highlight */ - multicol *m = multicol_start(PARRAY_SIZE); - int i; - int p1; - int rat; - - /* altered DAV 3/15/95 */ - - for (i = 0; i < num; i++) { - p1 = plist[i]; - if (type == blitz_rat) - rat = parray[p1].b_stats.rating; - if (type == wild_rat) - rat = parray[p1].w_stats.rating; - if (type == std_rat) - rat = parray[p1].s_stats.rating; - - if (type == none) { - sprintf(ptmp, " "); - } else { - sprintf(ptmp, "%-4s", ratstrii(rat, parray[p1].registered)); - if (parray[p1].simul_info.numBoards) { - strcat(ptmp, "~"); - } else if ((parray[p1].game >= 0) && (garray[parray[p1].game].status == GAME_EXAMINE)) { - strcat(ptmp, "#"); - } else if (parray[p1].game >= 0) { - strcat(ptmp, "^"); - } else if (!parray[p1].open) { - strcat(ptmp, ":"); - } else if (player_idle(p1) > 300) { - strcat(ptmp, "."); - } else { - strcat(ptmp, " "); - } - } - if (p == p1) { - psprintf_highlight(p, ptmp + strlen(ptmp), "%s", parray[p1].name); - } else { - strcat(ptmp, parray[p1].name); - } - if ((parray[p1].adminLevel >= 10) && (parray[p1].i_admin)) - strcat(ptmp, "(*)"); - if (in_list("computer", parray[p1].name)) - strcat(ptmp, "(C)"); -/* grimm's fishlist - if (in_list("fish", parray[p1].name)) strcat(ptmp, "(Fish)"); -*/ - if (in_list("fm", parray[p1].name)) - strcat(ptmp, "(FM)"); - if (in_list("im", parray[p1].name)) - strcat(ptmp, "(IM)"); - if (in_list("gm", parray[p1].name)) - strcat(ptmp, "(GM)"); - if (in_list("td", parray[p1].name)) - strcat(ptmp, "(TD)"); - multicol_store(m, ptmp); - } - multicol_pprint(m, p, 80, 2); - multicol_end(m); - pprintf(p, "\n %d Players displayed (of %d). (*) indicates system administrator.\n", num, player_count()); -} - -PRIVATE void who_verbose(p, num, plist) -int p; -int num; -int plist[]; -{ - int i, p1; - char playerLine[255], tmp[255]; /* +8 for highlight */ - - pprintf(p, - " +---------------------------------------------------------------+\n" - ); - pprintf(p, - " | User Standard Blitz On for Idle |\n" - ); - pprintf(p, - " +---------------------------------------------------------------+\n" - ); - - for (i = 0; i < num; i++) { - p1 = plist[i]; - - strcpy(playerLine, " |"); - - if (parray[p1].game >= 0) - sprintf(tmp, "%3d", parray[p1].game + 1); - else - sprintf(tmp, " "); - strcat(playerLine, tmp); - - if (!parray[p1].open) - sprintf(tmp, "X"); - else - sprintf(tmp, " "); - strcat(playerLine, tmp); - - if (parray[p1].registered) - if (parray[p1].rated) { - sprintf(tmp, " "); - } else { - sprintf(tmp, "u"); - } - else - sprintf(tmp, "U"); - strcat(playerLine, tmp); - - /* Modified by DAV 3/15/95 */ - if (p == p1) { - strcpy(tmp, " "); - psprintf_highlight(p, tmp + strlen(tmp), "%-17s", parray[p1].name); - } else { - sprintf(tmp, " %-17s", parray[p1].name); - } - strcat(playerLine, tmp); - - sprintf(tmp, " %4s %-4s %5s ", - ratstrii(parray[p1].s_stats.rating, parray[p1].registered), - ratstrii(parray[p1].b_stats.rating, parray[p1].registered), - hms(player_ontime(p1), 0, 0, 0)); - strcat(playerLine, tmp); - - if (player_idle(p1) >= 60) { - sprintf(tmp, "%5s |\n", hms(player_idle(p1), 0, 0, 0)); - } else { - sprintf(tmp, " |\n"); - } - strcat(playerLine, tmp); - pprintf(p, "%s", playerLine); - } - - pprintf(p, - " | |\n" - ); - pprintf(p, - " | %3d Players Displayed |\n", - num - ); - pprintf(p, - " +---------------------------------------------------------------+\n" - ); -} - -PRIVATE void who_winloss(p, num, plist) -int p; -int num; -int plist[]; -{ - int i, p1; - char playerLine[255], tmp[255]; /* for highlight */ - - pprintf(p, - "Name Stand win loss draw Blitz win loss draw idle\n" - ); - pprintf(p, - "---------------- ----- ------------- ----- ------------- ----\n" - ); - - for (i = 0; i < num; i++) { - p1 = plist[i]; - if (p1 == p) { - psprintf_highlight(p, playerLine, "%-17s", parray[p1].name); - } else { - sprintf(playerLine, "%-17s", parray[p1].name); - } - sprintf(tmp, " %4s %4d %4d %4d ", - ratstrii(parray[p1].s_stats.rating, parray[p1].registered), - (int) parray[p1].s_stats.win, - (int) parray[p1].s_stats.los, - (int) parray[p1].s_stats.dra); - strcat(playerLine, tmp); - - sprintf(tmp, "%4s %4d %4d %4d ", - ratstrii(parray[p1].b_stats.rating, parray[p1].registered), - (int) parray[p1].b_stats.win, - (int) parray[p1].b_stats.los, - (int) parray[p1].b_stats.dra); - strcat(playerLine, tmp); - - if (player_idle(p1) >= 60) { - sprintf(tmp, "%5s\n", hms(player_idle(p1), 0, 0, 0)); - } else { - sprintf(tmp, " \n"); - } - strcat(playerLine, tmp); - - pprintf(p, "%s", playerLine); - } - pprintf(p, " %3d Players Displayed.\n", num); -} - -PRIVATE int who_ok(p, sel_bits) -int p; -unsigned int sel_bits; -{ - if (parray[p].status != PLAYER_PROMPT) - return 0; - if (sel_bits == 0xff) - return 1; - if (sel_bits & WHO_OPEN) - if (!parray[p].open) - return 0; - if (sel_bits & WHO_CLOSED) - if (parray[p].open) - return 0; - if (sel_bits & WHO_RATED) - if (!parray[p].rated) - return 0; - if (sel_bits & WHO_UNRATED) - if (parray[p].rated) - return 0; - if (sel_bits & WHO_FREE) - if (parray[p].game >= 0) - return 0; - if (sel_bits & WHO_PLAYING) - if (parray[p].game < 0) - return 0; - if (sel_bits & WHO_REGISTERED) - if (!parray[p].registered) - return 0; - if (sel_bits & WHO_UNREGISTERED) - if (parray[p].registered) - return 0; - return 1; -} - - -PRIVATE int blitz_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].b_stats.rating > parray[p2].b_stats.rating) - return -1; - if (parray[p1].b_stats.rating < parray[p2].b_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int stand_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].s_stats.rating > parray[p2].s_stats.rating) - return -1; - if (parray[p1].s_stats.rating < parray[p2].s_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int wild_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].w_stats.rating > parray[p2].w_stats.rating) - return -1; - if (parray[p1].w_stats.rating < parray[p2].w_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int alpha_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PUBLIC void sort_players(int players[PARRAY_SIZE], - int ((*cmp_func) (const void *, const void *))) -{ - int i; - - for (i = 0; i < p_num; i++) { - players[i] = i; - } - qsort(players, p_num, sizeof(int), cmp_func); -} - -/* This is the of the most compliclicated commands in terms of parameters */ -PUBLIC int com_who(int p, param_list param) -{ - int style = 0; - float stop_perc = 1.0; - float start_perc = 0; - unsigned int sel_bits = 0xff; - int sortlist[PARRAY_SIZE], plist[PARRAY_SIZE]; - int ((*cmp_func) (const void *, const void *)) = blitz_cmp; - int startpoint; - int stoppoint; - int i, len; - int tmpI, tmpJ; - char c; - int p1, count, num_who; - int sort_type = blitz_rat; - - if (param[0].type == TYPE_WORD) { - len = strlen(param[0].val.word); - for (i = 0; i < len; i++) { - c = param[0].val.word[i]; - if (isdigit(c)) { - if (i == 0 || !isdigit(param[0].val.word[i - 1])) { - tmpI = c - '0'; - if (tmpI == 1) { - start_perc = 0.0; - stop_perc = 0.333333; - } else if (tmpI == 2) { - start_perc = 0.333333; - stop_perc = 0.6666667; - } else if (tmpI == 3) { - start_perc = 0.6666667; - stop_perc = 1.0; - } else if ((i == len - 1) || (!isdigit(param[0].val.word[i + 1]))) - return COM_BADPARAMETERS; - } else { - tmpI = c - '0'; - tmpJ = param[0].val.word[i - 1] - '0'; - if (tmpI == 0) - return COM_BADPARAMETERS; - if (tmpJ > tmpI) - return COM_BADPARAMETERS; - start_perc = ((float) tmpJ - 1.0) / (float) tmpI; - stop_perc = ((float) tmpJ) / (float) tmpI; - } - } else { - switch (c) { - case 'o': - if (sel_bits == 0xff) - sel_bits = WHO_OPEN; - else - sel_bits |= WHO_OPEN; - break; - case 'r': - if (sel_bits == 0xff) - sel_bits = WHO_RATED; - else - sel_bits |= WHO_RATED; - break; - case 'f': - if (sel_bits == 0xff) - sel_bits = WHO_FREE; - else - sel_bits |= WHO_FREE; - break; - case 'a': - if (sel_bits == 0xff) - sel_bits = WHO_FREE | WHO_OPEN; - else - sel_bits |= (WHO_FREE | WHO_OPEN); - break; - case 'R': - if (sel_bits == 0xff) - sel_bits = WHO_REGISTERED; - else - sel_bits |= WHO_REGISTERED; - break; - case 'l': /* Sort order */ - cmp_func = alpha_cmp; - sort_type = none; - break; - case 'A': /* Sort order */ - cmp_func = alpha_cmp; - break; - case 'w': /* Sort order */ - cmp_func = wild_cmp; - sort_type = wild_rat; - break; - case 's': /* Sort order */ - cmp_func = stand_cmp; - sort_type = std_rat; - break; - case 'b': /* Sort order */ - cmp_func = blitz_cmp; - sort_type = blitz_rat; - break; - case 't': /* format */ - style = 0; - break; - case 'v': /* format */ - style = 1; - break; - case 'n': /* format */ - style = 2; - break; - case 'U': - if (sel_bits == 0xff) - sel_bits = WHO_UNREGISTERED; - else - sel_bits |= WHO_UNREGISTERED; - break; - default: - return COM_BADPARAMETERS; - break; - } - } - } - } - sort_players(sortlist, cmp_func); - count = 0; - for (p1 = 0; p1 < p_num; p1++) { - if (!who_ok(sortlist[p1], sel_bits)) - continue; - count++; - } - startpoint = floor((float) count * start_perc); - stoppoint = ceil((float) count * stop_perc) - 1; - num_who = 0; - count = 0; - for (p1 = 0; p1 < p_num; p1++) { - if (!who_ok(sortlist[p1], sel_bits)) - continue; - if ((count >= startpoint) && (count <= stoppoint)) { - plist[num_who++] = sortlist[p1]; - } - count++; - } - if (num_who == 0) { - pprintf(p, "No logged in players match the flags in your who request.\n"); - return COM_OK; - } - switch (style) { - case 0: /* terse */ - who_terse(p, num_who, plist, sort_type); - break; - case 1: /* verbose */ - who_verbose(p, num_who, plist); - break; - case 2: /* win-loss */ - who_winloss(p, num_who, plist); - break; - default: - return COM_BADPARAMETERS; - break; - } - return COM_OK; -} - -PUBLIC int com_refresh(int p, param_list param) -{ - int g, p1; - - if (param[0].type == TYPE_NULL) { - if (parray[p].game >= 0) { - send_board_to(parray[p].game, p); - } else { /* Do observing in here */ - if (parray[p].num_observe) { - for (g = 0; g < parray[p].num_observe; g++) { - send_board_to(parray[p].observe_list[g], p); - } - } else { - pprintf(p, "You are neither playing, observing nor examining a game.\n"); - return COM_OK; - } - } - } else { - g = GameNumFromParam (p, &p1, ¶m[0]); - if (g < 0) - return COM_OK; - if ((g >= g_num) || ((garray[g].status != GAME_ACTIVE) - && (garray[g].status != GAME_EXAMINE))) { - pprintf(p, "No such game.\n"); - } else if (garray[g].private && parray[p].adminLevel==ADMIN_USER) { - pprintf (p, "Sorry, game %d is a private game.\n", g+1); - } else { - if (garray[g].private) - pprintf(p, "Refreshing PRIVATE game %d\n", g+1); - send_board_to(g, p); - } - } - return COM_OK; -} - -PUBLIC int com_open(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set open")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_simopen(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set simopen")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_bell(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set bell")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_flip(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set flip")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_highlight(int p, param_list param) -{ - pprintf(p, "Obsolete command. Please do set highlight <0-15>.\n"); - return COM_OK; -} - -PUBLIC int com_style(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_INT); - if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_promote(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_WORD); - if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_alias(int p, param_list param) -{ - int al; - - if (param[0].type == TYPE_NULL) { - for (al = 0; al < parray[p].numAlias; al++) { - pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, - parray[p].alias_list[al].alias); - } - return COM_OK; - } - al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); - if (param[1].type == TYPE_NULL) { - if (al < 0) { - pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); - } else { - pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, - parray[p].alias_list[al].alias); - } - } else { - if (al < 0) { - if (parray[p].numAlias >= MAX_ALIASES - 1) { - pprintf(p, "You have your maximum of %d aliases.\n", MAX_ALIASES - 1); - } else { - - if (!strcmp(param[0].val.string, "quit")) { /* making sure they - can't alias quit */ - pprintf(p, "You can't alias this command.\n"); - } else if (!strcmp(param[0].val.string, "unalias")) { /* making sure they - can't alias unalias - :) */ - pprintf(p, "You can't alias this command.\n"); - } else { - parray[p].alias_list[parray[p].numAlias].comm_name = - strdup(param[0].val.word); - parray[p].alias_list[parray[p].numAlias].alias = - strdup(param[1].val.string); - parray[p].numAlias++; - pprintf(p, "Alias set.\n"); - - } - } - } else { - rfree(parray[p].alias_list[al].alias); - parray[p].alias_list[al].alias = strdup(param[1].val.string); - pprintf(p, "Alias replaced.\n"); - } - parray[p].alias_list[parray[p].numAlias].comm_name = NULL; - } - return COM_OK; -} - -PUBLIC int com_unalias(int p, param_list param) -{ - int al; - int i; - - ASSERT(param[0].type == TYPE_WORD); - al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); - if (al < 0) { - pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); - } else { - rfree(parray[p].alias_list[al].comm_name); - rfree(parray[p].alias_list[al].alias); - for (i = al; i < parray[p].numAlias; i++) { - parray[p].alias_list[i].comm_name = parray[p].alias_list[i + 1].comm_name; - parray[p].alias_list[i].alias = parray[p].alias_list[i + 1].alias; - } - parray[p].numAlias--; - parray[p].alias_list[parray[p].numAlias].comm_name = NULL; - pprintf(p, "Alias removed.\n"); - } - return COM_OK; -} - -PUBLIC int com_servers(int p, param_list param) -{ -/* - int i; - - ASSERT(param[0].type == TYPE_NULL); - if (numServers == 0) { - */ pprintf(p, "There are no other servers known to this server.\n"); - return COM_OK; -} - /* pprintf(p, "There are %d known servers.\n", numServers); pprintf(p, "(Not - all of these may be active)\n"); pprintf(p, "%-30s%-7s\n", "HOST", - "PORT"); for (i = 0; i < numServers; i++) pprintf(p, "%-30s%-7d\n", - serverNames[i], serverPorts[i]); return COM_OK; } */ - -PUBLIC int com_index(int p, param_list param) -{ - int i; - char index_default[] = "_index"; - char *iwant, *filenames[100]; /* enough for all index filenames */ - - if (param[0].type == TYPE_NULL) { - iwant = index_default; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in category %s.\n", iwant); - return COM_OK; - } - } - - i = search_directory(index_dir, iwant, filenames, 1000); - if (i == 0) { - pprintf(p, "No index entry for \"%s\".\n", iwant); - } else if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, index_dir, *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Index file %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - pprintf(p, "Matches:"); - display_directory(p, filenames, i); - } - return COM_OK; -} - -PUBLIC int com_help(int p, param_list param) -{ - int i, UseLang = parray[p].language; - char help_default[] = "_help"; - char *iwant, *filenames[1000]; /* enough for all helpfile names */ - - if (param[0].type == TYPE_NULL) { - iwant = help_default; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in command %s.\n", iwant); - return COM_OK; - } - } - i = search_directory(help_dir[UseLang], iwant, filenames, 1000); - if (i == 0) { - if (UseLang != LANG_DEFAULT) { - i += search_directory(help_dir[LANG_DEFAULT], iwant, filenames, 1000); - if (i > 0) { - pprintf(p, "No help available in %s; using %s instead.\n", - Language(UseLang), Language(LANG_DEFAULT)); - UseLang = LANG_DEFAULT; - } - } - if (i==0) { - pprintf(p, "No help available on \"%s\".\n", iwant); - return COM_OK; - } - } - if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, help_dir[UseLang], *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Helpfile %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - pprintf(p, "Matches:"); - display_directory(p, filenames, i); - pprintf(p, "[Type \"info\" for a list of FICS general information files.]\n"); - } - return COM_OK; -} - -PUBLIC int com_info(int p, param_list param) -{ - int n; - char *filenames[1000]; - - if ((n = search_directory(info_dir, NULL, filenames, 1000)) > 0) - display_directory(p, filenames, n); - return COM_OK; -} - -PUBLIC int com_adhelp(int p, param_list param) -{ - int i; - static char nullify = '\0'; - char *iwant, *filenames[1000]; /* enough for all helpfile names */ - - if (param[0].type == TYPE_NULL) { - iwant = &nullify; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in command %s.\n", iwant); - return COM_OK; - } - } - - i = search_directory(adhelp_dir, iwant, filenames, 1000); - if (i == 0) { - pprintf(p, "No help available on \"%s\".\n", iwant); - } else if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, adhelp_dir, *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Helpfile %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - if (*iwant) - pprintf(p, "Matches:\n"); - display_directory(p, filenames, i); - } - return COM_OK; -} - -PUBLIC int com_mailsource(int p, param_list param) -{ - static char nullify = '\0'; - char *iwant, *buffer[1000]; - char subj[81], fname[MAX_FILENAME_SIZE]; - int count; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailsource command.\n"); - return COM_OK; - } - - if (param[0].type == TYPE_NULL) { - iwant = &nullify; - } else { - iwant = param[0].val.word; - } - - count = search_directory(source_dir, iwant, buffer, 1000); - if (count == 0) { - pprintf(p, "Found no source file matching \"%s\".\n", iwant); - } else if ((count == 1) || !strcmp(iwant, *buffer)) { - sprintf(subj, "FICS source file from server %s: %s",fics_hostname,*buffer); - sprintf(fname, "%s/%s",source_dir, *buffer); - mail_file_to_user (p, subj, fname); - pprintf(p, "Source file %s sent to %s\n", *buffer, parray[p].emailAddress); - } else { - pprintf(p, "Found %d source files matching that:\n", count); - if (*iwant) - display_directory(p, buffer, count); - else { /* this junk is to get *.c *.h */ - multicol *m = multicol_start(count); - char *s; - int i; - for (i=0; i < count; i++) { - if (((s = buffer[i] + strlen(buffer[i]) - 2) >= buffer[i]) && (!strcmp(s, ".c") || !strcmp(s, ".h"))) - multicol_store(m, buffer[i]); - } - multicol_pprint(m, p, 78, 1); - multicol_end(m); - } - } - return COM_OK; -} - -PUBLIC int com_mailhelp(int p, param_list param) -{ /* Sparky */ - char subj[81], fname[MAX_FILENAME_SIZE]; - char *iwant, *buffer[1000]; - - int count; - static char nullify = '\0'; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailhelp command.\n"); - return COM_OK; - } - if (param[0].type == TYPE_NULL) - iwant = &nullify; - else - iwant = param[0].val.word; - - count = search_directory(help_dir[parray[p].language], iwant, buffer, 1000); - if (count == 0) { - pprintf(p, "Found no help file matching \"%s\".\n", iwant); - } else if (count == 1) { - sprintf(subj, "FICS help file from server %s: %s", fics_hostname, *buffer); - sprintf(fname, "%s/%s",help_dir[parray[p].language], *buffer); - mail_file_to_user (p, subj, fname); - pprintf(p, "Help file %s sent to %s\n", *buffer, parray[p].emailAddress); - } else { - pprintf(p, "Found %d helpfiles matching that:\n", count); - display_directory(p, buffer, count); - } - - return COM_OK; -} - -PUBLIC int com_handles(int p, param_list param) -{ - char *buffer[1000]; - char pdir[MAX_FILENAME_SIZE]; - int count; - - sprintf(pdir, "%s/%c", player_dir, param[0].val.word[0]); - count = search_directory(pdir, param[0].val.word, buffer, 1000); - pprintf(p, "Found %d names.\n", count); - if (count > 0) - display_directory(p, buffer, count); - return COM_OK; -} - -PUBLIC int com_getpi(int p, param_list param) -{ - int p1; - - if (!in_list("td", parray[p].name)) { - pprintf(p, "Only TD programs are allowed to use this command.\n"); - return COM_OK; - } - if (((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) { - /* Darkside suggested not to return anything */ - return COM_OK; - } - if (!parray[p1].registered) { - pprintf(p, "*getpi %s -1 -1 -1*\n", parray[p1].name); - } else { - pprintf(p, "*getpi %s %d %d %d*\n", parray[p1].name, - parray[p1].w_stats.rating, - parray[p1].b_stats.rating, - parray[p1].s_stats.rating); - } - return COM_OK; -} - -PUBLIC int com_getps(int p, param_list param) -{ - int p1; - - if ((((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) || (parray[p1].game < 0)) { - pprintf(p, "*status %s 1*\n", param[0].val.word); - return COM_OK; - } - pprintf(p, "*status %s 0 %s*\n", parray[p1].name, parray[(parray[p1].opponent)].name); - return COM_OK; -} -PUBLIC int com_limits(int p, param_list param) -{ - pprintf(p, "\nCurrent hardcoded limits:\n"); - pprintf(p, " Max number of players: %d\n", MAX_PLAYER); - pprintf(p, " Max number of channels and max capacity: %d\n", MAX_CHANNELS); - pprintf(p, " Max number of channels one can be in: %d\n", MAX_INCHANNELS); - pprintf(p, " Max number of people on the notify list: %d\n", MAX_NOTIFY); - pprintf(p, " Max number of aliases: %d\n", MAX_ALIASES - 1); - pprintf(p, " Max number of games you can observe at a time: %d\n", MAX_OBSERVE); - pprintf(p, " Max number of requests pending: %d\n", MAX_PENDING); - pprintf(p, " Max number of people on the censor list: %d\n", MAX_CENSOR); - pprintf(p, " Max number of people in a simul game: %d\n", MAX_SIMUL); - pprintf(p, " Max number of messages one can receive: %d\n", MAX_MESSAGES); - pprintf(p, " Min number of games to be active: %d\n", PROVISIONAL); - pprintf(p, "\nAdmin settable limits:\n"); - pprintf(p, " Quota list gives two shouts per %d seconds.\n", quota_time); - return COM_OK; -} diff --git a/FICS/ficsmain.c.orig b/FICS/ficsmain.c.orig deleted file mode 100644 index d8ad0a1..0000000 --- a/FICS/ficsmain.c.orig +++ /dev/null @@ -1,171 +0,0 @@ -/* ficsmain.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "ficsmain.h" -#include "config.h" -#include "network.h" -#include "command.h" -#include "channel.h" -#include "playerdb.h" -#include "ratings.h" -#include "utils.h" -/*#include "hostinfo.h" */ -#include "board.h" -#include "talkproc.h" -#include "comproc.h" -#include "eco.h" - -/* Arguments */ -PUBLIC int port; -PUBLIC int withConsole; - -/* grimm */ -void player_array_init(void); -/* for warning */ - -PRIVATE void usage(char *progname) -{ - fprintf(stderr, "Usage: %s [-p port] [-C] [-h]\n", progname); - fprintf(stderr, "\t\t-p port\t\tSpecify port. (Default=5000)\n"); - fprintf(stderr, "\t\t-C\t\tStart with console player connected to stdin.\n"); - fprintf(stderr, "\t\t-h\t\tDisplay this information.\n"); - exit(1); -} - -PRIVATE void GetArgs(int argc, char *argv[]) -{ - int i; - - port = DEFAULT_PORT; - withConsole = 0; - - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - switch (argv[i][1]) { - case 'p': - if (i == argc - 1) - usage(argv[0]); - i++; - if (sscanf(argv[i], "%d", &port) != 1) - usage(argv[0]); - break; - case 'C': - fprintf(stderr, "-C Not implemented!\n"); - exit(1); - withConsole = 1; - break; - case 'h': - usage(argv[0]); - break; - } - } else { - usage(argv[0]); - } - } -} - -PRIVATE void main_event_loop(void) { -int current_socket; -char command_string[MAX_STRING_LENGTH]; - - while (1) { - ngc2(command_string, HEARTBEATTIME); - if (process_heartbeat(¤t_socket) == COM_LOGOUT) { - process_disconnection(current_socket); - net_close_connection(current_socket); - } - } -} - -void TerminateServer(int sig) -{ - fprintf(stderr, "FICS: Got signal %d\n", sig); - TerminateCleanup(); - net_close(); - exit(1); -} - -void BrokenPipe(int sig) -{ - fprintf(stderr, "FICS: Got Broken Pipe\n"); -} - -PUBLIC int main(int argc, char *argv[]) -{ -#ifdef SYSTEM_NEXT -#ifdef DEBUG - malloc_debug(16); -#endif -#endif - GetArgs(argc, argv); - signal(SIGTERM, TerminateServer); - signal(SIGINT, TerminateServer); - signal(SIGPIPE, BrokenPipe); - if (net_init(port)) { - fprintf(stderr, "FICS: Network initialize failed on port %d.\n", port); - exit(1); - } - startuptime = time(0); - gethostname(fics_hostname, 80); - quota_time = 60; - player_high = 0; - game_high = 0; - srand(startuptime); - fprintf(stderr, "FICS: Initialized on port %d at %s.\n", port, strltime(&startuptime)); -/* iamserver = 0; */ -/* if (hostinfo_init()) { - MailGameResult = 0; - fprintf(stderr, "FICS: No ratings server connection.\n"); - } else { - if (iamserver) { - fprintf(stderr, "FICS: I don't know how to be a ratings server, refusing.\n"); - MailGameResult = 0; - } else { - fprintf(stderr, "FICS: Ratings server set to: %s\n", hArray[0].email_address); - MailGameResult = 1; - } - } */ -/* if (mail_log_file) - fclose(mail_log_file); */ - fprintf(stderr, "FICS: commands_init()\n"); - commands_init(); - fprintf(stderr, "FICS: channel_init()\n"); - channel_init(); - fprintf(stderr, "FICS: rating_init()\n"); - rating_init(); - fprintf(stderr, "FICS: wild_init()\n"); - wild_init(); - fprintf(stderr, "FICS: book init()\n"); - BookInit(); - fprintf(stderr, "FICS: player_array_init()\n"); - player_array_init(); - player_init(withConsole); - main_event_loop(); - fprintf(stderr, "FICS: Closing down.\n"); - net_close(); - return 0; -} diff --git a/FICS/gameproc.c.orig b/FICS/gameproc.c.orig deleted file mode 100644 index 832f5c9..0000000 --- a/FICS/gameproc.c.orig +++ /dev/null @@ -1,2826 +0,0 @@ -/* gameproc.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "command.h" -#include "ficsmain.h" -#include "config.h" -#include "playerdb.h" -#include "gamedb.h" -#include "gameproc.h" -#include "movecheck.h" -#include "utils.h" -#include "ratings.h" -#include "rmalloc.h" -#include "comproc.h" -#include "matchproc.h" -#include "formula.h" -#include "eco.h" -#include "network.h" -/* #include "hostinfo.h" */ - -PUBLIC void game_ended(int g, int winner, int why) -{ - char outstr[200]; - char tmp[200]; - int p; - int rate_change = 0; - int isDraw = 0; - int whiteResult; - char winSymbol[10]; - char EndSymbol[10]; - char *NameOfWinner, *NameOfLoser; - int beingplayed = 0; /* i.e. it wasn't loaded for adjudication */ - - beingplayed = (parray[garray[g].black].game == g); - - sprintf(outstr, "\n{Game %d (%s vs. %s) ", g + 1, - parray[garray[g].white].name, - parray[garray[g].black].name); - garray[g].result = why; - garray[g].winner = winner; - if (winner == WHITE) { - whiteResult = RESULT_WIN; - strcpy(winSymbol, "1-0"); - NameOfWinner = parray[garray[g].white].name; - NameOfLoser = parray[garray[g].black].name; - } else { - whiteResult = RESULT_LOSS; - strcpy(winSymbol, "0-1"); - NameOfWinner = parray[garray[g].black].name; - NameOfLoser = parray[garray[g].white].name; - } - switch (why) { - case END_CHECKMATE: - sprintf(tmp, "%s checkmated} %s\n", NameOfLoser, winSymbol); - strcpy(EndSymbol, "Mat"); - rate_change = 1; - break; - case END_RESIGN: - sprintf(tmp, "%s resigns} %s\n", NameOfLoser, winSymbol); - strcpy(EndSymbol, "Res"); - rate_change = 1; - break; - case END_FLAG: - sprintf(tmp, "%s forfeits on time} %s\n", NameOfLoser, winSymbol); - strcpy(EndSymbol, "Fla"); - rate_change = 1; - break; - case END_STALEMATE: - sprintf(tmp, "Game drawn by stalemate} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "Sta"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_AGREEDDRAW: - sprintf(tmp, "Game drawn by mutual agreement} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "Agr"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_BOTHFLAG: - sprintf(tmp, "Game drawn because both players ran out of time} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "Fla"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_REPETITION: - sprintf(tmp, "Game drawn by repetition} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "Rep"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_50MOVERULE: - sprintf(tmp, "Game drawn by the 50 move rule} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "50"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_ADJOURN: - sprintf(tmp, "Game adjourned by mutual agreement} *\n"); - game_save(g); - break; - case END_LOSTCONNECTION: - sprintf(tmp, "%s lost connection; game ", NameOfWinner); - if (parray[garray[g].white].registered && parray[garray[g].black].registered) { - sprintf(tmp, "adjourned} *\n"); - game_save(g); - } else - sprintf(tmp, "aborted} *\n"); - whiteResult = RESULT_ABORT; - break; - case END_ABORT: - sprintf(tmp, "Game aborted by mutual agreement} *\n"); - whiteResult = RESULT_ABORT; - break; - case END_COURTESY: - sprintf(tmp, "Game courtesyaborted by %s} *\n", NameOfWinner); - whiteResult = RESULT_ABORT; - break; - case END_COURTESYADJOURN: - sprintf(tmp, "Game courtesyadjourned by %s} *\n", NameOfWinner); - game_save(g); - break; - case END_NOMATERIAL: - /* Draw by insufficient material (e.g., lone K vs. lone K) */ - sprintf(tmp, "Neither player has mating material} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "NM "); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_FLAGNOMATERIAL: - sprintf(tmp, "%s ran out of time and %s has no material to mate} 1/2-1/2\n", - NameOfLoser, NameOfWinner); - isDraw = 1; - strcpy(EndSymbol, "TM "); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_ADJWIN: - sprintf(tmp, "%s wins by adjudication} %s\n", NameOfWinner, winSymbol); - strcpy(EndSymbol, "Adj"); - rate_change = 1; - break; - case END_ADJDRAW: - sprintf(tmp, "Game drawn by adjudication} 1/2-1/2\n"); - isDraw = 1; - strcpy(EndSymbol, "Adj"); - rate_change = 1; - whiteResult = RESULT_DRAW; - break; - case END_ADJABORT: - sprintf(tmp, "Game aborted by adjudication} *\n"); - whiteResult = RESULT_ABORT; - break; - default: - sprintf(tmp, "Hmm, the game ended and I don't know why} *\n"); - break; - } - strcat(outstr, tmp); - if (beingplayed) { - pprintf_noformat(garray[g].white, outstr); - pprintf_noformat(garray[g].black, outstr); - - for (p = 0; p < p_num; p++) { - if ((p == garray[g].white) || (p == garray[g].black)) - continue; - if (parray[p].status != PLAYER_PROMPT) - continue; - if (!parray[p].i_game && !player_is_observe(p, g)) - continue; - pprintf_noformat(p, outstr); - pprintf_prompt(p, ""); - } - } - if ((garray[g].rated) && (rate_change)) { - /* Adjust ratings */ - rating_update(g); - if (parray[garray[g].white].network_player && - parray[garray[g].black].network_player) { - if (MailGameResult) { /* Send to ratings server */ - if (isDraw) { - /* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : - garray[g].type == TYPE_WILD ? "wild " : "stand", " - parray[garray[g].white].name, parray[garray[g].black].name, - "draw"); */ - } else { -/* hostinfo_mailresults(garray[g].type == TYPE_BLITZ ? "blitz" : garray[g].type == TYPE_WILD ? "wild " : "stand", - parray[garray[g].white].name, - parray[garray[g].black].name, - (winner == WHITE) ? parray[garray[g].white].name : - parray[garray[g].black].name); */ - } - } - } - } else { - if (beingplayed) { - pprintf(garray[g].white, "No ratings adjustment done.\n"); - pprintf(garray[g].black, "No ratings adjustment done.\n"); - } - } - if (rate_change) - game_write_complete(g, isDraw, EndSymbol); - /* Mail off the moves */ - if (parray[garray[g].white].automail) { - pcommand(garray[g].white, "mailmoves"); - } - if (parray[garray[g].black].automail) { - pcommand(garray[g].black, "mailmoves"); - } - parray[garray[g].white].num_white++; - parray[garray[g].white].lastColor = WHITE; - parray[garray[g].black].num_black++; - parray[garray[g].black].lastColor = BLACK; - parray[garray[g].white].last_opponent = garray[g].black; - parray[garray[g].black].last_opponent = garray[g].white; - if (beingplayed) { - parray[garray[g].white].game = -1; - parray[garray[g].black].game = -1; - parray[garray[g].white].opponent = -1; - parray[garray[g].black].opponent = -1; - if (garray[g].white != commanding_player) - pprintf_prompt(garray[g].white, ""); - if (garray[g].black != commanding_player) - pprintf_prompt(garray[g].black, ""); - if (parray[garray[g].white].simul_info.numBoards) { - player_simul_over(garray[g].white, g, whiteResult); - } - } - game_finish(g); -} - -PUBLIC void process_move(int p, char *command) -{ - int g; - move_t move; - int result; - unsigned now; - int len; /* loon: for lame promotion hack */ - int i; - - if (parray[p].game <0) { - pprintf(p, "You are not playing a game.\n"); - return; - } - player_decline_offers(p, -1, -PEND_SIMUL); - g = parray[p].game; - - if (garray[g].status != GAME_EXAMINE) { - if (parray[p].side != garray[g].game_state.onMove) { - pprintf(p, "It is not your move.\n"); - return; - } - if (garray[g].clockStopped) { - pprintf(p, "Game clock is paused, use \"unpause\" to resume.\n"); - return; - } - } - if ((len = strlen(command)) > 1) { - if (command[len - 2] == '=') { - switch (tolower(command[strlen(command) - 1])) { - case 'n': - parray[p].promote = KNIGHT; - break; - case 'b': - parray[p].promote = BISHOP; - break; - case 'r': - parray[p].promote = ROOK; - break; - case 'q': - parray[p].promote = QUEEN; - break; - default: - pprintf(p, "Don't understand that move.\n"); - return; - break; - } - } - } - switch (parse_move(command, &garray[g].game_state, &move, parray[p].promote)) { - case MOVE_ILLEGAL: - pprintf(p, "Illegal move.\n"); - return; - break; - case MOVE_AMBIGUOUS: - pprintf(p, "Ambiguous move.\n"); - return; - break; - default: - break; - } - - if (garray[g].status == GAME_EXAMINE) { - garray[g].numHalfMoves++; - if (garray[g].numHalfMoves > garray[g].examMoveListSize) { - garray[g].examMoveListSize += 20; /* Allocate 20 moves at a time */ - if (!garray[g].examMoveList) { - garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); - } else { - garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); - } - } - result = execute_move(&garray[g].game_state, &move, 1); - move.atTime = now; - move.tookTime = 0; - garray[g].examMoveList[garray[g].numHalfMoves - 1] = move; - /* roll back time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - - } else { /* real game */ - i = parray[p].opponent; - if (parray[i].simul_info.numBoards && - (parray[i].simul_info.boards[parray[i].simul_info.onBoard] != g)) { - pprintf(p, "It isn't your turn: wait until the simul giver is at your board.\n"); - return; - } -#ifdef TIMESEAL - - - if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ - if (parray[p].side == WHITE) { - garray[g].wLastRealTime = garray[g].wRealTime; - garray[g].wTimeWhenMoved = con[parray[p].socket].time; - if (((garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove) < 0) || - (garray[g].wTimeWhenReceivedMove == 0)) { - /* might seem weird - but could be caused by a person moving BEFORE - he receives the board pos (this is possible due to lag) but it's - safe to say he moved in 0 secs :-) */ - garray[g].wTimeWhenReceivedMove = garray[g].wTimeWhenMoved; - } else { - garray[g].wRealTime -= garray[g].wTimeWhenMoved - garray[g].wTimeWhenReceivedMove; - } - } else if (parray[p].side == BLACK) { - garray[g].bLastRealTime = garray[g].bRealTime; - garray[g].bTimeWhenMoved = con[parray[p].socket].time; - if (((garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove) < 0) || - (garray[g].bTimeWhenReceivedMove == 0)) { - /* might seem weird - but could be caused by a person moving BEFORE - he receives the board pos (this is possible due to lag) but it's - safe to say he moved in 0 secs :-) */ - garray[g].bTimeWhenReceivedMove = garray[g].bTimeWhenMoved; - } else { - garray[g].bRealTime -= garray[g].bTimeWhenMoved - garray[g].bTimeWhenReceivedMove; - } - } - } - if (parray[p].side == WHITE) { - /* we need to reset the opp's time for receiving the board since the - timeseal decoder only alters the time if it's 0 Otherwise the time - would be changed if the player did a refresh which would screw up - the timings */ - garray[g].bTimeWhenReceivedMove = 0; - } else { - /* we need to reset the opp's time for receiving the board since the - timeseal decoder only alters the time if it's 0 Otherwise the time - would be changed if the player did a refresh which would screw up - the timings */ - garray[g].wTimeWhenReceivedMove = 0; - } - -#endif - - game_update_time(g); - - /* maybe add autoflag here in the future? */ - -#ifdef TIMESEAL - - if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ - if (parray[p].side == WHITE) { - garray[g].wRealTime += garray[g].wIncrement * 100; - garray[g].wTime = garray[g].wRealTime / 100; /* remember to conv to - tenth secs */ - } else if (parray[p].side == BLACK) { - garray[g].bRealTime += garray[g].bIncrement * 100; /* conv to ms */ - garray[g].bTime = garray[g].bRealTime / 100; /* remember to conv to - tenth secs */ - } - } else { - if (garray[g].game_state.onMove == BLACK) { - garray[g].bTime += garray[g].bIncrement; - } - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += garray[g].wIncrement; - } - } - -#else - - if (garray[g].game_state.onMove == BLACK) { - garray[g].bTime += garray[g].bIncrement; - } - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += garray[g].wIncrement; - } -#endif - - /* Do the move */ - garray[g].numHalfMoves++; - if (garray[g].numHalfMoves > garray[g].moveListSize) { - garray[g].moveListSize += 20; /* Allocate 20 moves at a time */ - if (!garray[g].moveList) { - garray[g].moveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].moveListSize); - } else { - garray[g].moveList = (move_t *) rrealloc(garray[g].moveList, sizeof(move_t) * garray[g].moveListSize); - } - } - result = execute_move(&garray[g].game_state, &move, 1); - now = tenth_secs(); - move.atTime = now; - if (garray[g].numHalfMoves > 1) { - move.tookTime = move.atTime - garray[g].lastMoveTime; - } else { - move.tookTime = move.atTime - garray[g].startTime; - } - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - -#ifdef TIMESEAL - - if (con[parray[p].socket].timeseal) { /* does he use timeseal? */ - if (parray[p].side == WHITE) { - move.tookTime = (garray[parray[p].game].wTimeWhenMoved - - garray[parray[p].game].wTimeWhenReceivedMove) / 100; - } else { - move.tookTime = (garray[parray[p].game].bTimeWhenMoved - - garray[parray[p].game].bTimeWhenReceivedMove) / 100; - } - } -#endif - - garray[g].moveList[garray[g].numHalfMoves - 1] = move; - } - - send_boards(g); - - strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); - - if (result == MOVE_ILLEGAL) { - pprintf(p, "Internal error, illegal move accepted!\n"); - } - if ((result == MOVE_OK) && (garray[g].status == GAME_EXAMINE)) { - int p1; - - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf_prompt(p1, "%s moves: %s\n", parray[p].name, move.algString); - } - } - } - if (result == MOVE_CHECKMATE) { - if (garray[g].status == GAME_EXAMINE) { - int p1; - - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "%s has been checkmated.\n", - (CToggle(garray[g].game_state.onMove) == BLACK) ? "White" : "Black"); - } - } - } else { - game_ended(g, CToggle(garray[g].game_state.onMove), END_CHECKMATE); - } - } - if (result == MOVE_STALEMATE) { - if (garray[g].status == GAME_EXAMINE) { - int p1; - - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "Stalemate.\n"); - } - } - } else { - game_ended(g, CToggle(garray[g].game_state.onMove), END_STALEMATE); - } - } - if (result == MOVE_NOMATERIAL) { - if (garray[g].status == GAME_EXAMINE) { - int p1; - - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "No mating material.\n"); - } - } - } else { - game_ended(g, CToggle(garray[g].game_state.onMove), END_NOMATERIAL); - } - } -} - -int GameNumFromParam(int p, int *p1, parameter *param) -{ - if (param->type == TYPE_WORD) { - *p1 = player_find_part_login(param->val.word); - if (*p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param->val.word); - return -1; - } - if (parray[*p1].game <0) - pprintf(p, "%s is not playing a game.\n", parray[*p1].name); - return parray[*p1].game; - } else { /* Must be an integer */ - *p1 = -1; - if (param->val.integer <= 0) - pprintf(p, "%d is not a valid game number.\n", param->val.integer); - return param->val.integer - 1; - } -} - -PUBLIC int com_resign(int p, param_list param) -{ - int g, o, oconnected, confused = 0; - - if (param[0].type == TYPE_NULL) { - g = parray[p].game; - if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - } else { - player_decline_offers(p, -1, -1); - game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_RESIGN); - } - } else if (FindPlayer(p, ¶m[0], &o, &oconnected)) { - g = game_new(); - if (game_read(g, p, o) < 0) { - if (game_read(g, o, p) < 0) { - confused = 1; - pprintf(p, "You have no stored game with %s\n", parray[o].name); - } else { - garray[g].white = o; - garray[g].black = p; - } - } else { - garray[g].white = p; - garray[g].black = o; - } - if (!confused) { - pprintf(p, "You resign your stored game with %s\n", parray[o].name); - game_delete(garray[g].white, garray[g].black); - game_ended(g, (garray[g].white == p) ? BLACK : WHITE, END_RESIGN); - pcommand(p, "message %s I have resigned our stored game \"%s vs. %s.\"", - parray[o].name, - parray[garray[g].white].name, - parray[garray[g].black].name); - if (!oconnected) - player_remove(o); - } - } - return COM_OK; -} - -/* -PUBLIC int com_resign(int p, param_list param) -{ - ASSERT(param[0].type == TYPE_NULL); - if ((parray[p].game <0) || (garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -1); - game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_RESIGN); - return COM_OK; -} -*/ - -PUBLIC int com_draw(int p, param_list param) -{ - int p1; - int move_num = 0; - int i = 0, flag = 0; - - ASSERT(param[0].type == TYPE_NULL); - if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - if (garray[parray[p].game].numHalfMoves - ((garray[parray[p].game].game_state.lastIrreversable == -1) ? 0 : garray[parray[p].game].game_state.lastIrreversable) > 99) { - game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_50MOVERULE); - return COM_OK; - } - if (garray[parray[p].game].game_state.lastIrreversable != -1) - move_num = garray[parray[p].game].game_state.lastIrreversable; - - for (i = (garray[parray[p].game].numHalfMoves - 1); i <= garray[parray[p].game].numHalfMoves; i++) { - flag = 0; - if (garray[parray[p].game].game_state.lastIrreversable != -1) - move_num = garray[parray[p].game].game_state.lastIrreversable; - for (; move_num <= garray[parray[p].game].numHalfMoves; move_num++) { - if ((strlen(garray[parray[p].game].boardList[move_num])) != - (strlen(garray[parray[p].game].boardList[i]))) - continue; - - if (!strcmp(garray[parray[p].game].boardList[move_num], - garray[parray[p].game].boardList[i])) - flag++; - } - if (flag >= 3) { - if (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { - player_remove_request(parray[p].opponent, p, PEND_DRAW); - player_decline_offers(p, -1, -1); - } - game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_REPETITION); - return COM_OK; - } - } - - p1 = parray[p].opponent; - if (parray[p1].simul_info.numBoards && - parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != - parray[p].game) { - pprintf(p, "You can only make requests when the simul player is at your board.\n"); - return COM_OK; - } - if (player_find_pendfrom(p, parray[p].opponent, PEND_DRAW) >= 0) { - player_remove_request(parray[p].opponent, p, PEND_DRAW); - player_decline_offers(p, -1, -1); - game_ended(parray[p].game, (garray[parray[p].game].white == p) ? BLACK : WHITE, END_AGREEDDRAW); - } else { - pprintf(parray[p].opponent, "\n"); - pprintf_highlight(parray[p].opponent, "%s", parray[p].name); - pprintf_prompt(parray[p].opponent, " offers you a draw.\n"); - pprintf(p, "Draw request sent.\n"); - player_add_request(p, parray[p].opponent, PEND_DRAW, 0); - } - return COM_OK; -} - -PUBLIC int com_pause(int p, param_list param) -{ - int g; - int now; - - ASSERT(param[0].type == TYPE_NULL); - if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - g = parray[p].game; - if (garray[g].wTime == 0) { - pprintf(p, "You can't pause untimed games.\n"); - return COM_OK; - } - if (garray[g].clockStopped) { - pprintf(p, "Game is already paused, use \"unpause\" to resume.\n"); - return COM_OK; - } - if (player_find_pendfrom(p, parray[p].opponent, PEND_PAUSE) >= 0) { - player_remove_request(parray[p].opponent, p, PEND_PAUSE); - garray[g].clockStopped = 1; - /* Roll back the time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - pprintf_prompt(parray[p].opponent, "\n%s accepted pause. Game clock paused.\n", - parray[p].name); - pprintf(p, "Game clock paused.\n"); - } else { - pprintf(parray[p].opponent, "\n"); - pprintf_highlight(parray[p].opponent, "%s", parray[p].name); - pprintf_prompt(parray[p].opponent, " requests to pause the game.\n"); - pprintf(p, "Pause request sent.\n"); - player_add_request(p, parray[p].opponent, PEND_PAUSE, 0); - } - return COM_OK; -} - -PUBLIC int com_unpause(int p, param_list param) -{ - int now; - int g; - - ASSERT(param[0].type == TYPE_NULL); - if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - g = parray[p].game; - if (!garray[g].clockStopped) { - pprintf(p, "Game is not paused.\n"); - return COM_OK; - } - garray[g].clockStopped = 0; - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - pprintf(p, "Game clock resumed.\n"); - pprintf_prompt(parray[p].opponent, "\nGame clock resumed.\n"); - return COM_OK; -} - -PUBLIC int com_abort(int p, param_list param) -{ - int p1, g, myColor, yourColor; - - ASSERT(param[0].type == TYPE_NULL); - - g = parray[p].game; - if ((g < 0) || (garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - p1 = parray[p].opponent; - myColor = (p == garray[g].white ? WHITE : BLACK); - yourColor = (myColor == WHITE ? BLACK : WHITE); - - if (parray[p1].simul_info.numBoards && - parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != g) { - pprintf(p, "You can only make requests when the simul player is at your board.\n"); - return COM_OK; - } - if (player_find_pendfrom(p, p1, PEND_ABORT) >= 0) { - player_remove_request(p1, p, PEND_ABORT); - player_decline_offers(p, -1, -1); - game_ended(g, yourColor, END_ABORT); - } else { - game_update_time(g); - -#ifdef TIMESEAL - - if (con[parray[parray[p].opponent].socket].timeseal) { /* opp uses timeseal? */ - - /* If opponent has timeseal - we have no use for courtesyabort since - courtesyabort was used when opponent lagged out of time which cannot - happen with timeseal - only courtesyadjourn should be possible. - Thus: the request can only be for a normal abort of the game. */ - - pprintf(p1, "\n"); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf_prompt(p1, " would like to abort the game.\n"); - pprintf(p, "Abort request sent.\n"); - player_add_request(p, p1, PEND_ABORT, 0); - } else { - if ((myColor == WHITE && garray[g].wTime > 0 && garray[g].bTime <= 0) - || (myColor == BLACK && garray[g].bTime > 0 && garray[g].wTime <= 0)) { - /* player wants to abort + opponent is out of time = courtesyabort */ - pprintf(p, "Since you have time, and your opponent has none, the game has been aborted."); - pprintf(p1, "Your opponent has aborted the game rather than calling your flag."); - player_decline_offers(p, -1, -1); - game_ended(g, myColor, END_COURTESY); - } else { - pprintf(p1, "\n"); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf_prompt(p1, " would like to abort the game.\n"); - pprintf(p, "Abort request sent.\n"); - player_add_request(p, p1, PEND_ABORT, 0); - } - } - -#else - - if ((myColor == WHITE && garray[g].wTime > 0 && garray[g].bTime <= 0) - || (myColor == BLACK && garray[g].bTime > 0 && garray[g].wTime <= 0)) { - /* player wants to abort + opponent is out of time = courtesyabort */ - pprintf(p, "Since you have time, and your opponent has none, the game has been aborted."); - pprintf(p1, "Your opponent has aborted the game rather than calling your flag."); - player_decline_offers(p, -1, -1); - game_ended(g, myColor, END_COURTESY); - } else { - pprintf(p1, "\n"); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf(p1, " would like to abort the game; "); - pprintf_prompt(p1, "type \"abort\" to accept.\n"); - pprintf(p, "Abort request sent.\n"); - player_add_request(p, p1, PEND_ABORT, 0); - } - -#endif - - } - return COM_OK; -} - -#if 0 -int Courtesy(int p, int type) -{ - int g; - - if (parray[p].game <0) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - g = parray[p].game; - if (garray[g].wInitTime == 0) { - if (type == END_COURTESY) - pprintf(p, "You can't courtesy abort an untimed game, just resign.\n"); - else if (type == END_COURTESYADJOURN) - pprintf(p, "You can't courtesy adjourn an untimed game, just resign.\n"); - return COM_OK; - } - game_update_time(g); - if (((garray[g].white == p) && (garray[g].bTime <= 0) && (garray[g].wTime > 0)) || - ((garray[g].black == p) && (garray[g].wTime <= 0) && (garray[g].bTime > 0))) { - player_decline_offers(p, -1, -1); - game_ended(parray[p].game, (garray[g].white == p) ? WHITE : BLACK, type); - } else { - if (type == END_COURTESY) - pprintf(p, "Game not aborted.\n"); - else if (type == END_COURTESYADJOURN) - pprintf(p, "Game not adjourned.\n"); - pprintf(p, "Either your opponent still has time, or you are out of time also.\n"); - } - return COM_OK; -} - -PUBLIC int com_courtesyabort(int p, param_list param) -{ - ASSERT(param[0].type == TYPE_NULL); - return Courtesy(p, END_COURTESY); -} - -PUBLIC int com_courtesyadjourn(int p, param_list param) -{ - ASSERT(param[0].type == TYPE_NULL); - if (!garray[parray[p].game].rated) { - pprintf(p, "You cannot adjourn an unrated game. Use \"courtesyabort\".\n"); - return COM_OK; - } - return Courtesy(p, END_COURTESYADJOURN); -} -#endif - -PUBLIC int com_courtesyabort(int p, param_list param) -{ - pprintf(p, "Courtesyabort is obsolete; use \"abort\" instead.\n"); - return COM_OK; -} - -PUBLIC int com_courtesyadjourn(int p, param_list param) -{ - pprintf(p, "Use \"adjourn\" to courtesyadjourn a game.\n"); - return COM_OK; -} - -PRIVATE int player_has_mating_material(game_state_t *gs, int color) -{ - int i, j; - int piece; - int minor_pieces = 0; - - for (i = 0; i < 8; i++) - for (j = 0; j < 8; j++) { - piece = gs->board[i][j]; - switch (piecetype(piece)) { - case BISHOP: - case KNIGHT: - if (iscolor(piece, color)) - minor_pieces++; - break; - case KING: - case NOPIECE: - break; - default: - if (iscolor(piece, color)) - return 1; - } - } - return ((minor_pieces > 1) ? 1 : 0); -} - -PUBLIC int com_flag(int p, param_list param) -{ - int g; - int myColor; - - ASSERT(param[0].type == TYPE_NULL); - if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - g = parray[p].game; - myColor = (p == garray[g].white ? WHITE : BLACK); - if (garray[g].wInitTime == 0) { - pprintf(p, "You can't flag an untimed game.\n"); - return COM_OK; - } - if (garray[g].numHalfMoves < 2) { - pprintf(p, "You cannot flag if your opponent has not moved.\nYou can use abort instead.\n"); - return COM_OK; - } - game_update_time(g); - -#ifdef TIMESEAL - - { - int wt, bt; - - if (con[parray[p].socket].timeseal) { /* do caller use timeseal? */ - if (myColor == WHITE) { - wt = garray[g].wRealTime; - } else { - bt = garray[g].bRealTime; - } - } else { - if (myColor == WHITE) { - wt = garray[g].wTime; - } else { - bt = garray[g].bTime; - } - } - - if (con[parray[parray[p].opponent].socket].timeseal) { /* opp uses timeseal? */ - if (myColor == WHITE) { - bt = garray[g].bRealTime; - } else { - wt = garray[g].wRealTime; - } - } else { - if (myColor == WHITE) { - bt = garray[g].bTime; - } else { - wt = garray[g].wTime; - } - } - - /* the clocks to compare is now in wt and bt */ - - if ((wt <= 0) && (bt <= 0)) { - player_decline_offers(p, -1, -1); - game_ended(g, myColor, END_BOTHFLAG); - return COM_OK; - } - if (myColor == WHITE) { - if (bt > 0) { - pprintf(p, "Your opponent is not out of time!\n"); - return COM_OK; - } - } else { - if (wt > 0) { - pprintf(p, "Your opponent is not out of time!\n"); - return COM_OK; - } - } - } - -#else - - if ((garray[g].wTime <= 0) && (garray[g].bTime <= 0)) { - player_decline_offers(p, -1, -1); - game_ended(g, myColor, END_BOTHFLAG); - return COM_OK; - } - if (myColor == WHITE) { - if (garray[g].bTime > 0) { - pprintf(p, "Your opponent is not out of time!\n"); - return COM_OK; - } - } else { - if (garray[g].wTime > 0) { - pprintf(p, "Your opponent is not out of time!\n"); - return COM_OK; - } - } - -#endif - - player_decline_offers(p, -1, -1); - if (player_has_mating_material(&garray[g].game_state, myColor)) - game_ended(g, myColor, END_FLAG); - else - game_ended(g, myColor, END_FLAGNOMATERIAL); - return COM_OK; -} - -PUBLIC int com_adjourn(int p, param_list param) -{ - int p1, g, myColor, yourColor; - - ASSERT(param[0].type == TYPE_NULL); - g = parray[p].game; - if ((g < 0) || (garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - p1 = parray[p].opponent; - if (!(parray[p].registered && parray[p1].registered)) { - pprintf(p, "Both players must be registered to adjorn a game. Use \"abort\".\n"); - return COM_OK; - } - myColor = (p == garray[g].white ? WHITE : BLACK); - yourColor = (myColor == WHITE ? BLACK : WHITE); - - if (player_find_pendfrom(p, p1, PEND_ADJOURN) >= 0) { - player_remove_request(p1, p, PEND_ADJOURN); - player_decline_offers(p, -1, -1); - game_ended(parray[p].game, yourColor, END_ADJOURN); - } else { - game_update_time(g); - if (((myColor == WHITE) && (garray[g].wTime > 0) && (garray[g].bTime <= 0)) - || ((myColor == BLACK) && (garray[g].bTime > 0) && (garray[g].wTime <= 0))) { -/* player wants to adjourn + opponent is out of time = courtesyadjourn */ - pprintf(p, "Since you have time, and your opponent has none, the game has been adjourned."); - pprintf(p1, "Your opponent has adjourned the game rather than calling your flag."); - player_decline_offers(p, -1, -1); - game_ended(g, myColor, END_COURTESYADJOURN); - } else { - pprintf(p1, "\n"); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf(p1, " would like to adjourn the game; "); - pprintf_prompt(p1, "type \"adjourn\" to accept.\n"); - pprintf(p, "Adjourn request sent.\n"); - player_add_request(p, p1, PEND_ADJOURN, 0); - } - } - return COM_OK; -} - -PRIVATE int gamesortfunc(const void *i, const void *j) -{ - return (GetRating(&parray[garray[*(int *) i].white], garray[*(int *) i].type) + - GetRating(&parray[garray[*(int *) i].black], garray[*(int *) i].type) + - ((garray[*(int *) i].status == GAME_EXAMINE) ? 10000 : 0) - - GetRating(&parray[garray[*(int *) j].white], garray[*(int *) j].type) - - GetRating(&parray[garray[*(int *) j].black], garray[*(int *) j].type) - - ((garray[*(int *) j].status == GAME_EXAMINE) ? 10000 : 0)); -} - - -PUBLIC int com_games(int p, param_list param) -{ - int i, j; - int wp, bp; - int ws, bs; - int selected = 0; - int count = 0; - int totalcount; - char *s = NULL; - int slen = 0; - int *sortedgames; /* for qsort */ - - totalcount = game_count(); - if (totalcount == 0) { - pprintf(p, "There are no games in progress.\n"); - } else { - sortedgames = rmalloc(totalcount * sizeof(int)); /* for qsort */ - - if (param[0].type == TYPE_WORD) { - s = param[0].val.word; - slen = strlen(s); - selected = atoi(s); - if (selected < 0) - selected = 0; - } - for (i = 0; i < g_num; i++) { - if ((garray[i].status != GAME_ACTIVE) && (garray[i].status != GAME_EXAMINE)) - continue; - if ((selected) && (selected != i + 1)) - continue; /* not selected game number */ - wp = garray[i].white; - bp = garray[i].black; - if ((!selected) && s && strncasecmp(s, garray[i].white_name, slen) && - strncasecmp(s, garray[i].black_name, slen)) - continue; /* player names did not match */ - sortedgames[count++] = i; - } - if (!count) - pprintf(p, "No matching games were found (of %d in progress).\n", totalcount); - else { - qsort(sortedgames, count, sizeof(int), gamesortfunc); - pprintf(p, "\n"); - for (j = 0; j < count; j++) { - i = sortedgames[j]; - wp = garray[i].white; - bp = garray[i].black; - board_calc_strength(&garray[i].game_state, &ws, &bs); - if (garray[i].status != GAME_EXAMINE) { - pprintf_noformat(p, "%2d %4s %-11.11s %4s %-10.10s [%c%c%c%3d %3d] ", - i + 1, - ratstrii(GetRating(&parray[wp], - garray[i].type), - parray[wp].registered), - parray[wp].name, - ratstrii(GetRating(&parray[bp], - garray[i].type), - parray[bp].registered), - parray[bp].name, - (garray[i].private) ? 'p' : ' ', - *bstr[garray[i].type], - *rstr[garray[i].rated], - garray[i].wInitTime / 600, - garray[i].wIncrement / 10); - game_update_time(i); - pprintf_noformat(p, "%6s -", - tenth_str((garray[i].wTime > 0 ? garray[i].wTime : 0), 0)); - pprintf_noformat(p, "%6s (%2d-%2d) %c: %2d\n", - tenth_str((garray[i].bTime > 0 ? garray[i].bTime : 0), 0), - ws, bs, - (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', - garray[i].game_state.moveNum); - } else { - pprintf_noformat(p, "%2d (Exam. %4d %-11.11s %4d %-10.10s) [%c%c%c%3d %3d] ", - i + 1, - garray[i].white_rating, - garray[i].white_name, - garray[i].black_rating, - garray[i].black_name, - (garray[i].private) ? 'p' : ' ', - *bstr[garray[i].type], - *rstr[garray[i].rated], - garray[i].wInitTime / 600, - garray[i].wIncrement / 10); - pprintf_noformat(p, "%c: %2d\n", - (garray[i].game_state.onMove == WHITE) ? 'W' : 'B', - garray[i].game_state.moveNum); - } - } - if (count < totalcount) - pprintf(p, "\n %d game%s displayed (of %d in progress).\n", count, - (count == 1) ? "" : "s", totalcount); - else - pprintf(p, "\n %d game%s displayed.\n", totalcount, (totalcount == 1) ? "" : "s"); - } - rfree(sortedgames); - } - return COM_OK; -} - -PRIVATE int do_observe(int p, int obgame) -{ - if ((garray[obgame].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, game %d is a private game.\n", obgame + 1); - return COM_OK; - } - if ((garray[obgame].white == p) || (garray[obgame].black == p)) { - if (garray[obgame].status != GAME_EXAMINE) { - pprintf(p, "You cannot observe a game that you are playing.\n"); - return COM_OK; - } - } - if (player_is_observe(p, obgame)) { - pprintf(p, "Removing game %d from observation list.\n", obgame + 1); - player_remove_observe(p, obgame); - } else { - if (!player_add_observe(p, obgame)) { - pprintf(p, "You are now observing game %d.\n", obgame + 1); - send_board_to(obgame, p); - } else { - pprintf(p, "You are already observing the maximum number of games.\n"); - } - } - return COM_OK; -} - -PUBLIC void unobserveAll(int p) -{ - int i; - - for (i = 0; i < parray[p].num_observe; i++) { - pprintf(p, "Removing game %d from observation list.\n", parray[p].observe_list[i] + 1); - } - parray[p].num_observe = 0; - return; -} - -PUBLIC int com_unobserve(int p, param_list param) -{ - int gNum, p1; - - if (param[0].type == TYPE_NULL) { - unobserveAll(p); - return COM_OK; - } - gNum = GameNumFromParam(p, &p1, ¶m[0]); - if (gNum < 0) - return COM_OK; - if (!player_is_observe(p, gNum)) { - pprintf(p, "You are not observing game %d.\n", gNum); - } else { - player_remove_observe(p, gNum); - pprintf(p, "Removing game %d from observation list.\n", gNum + 1); - } - return COM_OK; -} - -PUBLIC int com_observe(int p, param_list param) -{ - int i; - int p1, obgame; - - if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are still examining a game.\n"); - return COM_OK; - } - if (param[0].type == TYPE_NULL) { - unobserveAll(p); - return COM_OK; - } - obgame = GameNumFromParam(p, &p1, ¶m[0]); - if (obgame < 0) - return COM_OK; - - if ((obgame >= g_num) || ((garray[obgame].status != GAME_ACTIVE) && - (garray[obgame].status != GAME_EXAMINE))) { - pprintf(p, "There is no such game.\n"); - return COM_OK; - } - if ((p1 >= 0) && parray[p1].simul_info.numBoards) { - for (i = 0; i < parray[p1].simul_info.numBoards; i++) - if (parray[p1].simul_info.boards[i] >= 0) - do_observe(p, parray[p1].simul_info.boards[i]); - } else { - do_observe(p, obgame); - } - return COM_OK; -} - -PUBLIC int com_allobservers(int p, param_list param) -{ - int obgame; - int p1; - int start, end; - int g; - int first; - - if (param[0].type == TYPE_NULL) { - obgame = -1; - } else { - obgame = GameNumFromParam(p, &p1, ¶m[0]); - if (obgame < 0) - return COM_OK; - } - if (obgame == -1) { - start = 0; - end = g_num; - } else if ((obgame >= g_num) || ((obgame < g_num) - && ((garray[obgame].status != GAME_ACTIVE) - && (garray[obgame].status != GAME_EXAMINE)))) { - pprintf(p, "There is no such game.\n"); - return COM_OK; - } else { - start = obgame; - end = obgame + 1; - } - - /* list games being played */ - - for (g = start; g < end; g++) { - if ((garray[g].status == GAME_ACTIVE) && - ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { - for (first = 1, p1 = 0; p1 < p_num; p1++) { - if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g))) { - if (first) { - pprintf(p, "Observing %2d [%s vs. %s]:", - g + 1, - parray[garray[g].white].name, - parray[garray[g].black].name); - first = 0; - } - pprintf(p, " %s%s", (parray[p1].game >=0) ? "#" : "", parray[p1].name); - } - } - if (!first) - pprintf(p, "\n"); - } - } - - /* list games being examined last */ - - for (g = start; g < end; g++) { - if ((garray[g].status == GAME_EXAMINE) && - ((parray[p].adminLevel > 0) || (garray[g].private == 0))) { - for (first = 1, p1 = 0; p1 < p_num; p1++) { - if ((parray[p1].status != PLAYER_EMPTY) && (player_is_observe(p1, g) || - (parray[p1].game == g))) { - if (first) { - if (strcmp(garray[g].white_name, garray[g].black_name)) { - pprintf(p, "Examining %2d [%s vs %s]:", g + 1, - garray[g].white_name, garray[g].black_name); - } else { - pprintf(p, "Examining %2d (scratch):", g + 1); - } - first = 0; - } - pprintf(p, " %s%s", (parray[p1].game == g) ? "#" : "", parray[p1].name); - } - } - if (!first) - pprintf(p, "\n"); - } - } - return COM_OK; -} - -PUBLIC int com_unexamine(int p, param_list param) -{ - int g, p1, flag = 0; - - if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { - pprintf(p, "You are not examining any games.\n"); - return COM_OK; - } - g = parray[p].game; - parray[p].game = -1; - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if ((parray[p1].game == g) &&(p != p1)) { - /* ok - there are other examiners to take over the game */ - flag = 1; - } - if ((player_is_observe(p1, g)) || (parray[p1].game == g)) { - pprintf(p1, "%s stopped examining game %d.\n", parray[p].name, g + 1); - } - } - if (!flag) { - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g)) { - pprintf(p1, "There are no examiners.\n"); - pcommand(p1, "unobserve %d", g + 1); - } - } - game_remove(g); - } - pprintf(p, "You are no longer examining game %d.\n", g + 1); - return COM_OK; -} - -PUBLIC int com_mexamine(int p, param_list param) -{ - int g, p1, p2; - - if ((parray[p].game <0) ||(garray[parray[p].game].status != GAME_EXAMINE)) { - pprintf(p, "You are not examining any games.\n"); - return COM_OK; - } - p1 = player_find_part_login(param[0].val.word); - if (p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); - return COM_OK; - } - g = parray[p].game; - if (!player_is_observe(p1, g)) { - pprintf(p, "%s must observe the game you are analysing.\n", parray[p1].name); - return COM_OK; - } else { - if (parray[p1].game >=0) { - pprintf(p, "%s is already analysing the game.\n", parray[p1].name); - return COM_OK; - } - /* if we get here - let's make him examiner of the game */ - unobserveAll(p1); /* fix for Xboard */ - player_decline_offers(p1, -1, PEND_MATCH); - player_withdraw_offers(p1, -1, PEND_MATCH); - player_withdraw_offers(p1, -1, PEND_SIMUL); - - parray[p1].game = g; /* yep - it really is that easy :-) */ - pprintf(p1, "You are now examiner of game %d.\n", g + 1); - send_board_to(g, p1); /* pos not changed - but fixes Xboard */ - for (p2 = 0; p2 < p_num; p2++) { - if (parray[p2].status != PLAYER_PROMPT) - continue; - if (p2 == p1) - continue; - if ((player_is_observe(p2, g)) || (parray[p2].game == g)) { - pprintf_prompt(p2, "%s is now examiner of game %d.\n", parray[p1].name, g + 1); - } - } - } - return COM_OK; -} - -PUBLIC int com_moves(int p, param_list param) -{ - int g; - int p1; - - if (param[0].type == TYPE_NULL) { - if (parray[p].game >=0) { - g = parray[p].game; - } else if (parray[p].num_observe) { - for (g = 0; g < parray[p].num_observe; g++) { - pprintf(p, "%s\n", movesToString(parray[p].observe_list[g], 0)); - } - return COM_OK; - } else { - pprintf(p, "You are neither playing, observing nor examining a game.\n"); - return COM_OK; - } - } else { - g = GameNumFromParam(p, &p1, ¶m[0]); - if (g < 0) - return COM_OK; - } - if ((g < 0) || (g >= g_num) || ((garray[g].status != GAME_ACTIVE) && - (garray[g].status != GAME_EXAMINE))) { - pprintf(p, "There is no such game.\n"); - return COM_OK; - } - if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - return COM_OK; - } - pprintf(p, "%s\n", movesToString(g, 0)); /* pgn may break interfaces? */ - return COM_OK; -} - -PUBLIC int com_mailmoves(int p, param_list param) -{ - int g; - int p1; - char subj[81]; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailhelp command.\n"); - return COM_OK; - } - - if (param[0].type == TYPE_NULL) { - if (parray[p].game >=0) { - g = parray[p].game; - } else { - pprintf(p, "You are neither playing, observing nor examining a game.\n"); - return COM_OK; - } - } else { - g = GameNumFromParam(p, &p1, ¶m[0]); - if (g < 0) - return COM_OK; - } - if ((g < 0) || (g >= g_num) || ((garray[g].status != GAME_ACTIVE) && (garray[g].status != GAME_EXAMINE))) { - pprintf(p, "There is no such game.\n"); - return COM_OK; - } - if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - return COM_OK; - } - sprintf(subj, "FICS game report %s vs %s", garray[g].white_name, garray[g].black_name); - if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) { - pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); - } else { - pprintf(p, "Moves mailed.\n"); - } - return COM_OK; -} - -PUBLIC int com_oldmoves(int p, param_list param) -{ - int g; - int p1 = p; - - if (param[0].type == TYPE_NULL) { - p1 = p; - } else if (param[0].type == TYPE_WORD) { - p1 = player_find_part_login(param[0].val.word); - if (p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); - return COM_OK; - } - } - g = FindOldGameFor(p1); - if (g < 0) { - pprintf(p, "There is no old game for %s.\n", parray[p1].name); - return COM_OK; - } - if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - return COM_OK; - } - pprintf(p, "%s\n", movesToString(g, 0)); /* pgn may break interfaces? */ - return COM_OK; -} - -PUBLIC int com_mailoldmoves(int p, param_list param) -{ - int g; - int p1 = p; - char subj[81]; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailhelp command.\n"); - return COM_OK; - } - - if (param[0].type == TYPE_NULL) { - p1 = p; - } else if (param[0].type == TYPE_WORD) { - p1 = player_find_part_login(param[0].val.word); - if (p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); - return COM_OK; - } - } - g = FindOldGameFor(p1); - if (g < 0) { - pprintf(p, "There is no old game for %s.\n", parray[p1].name); - return COM_OK; - } - if ((garray[g].white != p) && (garray[g].black != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - return COM_OK; - } - sprintf(subj, "FICS game report %s vs %s", garray[g].white_name, garray[g].black_name); - if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) { - pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); - } else { - pprintf(p, "Moves mailed.\n"); - } - return COM_OK; -} - -PUBLIC int com_load(int p, param_list param) -{ - pprintf(p, "Obsolete command, please use match <opponent>.\n"); - return COM_OK; -} - -void ExamineScratch(int p) -{ - char category, board; - int g = game_new(); - - unobserveAll(p); - - player_decline_offers(p, -1, PEND_MATCH); - player_withdraw_offers(p, -1, PEND_MATCH); - player_withdraw_offers(p, -1, PEND_SIMUL); - - garray[g].wInitTime = garray[g].wIncrement = 0; - garray[g].bInitTime = garray[g].bIncrement = 0; - garray[g].timeOfStart = tenth_secs(); - garray[g].wTime = garray[g].bTime = 0; - garray[g].rated = 0; - garray[g].clockStopped = 0; - garray[g].type = TYPE_UNTIMED; - garray[g].white = garray[g].black = p; - garray[g].status = GAME_EXAMINE; - garray[g].startTime = tenth_secs(); - garray[g].lastMoveTime = garray[g].startTime; - garray[g].lastDecTime = garray[g].startTime; - garray[g].totalHalfMoves = 0; - - parray[p].side = WHITE; /* oh well... */ - parray[p].game = g; - - category = board = '\0'; - if (board_init(&garray[g].game_state, &category, &board)) { - pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); - fprintf(stderr, "FICS: PROBLEM LOADING BOARD. Game Aborted.\n"); - } - garray[g].game_state.gameNum = g; - strcpy(garray[g].white_name, parray[p].name); - strcpy(garray[g].black_name, parray[p].name); - - send_boards(g); - - strcpy(garray[g].boardList[garray[g].numHalfMoves], boardToFEN(g)); -} - -PRIVATE int ExamineStored(FILE * fp, int p, char *filename) -{ - int g; - char category[100], board[100]; - game *gg; - - unobserveAll(p); - - player_decline_offers(p, -1, PEND_MATCH); - player_withdraw_offers(p, -1, PEND_MATCH); - player_withdraw_offers(p, -1, PEND_SIMUL); - - g = game_new(); - gg = &garray[g]; - category[0] = '\0'; - board[0] = '\0'; - if (board_init(&gg->game_state, category, board)) { - pprintf(p, "PROBLEM LOADING BOARD. Game Aborted.\n"); - fprintf(stderr, "FICS: PROBLEM LOADING BOARD %s %s. Game Aborted.\n", - category, board); - return -1; - } - gg->status = GAME_EXAMINE; - if (ReadGameAttrs(fp, filename, g) < 0) { - pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); - return -1; - } - gg->totalHalfMoves = gg->numHalfMoves; - gg->numHalfMoves = 0; - gg->revertHalfMove = 0; - gg->white = p; - gg->black = p; - gg->game_state.gameNum = g; - - gg->startTime = tenth_secs(); - gg->lastMoveTime = gg->startTime; - gg->lastDecTime = gg->startTime; - - parray[p].side = WHITE; /* oh well... */ - parray[p].game = g; - - send_boards(g); - - strcpy(gg->boardList[gg->numHalfMoves], boardToFEN(g)); - return g; -} - -void ExamineAdjourned(int p, int p1, int p2) -{ - FILE *fp; - char filename[1024]; - char *p1Login, *p2Login; - int g; - - p1Login = parray[p1].login; - p2Login = parray[p2].login; - - sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p1Login, p2Login); - fp = fopen(filename, "r"); - if (!fp) { - sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p1Login, p2Login); - fp = fopen(filename, "r"); - if (!fp) { - sprintf(filename, "%s/%c/%s-%s", adj_dir, *p2Login, p2Login, p1Login); - fp = fopen(filename, "r"); - if (!fp) { - sprintf(filename, "%s/%c/%s-%s", adj_dir, *p1Login, p2Login, p1Login); - fp = fopen(filename, "r"); - if (!fp) { - pprintf(p, "No stored game between \"%s\" and \"%s\".\n", - parray[p1].name, parray[p2].name); - return; - } - } - } - } - g = ExamineStored(fp, p, filename); - fclose(fp); - - if (g >= 0) { - if (garray[g].white_name[0] == '\0') - strcpy(garray[g].white_name, p1Login); - if (garray[g].black_name[0] == '\0') - strcpy(garray[g].black_name, p2Login); - } - return; -} - -char *FindHistory(int p, int p1, int game) -{ - FILE *fpHist; - static char fileName[MAX_FILENAME_SIZE]; - int index; - long when; - - sprintf(fileName, "%s/player_data/%c/%s.%s", stats_dir, - parray[p1].login[0], parray[p1].login, STATS_GAMES); - fpHist = fopen(fileName, "r"); - if (fpHist == NULL) { - pprintf(p, "No games in history for %s.\n", parray[p1].name); - return(NULL); - } - do { - fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d %*d %*s %*s %ld", - &index, &when); - } while (!feof(fpHist) && index != game); - - if (feof(fpHist)) { - pprintf(p, "There is no history game %d for %s.\n", game, parray[p1].name); - fclose(fpHist); - return(NULL); - } - fclose(fpHist); - - sprintf(fileName, "%s/%ld/%ld", hist_dir, when % 100, when); - return(fileName); -} - -void ExamineHistory(int p, int p1, int game) -{ - char *fileName; - - fileName = FindHistory(p, p1, game); - if (fileName != NULL) { - FILE *fpGame = fopen(fileName, "r"); - if (fpGame == NULL) { - pprintf(p, "History game %d not available for %s.\n", game, parray[p1].name); - } else { - ExamineStored(fpGame, p, fileName); - } - } - return; -} - -PUBLIC int com_examine(int p, param_list param) -{ - int p1, p2 = p, p1conn, p2conn = 1; - - if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are already examining a game.\n"); - } else if (parray[p].game >=0) { - pprintf(p, "You are playing a game.\n"); - } else if (param[0].type == TYPE_NULL) { - ExamineScratch(p); - } else if (param[0].type == TYPE_WORD) { - if (!FindPlayer(p, ¶m[0], &p1, &p1conn)) - return COM_OK; - - if (param[1].type == TYPE_INT) - ExamineHistory(p, p1, param[1].val.integer); - else { - if (param[1].type == TYPE_WORD - && !FindPlayer(p, ¶m[1], &p2, &p2conn)) - return COM_OK; - - ExamineAdjourned(p, p1, p2); - if (!p2conn) - player_remove(p2); - } - if (!p1conn) - player_remove(p1); - } - return COM_OK; -} - -PUBLIC int com_stored(int p, param_list param) -{ - DIR *dirp; -#ifdef USE_DIRENT - struct dirent *dp; -#else - struct direct *dp; -#endif - int p1, connected; - char dname[MAX_FILENAME_SIZE]; -#if 0 /* replacing all the code below with a - FindPlayer call; This stuff was buggy - anyway. */ - if (param[0].type == TYPE_WORD) { - if ((p1 = player_find_part_login(param[0].val.word)) < 0) { /* not logged in */ - connected = 0; - p1 = player_new(); - if (player_read(p1, param[0].val.word)) { - player_remove(p1); - pprintf(p, "There is no player by that name.\n"); - return COM_OK; - } - } else { - connected = 1; - } - } else { - p1 = p; - connected = 1; - } -#endif - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - sprintf(dname, "%s/%c", adj_dir, parray[p1].login[0]); - dirp = opendir(dname); - if (!dirp) { - pprintf(p, "Player %s has no games stored.\n", parray[p1].name); - if (!connected) - player_remove(p1); - return COM_OK; - } - pprintf(p, "Stored games for %s:\n", parray[p1].name); - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { - if (file_has_pname(dp->d_name, parray[p1].login)) { - pprintf(p, " %s vs. %s\n", file_wplayer(dp->d_name), file_bplayer(dp->d_name)); - } - } - - closedir(dirp); - pprintf(p, "\n"); - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_mailstored(int p, param_list param) -{ - int wp, wconnected, bp, bconnected, gotit = 0; - int g = -1; - - if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) - return (COM_OK); - - if (param[1].type == TYPE_INT) { /* look for a game from history */ - char *fileName = FindHistory(p, wp, param[1].val.integer); - if (fileName != NULL) { - FILE *fpGame = fopen(fileName, "r"); - if (fpGame == NULL) { - pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, parray[wp].name); - } else { - g = game_new(); - if (ReadGameAttrs(fpGame, fileName, g) < 0) - pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); - else - gotit = 1; - } - fclose(fpGame); - } - } else { /* look for a stored game between the players */ - if (FindPlayer(p, ¶m[1], &bp, &bconnected)) { - - g = game_new(); - if (game_read(g, wp, bp) >= 0) { /* look for a game white-black, */ - gotit = 1; - } else if (game_read(g, bp, wp) >= 0) { /* or black-white */ - gotit = 1; - } else { - pprintf(p, "There is no stored game %s vs. %s\n", parray[wp].name, parray[bp].name); - } - if (!bconnected) - player_remove(bp); - } - } - - if (gotit) { - if (strcasecmp(parray[p].name, garray[g].white_name) && strcasecmp(parray[p] -.name, garray[g].black_name) && garray[g].private && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - } else { - char subj[81]; - if (param[1].type == TYPE_INT) - sprintf(subj, "FICS history game: %s %d", parray[wp].name, param[1].val.integer); - else - sprintf(subj, "FICS adjourned game %s vs %s", garray[g].white_name, garray[g].black_name); - if (mail_string_to_user(p, subj, movesToString(g, parray[p].pgn))) - pprintf(p, "Moves NOT mailed, perhaps your address is incorrect.\n"); - else - pprintf(p, "Moves mailed.\n"); - } - } - if (!wconnected) - player_remove(wp); - if (g != -1) - game_remove(g); - return(COM_OK); -} - -/* it would be good to write a FindStored and nuke all the game_read(foo,bar) - game_read(bar,foo) etc. this stuff is a mess... */ - -PUBLIC int com_smoves(int p, param_list param) -{ - int wp, wconnected, bp, bconnected, gotit = 0; - int g = -1; - - if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) - return(COM_OK); - - if (param[1].type == TYPE_INT) { -/* look for a game from history */ - char *fileName = FindHistory(p, wp, param[1].val.integer); - if (fileName != NULL) { - FILE *fpGame = fopen(fileName, "r"); - if (fpGame == NULL) { - pprintf(p, "History game %d not available for %s.\n", param[1].val.integer, parray[wp].name); - } else { - g = game_new(); - if (ReadGameAttrs(fpGame, fileName, g) < 0) { - pprintf(p, "Gamefile is corrupt; please notify an admin.\n"); - } else { - gotit = 1; - } - } - fclose(fpGame); - } - } else { -/* look for a stored game between the players */ - if (FindPlayer(p, ¶m[1], &bp, &bconnected)) { - - g = game_new(); - if (game_read(g, wp, bp) >= 0) { /* look for a game white-black, */ - gotit = 1; - } else if (game_read(g, bp, wp) >= 0) { /* or black-white */ - gotit = 1; - } else { - pprintf(p, "There is no stored game %s vs. %s\n", parray[wp].name, parray[bp].name); - } - if (!bconnected) - player_remove(bp); - } - } - - if (gotit) { - if (strcasecmp(parray[p].name, garray[g].white_name) && strcasecmp(parray[p].name, garray[g].black_name) && garray[g].private && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - } else { - pprintf(p, "%s\n", movesToString(g, 0)); - } - } - if (!wconnected) - player_remove(wp); - if (g != -1) - game_remove(g); - return(COM_OK); -} - -PUBLIC int com_sposition(int p, param_list param) -{ - int wp, wconnected, bp, bconnected, confused = 0; - int g; - - if (!FindPlayer(p, ¶m[0], &wp, &wconnected)) - return (COM_OK); - if (!FindPlayer(p, ¶m[1], &bp, &bconnected)) - return COM_OK; - - g = game_new(); - if (game_read(g, wp, bp) < 0) { /* if no game white-black, */ - if (game_read(g, bp, wp) < 0) { /* look for black-white */ - confused = 1; - pprintf(p, "There is no stored game %s vs. %s\n", parray[wp].name, parray[bp].name); - } else { - int tmp; - tmp = wp; - wp = bp; - bp = tmp; - tmp = wconnected; - wconnected = bconnected; - bconnected = tmp; - } - } - if (!confused) { - if ((wp != p) && (bp != p) && (garray[g].private) && (parray[p].adminLevel < ADMIN_ADMIN)) { - pprintf(p, "Sorry, that is a private game.\n"); - } else { - garray[g].white = wp; - garray[g].black = bp; - garray[g].startTime = tenth_secs(); - garray[g].lastMoveTime = garray[g].startTime; - garray[g].lastDecTime = garray[g].startTime; - pprintf(p, "Position of stored game %s vs. %s\n", parray[wp].name, parray[bp].name); - send_board_to(g, p); - } - } - game_remove(g); - if (!wconnected) - player_remove(wp); - if (!bconnected) - player_remove(bp); - return COM_OK; -} - -PUBLIC int com_forward(int p, param_list param) -{ - int nHalfMoves = 1; - int g, i; - int p1; - unsigned now; - - if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { - pprintf(p, "You are not examining any games.\n"); - return COM_OK; - } - g = parray[p].game; - if (!strcmp(garray[g].white_name, garray[g].black_name)) { - pprintf(p, "You cannot go forward; no moves are stored.\n"); - return COM_OK; - } - if (param[0].type == TYPE_INT) { - nHalfMoves = param[0].val.integer; - } - if (garray[g].numHalfMoves > garray[g].revertHalfMove) { - pprintf(p, "No more moves.\n"); - return COM_OK; - } - if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "%s goes forward %d move%s.\n", - parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); - } - } - } - for (i = 0; i < nHalfMoves; i++) { - if (garray[g].numHalfMoves < garray[g].totalHalfMoves) { - execute_move(&garray[g].game_state, &garray[g].moveList[garray[g].numHalfMoves], 1); - if (garray[g].numHalfMoves + 1 > garray[g].examMoveListSize) { - garray[g].examMoveListSize += 20; /* Allocate 20 moves at a - time */ - if (!garray[g].examMoveList) { - garray[g].examMoveList = (move_t *) rmalloc(sizeof(move_t) * garray[g].examMoveListSize); - } else { - garray[g].examMoveList = (move_t *) rrealloc(garray[g].examMoveList, sizeof(move_t) * garray[g].examMoveListSize); - } - } - garray[g].examMoveList[garray[g].numHalfMoves] = garray[g].moveList[garray[g].numHalfMoves]; - garray[g].revertHalfMove++; - garray[g].numHalfMoves++; - } else { - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "End of game.\n"); - } - } - break; - } - } - /* roll back time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - return COM_OK; -} - -PUBLIC int com_backward(int p, param_list param) -{ - int nHalfMoves = 1; - int g, i; - int p1; - unsigned now; - - if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { - pprintf(p, "You are not examining any games.\n"); - return COM_OK; - } - g = parray[p].game; - if (param[0].type == TYPE_INT) { - nHalfMoves = param[0].val.integer; - } - if (garray[g].numHalfMoves != 0) { - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "%s backs up %d move%s.\n", - parray[p].name, nHalfMoves, (nHalfMoves == 1) ? "" : "s"); - } - } - } - for (i = 0; i < nHalfMoves; i++) { - if (backup_move(g, REL_EXAMINE) != MOVE_OK) { - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "Beginning of game.\n"); - } - } - - break; - } - } - if (garray[g].numHalfMoves < garray[g].revertHalfMove) { - garray[g].revertHalfMove = garray[g].numHalfMoves; - } - /* roll back time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - return COM_OK; -} - -PUBLIC int com_revert(int p, param_list param) -{ - int nHalfMoves = 1; - int g, i; - int p1; - unsigned now; - - if (!((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE))) { - pprintf(p, "You are not examining any games.\n"); - return COM_OK; - } - g = parray[p].game; - nHalfMoves = garray[g].numHalfMoves - garray[g].revertHalfMove; - if (nHalfMoves == 0) { - pprintf(p, "Already at mainline.\n"); - return COM_OK; - } - if (nHalfMoves < 0) { /* eek - should NEVER happen! */ - fprintf(stderr, "OUCH! in com_revert: nHalfMoves < 0\n"); - return COM_OK; - } - for (p1 = 0; p1 < p_num; p1++) { - if (parray[p1].status != PLAYER_PROMPT) - continue; - if (player_is_observe(p1, g) || parray[p1].game == g) { - pprintf(p1, "%s reverts to mainline.\n", parray[p].name); - } - } - for (i = 0; i < nHalfMoves; i++) { - backup_move(g, REL_EXAMINE);/* should never return error */ - } - /* roll back time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - return COM_OK; -} - -PUBLIC int com_takeback(int p, param_list param) -{ - int nHalfMoves = 1; - int from; - int g, i; - int p1; - - if ((parray[p].game <0) ||(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - p1 = parray[p].opponent; - if (parray[p1].simul_info.numBoards && - parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != - parray[p].game) { - pprintf(p, "You can only make requests when the simul player is at your board.\n"); - return COM_OK; - } - g = parray[p].game; - if (param[0].type == TYPE_INT) { - nHalfMoves = param[0].val.integer; - } - if ((from = player_find_pendfrom(p, parray[p].opponent, PEND_TAKEBACK)) >= 0) { - player_remove_request(parray[p].opponent, p, PEND_TAKEBACK); - if (parray[p].p_from_list[from].param1 == nHalfMoves) { - /* Doing the takeback */ - player_decline_offers(p, -1, -PEND_SIMUL); - for (i = 0; i < nHalfMoves; i++) { - if (backup_move(g, REL_GAME) != MOVE_OK) { - pprintf(garray[g].white, "Can only backup %d moves\n", i); - pprintf(garray[g].black, "Can only backup %d moves\n", i); - break; - } - } - -#ifdef TIMESEAL - - garray[g].wTimeWhenReceivedMove = 0; - garray[g].bTimeWhenReceivedMove = 0; - -#endif - - send_boards(g); - } else { - if (garray[g].numHalfMoves < nHalfMoves) { - pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); - pprintf_prompt(parray[p].opponent, "\n%s has declined the takeback request.\n", parray[p].name, nHalfMoves); - return COM_OK; - } - pprintf(p, "You disagree on the number of half-moves to takeback.\n"); - pprintf(p, "Alternate takeback request sent.\n"); - pprintf_prompt(parray[p].opponent, "\n%s proposes a different number (%d) of half-move(s).\n", parray[p].name, nHalfMoves); - player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); - } - } else { - if (garray[g].numHalfMoves < nHalfMoves) { - pprintf(p, "There are only %d half moves in your game.\n", garray[g].numHalfMoves); - return COM_OK; - } - pprintf(parray[p].opponent, "\n"); - pprintf_highlight(parray[p].opponent, "%s", parray[p].name); - pprintf_prompt(parray[p].opponent, " would like to take back %d half move(s).\n", - nHalfMoves); - pprintf(p, "Takeback request sent.\n"); - player_add_request(p, parray[p].opponent, PEND_TAKEBACK, nHalfMoves); - } - return COM_OK; -} - - -PUBLIC int com_switch(int p, param_list param) -{ - int g = parray[p].game; - int tmp, now; - int p1; - char *strTmp; - - if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - p1 = parray[p].opponent; - if (parray[p1].simul_info.numBoards && - parray[p1].simul_info.boards[parray[p1].simul_info.onBoard] != g) { - pprintf(p, "You can only make requests when the simul player is at your board.\n"); - return COM_OK; - } - if (player_find_pendfrom(p, parray[p].opponent, PEND_SWITCH) >= 0) { - player_remove_request(parray[p].opponent, p, PEND_SWITCH); - /* Doing the switch */ - player_decline_offers(p, -1, -PEND_SIMUL); - - tmp = garray[g].white; - garray[g].white = garray[g].black; - garray[g].black = tmp; - parray[p].side = (parray[p].side == WHITE) ? BLACK : WHITE; - strTmp = strdup(garray[g].white_name); - strcpy(garray[g].white_name, garray[g].black_name); - strcpy(garray[g].black_name, strTmp); - strfree(strTmp); - - parray[parray[p].opponent].side = - (parray[parray[p].opponent].side == WHITE) ? BLACK : WHITE; - /* Roll back the time */ - if (garray[g].game_state.onMove == WHITE) { - garray[g].wTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } else { - garray[g].bTime += (garray[g].lastDecTime - garray[g].lastMoveTime); - } - now = tenth_secs(); - if (garray[g].numHalfMoves == 0) - garray[g].timeOfStart = now; - garray[g].lastMoveTime = now; - garray[g].lastDecTime = now; - send_boards(g); - return COM_OK; - } - if (garray[g].rated && garray[g].numHalfMoves > 0) { - pprintf(p, "You cannot switch sides once a rated game is underway.\n"); - return COM_OK; - } - pprintf(parray[p].opponent, "\n"); - pprintf_highlight(parray[p].opponent, "%s", parray[p].name); - pprintf_prompt(parray[p].opponent, " would like to switch sides.\nType \"accept\" to switch sides, or \"decline\" to refuse.\n"); - pprintf(p, "Switch request sent.\n"); - player_add_request(p, parray[p].opponent, PEND_SWITCH, 0); - return COM_OK; -} - - -PUBLIC int com_history(int p, param_list param) -{ - int p1, connected; - char fname[MAX_FILENAME_SIZE]; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p1].login[0], - parray[p1].login, STATS_GAMES); - pgames(p, p1, fname); - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_time(int p, param_list param) -{ - int p1, g; - - if (param[0].type == TYPE_NULL) { - g = parray[p].game; - if ((g < 0) || (garray[g].status == GAME_EXAMINE)) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - } else { - g = GameNumFromParam(p, &p1, ¶m[0]); - if (g < 0) - return COM_OK; - } - if ((g < 0) || (g >= g_num) || (garray[g].status != GAME_ACTIVE)) { - pprintf(p, "There is no such game.\n"); - return COM_OK; - } - game_update_time(g); - pprintf(p, "White (%s) : %d mins, %d secs\n", - parray[garray[g].white].name, - garray[g].wTime / 600, - (garray[g].wTime - ((garray[g].wTime / 600) * 600)) / 10); - pprintf(p, "Black (%s) : %d mins, %d secs\n", - parray[garray[g].black].name, - garray[g].bTime / 600, - (garray[g].bTime - ((garray[g].bTime / 600) * 600)) / 10); - return COM_OK; -} - -PUBLIC int com_boards(int p, param_list param) -{ - char *category = NULL; - char dname[MAX_FILENAME_SIZE]; - DIR *dirp; -#ifdef USE_DIRENT - struct dirent *dp; -#else - struct direct *dp; -#endif - - if (param[0].type == TYPE_WORD) - category = param[0].val.word; - if (category) { - pprintf(p, "Boards Available For Category %s:\n", category); - sprintf(dname, "%s/%s", board_dir, category); - } else { - pprintf(p, "Categories Available:\n"); - sprintf(dname, "%s", board_dir); - } - dirp = opendir(dname); - if (!dirp) { - pprintf(p, "No such category %s, try \"boards\".\n", category); - return COM_OK; - } - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { - if (!strcmp(dp->d_name, ".")) - continue; - if (!strcmp(dp->d_name, "..")) - continue; - pprintf(p, "%s\n", dp->d_name); - } - closedir(dirp); - return COM_OK; -} - -PUBLIC int com_simmatch(int p, param_list param) -{ - int p1, g, adjourned; - int num; - char tmp[100]; - - if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You are still examining a game.\n"); - return COM_OK; - } - p1 = player_find_part_login(param[0].val.word); - if (p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); - return COM_OK; - } - if (p == p1) { - pprintf(p, "You can't simmatch yourself!\n"); - return COM_OK; - } - if (player_find_pendfrom(p, p1, PEND_SIMUL) >= 0) { - player_remove_request(p, p1, PEND_MATCH); - player_remove_request(p1, p, PEND_MATCH); - player_remove_request(p, p1, PEND_SIMUL); - player_remove_request(p1, p, PEND_SIMUL); - player_withdraw_offers(p, -1, PEND_SIMUL); - player_decline_offers(p1, -1, PEND_SIMUL); - player_withdraw_offers(p1, -1, PEND_SIMUL); - player_decline_offers(p, -1, PEND_MATCH); - player_withdraw_offers(p, -1, PEND_MATCH); - player_decline_offers(p1, -1, PEND_MATCH); - player_withdraw_offers(p1, -1, PEND_MATCH); - - - - /* Accepting Simul ! */ - - - if (parray[p].simul_info.numBoards >= MAX_SIMUL) { - pprintf(p, "You are already playing the maximum of %d boards.\n", MAX_SIMUL); - pprintf(p1, "Simul request removed, boards filled.\n"); - return COM_OK; - } - unobserveAll(p); /* stop observing when match starts */ - unobserveAll(p1); - - g = game_new(); - adjourned = 0; - if (game_read(g, p, p1) >= 0) - adjourned = 1; - if (!adjourned) { /* no adjourned game, so begin a new game */ - game_remove(g); - - if (create_new_match(p, p1, 0, 0, 0, 0, 0, "standard", "standard", 1)) { - pprintf(p, "There was a problem creating the new match.\n"); - pprintf_prompt(p1, "There was a problem creating the new match.\n"); - return COM_OK; - } - } else { /* resume adjourned game */ - game_delete(p, p1); - - sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s simul.}\n", g + 1, parray[p].name, parray[p1].name, rstr[garray[g].rated], bstr[garray[g].type]); - pprintf(p, tmp); - pprintf(p1, tmp); - - garray[g].white = p; - garray[g].black = p1; - garray[g].status = GAME_ACTIVE; - garray[g].startTime = tenth_secs(); - garray[g].lastMoveTime = garray[g].startTime; - garray[g].lastDecTime = garray[g].startTime; - parray[p].game = g; - parray[p].opponent = p1; - parray[p].side = WHITE; - parray[p1].game = g; - parray[p1].opponent = p; - parray[p1].side = BLACK; - send_boards(g); - } - - num = parray[p].simul_info.numBoards; - parray[p].simul_info.results[num] = -1; - parray[p].simul_info.boards[num] = parray[p].game; - parray[p].simul_info.numBoards++; - if (parray[p].simul_info.numBoards > 1 && - parray[p].simul_info.onBoard >= 0) - player_goto_board(p, parray[p].simul_info.onBoard); - else - parray[p].simul_info.onBoard = 0; - return COM_OK; - } - if (player_find_pendfrom(p, -1, PEND_SIMUL) >= 0) { - pprintf(p, "You cannot be the simul giver and request to join another simul.\nThat would just be too confusing for me and you.\n"); - return COM_OK; - } - if (parray[p].simul_info.numBoards) { - pprintf(p, "You cannot be the simul giver and request to join another simul.\nThat would just be too confusing for me and you.\n"); - return COM_OK; - } - if (parray[p].game >=0) { - pprintf(p, "You are already playing a game.\n"); - return COM_OK; - } - if (!parray[p1].sopen) { - pprintf_highlight(p, "%s", parray[p1].name); - pprintf(p, " is not open to receiving simul requests.\n"); - return COM_OK; - } - if (parray[p1].simul_info.numBoards >= MAX_SIMUL) { - pprintf_highlight(p, "%s", parray[p1].name); - pprintf(p, " is already playing the maximum of %d boards.\n", MAX_SIMUL); - return COM_OK; - } -/* loon: checking for some crazy situations we can't allow :) */ - - if ((parray[p1].game >=0) &&(parray[p1].simul_info.numBoards == 0)) { - pprintf_highlight(p, "%s", parray[p1].name); - if (parray[garray[parray[p1].game].white].simul_info.numBoards) { - pprintf(p, " is playing in "); - pprintf_highlight(p, "%s", parray[parray[p1].opponent].name); - pprintf(p, "'s simul, and can't accept.\n"); - } else { - pprintf(p, " can't begin a simul while playing a non-simul game.\n"); - } - return COM_OK; - } -/* loon: this was (p, p1, PEND_SIMUL) but player_add_request needs 4 args... -if 0 is the incorrect 4th arg, please fix :) */ - - g = game_new(); /* Check if an adjourned untimed game */ - adjourned = ((game_read(g, p, p1) < 0) && (game_read(g, p1, p) < 0)) ? 0 : 1; - if (adjourned) { - if (!(garray[g].type == TYPE_UNTIMED)) - adjourned = 0; - } - game_remove(g); - - if (player_add_request(p, p1, PEND_SIMUL, 0)) { - pprintf(p, "Maximum number of pending actions reached. Your request was not sent.\nTry again later.\n"); - return COM_OK; - } else { - pprintf(p1, "\n"); - pprintf_highlight(p1, "%s", parray[p].name); - if (adjourned) { - pprintf_prompt(p1, " requests to continue an adjourned simul game.\n"); - pprintf(p, "Request to resume simul sent. Adjourned game found.\n"); - } else { - pprintf_prompt(p1, " requests to join a simul match with you.\n"); - pprintf(p, "Simul match request sent.\n"); - } - } - return COM_OK; -} - -PUBLIC int com_goboard(int p, param_list param) -{ - int on, g, p1; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - p1 = player_find_part_login(param[0].val.word); - if (p1 < 0) { - pprintf(p, "No user named \"%s\" is logged in.\n", param[0].val.word); - return COM_OK; - } - if (p == p1) { - pprintf(p, "You can't goboard yourself!\n"); - return COM_OK; - } - on = parray[p].simul_info.onBoard; - g = parray[p].simul_info.boards[on]; - if (p1 == garray[g].black) { - pprintf(p, "You are already at that board!\n"); - return COM_OK; - } - if (parray[p].simul_info.numBoards > 1) { - player_decline_offers(p, -1, -PEND_SIMUL); - if (player_goto_simulgame_bynum(p, parray[p1].game) !=-1) { - if (g >= 0) { - pprintf(garray[g].black, "\n"); - pprintf_highlight(garray[g].black, "%s", parray[p].name); - pprintf_prompt(garray[g].black, " has moved away from your board.\n"); - } - } - } else - pprintf(p, "You are only playing one board!\n"); - return COM_OK; -} - -PUBLIC int com_gonum(int p, param_list param) -{ - int on, g, gamenum; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - on = parray[p].simul_info.onBoard; - g = parray[p].simul_info.boards[on]; - gamenum = param[0].val.integer - 1; - if (gamenum < 0) - gamenum = 0; - if (on == gamenum) { - pprintf(p, "You are already at that board!\n"); - return COM_OK; - } - if (parray[p].simul_info.numBoards > 1) { - player_decline_offers(p, -1, -PEND_SIMUL); - if (player_goto_simulgame_bynum(p, gamenum) != -1) { - if (g >= 0) { - pprintf(garray[g].black, "\n"); - pprintf_highlight(garray[g].black, "%s", parray[p].name); - pprintf_prompt(garray[g].black, " has moved away from your board.\n"); - } - } - } else - pprintf(p, "You are only playing one board!\n"); - return COM_OK; -} - -PUBLIC int com_simnext(int p, param_list param) -{ - int on, g; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - if (parray[p].simul_info.numBoards > 1) { - player_decline_offers(p, -1, -PEND_SIMUL); - on = parray[p].simul_info.onBoard; - g = parray[p].simul_info.boards[on]; - if (g >= 0) { - pprintf(garray[g].black, "\n"); - pprintf_highlight(garray[g].black, "%s", parray[p].name); - pprintf_prompt(garray[g].black, " is moving away from your board.\n"); - player_goto_next_board(p); - } - } else - pprintf(p, "You are only playing one board!\n"); - return COM_OK; -} - - -PUBLIC int com_simprev(int p, param_list param) -{ - int on, g; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - if (parray[p].simul_info.numBoards > 1) { - player_decline_offers(p, -1, -PEND_SIMUL); - on = parray[p].simul_info.onBoard; - g = parray[p].simul_info.boards[on]; - if (g >= 0) { - pprintf(garray[g].black, "\n"); - pprintf_highlight(garray[g].black, "%s", parray[p].name); - pprintf_prompt(garray[g].black, " is moving back to the previous board.\n"); - } - player_goto_prev_board(p); - } else - pprintf(p, "You are only playing one board!\n"); - return COM_OK; -} - -PUBLIC int com_simgames(int p, param_list param) -{ - int p1 = p; - - if (param[0].type == TYPE_WORD) { - if ((p1 = player_find_part_login(param[0].val.word)) < 0) { - pprintf(p, "No player named %s is logged in.\n", param[0].val.word); - return COM_OK; - } - } - if (p1 == p) - pprintf(p, "You are playing %d simultaneous games.\n", - player_num_active_boards(p1)); - else - pprintf(p, "%s is playing %d simultaneous games.\n", parray[p1].name, - player_num_active_boards(p1)); - return COM_OK; -} - -PUBLIC int com_simpass(int p, param_list param) -{ - int g, p1, on; - - if (parray[p].game <0) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - g = parray[p].game; - p1 = garray[g].white; - if (!parray[p1].simul_info.numBoards) { - pprintf(p, "You are not participating in a simul.\n"); - return COM_OK; - } - if (p == p1) { - pprintf(p, "You are the simul holder and cannot pass!\n"); - return COM_OK; - } - if (player_num_active_boards(p1) == 1) { - pprintf(p, "This is the only game, so passing is futile.\n"); - return COM_OK; - } - on = parray[p1].simul_info.onBoard; - if (on != g) { - pprintf(p, "You cannot pass until the simul holder arrives!\n"); - return COM_OK; - } - if (garray[g].passes >= MAX_SIMPASS) { - if (parray[p].bell) - pprintf(p, "\a"); - pprintf(p, "You have reached your maximum of %d passes.\n", MAX_SIMPASS); - pprintf(p, "Please move IMMEDIATELY!\n"); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf_prompt(p1, " tried to pass, but is out of passes.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -PEND_SIMUL); - - garray[g].passes++; - pprintf(p, "You have passed and have %d passes left.\n", - (MAX_SIMPASS - garray[g].passes)); - pprintf_highlight(p1, "%s", parray[p].name); - pprintf_prompt(p1, " has decided to pass and has %d passes left.\n", - (MAX_SIMPASS - garray[g].passes)); - player_goto_next_board(p1); - return COM_OK; -} - -PUBLIC int com_simabort(int p, param_list param) -{ - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -PEND_SIMUL); - game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], - WHITE, END_ABORT); - return COM_OK; -} - -PUBLIC int com_simallabort(int p, param_list param) -{ - int i; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -PEND_SIMUL); - for (i = 0; i < parray[p].simul_info.numBoards; i++) { - if (parray[p].simul_info.boards[i] >= 0) { - game_ended(parray[p].simul_info.boards[i], - WHITE, END_ABORT); - } - } - return COM_OK; -} - -PUBLIC int com_simadjourn(int p, param_list param) -{ - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -PEND_SIMUL); - game_ended(parray[p].simul_info.boards[parray[p].simul_info.onBoard], - WHITE, END_ADJOURN); - return COM_OK; -} - -PUBLIC int com_simalladjourn(int p, param_list param) -{ - int i; - - if (!parray[p].simul_info.numBoards) { - pprintf(p, "You are not giving a simul.\n"); - return COM_OK; - } - player_decline_offers(p, -1, -PEND_SIMUL); - for (i = 0; i < parray[p].simul_info.numBoards; i++) { - if (parray[p].simul_info.boards[i] >= 0) { - game_ended(parray[p].simul_info.boards[i], - WHITE, END_ADJOURN); - } - } - return COM_OK; -} - -PUBLIC int com_moretime(int p, param_list param) -{ - int g, increment; - - ASSERT(param[0].type == TYPE_INT); - if ((parray[p].game >=0) &&(garray[parray[p].game].status == GAME_EXAMINE)) { - pprintf(p, "You cannot use moretime in an examined game.\n"); - return COM_OK; - } - increment = param[0].val.integer; - if (increment <= 0) { - pprintf(p, "Moretime requires an integer value greater than zero.\n"); - return COM_OK; - } - if (parray[p].game <0) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } - if (increment > 600) { - pprintf(p, "Moretime has a maximum limit of 600 seconds.\n"); - increment = 600; - } - g = parray[p].game; - if (garray[g].white == p) { - garray[g].bTime += increment * 10; -#ifdef TIMESEAL - garray[g].bRealTime += increment * 10 * 100; -#endif - pprintf(p, "%d seconds were added to your opponents clock\n", - increment); - pprintf_prompt(parray[p].opponent, - "\nYour opponent has added %d seconds to your clock.\n", - increment); - } - if (garray[g].black == p) { - garray[g].wTime += increment * 10;; -#ifdef TIMESEAL - garray[g].wRealTime += increment * 10 * 100; -#endif - pprintf(p, "%d seconds were added to your opponents clock\n", - increment); - pprintf_prompt(parray[p].opponent, - "\nYour opponent has added %d seconds to your clock.\n", - increment); - } - return COM_OK; -} diff --git a/FICS/multicol.c.orig b/FICS/multicol.c.orig deleted file mode 100644 index 8d52b04..0000000 --- a/FICS/multicol.c.orig +++ /dev/null @@ -1,153 +0,0 @@ -/* multicol.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "multicol.h" -#include "utils.h" -#include "rmalloc.h" - -/* grimm */ -#if defined(SGI) -#else -/* char *strchr( char *s, int c); */ -#endif -/* added for warning */ - -PUBLIC multicol *multicol_start(int maxArray) -{ - int i; - multicol *m; - - m = (multicol *) rmalloc(sizeof(multicol)); - m->arraySize = maxArray; - m->num = 0; - m->strArray = (char **) rmalloc(sizeof(char *) * m->arraySize); - for (i = 0; i < m->arraySize; i++) - m->strArray[i] = NULL; - return m; -} - -PUBLIC int multicol_store(multicol * m, char *str) -{ - if (m->num >= m->arraySize) - return -1; - if (!str) - return -1; - m->strArray[m->num] = strdup(str); - m->num++; - return 0; -} - -PUBLIC int multicol_store_sorted(multicol * m, char *str) -/* use this instead of milticol_store to print a list sorted */ -{ - int i; - int found = 0; - if (m->num >= m->arraySize) - return -1; - if (!str) - return -1; - for (i = m->num; (i > 0) && (!found); i--) { - if (strcasecmp(str, m->strArray[i - 1]) >= 0) { - found = 1; - m->strArray[i] = strdup(str); - } else { - m->strArray[i] = m->strArray[i - 1]; - } - } - if (!found) - m->strArray[0] = strdup(str); - m->num++; - return 0; -} - -PUBLIC int multicol_pprint(multicol * m, int player, int cols, int space) -{ - int i; - int maxWidth = 0; - int numPerLine; - int numLines; - int on, theone, len; - int done; - int temp; - char *tempptr; - - pprintf(player, "\n"); - for (i = 0; i < m->num; i++) { - tempptr = m->strArray[i]; - temp = strlen(tempptr); /* loon: yes, this is pathetic */ - for (; *tempptr; tempptr++) { - if (*tempptr == '\033') - temp -= 4; - } - if (temp > maxWidth) - maxWidth = temp; - } - maxWidth += space; - numPerLine = cols / maxWidth; - numLines = m->num / numPerLine; - if (numLines * numPerLine < m->num) - numLines++; - on = 0; - done = 0; - while (!done) { - for (i = 0; i < numPerLine; i++) { - theone = on + numLines * i; - if (theone >= m->num) { - break; - } - tempptr = m->strArray[theone]; - temp = strlen(tempptr); /* loon: yes, still pathetic */ - for (; *tempptr; tempptr++) { - if (*tempptr == '\033') - temp -= 4; - } - len = maxWidth - temp; - if (i == numPerLine - 1) - len -= space; - pprintf(player, "%s", m->strArray[theone]); - while (len) { - pprintf(player, " "); - len--; - } - } - pprintf(player, "\n"); - on += 1; - if (on >= numLines) - break; - } - return 0; -} - -PUBLIC int multicol_end(multicol * m) -{ - int i; - for (i = 0; i < m->num; i++) - rfree(m->strArray[i]); - rfree(m->strArray); - rfree(m); - return 0; -} diff --git a/FICS/network.c.orig b/FICS/network.c.orig deleted file mode 100644 index eed60c8..0000000 --- a/FICS/network.c.orig +++ /dev/null @@ -1,657 +0,0 @@ -/* network.c - * - */ - -#include "stdinclude.h" - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/telnet.h> - -#include "common.h" -#include "utils.h" -#include "playerdb.h" -#include "network.h" -#include "rmalloc.h" -#ifdef TIMESEAL -#include "timeseal.h" -#endif - -extern int errno; - -/* grimm */ -#if defined(SGI) -#else -/* -int send(int s, char *msg, int len, int flags); -int recv(int s, char *buf, int len, int flags); -char *memset(char *s, int c, int n); -int setsockopt( int s, int level, int optname, char *optval, int optlen); -int accept(int s, struct sockaddr *addr, size_t *addrlen); -void *memmove(void *dst0, const void *src0, register size_t length); -int bind(int s, struct sockaddr *name, int namelen); -int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, - struct timeval *timeout); -int listen(int s, int level); -*/ -#endif -/* added for warning */ - -PRIVATE int sockfd = 0; /* The socket */ -PRIVATE int numConnections = 0; -/* Sparse array */ -PUBLIC connection con[256]; - -PUBLIC int no_file; -PUBLIC int max_connections; - -/* Index == fd, for sparse array, quick lookups! wasted memory :( */ -PUBLIC int findConnection(int fd) -{ - if (con[fd].status == NETSTAT_EMPTY) - return -1; - else - return fd; -} - -PUBLIC int net_addConnection(int fd, unsigned int fromHost) -{ - int noblock = 1; - - if (findConnection(fd) >= 0) { - fprintf(stderr, "FICS: FD already in connection table!\n"); - return -1; - } - if (numConnections == max_connections) - return -1; - if (ioctl(fd, FIONBIO, &noblock) == -1) { - fprintf(stderr, "Error setting nonblocking mode errno=%d\n", errno); - } - con[fd].fd = fd; - if (fd != 0) - con[fd].outFd = fd; - else - con[fd].outFd = 1; - con[fd].fromHost = fromHost; - con[fd].status = NETSTAT_CONNECTED; -#ifdef TIMESEAL - con[fd].user[0]='\0'; - con[fd].sys[0]='\0'; - con[fd].timeseal = 0; - con[fd].time = 0; -#endif - con[fd].numPending = 0; - con[fd].processed = 0; - con[fd].outPos = 0; - if (con[fd].sndbuf == NULL) { -#ifdef DEBUG - fprintf(stderr, "FICS: nac(%d) allocating sndbuf.\n", fd); -#endif - con[fd].sndbufpos = 0; - con[fd].sndbufsize = MAX_STRING_LENGTH; - con[fd].sndbuf = rmalloc(MAX_STRING_LENGTH); - } else { -#ifdef DEBUG - fprintf(stderr, "FICS: nac(%d) reusing old sndbuf size %d pos %d.\n", fd, con[fd].sndbufsize, con[fd].sndbufpos); -#endif - } - con[fd].state = 0; - numConnections++; - -#ifdef DEBUG - fprintf(stderr, "FICS: fd: %d connections: %d descriptors: %d \n", fd, numConnections, getdtablesize()); /* sparky 3/13/95 */ -#endif - - return 0; -} - -PRIVATE int remConnection(int fd) -{ - int which; - if ((which = findConnection(fd)) < 0) { - return -1; - } - numConnections--; - con[fd].status = NETSTAT_EMPTY; - if (con[fd].sndbuf == NULL) { - fprintf(stderr, "FICS: remcon(%d) totally screwed, this shouldn't happen.\n", fd); - } else { - if (con[fd].sndbufsize > MAX_STRING_LENGTH) { - con[fd].sndbufsize = MAX_STRING_LENGTH; - con[fd].sndbuf = rrealloc(con[fd].sndbuf, MAX_STRING_LENGTH); - } - if (con[fd].sndbufpos) { /* didn't send everything, bummer */ - con[fd].sndbufpos = 0; - } - } - return 0; -} - -PRIVATE void net_flushme(int which) -{ - int sent; - - sent = send(con[which].outFd, con[which].sndbuf, con[which].sndbufpos, 0); - if (sent == -1) { - if (errno != EPIPE) /* EPIPE = they've disconnected */ - fprintf(stderr, "FICS: net_flushme(%d) couldn't send, errno=%d.\n", which, errno); - con[which].sndbufpos = 0; - } else { - con[which].sndbufpos -= sent; - if (con[which].sndbufpos) - memmove(con[which].sndbuf, con[which].sndbuf + sent, con[which].sndbufpos); - } - if (con[which].sndbufsize > MAX_STRING_LENGTH && con[which].sndbufpos < MAX_STRING_LENGTH) { - /* time to shrink the buffer */ - con[which].sndbuf = rrealloc(con[which].sndbuf, MAX_STRING_LENGTH); - con[which].sndbufsize = MAX_STRING_LENGTH; - } -} - -PRIVATE void net_flush_all_connections(void) -{ - int which; - fd_set writefds; - struct timeval to; - - FD_ZERO(&writefds); - for (which = 0; which < max_connections; which++) - if (con[which].status == NETSTAT_CONNECTED && con[which].sndbufpos) - FD_SET(con[which].outFd, &writefds); - - to.tv_usec = 0; - to.tv_sec = 0; - select(no_file, NULL, &writefds, NULL, &to); - for (which = 0; which < max_connections; which++) { - if (FD_ISSET(con[which].outFd, &writefds)) { - net_flushme(which); - } - } -} - -PRIVATE void net_flush_connection(int fd) -{ - int which; - fd_set writefds; - struct timeval to; - - if (((which = findConnection(fd)) >= 0) && (con[which].sndbufpos)) { - FD_ZERO(&writefds); - FD_SET(con[which].outFd, &writefds); - to.tv_usec = 0; - to.tv_sec = 0; - select(no_file, NULL, &writefds, NULL, &to); - if (FD_ISSET(con[which].outFd, &writefds)) { - net_flushme(which); - } - } - return; -} - -PRIVATE int sendme(int which, char *str, int len) -{ - int i, count; - fd_set writefds; - struct timeval to; - count = len; - - while ((i = ((con[which].sndbufsize - con[which].sndbufpos) < len) ? (con[which].sndbufsize - con[which].sndbufpos) : len) > 0) { - memmove(con[which].sndbuf + con[which].sndbufpos, str, i); - con[which].sndbufpos += i; - if (con[which].sndbufpos == con[which].sndbufsize) { - - FD_ZERO(&writefds); - FD_SET(con[which].outFd, &writefds); - to.tv_usec = 0; - to.tv_sec = 0; - select(no_file, NULL, &writefds, NULL, &to); - if (FD_ISSET(con[which].outFd, &writefds)) { - net_flushme(which); - } else { - /* time to grow the buffer */ - con[which].sndbufsize += MAX_STRING_LENGTH; - con[which].sndbuf = rrealloc(con[which].sndbuf, con[which].sndbufsize); - } - } - str += i; - len -= i; - } - return count; -} - -/* - * -1 for an error other than EWOULDBLOCK. - * Put <lf> after every <cr> and put \ at the end of overlength lines. - * Doesn't send anything unless the buffer fills, output waits until - * flushed -*/ -PUBLIC int net_send_string(int fd, char *str, int format) -{ - int which, i, j; - - if ((which = findConnection(fd)) < 0) { - return -1; - } - while (*str) { - for (i = 0; str[i] >= ' '; i++); - if (i) { - if (format && (i >= (j = LINE_WIDTH - con[which].outPos))) { /* word wrap */ - i = j; - while (i > 0 && str[i - 1] != ' ') - i--; - while (i > 0 && str[i - 1] == ' ') - i--; - if (i == 0) - i = j - 1; - sendme(which, str, i); - sendme(which, "\n\r\\ ", 6); - con[which].outPos = 4; - while (str[i] == ' ') /* eat the leading spaces after we wrap */ - i++; - } else { - sendme(which, str, i); - con[which].outPos += i; - } - str += i; - } else { /* non-printable stuff handled here */ - switch (*str) { - case '\t': - sendme(which, " ", 8 - (con[which].outPos & 7)); - con[which].outPos &= ~7; - if (con[which].outPos += 8 >= LINE_WIDTH) - con[which].outPos = 0; - break; - case '\n': - sendme(which, "\n\r", 2); - con[which].outPos = 0; - break; - case '\033': - con[which].outPos -= 3; - default: - sendme(which, str, 1); - } - str++; - } - } - return 0; -} - -/* if we get a complete line (something terminated by \n), copy it to com - and return 1. - if we don't get a complete line, but there is no error, return 0. - if some error, return -1. - */ -PUBLIC int readline2(char *com, int who) -{ - unsigned char *start, *s, *d; - int howmany, state, fd, pending; - - static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; - static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; - static unsigned char ayt[] = "[Responding to AYT: Yes, I'm here.]\n"; - - state = con[who].state; - if ((state == 2) || (state > 4)) { - fprintf(stderr, "FICS: state screwed for con[%d], this is a bug.\n", who); - state = 0; - } - s = start = con[who].inBuf; - pending = con[who].numPending; - fd = con[who].fd; - - howmany = recv(fd, start + pending, MAX_STRING_LENGTH - 1 - pending, 0); - if (howmany == 0) /* error: they've disconnected */ - return (-1); - else if (howmany == -1) { - if (errno != EWOULDBLOCK) { /* some other error */ - return (-1); - } else if (con[who].processed) { /* nothing new and nothing old */ - return (0); - } else { /* nothing new, but some unprocessed old */ - howmany = 0; - } - } - if (con[who].processed) - s += pending; - else - howmany += pending; - d = s; - - for (; howmany-- > 0; s++) { - switch (state) { - case 0: /* Haven't skipped over any control chars or - telnet commands */ - if (*s == IAC) { - d = s; - state = 1; - } else if (*s == '\n') { - *s = '\0'; - strcpy(com, start); - if (howmany) - bcopy(s + 1, start, howmany); - con[who].state = 0; - con[who].numPending = howmany; - con[who].processed = 0; - con[who].outPos = 0; - return (1); - } else if ((*s > (0xff - 0x20)) || (*s < 0x20)) { - d = s; - state = 2; - } - break; - case 1: /* got telnet IAC */ - if (*s == IP) - return (-1); /* ^C = logout */ - else if (*s == DO) - state = 4; - else if ((*s == WILL) || (*s == DONT) || (*s == WONT)) - state = 3; /* this is cheesy, but we aren't using em */ - else if (*s == AYT) { - send(fd, (char *) ayt, strlen((char *) ayt), 0); - state = 2; - } else if (*s == EL) { /* erase line */ - d = start; - state = 2; - } else /* dunno what it is, so ignore it */ - state = 2; - break; - case 2: /* we've skipped over something, need to - shuffle processed chars down */ - if (*s == IAC) - state = 1; - else if (*s == '\n') { - *d = '\0'; - strcpy(com, start); - if (howmany) - memmove(start, s + 1, howmany); - con[who].state = 0; - con[who].numPending = howmany; - con[who].processed = 0; - con[who].outPos = 0; - return (1); - } else if (*s >= ' ') - *(d++) = *s; - break; - case 3: /* some telnet junk we're ignoring */ - state = 2; - break; - case 4: /* got IAC DO */ - if (*s == TELOPT_TM) - send(fd, (char *) will_tm, strlen((char *) will_tm), 0); - else if (*s == TELOPT_SGA) - send(fd, (char *) will_sga, strlen((char *) will_sga), 0); - state = 2; - break; - } - } - if (state == 0) - d = s; - else if (state == 2) - state = 0; - con[who].state = state; - con[who].numPending = d - start; - con[who].processed = 1; - if (con[who].numPending == MAX_STRING_LENGTH - 1) { /* buffer full */ - *d = '\0'; - strcpy(com, start); - con[who].state = 0; - con[who].numPending = 0; - con[who].processed = 0; - return (1); - } - return (0); -} - -/* -PRIVATE int readline(int who) -{ - int e, fd = con[who].fd; - char *t = con[who].inBuf; - int recvCount; - int totalCount = 0; - unsigned char c; - static unsigned char will_tm[] = {IAC, WILL, TELOPT_TM, '\0'}; - static unsigned char will_sga[] = {IAC, WILL, TELOPT_SGA, '\0'}; - - t += con[who].numPending; - - while ((recvCount = recv(fd, (char *) &c, 1, 0)) == 1) { - totalCount += recvCount; - if (c == IAC) { - recvCount = recv(fd, (char *) &c, 1, 0); - if (recvCount == 1) { - totalCount += recvCount; - switch (c) { - case IP: - c = '\3'; - break; - case DO: - recvCount = recv(fd, (char *) &c, 1, 0); - if (recvCount == 1) { - totalCount += recvCount; - if (c == TELOPT_TM) { - send(fd, (char *) will_tm, strlen((char *) will_tm), 0); - } else if (c == TELOPT_SGA) { - send(fd, (char *) will_sga, strlen((char *) will_sga), 0); - } - } - c = '\0'; - break; - case DONT: - recvCount = recv(fd, (char *) &c, 1, 0); - break; - c = '\0'; - default: - recvCount = recv(fd, (char *) &c, 1, 0); - c = '\0'; - break; - } - } - } - if (c != '\r' && c > 2) { - if (isprint(c) || (c == '\n')) { - *t++ = c; - con[who].numPending++; - } - } - if (c == '\n' || con[who].numPending >= MAX_STRING_LENGTH - 1) { - *--t = '\0'; - con[who].numPending = 0; - con[fd].outPos = 0; - return 1; - } - } - - *t = '\0'; - e = ((totalCount == 0) || (errno != EWOULDBLOCK)) ? -1 : 0; - return (e); -} -*/ - -PUBLIC int net_init(int port) -{ - int i; - int opt; - struct sockaddr_in serv_addr; - struct linger lingeropt; - - no_file = getdtablesize(); -/* Although we have 256 descriptors to work with for opening sockets, - * we can only use 126 maximum of them for some reason... built in - * limitation of the socket libs? Sparky 3/13/95 - */ - if (no_file > MAX_PLAYER + 10) - no_file = MAX_PLAYER + 10; - max_connections = no_file - 10; - for (i = 0; i < no_file; i++) { - con[i].status = NETSTAT_EMPTY; - con[i].sndbuf = NULL; - con[i].sndbufsize = con[i].sndbufpos = 0; - } - /* Open a TCP socket (an Internet stream socket). */ - if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - fprintf(stderr, "FICS: can't open stream socket\n"); - return -1; - } - /* Bind our local address so that the client can send to us */ - memset((char *) &serv_addr, 0, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - serv_addr.sin_port = htons(port); - - /** added in an attempt to allow rebinding to the port **/ - - opt = 1; - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt)); - opt = 1; - setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt)); - lingeropt.l_onoff = 0; - lingeropt.l_linger = 0; - setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (char *) &lingeropt, sizeof(lingeropt)); - -/* -#ifdef DEBUG - opt = 1; - setsockopt(sockfd, SOL_SOCKET, SO_DEBUG, (char *)&opt, sizeof(opt)); -#endif -*/ - - if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) { - fprintf(stderr, "FICS: can't bind local address. errno=%d\n", errno); - return -1; - } - opt = 1; - ioctl(sockfd, FIONBIO, &opt); - listen(sockfd, 5); - return 0; -} - -PUBLIC void net_close(void) -{ - int i; - for (i = 0; i < no_file; i++) { - if (con[i].status != NETSTAT_EMPTY) - net_close_connection(con[i].fd); - } -} - -PUBLIC void net_close_connection(int fd) -{ - if (con[fd].status == NETSTAT_CONNECTED) - net_flush_connection(fd); - if (!remConnection(fd)) { - if (fd > 2) - close(fd); - } -} - -PUBLIC void turn_echo_on(int fd) -{ - static unsigned char wont_echo[] = {IAC, WONT, TELOPT_ECHO, '\0'}; - - send(fd, (char *) wont_echo, strlen((char *) wont_echo), 0); -} - -PUBLIC void turn_echo_off(int fd) -{ - static unsigned char will_echo[] = {IAC, WILL, TELOPT_ECHO, '\0'}; - - send(fd, (char *) will_echo, strlen((char *) will_echo), 0); -} - -PUBLIC unsigned int net_connected_host(int fd) -{ - int which; - - if ((which = findConnection(fd)) < 0) { - fprintf(stderr, "FICS: FD not in connection table!\n"); - return -1; - } - return con[which].fromHost; -} - -PUBLIC void ngc2(char *com, int timeout) -{ - struct sockaddr_in cli_addr; - size_t cli_len = sizeof(struct sockaddr_in); - - int fd, loop, nfound, lineComplete; - fd_set readfds; - struct timeval to; - - while ((fd = accept(sockfd, (struct sockaddr *) & cli_addr, &cli_len)) != -1) { - if (net_addConnection(fd, cli_addr.sin_addr.s_addr)) { - char *woo = -"FICS is currently full. Please try one of the following sites:\n\r\n\r" -"E-FICS: krypton.daimi.aau.dk 5000 (130.225.18.157 5000) Main EURO server\n\r" -"D-FICS: dds.hacktic.nl 5000 (193.78.33.69 5000) Dutch server\n\r" -"B-FICS: holly.csv.warwick.ac.uk 5000 (137.205.192.12 5000) British server\n\r" -"?-FICS: chess.unix-ag.uni-kl.de 5000 (131.246.89.3 5000) German server\n\r" -"M-FICS: wisdom.weizmann.ac.il 5000 (132.76.80.77 5000) Mid-east server\n\r\n\r"; - fprintf(stderr, "FICS is full. fd = %d\n"); - write (fd, woo, strlen(woo)); - sleep(1); - close(fd); - } else { -/* int opt, optlen; - - opt = 1024; - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(opt)); - opt = 8192; - setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, sizeof(opt)); - optlen = sizeof(opt); - getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &optlen); - fprintf(stderr, "%d sndbuf: %d", fd, opt); - optlen = sizeof(opt); - getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &optlen); - fprintf(stderr, " rcvbuf: %d\n", opt); -*/ - process_new_connection(fd, net_connected_host(fd)); - } - } - if (errno != EWOULDBLOCK) - fprintf(stderr, "FICS: Problem with accept(). errno=%d\n", errno); - - net_flush_all_connections(); - - FD_ZERO(&readfds); - for (loop = 0; loop < no_file; loop++) - if (con[loop].status != NETSTAT_EMPTY) - FD_SET(con[loop].fd, &readfds); - - to.tv_usec = 0; - to.tv_sec = timeout; - nfound = select(no_file, &readfds, NULL, NULL, &to); - for (loop = 0; loop < no_file; loop++) { - if (con[loop].status != NETSTAT_EMPTY) { - fd = con[loop].fd; - lineComplete = readline2(com, fd); - if (lineComplete == 0) /* partial line: do nothing with it */ - continue; - if (lineComplete > 0) { /* complete line: process it */ -#ifdef TIMESEAL - if (!(parseInput(com, &con[loop]))) continue; -#endif - if (process_input(fd, com) != COM_LOGOUT) { - net_flush_connection(fd); - continue; - } - } - /* Disconnect anyone who gets here */ - process_disconnection(fd); - net_close_connection(fd); - } - } -} - -PUBLIC int net_consize(void) -{ - int i, total; - - total = sizeof(con); - for (i=0; i < no_file; i++) - total += con[i].sndbufsize; - - return(total); -} diff --git a/FICS/ratings.c.orig b/FICS/ratings.c.orig deleted file mode 100644 index 37e26f9..0000000 --- a/FICS/ratings.c.orig +++ /dev/null @@ -1,1432 +0,0 @@ -/* - ratings.c - - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created - vek leeds@math.gatech.edu 95/04/05 Glicko system, with sterr -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "playerdb.h" -#include "ratings.h" -#include "gamedb.h" -#include "command.h" -#include "comproc.h" -#include "lists.h" -#include "ficsmain.h" -#include "config.h" -#include "utils.h" - -/* grimm */ -#if defined(SGI) -#else -/* int system(char *arg); */ -/* int rewind(FILE *stream); */ -#endif - - -PUBLIC double Ratings_B_Average; -PUBLIC double Ratings_B_StdDev; - -PUBLIC double Ratings_S_Average; -PUBLIC double Ratings_S_StdDev; - -PUBLIC double Ratings_W_Average; -PUBLIC double Ratings_W_StdDev; - -PRIVATE double Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; -PRIVATE int Rb_count = 0; - -PRIVATE double Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; -PRIVATE int Rs_count = 0; - -PRIVATE double Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; -PRIVATE int Rw_count = 0; - -/* -PUBLIC rateStruct bestS[MAX_BEST]; -PUBLIC int numS = 0; -PUBLIC rateStruct bestB[MAX_BEST]; -PUBLIC int numB = 0; -PUBLIC rateStruct bestW[MAX_BEST]; -PUBLIC int numW = 0; -*/ - -#define MAXHIST 30 -#define LOWESTHIST 800 -PUBLIC int sHist[MAXHIST]; -PUBLIC int bHist[MAXHIST]; -PUBLIC int wHist[MAXHIST]; - -char sdir[] = DEFAULT_STATS; - -PUBLIC int is_active(int Games) -{ - return (Games >= PROVISIONAL); -} - - -PUBLIC void rating_add(int rating, int type) -{ - int which; - - which = (rating - LOWESTHIST) / 100; - if (which < 0) - which = 0; - if (which >= MAXHIST) - which = MAXHIST - 1; - if (type == TYPE_BLITZ) { - bHist[which] += 1; - Rb_count++; - Rb_total += rating; - if (Rb_count == 1) { - Rb_M = rating; - } else { - Rb_S = Rb_S + (rating - Rb_M) * (rating - Rb_M); - Rb_M = Rb_M + (rating - Rb_M) / (Rb_count); - } - Ratings_B_StdDev = sqrt(Rb_S / Rb_count); - Ratings_B_Average = Rb_total / (double) Rb_count; - } else if (type == TYPE_WILD) { /* TYPE_WILD */ - wHist[which] += 1; - Rw_count++; - Rw_total += rating; - if (Rw_count == 1) { - Rw_M = rating; - } else { - Rw_S = Rw_S + (rating - Rw_M) * (rating - Rw_M); - Rw_M = Rw_M + (rating - Rw_M) / (Rw_count); - } - Ratings_W_StdDev = sqrt(Rw_S / Rw_count); - Ratings_W_Average = Rw_total / (double) Rw_count; - } else { /* TYPE_STAND */ - sHist[which] += 1; - Rs_count++; - Rs_total += rating; - if (Rs_count == 1) { - Rs_M = rating; - } else { - Rs_S = Rs_S + (rating - Rs_M) * (rating - Rs_M); - Rs_M = Rs_M + (rating - Rs_M) / (Rs_count); - } - Ratings_S_StdDev = sqrt(Rs_S / Rs_count); - Ratings_S_Average = Rs_total / (double) Rs_count; - } -} - -PUBLIC void rating_remove(int rating, int type) -{ - int which; - - which = (rating - LOWESTHIST) / 100; - if (which < 0) - which = 0; - if (which >= MAXHIST) - which = MAXHIST - 1; - if (type == TYPE_BLITZ) { - bHist[which] = bHist[which] - 1; - if (bHist[which] < 0) - bHist[which] = 0; - if (Rb_count == 0) - return; - Rb_count--; - Rb_total -= rating; - if (Rb_count == 0) { - Rb_M = 0; - Rb_S = 0; - } else { - Rb_M = Rb_M - (rating - Rb_M) / (Rb_count); - Rb_S = Rb_S - (rating - Rb_M) * (rating - Rb_M); - /* added this 3.11.95 foxbat */ if (Rb_S < 0) - Rb_S = 0; - } - if (Rb_count) { - Ratings_B_StdDev = sqrt(Rb_S / Rb_count); - Ratings_B_Average = Rb_total / (double) Rb_count; - } else { - Ratings_B_StdDev = 0; - Ratings_B_Average = 0; - } - } else if (type == TYPE_WILD) { /* TYPE_WILD */ - wHist[which] = wHist[which] - 1; - if (wHist[which] < 0) - wHist[which] = 0; - if (Rw_count == 0) - return; - Rw_count--; - Rw_total -= rating; - if (Rw_count == 0) { - Rw_M = 0; - Rw_S = 0; - } else { - Rw_M = Rw_M - (rating - Rw_M) / (Rw_count); - Rw_S = Rw_S - (rating - Rw_M) * (rating - Rw_M); - /* added this 3.10.95 foxbat */ if (Rw_S < 0) - Rw_S = 0; - } - if (Rw_count) { - Ratings_W_StdDev = sqrt(Rw_S / Rw_count); - Ratings_W_Average = Rw_total / (double) Rw_count; - } else { - Ratings_W_StdDev = 0; - Ratings_W_Average = 0; - } - } else { /* TYPE_STAND */ - sHist[which] = sHist[which] - 1; - if (sHist[which] < 0) - sHist[which] = 0; - if (Rs_count == 0) - return; - Rs_count--; - Rs_total -= rating; - if (Rs_count == 0) { - Rs_M = 0; - Rs_S = 0; - } else { - Rs_M = Rs_M - (rating - Rs_M) / (Rs_count); - Rs_S = Rs_S - (rating - Rs_M) * (rating - Rs_M); - /* added this 3.10.95 foxbat */ if (Rs_S < 0) - Rs_S = 0; - } - if (Rs_count) { - Ratings_S_StdDev = sqrt(Rs_S / Rs_count); - Ratings_S_Average = Rs_total / (double) Rs_count; - } else { - Ratings_S_StdDev = 0; - Ratings_S_Average = 0; - } - } -} - -PRIVATE void load_ratings(void) -{ - FILE *fp; - char fname[MAX_FILENAME_SIZE]; - int i; - - sprintf(fname, "%s/newratings_data", stats_dir); - fp = fopen(fname, "r"); - if (!fp) { - fprintf(stderr, "FICS: Can't read ratings data!\n"); - return; - } - fscanf(fp, "%lf %lf %lf %d", &Rb_M, &Rb_S, &Rb_total, &Rb_count); - fscanf(fp, "%lf %lf %lf %d", &Rs_M, &Rs_S, &Rs_total, &Rs_count); - fscanf(fp, "%lf %lf %lf %d", &Rw_M, &Rw_S, &Rw_total, &Rw_count); -/* loon testing - fscanf(fp, "%d", &numB); - for (i = 0; i < numB; i++) { - fscanf(fp, "%s %d", bestB[i].name, &(bestB[i].rating)); - } - fscanf(fp, "%d", &numS); - for (i = 0; i < numS; i++) { - fscanf(fp, "%s %d", bestS[i].name, &bestS[i].rating); - } - fscanf(fp, "%d", &numW); - for (i = 0; i < numW; i++) { - fscanf(fp, "%s %d", bestW[i].name, &bestW[i].rating); - } -*/ - for (i = 0; i < MAXHIST; i++) { - fscanf(fp, "%d %d %d", &sHist[i], &bHist[i], &wHist[i]); - } - fclose(fp); - if (Rs_count) { - Ratings_S_StdDev = sqrt(Rs_S / Rs_count); - Ratings_S_Average = Rs_total / (double) Rs_count; - } else { - Ratings_S_StdDev = 0; - Ratings_S_Average = 0; - } - if (Rb_count) { - Ratings_B_StdDev = sqrt(Rb_S / Rb_count); - Ratings_B_Average = Rb_total / (double) Rb_count; - } else { - Ratings_B_StdDev = 0; - Ratings_B_Average = 0; - } - if (Rw_count) { - Ratings_W_StdDev = sqrt(Rw_S / Rw_count); - Ratings_W_Average = Rw_total / (double) Rw_count; - } else { - Ratings_W_StdDev = 0; - Ratings_W_Average = 0; - } -} - -PUBLIC void save_ratings(void) -{ - FILE *fp; - char fname[MAX_FILENAME_SIZE]; - int i; - - sprintf(fname, "%s/newratings_data", stats_dir); - fp = fopen(fname, "w"); - if (!fp) { - fprintf(stderr, "FICS: Can't write ratings data!\n"); - return; - } - fprintf(fp, "%10f %10f %10f %d\n", Rb_M, Rb_S, Rb_total, Rb_count); - fprintf(fp, "%10f %10f %10f %d\n", Rs_M, Rs_S, Rs_total, Rs_count); - fprintf(fp, "%10f %10f %10f %d\n", Rw_M, Rw_S, Rw_total, Rw_count); -/* loon testing - fprintf(fp, "%d\n", numB); - for (i = 0; i < numB; i++) { - fprintf(fp, "%s %d\n", bestB[i].name, bestB[i].rating); - } - fprintf(fp, "%d\n", numS); - for (i = 0; i < numS; i++) { - fprintf(fp, "%s %d\n", bestS[i].name, bestS[i].rating); - } - fprintf(fp, "%d\n", numW); - for (i = 0; i < numW; i++) { - fprintf(fp, "%s %d\n", bestW[i].name, bestW[i].rating); - } -*/ - for (i = 0; i < MAXHIST; i++) { - fprintf(fp, "%d %d %d\n", sHist[i], bHist[i], wHist[i]); - } - fclose(fp); -} - -/* -PRIVATE void BestRemove(int p) -{ - int i; - - for (i = 0; i < numB; i++) { - if (!strcmp(bestB[i].name, parray[p].name)) - break; - } - if (i < numB) { - for (; i < numB - 1; i++) { - strcpy(bestB[i].name, bestB[i + 1].name); - bestB[i].rating = bestB[i + 1].rating; - } - numB--; - } - for (i = 0; i < numS; i++) { - if (!strcmp(bestS[i].name, parray[p].name)) - break; - } - if (i < numS) { - for (; i < numS - 1; i++) { - strcpy(bestS[i].name, bestS[i + 1].name); - bestS[i].rating = bestS[i + 1].rating; - } - numS--; - } - for (i = 0; i < numW; i++) { - if (!strcmp(bestW[i].name, parray[p].name)) - break; - } - if (i < numW) { - for (; i < numW - 1; i++) { - strcpy(bestW[i].name, bestW[i + 1].name); - bestW[i].rating = bestW[i + 1].rating; - } - numW--; - } -} - -PRIVATE void BestAdd(int p) -{ - int where, j; - - if ((parray[p].b_stats.rating > 0) && (parray[p].b_stats.num > 19)) { - for (where = 0; where < numB; where++) { - if (parray[p].b_stats.rating > bestB[where].rating) - break; - } - if (where < MAX_BEST) { - for (j = numB; j > where; j--) { - if (j == MAX_BEST) - continue; - strcpy(bestB[j].name, bestB[j - 1].name); - bestB[j].rating = bestB[j - 1].rating; - } - strcpy(bestB[where].name, parray[p].name); - bestB[where].rating = parray[p].b_stats.rating; - if (numB < MAX_BEST) - numB++; - } - } - if ((parray[p].s_stats.rating > 0) && (parray[p].s_stats.num > 19)) { - for (where = 0; where < numS; where++) { - if (parray[p].s_stats.rating > bestS[where].rating) - break; - } - if (where < MAX_BEST) { - for (j = numS; j > where; j--) { - if (j == MAX_BEST) - continue; - strcpy(bestS[j].name, bestS[j - 1].name); - bestS[j].rating = bestS[j - 1].rating; - } - strcpy(bestS[where].name, parray[p].name); - bestS[where].rating = parray[p].s_stats.rating; - if (numS < MAX_BEST) - numS++; - } - } - if ((parray[p].w_stats.rating > 0) && (parray[p].w_stats.num > 19)) { - for (where = 0; where < numW; where++) { - if (parray[p].w_stats.rating > bestW[where].rating) - break; - } - if (where < MAX_BEST) { - for (j = numW; j > where; j--) { - if (j == MAX_BEST) - continue; - strcpy(bestW[j].name, bestW[j - 1].name); - bestW[j].rating = bestW[j - 1].rating; - } - strcpy(bestW[where].name, parray[p].name); - bestW[where].rating = parray[p].w_stats.rating; - if (numW < MAX_BEST) - numW++; - } - } -} - -PUBLIC void BestUpdate(int p) -{ - BestRemove(p); - BestAdd(p); -} - -*/ - -PUBLIC void zero_stats(void) -{ - int i; - for (i = 0; i < MAXHIST; i++) { - sHist[i] = 0; - bHist[i] = 0; - wHist[i] = 0; - } - Rb_M = 0.0, Rb_S = 0.0, Rb_total = 0.0; - Rb_count = 0; - - Rs_M = 0.0, Rs_S = 0.0, Rs_total = 0.0; - Rs_count = 0; - - Rw_M = 0.0, Rw_S = 0.0, Rw_total = 0.0; - Rw_count = 0; - -/* - numS = 0; - numB = 0; - numW = 0; -*/ -} - -PUBLIC void rating_init(void) -{ - zero_stats(); - load_ratings(); -} - -/* This recalculates the rating info from the player data, it can take - a long time! */ -PUBLIC void rating_recalc(void) -{ - char dname[MAX_FILENAME_SIZE]; - int p1; - int c; - int t = time(0); - DIR *dirp; -#if USE_DIRENT - struct dirent *dp; -#else - struct direct *dp; -#endif - - fprintf(stderr, "FICS: Recalculating ratings at %s\n", strltime(&t)); - zero_stats(); - for (c = 'a'; c <= 'z'; c++) { - /* Never done as ratings server */ - sprintf(dname, "%s/%c", player_dir, c); - dirp = opendir(dname); - if (!dirp) - continue; - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { - if (dp->d_name[0] != '.') { - p1 = player_new(); - if (player_read(p1, dp->d_name)) { - player_remove(p1); - fprintf(stderr, "FICS: Problem reading player %s.\n", dp->d_name); - continue; - } - if (parray[p1].b_stats.rating > 0) { - rating_add(parray[p1].b_stats.rating, TYPE_BLITZ); - } - if (parray[p1].s_stats.rating > 0) { - rating_add(parray[p1].s_stats.rating, TYPE_STAND); - } - if (parray[p1].w_stats.rating > 0) { - rating_add(parray[p1].w_stats.rating, TYPE_WILD); - } - player_remove(p1); - } - } - closedir(dirp); - } - if (Rs_count) { - Ratings_S_StdDev = sqrt(Rs_S / Rs_count); - Ratings_S_Average = Rs_total / (double) Rs_count; - } else { - Ratings_S_StdDev = 0; - Ratings_S_Average = 0; - } - if (Rb_count) { - Ratings_B_StdDev = sqrt(Rb_S / Rb_count); - Ratings_B_Average = Rb_total / (double) Rb_count; - } else { - Ratings_B_StdDev = 0; - Ratings_B_Average = 0; - } - if (Rw_count) { - Ratings_W_StdDev = sqrt(Rw_S / Rw_count); - Ratings_W_Average = Rw_total / (double) Rw_count; - } else { - Ratings_W_StdDev = 0; - Ratings_W_Average = 0; - } - save_ratings(); - t = time(0); - fprintf(stderr, "FICS: Finished at %s\n", strltime(&t)); -} - -/* Constants for Glicko system */ -#define Gd 3.25 -#define Gr0 1720 -#define Gs0 350 -#define Gq 0.00575646273249 -#define Gp 0.000010072398601964 - -/* End of Glicko system variables */ - -PRIVATE double Gf(double ss) -{ - return (1.0 / sqrt(1.0 + Gp * ss * ss)); -} - -/* Confusing but economical: calculate error and attenuation function together */ -PRIVATE double GE(int r, int rr, double ss, double *fss) -{ - *fss = Gf(ss); - return (1.0 / (1.0 + pow(10.0, (rr - r) * (*fss) / 400.0))); -} - -PUBLIC double current_sterr(double s, int t) -{ - if (t < 0) - t = 0; /* this shouldn't happen */ - return (sqrt(s * s + Gd * Gd * log(1.0 + t / 60.0))); -} - -/* Calculates new rating and standard error. By vek. The person */ -/* who invented the ratings system is Mark E. Glickman, Ph.D. */ -/* His e-mail address is glickman@hustat.harvard.edu as of April '95. */ -/* Postscript copy of the note I coded this from should be available */ -/* for ftp from ics.onenet.net, if not elsewhere. */ - -PUBLIC void rating_sterr_delta(int p1, int p2, int type, int gtime, int result, - int *deltarating, double *newsterr) -{ - statistics *p1_stats; - statistics *p2_stats; - - double s1, s2; - int t1, r1, t2, r2; /* Initial sterrs and ratings */ - double E, fs2, denominator, GK, w; /* Parts of fancy formulas */ - double delta, sigma; /* Results to return */ - - if (type == TYPE_BLITZ) { - p1_stats = &parray[p1].b_stats; - p2_stats = &parray[p2].b_stats; - } else if (type == TYPE_WILD) { - p1_stats = &parray[p1].w_stats; - p2_stats = &parray[p2].w_stats; - } else { - p1_stats = &parray[p1].s_stats; - p2_stats = &parray[p2].s_stats; - } - - /* Calculate effective pre-game sterrs. ltime==0 implies never had sterr. */ - - if (p1_stats->ltime == 0) - s1 = Gs0; - else { - t1 = gtime - p1_stats->ltime; - s1 = current_sterr(p1_stats->sterr, t1); - if (s1 > Gs0) - s1 = Gs0; - } - - if (p2_stats->ltime == 0) - s2 = Gs0; - else { - t2 = gtime - p2_stats->ltime; - s2 = current_sterr(p2_stats->sterr, t2); - if (s2 > Gs0) - s2 = Gs0; - } - - /* pre-game ratings */ - if (p1_stats->rating == 0 && p1_stats->num == 0) - r1 = Gr0; - else - r1 = p1_stats->rating; - - if (p2_stats->rating == 0 && p2_stats->num == 0) - r2 = Gr0; - else - r2 = p2_stats->rating; - - /* now crunch */ - - if (result == RESULT_WIN) { - w = 1.0; - } else if (result == RESULT_DRAW) { - w = 0.5; - } else { - w = 0.0; - } - - E = GE(r1, r2, s2, &fs2); /* side effect: calculate fs2 */ - - denominator = 1.0 / (s1 * s1) + Gq * Gq * fs2 * fs2 * E * (1.0 - E); - GK = Gq * fs2 / denominator; - - delta = GK * (w - E); - if (p1_stats->rating == 0 && p1_stats->num == 0) - *deltarating = (int) (Gr0 + delta + 0.5); - else - *deltarating = (int) delta + 0.5; /* Returned values: deltarating, - newsterr */ - - sigma = 1.0 / sqrt(denominator); - *newsterr = (double) sigma; - -} - -/* vek: Next is for when we want just the delta, and not the sigma. */ - -PUBLIC int rating_delta(int p1, int p2, int type, int result, int gtime) -{ - int delta; - double sigma; - - rating_sterr_delta(p1, p2, type, gtime, result, &delta, &sigma); - return (delta); - -} - -PUBLIC int rating_update(int g) -{ - int wDelta, bDelta; - double wSigma, bSigma; /* vek */ - - int wRes, bRes; - statistics *w_stats; - statistics *b_stats; - - int gtime; - - int inprogress = (g == parray[garray[g].black].game); - /* if this is adjudication of stored game, be quiet about ratings change */ - - if (garray[g].type == TYPE_BLITZ) { - w_stats = &parray[garray[g].white].b_stats; - b_stats = &parray[garray[g].black].b_stats; - } else if (garray[g].type == TYPE_STAND) { - w_stats = &parray[garray[g].white].s_stats; - b_stats = &parray[garray[g].black].s_stats; - } else if (garray[g].type == TYPE_WILD) { - w_stats = &parray[garray[g].white].w_stats; - b_stats = &parray[garray[g].black].w_stats; - } else { - fprintf(stderr, "FICS: Can't update untimed ratings!\n"); - return -1; - } - - switch (garray[g].result) { - case END_CHECKMATE: - case END_RESIGN: - case END_FLAG: - case END_ADJWIN: - if (garray[g].winner == WHITE) { - wRes = RESULT_WIN; - bRes = RESULT_LOSS; - } else { - bRes = RESULT_WIN; - wRes = RESULT_LOSS; - } - break; - case END_AGREEDDRAW: - case END_REPETITION: - case END_50MOVERULE: - case END_STALEMATE: - case END_NOMATERIAL: - case END_BOTHFLAG: - case END_ADJDRAW: - case END_FLAGNOMATERIAL: - wRes = bRes = RESULT_DRAW; - break; - default: - fprintf(stderr, "FICS: Update undecided game %d?\n", garray[g].result); - return -1; - } - gtime = untenths(garray[g].timeOfStart); - rating_sterr_delta(garray[g].white, garray[g].black, - garray[g].type, gtime, wRes, - &wDelta, &wSigma); - - rating_sterr_delta(garray[g].black, garray[g].white, - garray[g].type, gtime, bRes, - &bDelta, &bSigma); - - /* vek: Update time of last rated game played, for future ratings calcs. */ - /* Kept independently for blitz and standard. */ - w_stats->ltime = gtime; - b_stats->ltime = gtime; - /* end vek add 4/5/95 */ - - if (wRes == RESULT_WIN) { - w_stats->win++; - } else if (wRes == RESULT_LOSS) { - w_stats->los++; - } else { - w_stats->dra++; - } - w_stats->num++; - if (bRes == RESULT_WIN) { - b_stats->win++; - } else if (bRes == RESULT_LOSS) { - b_stats->los++; - } else { - b_stats->dra++; - } - b_stats->num++; - rating_remove(w_stats->rating, garray[g].type); - rating_remove(b_stats->rating, garray[g].type); - - if (inprogress) { - pprintf(garray[g].white, "%s rating adjustment: %d ", - ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : "Standard")), w_stats->rating); - pprintf(garray[g].black, "%s rating adjustment: %d ", - ((garray[g].type == TYPE_BLITZ) ? "Blitz" : ((garray[g].type == TYPE_WILD) ? "Wild" : "Standard")), b_stats->rating); - } - if (wDelta < -1000) { - pprintf(garray[g].white, "not changed due to bug (way too small)! sorry!\n"); - fprintf(stderr, "FICS: Got too small ratings bug for %s (w) vs. %s\n", - parray[garray[g].white].login, parray[garray[g].black].login); - } else if (wDelta > 3000) { - pprintf(garray[g].white, "not changed due to bug (way too big)! sorry!\n"); - fprintf(stderr, "FICS: Got too big ratings bug for %s (w) vs. %s\n", - parray[garray[g].white].login, parray[garray[g].black].login); - } else { - w_stats->rating += wDelta; - w_stats->sterr = wSigma; - } - - if (bDelta < -1000) { - pprintf(garray[g].black, "not changed due to bug (way too small)! sorry! "); - fprintf(stderr, "FICS: Got too small ratings bug for %s (b) vs. %s\n", - parray[garray[g].black].login, parray[garray[g].white].login); - } else if (bDelta > 3000) { - pprintf(garray[g].black, "not changed due to bug (way too big)! sorry! "); - fprintf(stderr, "FICS: Got too big ratings bug for %s (b) vs. %s\n", - parray[garray[g].black].login, parray[garray[g].white].login); - } else { - b_stats->rating += bDelta; - b_stats->sterr = bSigma; - } /* error messages down to vek */ - - rating_add(w_stats->rating, garray[g].type); - rating_add(b_stats->rating, garray[g].type); - - if ((w_stats->rating > w_stats->best) && (is_active(w_stats->num))) { - w_stats->best = w_stats->rating; - w_stats->whenbest = time(NULL); - } - if ((b_stats->rating > b_stats->best) && (is_active(b_stats->num))) { - b_stats->best = b_stats->rating; - b_stats->whenbest = time(NULL); - } -/* Ratings are now saved to disk after each game */ - player_save(garray[g].white); - player_save(garray[g].black); - -/* foxbat 3.11.95 */ - if (garray[g].type == TYPE_BLITZ) { - Rb_count++; - Rb_total += (w_stats->rating + b_stats->rating) / 2.0; - } else if (garray[g].type == TYPE_STAND) { - Rs_count++; - Rs_total += (w_stats->rating + b_stats->rating) / 2.0; - } else if (garray[g].type == TYPE_WILD) { - Rw_count++; - Rw_total += (w_stats->rating + b_stats->rating) / 2.0; - } -/* end add */ -/* loon testing - BestUpdate(garray[g].white); - BestUpdate(garray[g].black); -*/ - if (inprogress) { - pprintf(garray[g].white, "--> %d\n", w_stats->rating); - pprintf(garray[g].black, "--> %d\n", b_stats->rating); - } - save_ratings(); - UpdateRank(garray[g].type, parray[garray[g].white].name, - w_stats, parray[garray[g].white].name); - UpdateRank(garray[g].type, parray[garray[g].black].name, - b_stats, parray[garray[g].black].name); - return 0; -} - -PUBLIC int com_assess(int p, param_list param) -{ - int p1 = p, p2, nowtime; - int p1_connected = 1, p2_connected = 1; - int win1, draw1, loss1; - double newsterr1; - int win2, draw2, loss2; - double newsterr2; - - nowtime = time(0); - -/* Hawk: Now assess can be used with players not */ -/* logged on -- I wonder if anyone doesn't */ -/* get just a bit confused here :) */ - - if (param[0].type == TYPE_NULL) { - if (parray[p].game <0) { - pprintf(p, "You are not playing a game.\n"); - return COM_OK; - } else if (garray[parray[p].game].status == GAME_EXAMINE) { - if (!strcmp(garray[parray[p].game].black_name, parray[p].name)) { - pcommand(p, "assess %s\n", garray[parray[p].game].white_name); - } else { - pcommand(p, "assess %s %s\n", - garray[parray[p].game].white_name, - garray[parray[p].game].black_name); - } - return COM_OK; - } else { - p2 = parray[p].opponent; - } - } else { - if (!FindPlayer(p, ¶m[0], &p2, &p2_connected)) { - pprintf(p, "No user named \"%s\" was found.\n", param[0].val.word); - return COM_OK; - } - if (param[1].type != TYPE_NULL) { - p1 = p2; - p1_connected = p2_connected; - if (!FindPlayer(p, ¶m[1], &p2, &p2_connected)) { - pprintf(p, "No user named \"%s\" was found.\n", param[1].val.word); - if (!p1_connected) - player_remove(p1); - return COM_OK; - } - } - } - if (p1 == p2) { - pprintf(p, "You can't assess the same players.\n"); - if (!p1_connected) - player_remove(p1); - if (!p2_connected) - player_remove(p2); - return COM_OK; - } - rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_WIN, &win1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss1, &newsterr1); - rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_WIN, &win2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_DRAW, &draw2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_BLITZ, nowtime, RESULT_LOSS, &loss2, &newsterr2); - - pprintf(p, "\nBlitz\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", - parray[p1].name, ratstrii(parray[p1].b_stats.rating, parray[p1].registered), parray[p1].b_stats.sterr, - parray[p2].name, ratstrii(parray[p2].b_stats.rating, parray[p2].registered), parray[p2].b_stats.sterr); - pprintf(p, "Win : %4d %4d\n", win1, loss2); - pprintf(p, "Draw: %4d %4d\n", draw1, draw2); - pprintf(p, "Loss: %4d %4d\n", loss1, win2); - pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); - - rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_WIN, &win1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_DRAW, &draw1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_STAND, nowtime, RESULT_LOSS, &loss1, &newsterr1); - rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_WIN, &win2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_DRAW, &draw2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_STAND, nowtime, RESULT_LOSS, &loss2, &newsterr2); - - pprintf(p, "\nStandard\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", - parray[p1].name, ratstrii(parray[p1].s_stats.rating, parray[p1].registered), parray[p1].s_stats.sterr, - parray[p2].name, ratstrii(parray[p2].s_stats.rating, parray[p2].registered), parray[p2].s_stats.sterr); - pprintf(p, "Win : %4d %4d\n", win1, loss2); - pprintf(p, "Draw: %4d %4d\n", draw1, draw2); - pprintf(p, "Loss: %4d %4d\n", loss1, win2); - pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); - - rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_WIN, &win1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_DRAW, &draw1, &newsterr1); - rating_sterr_delta(p1, p2, TYPE_WILD, nowtime, RESULT_LOSS, &loss1, &newsterr1); - rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_WIN, &win2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_DRAW, &draw2, &newsterr2); - rating_sterr_delta(p2, p1, TYPE_WILD, nowtime, RESULT_LOSS, &loss2, &newsterr2); - - pprintf(p, "\nWild\n %10s (%4s, RD: %5.1f) %10s (%4s, RD: %5.1f)\n", - parray[p1].name, ratstrii(parray[p1].w_stats.rating, parray[p1].registered), parray[p1].w_stats.sterr, - parray[p2].name, ratstrii(parray[p2].w_stats.rating, parray[p2].registered), parray[p2].w_stats.sterr); - pprintf(p, "Win : %4d %4d\n", win1, loss2); - pprintf(p, "Draw: %4d %4d\n", draw1, draw2); - pprintf(p, "Loss: %4d %4d\n", loss1, win2); - pprintf(p, "New RD: %5.1f %5.1f\n", newsterr1, newsterr2); - - if (!p1_connected) - player_remove(p1); - if (!p2_connected) - player_remove(p2); - return COM_OK; -} - - -PUBLIC int com_best(int p, param_list param) -{ - return Best(p, param, 1); -} - -PUBLIC int com_hbest(int p, param_list param) -{ - return Best(p, param, 0); -} - -#if 0 -PUBLIC int com_best(int p, param_list param) -{ - int i; - - pprintf(p, "Standard Blitz Wild\n"); - for (i = 0; i < MAX_BEST; i++) { - if ((i >= numS) && (i >= numB)) - break; - if (i < numS) { - pprintf(p, "%4d %-17s ", bestS[i].rating, bestS[i].name); - } else { - pprintf(p, " "); - } - if (i < numB) { - pprintf(p, "%4d %-17s ", bestB[i].rating, bestB[i].name); - } else { - pprintf(p, " "); - } - if (i < numW) { - pprintf(p, "%4d %-17s\n", bestW[i].rating, bestW[i].name); - } else { - pprintf(p, "\n"); - } - } - return COM_OK; -} -#endif - -PUBLIC int com_statistics(int p, param_list param) -{ - pprintf(p, " Standard Blitz Wild\n"); - pprintf(p, "average: %7.2f %7.2f %7.2f\n", Ratings_S_Average, Ratings_B_Average, Ratings_W_Average); - pprintf(p, "std dev: %7.2f %7.2f %7.2f\n", Ratings_S_StdDev, Ratings_B_StdDev, Ratings_W_StdDev); - pprintf(p, "number : %7d %7d %7d\n", Rs_count, Rb_count, Rw_count); - return COM_OK; -} - -PUBLIC int com_fixrank(int p, param_list param) -{ - int p1, connected; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - UpdateRank(TYPE_BLITZ, parray[p1].name, &parray[p1].b_stats, - parray[p1].name); - UpdateRank(TYPE_STAND, parray[p1].name, &parray[p1].s_stats, - parray[p1].name); - UpdateRank(TYPE_WILD, parray[p1].name, &parray[p1].w_stats, - parray[p1].name); - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_rank(int p, param_list param) -{ - return DisplayRank(p, param, 1); -} - -PUBLIC int com_hrank(int p, param_list param) -{ - return DisplayRank(p, param, 0); -} - -PUBLIC int DisplayRank(int p, param_list param, int showComputers) -{ - int start, end, target, connected; - int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; - - if (param[0].type == TYPE_NULL) { - DisplayTargetRank(p, parray[p].name, show, showComputers); - return COM_OK; - } else if (isdigit(param[0].val.word[0])) { - end = -1; - sscanf(param[0].val.word, "%d-%d", &start, &end); - if (end > 0 && (param[1].type != TYPE_NULL)) - show = ShowFromString(param[1].val.word); - DisplayRankedPlayers(p, start, end, show, showComputers); - return COM_OK; - } else { - target = player_search(p, param[0].val.word); - if (target == 0) { - pprintf(p, "Target %s not found.\n", param[0].val.word); - return COM_OK; - } - connected = (target > 0); - if (!connected) - target = -target - 1; - else - target--; - - if (param[1].type != TYPE_NULL) - show = ShowFromString(param[1].val.word); - DisplayTargetRank(p, parray[target].name, show, showComputers); - if (!connected) - player_remove(target); - return COM_OK; - } -} - -/* CompareStats returns 1 if s1 comes first, -1 if s2 comes first, and 0 - if neither takes precedence. */ -PRIVATE int CompareStats(char *name1, statistics *s1, - char *name2, statistics *s2) -{ - int i, l1; - - if (s1 == NULL) - if (s2 == NULL) - return 0; - else - return -1; - else if (s2 == NULL) - return 1; - - if (s1->rating > s2->rating) - return 1; - if (s1->rating < s2->rating) - return -1; - l1 = strlen(name1); - for (i = 0; i < l1; i++) { - if (name2[i] == '\0') - return -1; - if (tolower(name1[i]) < tolower(name2[i])) - return 1; - if (tolower(name1[i]) > tolower(name2[i])) - return -1; - } - if (name2[i] != '\0') - return 1; -/* if (s1->sterr < s2->sterr) return 1; - if (s1->sterr > s2->sterr) return -1; - if (s1->num > s2->num) return 1; - if (s1->num < s2->num) return -1; -*/ - fprintf(stderr, "Duplicate entries found: %s.\n", name1); - return 0; -} - -PRIVATE int GetRankFileName(char *out, int type) -{ - switch (type) { - case TYPE_BLITZ:sprintf(out, "%s/rank.blitz", sdir); - return type; - case TYPE_STAND: - sprintf(out, "%s/rank.std", sdir); - return type; - case TYPE_WILD: - sprintf(out, "%s/rank.wild", sdir); - return type; - default: - return -1; - } -} - -PUBLIC void UpdateRank(int type, char *addName, - statistics *sNew, char *delName) -{ - char RankFile[MAX_FILENAME_SIZE]; - char TmpRankFile[MAX_FILENAME_SIZE]; - char line[MAX_RANK_LINE]; - char login[MAX_LOGIN_NAME]; - char command[MAX_STRING_LENGTH]; - int comp; - statistics sCur; - FILE *fp; - FILE *fptemp; - - if (GetRankFileName(RankFile, type) < 0) - return; - fp = fopen(RankFile, "r"); - if (fp == NULL) { - fprintf(stderr, "Can't open rank file to update.\n"); - return; - } - sprintf(TmpRankFile, "%s/tmpRank", sdir); - fptemp = fopen(TmpRankFile, "w"); - - while (fgets(line, MAX_RANK_LINE - 1, fp)) { - sscanf(line, "%s %d %d %d", login, &sCur.rating, - &sCur.num, &comp); - if (delName != NULL && !strcasecmp(delName, login)) { /* Kill name. */ - delName = NULL; - continue; - } - if (addName != NULL && CompareStats(addName, sNew, login, &sCur) > 0) { - int computer = in_list("computer", addName); - fprintf(fptemp, "%s %d %d %d\n", addName, sNew->rating, - sNew->num, computer); - addName = NULL; - } - fprintf(fptemp, "%s %d %d %d\n", login, sCur.rating, sCur.num, comp); - } - fclose(fptemp); - fclose(fp); - - sprintf(command, "mv %s %s", TmpRankFile, RankFile); - system(command); -} - -PRIVATE void DisplayRankHead(int p, int show) -{ - char Line[MAX_STRING_LENGTH]; - - Line[0] = '\0'; - if (CheckFlag(show, SHOW_BLITZ)) - strcat(Line, " Blitz "); - if (CheckFlag(show, SHOW_STANDARD)) - strcat(Line, " Standard "); - if (CheckFlag(show, SHOW_WILD)) - strcat(Line, " Wild"); - pprintf(p, "%s\n\n", Line); -} - -PRIVATE int CountRankLine(int countComp, char *loginName, - int num, int is_computer) -{ - if (loginName == NULL || loginName[0] == '\0') - return 0; - return (countComp || !is_computer) && (is_active(num)); -} - -PRIVATE int GetRank(FILE * fp, char *target, int countComp) -{ - int count = 0; - int nGames, is_computer; - int playerFound = 0; - char line[MAX_RANK_LINE]; - char login[MAX_LOGIN_NAME]; - - while (fgets(line, MAX_RANK_LINE - 1, fp) && !playerFound) { - sscanf(line, "%s %*d %d %d", login, &nGames, &is_computer); - if ((playerFound = !strcasecmp(login, target)) - || CountRankLine(countComp, login, nGames, is_computer)) - count++; - } - return (playerFound ? count : -1); -} - -PRIVATE void PositionFilePtr(FILE * fp, int count, int *last, - int *nTied, int showComp) -{ - int i, rating, nGames, is_computer; - char login[MAX_LOGIN_NAME]; - char line[MAX_RANK_LINE]; - - if (fp == NULL) - return; - rewind(fp); - for (i = 1; i < count; i++) { - do { - fgets(line, MAX_RANK_LINE - 1, fp); - if (feof(fp)) - break; - sscanf(line, "%s %d %d %d", login, &rating, &nGames, &is_computer); - } while (!CountRankLine(showComp, login, nGames, is_computer)); - if (rating != *last) { - *nTied = 1; - *last = rating; - } else - (*nTied)++; - } -} - -PRIVATE int ShowRankEntry(int p, FILE * fp, int count, int comp, - char *target, int *lastRating, int *nTied) -{ - char newLine[MAX_RANK_LINE]; - char login[MAX_LOGIN_NAME]; - int rating, findable, nGames, is_comp; - - findable = (count > 0) && !feof(fp); - if (findable) { - do { - fgets(newLine, MAX_RANK_LINE - 1, fp); - if (feof(fp)) - findable = 0; - else if (newLine[0] != '\0') - sscanf(newLine, "%s %d %d %d", - login, &rating, &nGames, &is_comp); - else - login[0] = '\0'; - } while (!CountRankLine(comp, login, nGames, is_comp) && findable - && strcasecmp(login, target)); - } - if (findable) { - if (!strcasecmp(login, target) - && !CountRankLine(comp, login, nGames, is_comp)) { - pprintf_highlight(p, "---- %-12.12s %4s", login, ratstr(rating)); - pprintf(p, " "); - return 0; - } else if (*lastRating == rating && *nTied < 1) { - pprintf(p, " "); - if (!strcasecmp(login, target)) - pprintf_highlight(p, "%-12.12s %4s", login, ratstr(rating)); - else - pprintf(p, "%-12.12s %4s", login, ratstr(rating)); - pprintf(p, " "); - return 1; - } else { - if (*nTied >= 1) { - if (*lastRating == rating) - count -= *nTied; - *nTied = -1; - } - if (!strcasecmp(login, target)) - pprintf_highlight(p, "%4d. %-12.12s %4s", - count, login, ratstr(rating)); - else - pprintf(p, "%4d. %-12.12s %4s", - count, login, ratstr(rating)); - pprintf(p, " "); - *lastRating = rating; - return 1; - } - } else { - pprintf(p, "%25s", ""); - return 1; - } -} - -PRIVATE int CountAbove(int num, int blitz, int std, int wild, int which) -{ - int max = blitz; - - if (max < std) - max = std; - if (max < wild) - max = wild; - return (max <= (num + 1) / 2 ? max - 1 : (num + 1) / 2); -} - -PRIVATE int ShowRankLines(int p, FILE * fb, FILE * fs, FILE * fw, int bCount, - int sCount, int wCount, int n, int showComp, int show, char *target) -{ - int lastBlitz = 9999, nTiedBlitz = 0; - int lastStd = 9999, nTiedStd = 0; - int lastWild = 9999, nTiedWild = 0; - int i; - - if (n <= 0) - return 0; - if (CheckFlag(show, SHOW_BLITZ)) { - PositionFilePtr(fb, bCount, &lastBlitz, &nTiedBlitz, showComp); - if (feof(fb)) - ClearFlag(show, SHOW_BLITZ); - } - if (CheckFlag(show, SHOW_STANDARD)) { - PositionFilePtr(fs, sCount, &lastStd, &nTiedStd, showComp); - if (feof(fs)) - ClearFlag(show, SHOW_STANDARD); - } - if (CheckFlag(show, SHOW_WILD)) { - PositionFilePtr(fw, wCount, &lastWild, &nTiedWild, showComp); - if (feof(fw)) - ClearFlag(show, SHOW_WILD); - } - if (!CheckFlag(show, SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD)) - return 0; - DisplayRankHead(p, show); - - for (i = 0; i < n && show; i++) { - if (CheckFlag(show, SHOW_BLITZ)) - bCount += ShowRankEntry(p, fb, bCount, showComp, target, - &lastBlitz, &nTiedBlitz); - if (CheckFlag(show, SHOW_STANDARD)) - sCount += ShowRankEntry(p, fs, sCount, showComp, target, - &lastStd, &nTiedStd); - if (CheckFlag(show, SHOW_WILD)) - wCount += ShowRankEntry(p, fw, wCount, showComp, target, - &lastWild, &nTiedWild); - pprintf(p, "\n"); - } - return 1; -} - -PUBLIC int DisplayTargetRank(int p, char *target, int show, int showComp) -{ - int numToShow = 20; - int blitzRank = -1, blitzCount; - int stdRank = -1, stdCount; - int wildRank = -1, wildCount; - int numAbove; - char Path[MAX_FILENAME_SIZE]; - FILE *fb = NULL, *fs = NULL, *fw = NULL; - - if (CheckFlag(show, SHOW_BLITZ)) { - GetRankFileName(Path, TYPE_BLITZ); - fb = (FILE *) fopen(Path, "r"); - if (fb != NULL) - blitzRank = GetRank(fb, target, showComp); - if (blitzRank < 0) - ClearFlag(show, SHOW_BLITZ); - } - if (CheckFlag(show, SHOW_STANDARD)) { - GetRankFileName(Path, TYPE_STAND); - fs = (FILE *) fopen(Path, "r"); - if (fs != NULL) - stdRank = GetRank(fs, target, showComp); - if (stdRank < 0) - ClearFlag(show, SHOW_STANDARD); - } - if (CheckFlag(show, SHOW_WILD)) { - GetRankFileName(Path, TYPE_WILD); - if (CheckFlag(show, SHOW_WILD)) - fw = (FILE *) fopen(Path, "r"); - if (fw != NULL) - wildRank = GetRank(fw, target, showComp); - if (wildRank < 0) - ClearFlag(show, SHOW_WILD); - } - if (!CheckFlag(show, SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD)) { - pprintf(p, "No ratings to show.\n"); - return (0); - } - numAbove = CountAbove(numToShow, blitzRank, stdRank, wildRank, show); - blitzCount = blitzRank - numAbove; - stdCount = stdRank - numAbove; - wildCount = wildRank - numAbove; - - ShowRankLines(p, fb, fs, fw, blitzCount, stdCount, wildCount, - numToShow, showComp, show, target); - if (fb != NULL) - fclose(fb); - if (fs != NULL) - fclose(fs); - if (fw != NULL) - fclose(fw); - return (1); -} - -PUBLIC int DisplayRankedPlayers(int p, int start, int end, - int show, int showComp) -{ - int num = end - start + 1; - FILE *fb = NULL, *fs = NULL, *fw = NULL; - char Path[MAX_FILENAME_SIZE]; - - if (start <= 0) - start = 1; - if (num <= 0) - return 0; - if (num > 100) - num = 100; - if (CheckFlag(show, SHOW_BLITZ)) { - GetRankFileName(Path, TYPE_BLITZ); - fb = (FILE *) fopen(Path, "r"); - if (fb == NULL) - ClearFlag(show, SHOW_BLITZ); - } - if (CheckFlag(show, SHOW_STANDARD)) { - GetRankFileName(Path, TYPE_STAND); - fs = (FILE *) fopen(Path, "r"); - if (fs == NULL) - ClearFlag(show, SHOW_STANDARD); - } - if (CheckFlag(show, SHOW_WILD)) { - GetRankFileName(Path, TYPE_WILD); - fw = (FILE *) fopen(Path, "r"); - if (fw == NULL) - ClearFlag(show, SHOW_WILD); - } - ShowRankLines(p, fb, fs, fw, start, start, start, - num, showComp, show, ""); - if (fb) - fclose(fb); - if (fs) - fclose(fs); - if (fw) - fclose(fw); - return 1; -} - -PUBLIC int ShowFromString(char *s) -{ - int i, len = strlen(s); - int show = 0; - - if (s == NULL || s[0] == '\0') - return SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; - for (i = 0; i < len; i++) { - switch (s[i]) { - case 'b': - SetFlag(show, SHOW_BLITZ); - break; - case 's': - SetFlag(show, SHOW_STANDARD); - break; - case 'w': - SetFlag(show, SHOW_WILD); - break; - } - } - return (show); -} - -PUBLIC int Best(int p, param_list param, int ShowComp) -{ - int show = SHOW_BLITZ | SHOW_STANDARD | SHOW_WILD; - - if (param[0].type != TYPE_NULL) - show = ShowFromString(param[0].val.word); - - DisplayRankedPlayers(p, 1, 20, show, ShowComp); - return COM_OK; -} diff --git a/FICS/stdinclude.h.orig b/FICS/stdinclude.h.orig deleted file mode 100644 index 394b007..0000000 --- a/FICS/stdinclude.h.orig +++ /dev/null @@ -1,164 +0,0 @@ -/* stdinclude.h - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ -#include <sys/types.h> - -/* Set up system specific defines */ -#if defined(SYSTEM_NEXT) - -#define HASMALLOCSIZE -#include <sys/vfs.h> - -#elif defined(SYSTEM_ULTRIX) - -#include <sys/param.h> -#include <sys/mount.h> - -#endif - -#ifdef SYSTEM_USL -# define NO_TM_ZONE -#endif - -#ifdef SYSTEM_SUN4 -# define USE_VARARGS -#endif - -#ifdef SGI -#define _BSD_SIGNALS -#include <fcntl.h> -#include <bstring.h> -#endif - -#if defined(SYSTEM_RS6K) -#include <sys/select.h> -#include <dirent.h> -#define USE_DIRENT -#endif - -/* These are included into every .c file */ -#if defined(SYSTEM_SUN5) -#define USE_RLIMIT -#define USE_TIMES -#define USE_WAITPID -#define GOOD_STDIO -#define NO_TM_ZONE -#include <string.h> -#include <dirent.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/filio.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#define direct dirent - -#else -#include <strings.h> -#include <sys/dir.h> -#endif - -#include <sys/stat.h> -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <unistd.h> -#include <ctype.h> -#include <sys/errno.h> -#include <signal.h> -#include <time.h> -#include <math.h> -#include <sys/time.h> -#include <sys/file.h> -#include <sys/ioctl.h> -#include <sys/wait.h> - -/* Forward declare the functions that aren't defined above */ - -#if defined(SGI) -#include <errno.h> -#define GOOD_STDIO -#define NO_TM_ZONE -#else -#define GOOD_STDIO -/* -extern FILE *popen(char *, char *); -extern int pclose(FILE *); -extern int fputs(char *, FILE *); -extern int fseek(FILE *, long, int); -extern int fread(char *, int, int, FILE *); -extern int fwrite(char *, int, int, FILE *); -extern int socket(int, int, int); -extern int atoi (char *nptr); -extern long atol (char *nptr); -extern int truncate(char *, off_t), ftruncate(int, off_t); -*/ -#endif - -#ifndef GOOD_STDIO -extern int fclose(FILE *); -extern int fscanf(FILE *, char *, ...); -extern int fprintf(FILE *, char *, ...); -extern int printf(char *, ...); -#endif - -extern time_t time(time_t *); -extern int rand(void); -extern int close(int); -extern char *crypt (char *key, char *salt); -extern size_t malloc_size(void *ptr); - -#ifdef __STDC__ -/* extern fcntl(int fildes, int cmd, ...); */ -/* extern open(char *path, int oflag, ...); */ -/* extern int ioctl(int, long, ...); */ - -#else - extern fcntl(); - extern open(); - extern int ioctl(); - -#endif /* __STDC__ */ -/* extern void *malloc(unsigned int size); */ -/* extern void *calloc(unsigned int num, unsigned int size); */ -/* extern void *realloc(void *addr, unsigned int size); */ -/* extern void free(void *data); */ -/* extern void malloc_good_size(unsigned int size); */ -/* extern int link(); */ -/* extern int unlink(); */ -/* extern int rename(); */ -/* extern int getpid(); */ -/* extern int kill(); */ -/* extern int fork(); */ -/* extern int access(); */ -/* extern int getdtablesize(); */ -/* extern int write(); */ -#if !defined(SYSTEM_ULTRIX) -/* extern int sleep(); */ -/* extern int getuid(); */ -extern int statfs(); -#endif - diff --git a/FICS/utils.c.orig b/FICS/utils.c.orig deleted file mode 100644 index 1d4fdaa..0000000 --- a/FICS/utils.c.orig +++ /dev/null @@ -1,991 +0,0 @@ -/* utils.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "utils.h" -#include "playerdb.h" -#include "network.h" -#include "rmalloc.h" -#include "config.h" -#if defined(SYSTEM_SUN4) -/* #include <sys/vfs.h> */ -#endif - -/* -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -*/ - -/* grimm */ -#if defined(SGI) -#else -/* char vsprintf(char *tmp, va_list format, va_list ap); */ -int gettimeofday(struct timeval * tp, struct timezone * tzp); -#endif -/* added for warnings */ - -PUBLIC int count_lines(FILE *fp) -{ - int c, nl = 0; - - while ((c = fgetc(fp)) != EOF) - if (c == '\n') - ++nl; - - return nl; -} - -PUBLIC int iswhitespace(int c) -{ - if ((c < ' ') || (c == '\b') || (c == '\n') || - (c == '\t') || (c == ' ')) { /* white */ - return 1; - } else { - return 0; - } -} - -PUBLIC char *getword(char *str) -{ - int i; - static char word[MAX_WORD_SIZE]; - - i = 0; - while (*str && !iswhitespace(*str)) { - word[i] = *str; - str++; - i++; - if (i == MAX_WORD_SIZE) { - i = i - 1; - break; - } - } - word[i] = '\0'; - return word; -} - -PUBLIC char *eatword(char *str) -{ - while (*str && !iswhitespace(*str)) - str++; - return str; -} - -PUBLIC char *eatwhite(char *str) -{ - while (*str && iswhitespace(*str)) - str++; - return str; -} - -PUBLIC char *eattailwhite(char *str) -{ - int len; - if (str == NULL) - return NULL; - - len = strlen(str); - while (len > 0 && iswhitespace(str[len - 1])) - len--; - str[len] = '\0'; - return (str); -} - -PUBLIC char *nextword(char *str) -{ - return eatwhite(eatword(str)); -} - -/* check_the_email_address function: */ -/* -PUBLIC int check_emailaddr(char *email) -{ - int qbuflen; - char qabuf[5120]; - - if ((email = strchr(email, '@')) == NULL) - return 2; - email++; - - res_init(); - _res.options = (RES_INIT | RES_RECURSE); - if ((qbuflen = res_mkquery(QUERY, email, C_IN, T_ANY, NULL, 0, NULL, qabuf, sizeof(qabuf))) == -1) - return 1; - - if (res_send(qabuf, qbuflen, qabuf, sizeof(qabuf)) == -1) - return 1; - - return (_getshort(qabuf + 6) ? 0 : 2); -} -*/ - -PUBLIC int mail_string_to_address(char *addr, char *subj, char *str) -{ - char com[1000]; - FILE *fp; - -#ifdef SENDMAILPROG - sprintf(com, "%s\n", SENDMAILPROG); -#else - sprintf(com, "%s -s \"%s\" %s", MAILPROGRAM, subj, addr); -#endif - fp = popen(com, "w"); - if (!fp) - return -1; -#ifdef SENDMAILPROG - fprintf(fp, "To: %s\nSubject: %s\n%s", addr, subj, str); -#else - fprintf(fp, "%s", str); -#endif - pclose(fp); - return 0; -} - -PUBLIC int mail_string_to_user(int p, char *subj, char *str) -{ - - if (parray[p].emailAddress && - parray[p].emailAddress[0] && - safestring(parray[p].emailAddress)) { - return mail_string_to_address(parray[p].emailAddress, subj, str); - } else { - return -1; - } -} - -PUBLIC int mail_file_to_address(char *addr, char *subj, char *fname) -{ - char com[1000]; - char tmp[MAX_LINE_SIZE]; - FILE *fp; - FILE *file_fp; - -#ifdef SENDMAILPROG - sprintf(com, "%s\n", SENDMAILPROG); -#else - sprintf(com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, subj, addr, fname); -#endif - fp = popen(com, "w"); - if (!fp) - return -1; -#ifdef SENDMAILPROG - fprintf(fp, "To: %s\nSubject: %s\n", addr, subj); - file_fp = fopen(fname, "r"); - if (!file_fp) - return -1; - while (!feof(file_fp)) { - fgets(tmp, MAX_LINE_SIZE - 1, file_fp); - if (!feof(file_fp)) { - fputs(tmp, fp); - } - } - fclose(file_fp); - -#endif - pclose(fp); - return 0; -} - -PUBLIC int mail_file_to_user(int p, char *subj, char *fname) -{ - - if (parray[p].emailAddress && - parray[p].emailAddress[0] && - safestring(parray[p].emailAddress)) { - return mail_file_to_address(parray[p].emailAddress, subj, fname); - } else { - return -1; - } -} - - -/* Process a command for a user */ -PUBLIC int pcommand(int p, char *comstr,...) -{ - char tmp[MAX_LINE_SIZE]; - int retval; - int current_socket = parray[p].socket; - va_list ap; - va_start(ap, comstr); - - vsprintf(tmp, comstr, ap); - retval = process_input(current_socket, tmp); - if (retval == COM_LOGOUT) { - process_disconnection(current_socket); - net_close_connection(current_socket); - } - va_end(ap); - return retval; -} - -PUBLIC int pprintf(int p, char *format,...) -{ - char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of - stuff */ - int retval; - va_list ap; - va_start(ap, format); - - retval = vsprintf(tmp, format, ap); - if (strlen(tmp) > 10 * MAX_LINE_SIZE) { - fprintf(stderr, "FICS: pprintf buffer overflow\n"); - } - net_send_string(parray[p].socket, tmp, 1); - va_end(ap); - return retval; -} - -PUBLIC void pprintf_dohightlight(int p) -{ - if (parray[p].highlight & 0x01) - pprintf(p, "\033[7m"); - if (parray[p].highlight & 0x02) - pprintf(p, "\033[1m"); - if (parray[p].highlight & 0x04) - pprintf(p, "\033[4m"); - if (parray[p].highlight & 0x08) - pprintf(p, "\033[2m"); -} - -PUBLIC int pprintf_highlight(int p, char *format,...) -{ - char tmp[10 * MAX_LINE_SIZE]; - int retval; - va_list ap; - - va_start(ap, format); - pprintf_dohightlight(p); - retval = vsprintf(tmp, format, ap); - if (strlen(tmp) > 10 * MAX_LINE_SIZE) { - fprintf(stderr, "FICS: pprintf buffer overflow\n"); - } - net_send_string(parray[p].socket, tmp, 1); - va_end(ap); - if (parray[p].highlight) - pprintf(p, "\033[0m"); - return retval; -} - -PUBLIC void sprintf_dohightlight(int p, char *s) -{ - - if (parray[p].highlight & 0x01) - strcat(s, "\033[7m"); - if (parray[p].highlight & 0x02) - strcat(s, "\033[1m"); - if (parray[p].highlight & 0x04) - strcat(s, "\033[4m"); - if (parray[p].highlight & 0x08) - strcat(s, "\033[2m"); -} - -PUBLIC int psprintf_highlight(int p, char *s, char *format,...) -{ - int retval; - va_list ap; - - va_start(ap, format); - if (parray[p].highlight) { - sprintf_dohightlight(p, s); - retval = vsprintf(s + strlen(s), format, ap); - strcat(s, "\033[0m"); - } else { - retval = vsprintf(s, format, ap); - } - va_end(ap); - return retval; -} - -PUBLIC int pprintf_prompt(int p, char *format,...) -{ - char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of - stuff */ - int retval; - va_list ap; - - va_start(ap, format); - - retval = vsprintf(tmp, format, ap); - if (strlen(tmp) > 10 * MAX_LINE_SIZE) { - fprintf(stderr, "FICS: pprintf_prompt buffer overflow\n"); - } - net_send_string(parray[p].socket, tmp, 1); - net_send_string(parray[p].socket, parray[p].prompt, 1); - va_end(ap); - return retval; -} - -PUBLIC int pprintf_noformat(int p, char *format,...) -{ - char tmp[10 * MAX_LINE_SIZE]; /* Make sure you can handle 10 lines worth of - stuff */ - int retval; - va_list ap; - - va_start(ap, format); - - retval = vsprintf(tmp, format, ap); - if (strlen(tmp) > 10 * MAX_LINE_SIZE) { - fprintf(stderr, "FICS: pprintf_noformat buffer overflow\n"); - } - net_send_string(parray[p].socket, tmp, 0); - va_end(ap); - return retval; -} - - -/******************* grimm *************/ -/******************* added below *************/ -PUBLIC int psend_raw_file(int p, char *dir, char *file) -{ - FILE *fp; - char tmp[MAX_LINE_SIZE]; - char fname[MAX_FILENAME_SIZE]; - int num; - - if (dir) - sprintf(fname, "%s/%s", dir, file); - else - strcpy(fname, file); - fp = fopen(fname, "r"); - if (!fp) - return -1; - while ((num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp)) > 0) { - tmp[num] = '\0'; - net_send_string(parray[p].socket, tmp, 1); - } - fclose(fp); - return 0; -} - -PUBLIC int psend_file(int p, char *dir, char *file) -{ - FILE *fp; - char tmp[MAX_LINE_SIZE]; - char fname[MAX_FILENAME_SIZE]; - int lcount = parray[p].d_height - 1; - - if (parray[p].last_file) - rfree(parray[p].last_file); - parray[p].last_file = NULL; - parray[p].last_file_byte = 0L; - - if (dir) - sprintf(fname, "%s/%s", dir, file); - else - strcpy(fname, file); - fp = fopen(fname, "r"); - if (!fp) - return -1; - while (!feof(fp) && (--lcount > 0)) { - fgets(tmp, MAX_LINE_SIZE - 1, fp); - if (!feof(fp)) { - net_send_string(parray[p].socket, tmp, 1); - } - } - if (!feof(fp)) { - parray[p].last_file = strdup(fname); - parray[p].last_file_byte = ftell(fp); - pprintf(p, "Type [next] to see next page.\n"); - } - fclose(fp); - return 0; -} - -/* - * Marsalis added on 8/27/95 so that [next] does not - * appear in the logout process for those that have - * a short screen height. (Fixed due to complaint - * in Bug's messages). - */ -PUBLIC int psend_logoutfile(int p, char *dir, char *file) -{ - FILE *fp; - char tmp[MAX_LINE_SIZE]; - char fname[MAX_FILENAME_SIZE]; - - if (parray[p].last_file) - rfree(parray[p].last_file); - parray[p].last_file = NULL; - parray[p].last_file_byte = 0L; - - if (dir) - sprintf(fname, "%s/%s", dir, file); - else - strcpy(fname, file); - fp = fopen(fname, "r"); - if (!fp) - return -1; - while (!feof(fp)) { - fgets(tmp, MAX_LINE_SIZE - 1, fp); - if (!feof(fp)) { - net_send_string(parray[p].socket, tmp, 1); - } - } - - fclose(fp); - return 0; -} - -PUBLIC int pmore_file(int p) -{ - FILE *fp; - char tmp[MAX_LINE_SIZE]; - int lcount = parray[p].d_height - 1; - - if (!parray[p].last_file) { - pprintf(p, "There is no more.\n"); - return -1; - } - fp = fopen(parray[p].last_file, "r"); - if (!fp) { - pprintf(p, "File not found!\n"); - return -1; - } - fseek(fp, parray[p].last_file_byte, SEEK_SET); - - while (!feof(fp) && (--lcount > 0)) { - fgets(tmp, MAX_LINE_SIZE - 1, fp); - if (!feof(fp)) { - net_send_string(parray[p].socket, tmp, 1); - } - } - if (!feof(fp)) { - parray[p].last_file_byte = ftell(fp); - pprintf(p, "Type [next] to see next page.\n"); - } else { - rfree(parray[p].last_file); - parray[p].last_file = NULL; - parray[p].last_file_byte = 0L; - } - fclose(fp); - return 0; -} - -PUBLIC int psend_command(int p, char *command, char *input) -{ - FILE *fp; - char tmp[MAX_LINE_SIZE]; - int num; - - if (input) - fp = popen(command, "w"); - else - fp = popen(command, "r"); - if (!fp) - return -1; - if (input) { - fwrite(input, sizeof(char), strlen(input), fp); - } else { - while (!feof(fp)) { - num = fread(tmp, sizeof(char), MAX_LINE_SIZE - 1, fp); - tmp[num] = '\0'; - net_send_string(parray[p].socket, tmp, 1); - } - } - pclose(fp); - return 0; -} - -PUBLIC char *stolower(char *str) -{ - int i; - - if (!str) - return NULL; - for (i = 0; str[i]; i++) { - if (isupper(str[i])) { - str[i] = tolower(str[i]); - } - } - return str; -} - -PUBLIC int safechar(int c) -{ - if ((c == '>') || (c == '!') || (c == '&') || (c == '*') || (c == '?') || - (c == '/') || (c == '<') || (c == '|') || (c == '`') || (c == '$')) - return 0; - return 1; -} - -PUBLIC int safestring(char *str) -{ - int i; - - if (!str) - return 1; - for (i = 0; str[i]; i++) { - if (!safechar(str[i])) - return 0; - } - return 1; -} - -PUBLIC int alphastring(char *str) -{ - int i; - - if (!str) - return 1; - for (i = 0; str[i]; i++) { - if (!isalpha(str[i])) { - return 0; - } - } - return 1; -} - -PUBLIC int printablestring(char *str) -{ - int i; - - if (!str) - return 1; - for (i = 0; str[i]; i++) { - if ((!isprint(str[i])) && (str[i] != '\t') && (str[i] != '\n')) - return 0; - } - return 1; -} - - -/*#if defined(SGI) -#else*/ -/* This version of strdup must be used, or the count of allocs - in "uptime" will omit them. Maybe we change the name to - rstrdup and replace all calls, if the name is causing a conflict - with anyone's libraries. --mann -*/ -PUBLIC char *strdup(const char *str) -{ - char *tmp; - - if (!str) - return NULL; - tmp = rmalloc(strlen(str) + 1); - strcpy(tmp, str); - return tmp; -} -/*#endif*/ - -PUBLIC char *hms(int t, int showhour, int showseconds, int spaces) -{ - static char tstr[20]; - char tmp[10]; - int h, m, s; - - h = t / 3600; - t = t % 3600; - m = t / 60; - s = t % 60; - if (h || showhour) { - if (spaces) - sprintf(tstr, "%d : %02d", h, m); - else - sprintf(tstr, "%d:%02d", h, m); - } else { - sprintf(tstr, "%d", m); - } - if (showseconds) { - if (spaces) - sprintf(tmp, " : %02d", s); - else - sprintf(tmp, ":%02d", s); - strcat(tstr, tmp); - } - return tstr; -} - -PRIVATE char *strtime(struct tm * stm) -{ - static char tstr[100]; - -#if defined (SGI) - strftime(tstr, sizeof(tstr), "%a %b %e, %H:%M %Z", stm); -#else - strftime(tstr, sizeof(tstr), "%a %b %e, %k:%M %Z", stm); -#endif - return (tstr); -} - -PUBLIC char *strltime(time_t *clock) -{ - struct tm *stm = localtime(clock); - return strtime(stm); -} - -PUBLIC char *strgtime(time_t *clock) -{ - struct tm *stm = gmtime(clock); - return strtime(stm); -} - -/* This is used only for relative timeing since it reports seconds since - * about 5:00pm on Feb 16, 1994 - */ -PUBLIC unsigned tenth_secs(void) -{ - struct timeval tp; - struct timezone tzp; - - gettimeofday(&tp, &tzp); -/* .1 seconds since 1970 almost fills a 32 bit int! So lets subtract off - * the time right now */ - return ((tp.tv_sec - 331939277) * 10L) + (tp.tv_usec / 100000); -} - -/* This is to translate tenths-secs time back into 1/1/70 time in full - * seconds, because vek didn't read utils.c when he programmed new ratings. - 1 sec since 1970 fits into a 32 bit int OK. -*/ -PUBLIC int untenths(unsigned tenths) -{ - return (tenths / 10 + 331939277 + 0xffffffff / 10 + 1); -} - -PUBLIC char *tenth_str(unsigned t, int spaces) -{ - return hms((t + 5) / 10, 0, 1, spaces); /* Round it */ -} - -#define MAX_TRUNC_SIZE 100 - -/* Warning, if lines in the file are greater than 1024 bytes in length, this - won't work! */ -/* nasty bug fixed by mann, 3-12-95 */ -PUBLIC int truncate_file(char *file, int lines) -{ - FILE *fp; - int bptr = 0, trunc = 0, i; - char tBuf[MAX_TRUNC_SIZE][MAX_LINE_SIZE]; - - if (lines > MAX_TRUNC_SIZE) - lines = MAX_TRUNC_SIZE; - fp = fopen(file, "r"); - if (!fp) - return 1; - while (!feof(fp)) { - fgets(tBuf[bptr], MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (tBuf[bptr][strlen(tBuf[bptr]) - 1] != '\n') { /* Line too long */ - fclose(fp); - return -1; - } - bptr++; - if (bptr == lines) { - trunc = 1; - bptr = 0; - } - } - fclose(fp); - if (trunc) { - fp = fopen(file, "w"); - for (i = 0; i < lines; i++) { - fputs(tBuf[bptr], fp); - bptr++; - if (bptr == lines) { - bptr = 0; - } - } - fclose(fp); - } - return 0; -} - -/* Warning, if lines in the file are greater than 1024 bytes in length, this - won't work! */ -PUBLIC int lines_file(char *file) -{ - FILE *fp; - int lcount = 0; - char tmp[MAX_LINE_SIZE]; - - fp = fopen(file, "r"); - if (!fp) - return 0; - while (!feof(fp)) { - if (fgets(tmp, MAX_LINE_SIZE, fp)) - lcount++; - } - fclose(fp); - return lcount; -} - -PUBLIC int file_has_pname(char *fname, char *plogin) -{ - if (!strcmp(file_wplayer(fname), plogin)) - return 1; - if (!strcmp(file_bplayer(fname), plogin)) - return 1; - return 0; -} - -PUBLIC char *file_wplayer(char *fname) -{ - static char tmp[MAX_FILENAME_SIZE]; - char *ptr; - strcpy(tmp, fname); - ptr = rindex(tmp, '-'); - if (!ptr) - return ""; - *ptr = '\0'; - return tmp; -} - -PUBLIC char *file_bplayer(char *fname) -{ - char *ptr; - - ptr = rindex(fname, '-'); - if (!ptr) - return ""; - return ptr + 1; -} - - -/* Hey, leave this code alone. "a" is always in network byte order, - which is big-endian, even on a little-endian machine. I fixed this - code to handle that correctly a while ago, and someone - gratuitiously changed it so that it would work correctly only on a - big-endian machine (like a Sun). I have now changed it back. --mann -*/ -PUBLIC char *dotQuad(unsigned int a) -{ - static char tmp[20]; - unsigned char *aa = (unsigned char *) &a; - - sprintf(tmp, "%d.%d.%d.%d", aa[0], aa[1], aa[2], aa[3]); - return tmp; -} - -PUBLIC int available_space(void) -{ -#if defined(SYSTEM_NEXT) - struct statfs buf; - - statfs(player_dir, &buf); - return ((buf.f_bsize * buf.f_bavail)); -#elif defined(SYSTEM_ULTRIX) - struct fs_data buf; - - statfs(player_dir, &buf); - return ((1024 * buf.bfreen)); -#elif defined(SYSTEM_SUN4) -/* - struct statfs buf; - - statfs(player_dir, buf); - return (1024 * buf.f_bfree); */ - return 100000000; /* Infinite space */ -#else - return 100000000; /* Infinite space */ -#endif -} - -PUBLIC int file_exists(char *fname) -{ - FILE *fp; - - fp = fopen(fname, "r"); - if (!fp) - return 0; - fclose(fp); - return 1; -} - -PUBLIC char *ratstr(int rat) -{ - static int on = 0; - static char tmp[20][10]; - - if (on == 20) - on = 0; - if (rat) { - sprintf(tmp[on], "%4d", rat); - } else { - sprintf(tmp[on], "----"); - - } - on++; - return tmp[on - 1]; -} - -PUBLIC char *ratstrii(int rat, int reg) -{ - static int on = 0; - static char tmp[20][10]; - - if (on == 20) - on = 0; - if (rat) { - sprintf(tmp[on], "%4d", rat); - } else { - if (reg) { - sprintf(tmp[on], "----"); - } else { - sprintf(tmp[on], "++++"); - } - } - on++; - return tmp[on - 1]; -} - -struct t_tree { - struct t_tree *left, *right; - char name; /* Not just 1 char - space for whole name */ -}; /* is allocated. Maybe a little cheesy? */ - -struct t_dirs { - struct t_dirs *left, *right; - time_t mtime; /* dir's modification time */ - struct t_tree *files; - char name; /* ditto */ -}; - -PRIVATE char **t_buffer = NULL; /* pointer to next space in return buffer */ -PRIVATE int t_buffersize = 0; /* size of return buffer */ - -/* fill t_buffer with anything matching "want*" in file tree t_tree */ -PRIVATE void t_sft(char *want, struct t_tree *t) -{ - if (t) { - int cmp = strncmp(want, &t->name, strlen(want)); - if (cmp <= 0) /* if want <= this one, look left */ - t_sft(want, t->left); - if (t_buffersize && (cmp == 0)) { /* if a match, add it to buffer */ - t_buffersize--; - *t_buffer++ = &(t->name); - } - if (cmp >= 0) /* if want >= this one, look right */ - t_sft(want, t->right); - } -} - -/* delete file tree t_tree */ -PRIVATE void t_cft(struct t_tree **t) -{ - if (*t) { - t_cft(&(*t)->left); - t_cft(&(*t)->right); - rfree(*t); - *t = NULL; - } -} - -/* make file tree for dir d */ -PRIVATE void t_mft(struct t_dirs *d) -{ - DIR *dirp; - struct dirent *dp; - struct t_tree **t; - - if ((dirp = opendir(&(d->name))) == NULL) { - fprintf(stderr, "FICS:mft() couldn't opendir.\n"); - } else { - while ((dp = readdir(dirp))) { - t = &d->files; - if (dp->d_name[0] != '.') { /* skip anything starting with . */ - while (*t) { - if (strcmp(dp->d_name, &(*t)->name) < 0) { - t = &(*t)->left; - } else { - t = &(*t)->right; - } - } - *t = rmalloc(sizeof(struct t_tree) + strlen(dp->d_name)); - (*t)->right = (*t)->left = NULL; - strcpy(&(*t)->name, dp->d_name); - } - } - closedir(dirp); - } -} - -PUBLIC int search_directory(char *dir, char *filter, char **buffer, int buffersize) -{ -/* dir = directory to search - filter = what to search for - buffer = where to store pointers to matches - buffersize = how many pointers will fit inside buffer */ - - static struct t_dirs *ramdirs = NULL; - struct t_dirs **i; - int cmp; - static char nullify = '\0'; - struct stat statbuf; - - t_buffer = buffer; - t_buffersize = buffersize; - - if (!stat(dir, &statbuf)) { - if (filter == NULL) /* NULL becomes pointer to null string */ - filter = &nullify; - i = &ramdirs; - while (*i) { /* find dir in dir tree */ - cmp = strcmp(dir, &(*i)->name); - if (cmp == 0) - break; - else if (cmp < 0) - i = &(*i)->left; - else - i = &(*i)->right; - } - if (!*i) { /* if dir isn't in dir tree, add him */ - *i = rmalloc(sizeof(struct t_dirs) + strlen(dir)); - (*i)->left = (*i)->right = NULL; - (*i)->files = NULL; - strcpy(&(*i)->name, dir); - } - if ((*i)->files) { /* delete any obsolete file tree */ - if ((*i)->mtime != statbuf.st_mtime) { - t_cft(&(*i)->files); - } - } - if ((*i)->files == NULL) { /* if no file tree for him, make one */ - (*i)->mtime = statbuf.st_mtime; - t_mft(*i); - } - t_sft(filter, (*i)->files); /* finally, search for matches */ - } - return (buffersize - t_buffersize); -} - -PUBLIC int display_directory(int p, char **buffer, int count) -/* buffer contains 'count' string pointers */ -{ - int i; - multicol *m = multicol_start(count); - - for (i = 0; (i < count); i++) - multicol_store(m, *buffer++); - multicol_pprint(m, p, 78, 1); - multicol_end(m); - return (i); -} diff --git a/FICS/utils.h.orig b/FICS/utils.h.orig deleted file mode 100644 index 68f042f..0000000 --- a/FICS/utils.h.orig +++ /dev/null @@ -1,115 +0,0 @@ -/* utils.h - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#ifndef _UTILS_H -#define _UTILS_H - -#include <stdio.h> -#include "multicol.h" - -#define MAX_WORD_SIZE 1024 - -/* Maximum length of an output line */ -#define MAX_LINE_SIZE 1024 - -/* Maximum size of a filename */ -#ifdef FILENAME_MAX -# define MAX_FILENAME_SIZE FILENAME_MAX -#else -# define MAX_FILENAME_SIZE 1024 -#endif - -#define SetFlag(VAR, FLAG) (VAR |= (FLAG)) -#define ClearFlag(VAR, FLAG) (VAR &= ~(FLAG)) -#define CheckFlag(VAR, FLAG) (VAR & (FLAG)) - -extern int count_lines(FILE *); -extern int iswhitespace( ); -extern char *getword( ); -/* Returns a pointer to the first whitespace in the argument */ -extern char *eatword( ); -/* Returns a pointer to the first non-whitespace char in the argument */ -extern char *eatwhite( ); -/* Returns a pointer to the same string with trailing spaces removed */ -extern char *eattailwhite( ); -/* Returns the next word in a given string >eatwhite(eatword(foo))< */ -extern char *nextword( ); - -extern int check_emailaddr(char *); -extern int mail_string_to_address(); -extern int mail_string_to_user(); -extern int mail_file_to_address(); -extern int mail_file_to_user(); -extern int pcommand(int, char *, ...); -extern int pprintf(int, char *, ...); -extern void pprintf_dohightlight(int); -extern void sprintf_dohightlight(int,char *); -extern int pprintf_highlight(int, char *, ...); -extern int psprintf_highlight(int, char *, char *, ...); -extern int pprintf_prompt(int, char *, ...); -extern int pprintf_noformat(int, char *, ...); -extern int psend_raw_file( ); -extern int psend_file( ); -extern int psend_logoutfile( ); -extern int pmore_file( ); -extern int pmail_file( ); -extern int psend_command( ); - -extern char *stolower( ); - -extern int safechar( ); -extern int safestring( ); -extern int alphastring( ); -extern int printablestring( ); -#if defined(SGI) -#else -/* extern char *strdup( ); */ -#endif - -extern char *hms(); -extern char *strltime(); -extern char *strgtime(); -extern unsigned tenth_secs(); -extern char *tenth_str(); -extern int untenths(); - -extern int truncate_file(); -extern int lines_file(); - -extern int file_has_pname(); -extern char *file_wplayer(); -extern char *file_bplayer(); - -extern char *dotQuad(); - -extern int available_space(); -extern int file_exists(); -extern char *ratstr(); -extern char *ratstrii(); - -extern int search_directory(char *, char *, char **, int); -extern int display_directory(int, char **, int); - -#endif /* _UTILS_H */ - diff --git a/FICS/vers.h.orig b/FICS/vers.h.orig deleted file mode 100644 index df005ac..0000000 --- a/FICS/vers.h.orig +++ /dev/null @@ -1,31 +0,0 @@ -/* vers.h - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created -*/ - -#ifndef _VERS_H -#define _VERS_H - -extern char SGS_VERS[]; -extern char VERS_NUM[]; -extern char COMP_DATE[]; - -#endif /* _VERS_H */ |