aboutsummaryrefslogtreecommitdiffstats
path: root/FICS
diff options
context:
space:
mode:
Diffstat (limited to 'FICS')
-rw-r--r--FICS/gamedb.c37
-rw-r--r--FICS/gamedb.h19
-rw-r--r--FICS/obsproc.c52
3 files changed, 72 insertions, 36 deletions
diff --git a/FICS/gamedb.c b/FICS/gamedb.c
index a34fd89..2293ba7 100644
--- a/FICS/gamedb.c
+++ b/FICS/gamedb.c
@@ -39,6 +39,7 @@
Markus Uhlin 25/03/18 Fixed unchecked return values
Markus Uhlin 25/03/25 ReadGameState: fixed truncated
stdio return value.
+ Markus Uhlin 25/04/01 Fixed call of risky function
*/
#include "stdinclude.h"
@@ -1844,38 +1845,46 @@ write_g_out(int g, char *file, int maxlines, int isDraw, char *EndSymbol,
* Find from_spot in journal list - return 0 if corrupted
*/
PUBLIC int
-journal_get_info(int p, char from_spot, char *WhiteName, int *WhiteRating,
- char *BlackName, int *BlackRating, char *type, int *t, int *i, char *eco,
- char *ending, char *result, char *fname)
+journal_get_info(struct JGI_context *ctx, const char *fname)
{
FILE *fp;
char count;
if ((fp = fopen(fname, "r")) == NULL) {
fprintf(stderr, "Corrupt journal file! %s\n", fname);
- pprintf(p, "The journal file is corrupt! See an admin.\n");
+ pprintf(ctx->p, "The journal file is corrupt! See an admin.\n");
return 0;
}
while (!feof(fp)) {
- if (fscanf(fp, "%c %s %d %s %d %s %d %d %s %s %s\n",
+ _Static_assert(ARRAY_SIZE(ctx->WhiteName) > 20,
+ "'WhiteName' too small");
+ _Static_assert(ARRAY_SIZE(ctx->BlackName) > 20,
+ "'BlackName' too small");
+
+ _Static_assert(ARRAY_SIZE(ctx->type) > 99, "'type' too small");
+ _Static_assert(ARRAY_SIZE(ctx->eco) > 99, "'eco' too small");
+ _Static_assert(ARRAY_SIZE(ctx->ending) > 99, "'ending' too small");
+ _Static_assert(ARRAY_SIZE(ctx->result) > 99, "'result' too small");
+
+ if (fscanf(fp, "%c %20s %d %20s %d %99s %d %d %99s %99s %99s\n",
&count,
- WhiteName, &(*WhiteRating),
- BlackName, &(*BlackRating),
- type,
- &(*t), &(*i),
- eco,
- ending,
- result) != 11) {
+ ctx->WhiteName, &ctx->WhiteRating,
+ ctx->BlackName, &ctx->BlackRating,
+ ctx->type,
+ &ctx->t, &ctx->i,
+ ctx->eco,
+ ctx->ending,
+ ctx->result) != 11) {
fprintf(stderr, "FICS: Error in journal info format. "
"%s\n", fname);
- pprintf(p, "The journal file is corrupt! Error in "
+ pprintf(ctx->p, "The journal file is corrupt! Error in "
"internal format.\n");
fclose(fp);
return 0;
}
- if (tolower(count) == from_spot) {
+ if (tolower(count) == ctx->from_spot) {
fclose(fp);
return 1;
}
diff --git a/FICS/gamedb.h b/FICS/gamedb.h
index d123028..2d0edc8 100644
--- a/FICS/gamedb.h
+++ b/FICS/gamedb.h
@@ -30,6 +30,7 @@
#include <time.h>
#include "board.h"
+#include "command.h"
extern const char *bstr[7];
extern const char *rstr[2];
@@ -148,6 +149,21 @@ typedef struct _game {
int winner;
} game;
+struct JGI_context {
+ int p;
+ char from_spot;
+ char WhiteName[MAX_LOGIN_NAME + 1];
+ int WhiteRating;
+ char BlackName[MAX_LOGIN_NAME + 1];
+ int BlackRating;
+ char type[100];
+ int t;
+ int i;
+ char eco[100];
+ char ending[100];
+ char result[100];
+};
+
extern game *garray;
extern int g_num;
@@ -171,8 +187,7 @@ extern int game_remove(int);
extern int game_save(int);
extern int game_zero(int);
extern int got_attr_value(int, char *, char *, FILE *, char *);
-extern int journal_get_info(int, char, char *, int *, char *, int *,
- char *, int *, int *, char *, char *, char *, char *);
+extern int journal_get_info(struct JGI_context *, const char *);
extern int pgames(int, int, char *);
extern int pjournal(int, int, char *);
extern void MakeFENpos(int, char *, size_t);
diff --git a/FICS/obsproc.c b/FICS/obsproc.c
index 43954ff..966e30e 100644
--- a/FICS/obsproc.c
+++ b/FICS/obsproc.c
@@ -1757,21 +1757,13 @@ com_journal(int p, param_list param)
PRIVATE void
jsave_journalentry(int p, char save_spot, int p1, char from_spot, char *to_file)
{
- FILE *Game;
- char *name_from = parray[p1].login;
- char *name_to = parray[p].login;
- char BlackName[MAX_LOGIN_NAME + 1];
- char WhiteName[MAX_LOGIN_NAME + 1];
- char command[MAX_FILENAME_SIZE * 2 + 3];
- char eco[100];
- char ending[100];
- char fname[MAX_FILENAME_SIZE];
- char fname2[MAX_FILENAME_SIZE];
- char result[100];
- char type[100];
- int BlackRating;
- int WhiteRating;
- int i, t;
+ FILE *Game;
+ char *name_from = parray[p1].login;
+ char *name_to = parray[p].login;
+ char command[MAX_FILENAME_SIZE * 2 + 3];
+ char fname[MAX_FILENAME_SIZE];
+ char fname2[MAX_FILENAME_SIZE];
+ struct JGI_context ctx;
msnprintf(fname, sizeof fname, "%s/%c/%s.%c", journal_dir, name_from[0],
name_from, from_spot);
@@ -1801,14 +1793,34 @@ jsave_journalentry(int p, char save_spot, int p1, char from_spot, char *to_file)
msnprintf(fname, sizeof fname, "%s/player_data/%c/%s.%s", stats_dir,
name_to[0], name_to, STATS_JOURNAL);
- if (!journal_get_info(p, from_spot, WhiteName, &WhiteRating,
- BlackName, &BlackRating, type, &t, &i, eco, ending, result, fname))
+ /*
+ * Init context
+ */
+ ctx.p = p;
+ ctx.from_spot = from_spot;
+ ctx.WhiteRating = 0;
+ ctx.BlackRating = 0;
+ ctx.t = 0;
+ ctx.i = 0;
+ memset(ctx.WhiteName, 0, sizeof(ctx.WhiteName));
+ memset(ctx.BlackName, 0, sizeof(ctx.BlackName));
+ memset(ctx.type, 0, sizeof(ctx.type));
+ memset(ctx.eco, 0, sizeof(ctx.eco));
+ memset(ctx.ending, 0, sizeof(ctx.ending));
+ memset(ctx.result, 0, sizeof(ctx.result));
+
+ if (!journal_get_info(&ctx, fname))
return;
addjournalitem(p, toupper(save_spot),
- WhiteName, WhiteRating,
- BlackName, BlackRating,
- type, t, i, eco, ending, result, to_file);
+ ctx.WhiteName, ctx.WhiteRating,
+ ctx.BlackName, ctx.BlackRating,
+ ctx.type,
+ ctx.t, ctx.i,
+ ctx.eco,
+ ctx.ending,
+ ctx.result,
+ to_file);
pprintf(p, "Journal entry %s %c saved in slot %c in journal.\n",
parray[p1].name, toupper(from_spot), toupper(save_spot));
}