From d987d61d3c36ae4b482b22226a6513b015da25ec Mon Sep 17 00:00:00 2001 From: eadler Date: Wed, 7 Nov 2012 00:41:07 +0000 Subject: [PATCH] MFC r242577: Make OK_TO_WRITE_TO_DISK an envrionment variable instead of a compile time option. While here, don't differ based on the existence of LOCK_EX which doesn't seem to have ever made a difference on FreeBSD. Approved by: cperciva (implicit) git-svn-id: svn://svn.freebsd.org/base/stable/9@242687 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- games/fortune/fortune/fortune.6 | 3 ++ games/fortune/fortune/fortune.c | 87 ++++++++++++++++----------------- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/games/fortune/fortune/fortune.6 b/games/fortune/fortune/fortune.6 index d73274349..7272fd0d8 100644 --- a/games/fortune/fortune/fortune.6 +++ b/games/fortune/fortune/fortune.6 @@ -170,6 +170,9 @@ looks for data files. If not set it will default to .Pa /usr/games/fortune . If none of the directories specified exist, it will print a warning and exit. +.It Ev FORTUNE_SAVESTATE +If set, fortune will save some state about what fortune +it was up to on disk. .El .Sh FILES .Bl -tag -width ".Pa /usr/share/games/fortune/*" diff --git a/games/fortune/fortune/fortune.c b/games/fortune/fortune/fortune.c index 0c49f8701..f69a869fe 100644 --- a/games/fortune/fortune/fortune.c +++ b/games/fortune/fortune/fortune.c @@ -107,6 +107,7 @@ bool Offend = FALSE; /* offensive fortunes only */ bool All_forts = FALSE; /* any fortune allowed */ bool Equal_probs = FALSE; /* scatter un-allocted prob equally */ bool Match = FALSE; /* dump fortunes matching a pattern */ +static bool WriteToDisk = false; /* use files on disk to save state */ #ifdef DEBUG bool Debug = FALSE; /* print debug messages */ #endif @@ -170,9 +171,10 @@ static regex_t Re_pat; int main(int argc, char *argv[]) { -#ifdef OK_TO_WRITE_DISK int fd; -#endif /* OK_TO_WRITE_DISK */ + + if (getenv("FORTUNE_SAVESTATE") != NULL) + WriteToDisk = true; (void) setlocale(LC_ALL, ""); @@ -190,26 +192,22 @@ main(int argc, char *argv[]) display(Fortfile); -#ifdef OK_TO_WRITE_DISK - if ((fd = creat(Fortfile->posfile, 0666)) < 0) { - perror(Fortfile->posfile); - exit(1); + if (WriteToDisk) { + if ((fd = creat(Fortfile->posfile, 0666)) < 0) { + perror(Fortfile->posfile); + exit(1); + } + /* + * if we can, we exclusive lock, but since it isn't very + * important, we just punt if we don't have easy locking + * available. + */ + flock(fd, LOCK_EX); + write(fd, (char *) &Fortfile->pos, sizeof Fortfile->pos); + if (!Fortfile->was_pos_file) + chmod(Fortfile->path, 0666); + flock(fd, LOCK_UN); } -#ifdef LOCK_EX - /* - * if we can, we exclusive lock, but since it isn't very - * important, we just punt if we don't have easy locking - * available. - */ - (void) flock(fd, LOCK_EX); -#endif /* LOCK_EX */ - write(fd, (char *) &Fortfile->pos, sizeof Fortfile->pos); - if (!Fortfile->was_pos_file) - (void) chmod(Fortfile->path, 0666); -#ifdef LOCK_EX - (void) flock(fd, LOCK_UN); -#endif /* LOCK_EX */ -#endif /* OK_TO_WRITE_DISK */ if (Wait) { if (Fort_len == 0) (void) fortlen(); @@ -587,9 +585,8 @@ over: fp->next = *head; *head = fp; } -#ifdef OK_TO_WRITE_DISK - fp->was_pos_file = (access(fp->posfile, W_OK) >= 0); -#endif /* OK_TO_WRITE_DISK */ + if (WriteToDisk) + fp->was_pos_file = (access(fp->posfile, W_OK) >= 0); return (TRUE); } @@ -691,10 +688,9 @@ all_forts(FILEDESC *fp, char *offensive) obscene->name = ++sp; obscene->datfile = datfile; obscene->posfile = posfile; - obscene->read_tbl = FALSE; -#ifdef OK_TO_WRITE_DISK - obscene->was_pos_file = (access(obscene->posfile, W_OK) >= 0); -#endif /* OK_TO_WRITE_DISK */ + obscene->read_tbl = false; + if (WriteToDisk) + obscene->was_pos_file = (access(obscene->posfile, W_OK) >= 0); } /* @@ -824,12 +820,13 @@ is_fortfile(const char *file, char **datp, char **posp, int check_for_offend) else free(datfile); if (posp != NULL) { -#ifdef OK_TO_WRITE_DISK - *posp = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */ - (void) strcat(*posp, ".pos"); -#else - *posp = NULL; -#endif /* OK_TO_WRITE_DISK */ + if (WriteToDisk) { + *posp = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */ + strcat(*posp, ".pos"); + } + else { + *posp = NULL; + } } DPRINTF(2, (stderr, "TRUE\n")); @@ -1110,23 +1107,21 @@ open_dat(FILEDESC *fp) void get_pos(FILEDESC *fp) { -#ifdef OK_TO_WRITE_DISK int fd; -#endif /* OK_TO_WRITE_DISK */ assert(fp->read_tbl); if (fp->pos == POS_UNKNOWN) { -#ifdef OK_TO_WRITE_DISK - if ((fd = open(fp->posfile, O_RDONLY)) < 0 || - read(fd, &fp->pos, sizeof fp->pos) != sizeof fp->pos) + if (WriteToDisk) { + if ((fd = open(fp->posfile, O_RDONLY)) < 0 || + read(fd, &fp->pos, sizeof fp->pos) != sizeof fp->pos) + fp->pos = arc4random_uniform(fp->tbl.str_numstr); + else if (fp->pos >= fp->tbl.str_numstr) + fp->pos %= fp->tbl.str_numstr; + if (fd >= 0) + close(fd); + } + else fp->pos = arc4random_uniform(fp->tbl.str_numstr); - else if (fp->pos >= fp->tbl.str_numstr) - fp->pos %= fp->tbl.str_numstr; - if (fd >= 0) - (void) close(fd); -#else - fp->pos = arc4random_uniform(fp->tbl.str_numstr); -#endif /* OK_TO_WRITE_DISK */ } if (++(fp->pos) >= fp->tbl.str_numstr) fp->pos -= fp->tbl.str_numstr; -- 2.45.0