summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreadler <eadler@FreeBSD.org>2012-11-04 15:15:47 +0000
committereadler <eadler@FreeBSD.org>2012-11-04 15:15:47 +0000
commit63f3f6b3d4cf7b4ca50105eb17c8ceaee34898a7 (patch)
tree280c56c616468d10cf672ff2cb18635d409a34e0
parent0b0da0bc2aa8451ebfa7b8769910a04eef1796cb (diff)
downloadFreeBSD-src-63f3f6b3d4cf7b4ca50105eb17c8ceaee34898a7.zip
FreeBSD-src-63f3f6b3d4cf7b4ca50105eb17c8ceaee34898a7.tar.gz
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 (from discussion) MFC after: 3 days
-rw-r--r--games/fortune/fortune/fortune.63
-rw-r--r--games/fortune/fortune/fortune.c87
2 files changed, 44 insertions, 46 deletions
diff --git a/games/fortune/fortune/fortune.6 b/games/fortune/fortune/fortune.6
index d732743..7272fd0 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 74339f4..22d85ac 100644
--- a/games/fortune/fortune/fortune.c
+++ b/games/fortune/fortune/fortune.c
@@ -107,6 +107,7 @@ static bool Offend = FALSE; /* offensive fortunes only */
static bool All_forts = FALSE; /* any fortune allowed */
static bool Equal_probs = FALSE; /* scatter un-allocted prob equally */
static bool Match = FALSE; /* dump fortunes matching a pattern */
+static bool WriteToDisk = false; /* use files on disk to save state */
#ifdef DEBUG
static bool Debug = FALSE; /* print debug messages */
#endif
@@ -168,9 +169,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, "");
@@ -188,26 +190,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();
@@ -585,9 +583,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);
}
@@ -689,10 +686,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);
}
/*
@@ -822,12 +818,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"));
@@ -1108,23 +1105,21 @@ open_dat(FILEDESC *fp)
static 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;
OpenPOWER on IntegriCloud