svn commit: r242687 - stable/9/games/fortune/fortune
Eitan Adler
eadler at FreeBSD.org
Wed Nov 7 00:41:08 UTC 2012
Author: eadler
Date: Wed Nov 7 00:41:07 2012
New Revision: 242687
URL: http://svnweb.freebsd.org/changeset/base/242687
Log:
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)
Modified:
stable/9/games/fortune/fortune/fortune.6
stable/9/games/fortune/fortune/fortune.c
Directory Properties:
stable/9/games/fortune/ (props changed)
Modified: stable/9/games/fortune/fortune/fortune.6
==============================================================================
--- stable/9/games/fortune/fortune/fortune.6 Wed Nov 7 00:40:01 2012 (r242686)
+++ stable/9/games/fortune/fortune/fortune.6 Wed Nov 7 00:41:07 2012 (r242687)
@@ -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/*"
Modified: stable/9/games/fortune/fortune/fortune.c
==============================================================================
--- stable/9/games/fortune/fortune/fortune.c Wed Nov 7 00:40:01 2012 (r242686)
+++ stable/9/games/fortune/fortune/fortune.c Wed Nov 7 00:41:07 2012 (r242687)
@@ -107,6 +107,7 @@ bool Offend = FALSE; /* offensive fortu
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 **dat
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;
More information about the svn-src-stable-9
mailing list