summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Janzen <pjanzen@cvs.openbsd.org>1998-10-01 05:31:39 +0000
committerPaul Janzen <pjanzen@cvs.openbsd.org>1998-10-01 05:31:39 +0000
commit37050e0ebb79a0adf6c41ad88f985cf4fb639998 (patch)
treef6bef751af27447e66f2c329fdad516b66c861d8
parent5ebd1c7d9b5bb0f04af00115afa948dcaad1376a (diff)
'Spam' winners a bit more safely
-rw-r--r--games/larn/Makefile6
-rw-r--r--games/larn/bill.c81
-rw-r--r--games/larn/main.c13
-rw-r--r--games/larn/pathnames.h4
4 files changed, 63 insertions, 41 deletions
diff --git a/games/larn/Makefile b/games/larn/Makefile
index e8a181ad8e7..d9b0716d5ac 100644
--- a/games/larn/Makefile
+++ b/games/larn/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.7 1998/09/15 05:12:30 pjanzen Exp $
+# $OpenBSD: Makefile,v 1.8 1998/10/01 05:31:38 pjanzen Exp $
# EXTRA
# Incorporates code to gather additional performance statistics
@@ -37,7 +37,7 @@
# cause player id's from the file ".playerids" to be used instead.
# (.playerids is created upon demand). Only one entry per id # is
# allowed in each scoreboard (winning & non-winning).
-# VT100
+# VT100
# Compile for using vt100 family of terminals. Omission of this
# define will cause larn to use termcap, but it will be MUCH slower
# due to an extra layer of output interpretation. Also, only VT100
@@ -52,6 +52,8 @@
# used to delay for effect when casting missile type spells.
# NOLOG
# Turn off logging.
+# NOSPAM
+# Don't send e-mail to players once they've won.
PROG= larn
MAN= larn.6
diff --git a/games/larn/bill.c b/games/larn/bill.c
index 63960d50b49..51d3116baea 100644
--- a/games/larn/bill.c
+++ b/games/larn/bill.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bill.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $OpenBSD: bill.c,v 1.4 1998/10/01 05:31:38 pjanzen Exp $ */
/* $NetBSD: bill.c,v 1.5 1997/10/18 20:03:06 christos Exp $ */
/*-
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)bill.c 5.2 (Berkeley) 5/28/91";
#else
-static char rcsid[] = "$OpenBSD: bill.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $";
+static char rcsid[] = "$OpenBSD: bill.c,v 1.4 1998/10/01 05:31:38 pjanzen Exp $";
#endif
#endif /* not lint */
@@ -50,12 +50,14 @@ static char rcsid[] = "$OpenBSD: bill.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $"
#include <unistd.h>
#include "header.h"
#include "extern.h"
+#include "pathnames.h"
/* bill.c Larn is copyrighted 1986 by Noah Morgan. */
+#ifndef NOSPAM
char *mail[] = {
+ "Undeclared Income",
"From: The LRS (Larn Revenue Service)\n",
- "~s Undeclared Income\n",
"\n We have heard you survived the caverns of Larn. Let us be the",
"\nfirst to congratulate you on your success. It was quite a feat.",
"\nIt was also very profitable for you...",
@@ -67,8 +69,8 @@ char *mail[] = {
"\nmean penalties. Once again, congratulations. We look forward",
"\nto your future successful expeditions.\n",
NULL,
+ "A Noble Deed",
"From: His Majesty King Wilfred of Larndom\n",
- "~s A Noble Deed\n",
"\n I have heard of your magnificent feat, and I, King Wilfred,",
"\nforthwith declare today to be a national holiday. Furthermore,",
"\nthree days hence be ye invited to the castle to receive the",
@@ -76,15 +78,15 @@ char *mail[] = {
"\n\nBravery and courage be yours.",
"\n\nMay you live in happiness forevermore...\n",
NULL,
+ "You Bastard!",
"From: Count Endelford\n",
- "~s You Bastard!\n",
"\n I have heard (from sources) of your journey. Congratulations!",
"\nYou Bastard! With several attempts I have yet to endure the",
" caves,\nand you, a nobody, make the journey! From this time",
" onward, bewarned -- \nupon our meeting you shall pay the price!\n",
NULL,
+ "High Praise",
"From: Mainair, Duke of Larnty\n",
- "~s High Praise\n",
"\n With certainty, a hero I declare to be amongst us! A nod of",
"\nfavour I send to thee. Me thinks Count Endelford this day of",
"\nright breath'eth fire as of dragon of whom ye are slayer. I",
@@ -92,8 +94,8 @@ char *mail[] = {
"\nunleash some of thy wealth upon those who be unfortunate, I,",
"\nDuke Mainair, shall equal thy gift also.\n",
NULL,
+ "these poor children",
"From: St. Mary's Children's Home\n",
- "~s these poor children\n",
"\n News of your great conquests has spread to all of Larndom.",
"\nMight I have a moment of a great adventurer's time? We here at",
"\nSt. Mary's Children's Home are very poor, and many children are",
@@ -102,8 +104,8 @@ char *mail[] = {
"\nin our plight? Whatever you could give will help much.",
"\n(your gift is tax deductible)\n",
NULL,
+ "hope",
"From: The National Cancer Society of Larn\n",
- "~s hope\n",
"\nCongratulations on your successful expedition. We are sure much",
"\ncourage and determination were needed on your quest. There are",
"\nmany though, that could never hope to undertake such a journey",
@@ -114,8 +116,10 @@ char *mail[] = {
"\ndreaded disease, and you can help today. Could you please see it",
"\nin your heart to give generously? Your continued good health",
"\ncan be your everlasting reward.\n",
+ NULL,
NULL
};
+#endif
/*
* function to mail the letters to the player if a winner
@@ -124,41 +128,54 @@ char *mail[] = {
void
mailbill()
{
+#ifndef NOSPAM
int i;
- char fname[32];
char buf[128];
char **cp;
- int fd;
+ int fd[2];
+ pid_t pid;
+ /* This is the last thing that gets run. We don't care if it
+ * fails, so exit on any failure. Drop privs. */
+ setegid(gid);
+ setgid(gid);
wait(0);
- if (fork() == 0) {
- resetscroll();
- cp = mail;
- sprintf(fname, "/tmp/#%dlarnmail", getpid());
- for (i = 0; i < 6; i++) {
- if ((fd = open(fname, O_WRONLY | O_TRUNC | O_CREAT,
- 0666)) == -1)
- exit(0);
- while (*cp != NULL) {
- if (*cp[0] == '1') {
+ resetscroll();
+ cp = mail;
+ for (i = 0; i < 6; i++) {
+ if (pipe(fd) < 0)
+ exit(0);
+ if ((pid = fork()) < 0)
+ exit(0);
+ else if (pid > 0) { /* parent */
+ close(fd[0]);
+ while (*++cp != NULL) {
+ if (*cp[0] == '1')
sprintf(buf, "\n%ld gold pieces back with you from your journey. As the",
(long) c[GOLD]);
- write(fd, buf, strlen(buf));
- } else if (*cp[0] == '2') {
+ else if (*cp[0] == '2')
sprintf(buf, "\nin preparing your tax bill. You owe %ld gold pieces as", (long) c[GOLD] * TAXRATE);
- write(fd, buf, strlen(buf));
- } else
- write(fd, *cp, strlen(*cp));
- cp++;
+ else
+ sprintf(buf, *cp);
+ if (write(fd[1], buf, strlen(buf)) != strlen(buf))
+ exit(0);
}
cp++;
-
- close(fd);
- sprintf(buf, "mail -I %s < %s > /dev/null",
- loginname, fname);
- system(buf);
- unlink(fname);
+ close(fd[1]);
+ if (waitpid(pid, NULL, 0) < 0)
+ exit(0);
+ } else { /* child */
+ close(fd[1]);
+ if (fd[0] != STDIN_FILENO) {
+ if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
+ exit(0);
+ close(fd[0]);
+ }
+ if (execl(_PATH_MAIL, "mail", "-s", *cp, loginname,
+ (char *) NULL) < 0)
+ exit(0);
}
}
+#endif
exit(0);
}
diff --git a/games/larn/main.c b/games/larn/main.c
index 53cd18e0156..48a59cd75eb 100644
--- a/games/larn/main.c
+++ b/games/larn/main.c
@@ -1,12 +1,13 @@
-/* $OpenBSD: main.c,v 1.8 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $OpenBSD: main.c,v 1.9 1998/10/01 05:31:38 pjanzen Exp $ */
/* $NetBSD: main.c,v 1.12 1998/02/12 08:07:49 mikel Exp $ */
/* main.c */
#ifndef lint
-static char rcsid[] = "$OpenBSD: main.c,v 1.8 1998/09/15 05:12:32 pjanzen Exp $";
+static char rcsid[] = "$OpenBSD: main.c,v 1.9 1998/10/01 05:31:38 pjanzen Exp $";
#endif /* not lint */
#include <sys/types.h>
+#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <pwd.h>
@@ -79,11 +80,11 @@ main(argc, argv)
/* can we get it from /etc/passwd? */
if ((pwe = getpwuid(getuid())) != NULL)
ptr = pwe->pw_name;
+#ifdef NOSPAM
else if ((ptr = getenv("LOGNAME")) == 0)
- if ((ptr = getenv("USER")) == 0) {
- noone: write(2, "Can't find your logname. Who Are You?\n", 39);
- exit(1);
- }
+ if ((ptr = getenv("USER")) == 0)
+#endif
+ noone: errx(1, "can't find your logname. Who Are You?");
}
if (ptr == 0)
goto noone;
diff --git a/games/larn/pathnames.h b/games/larn/pathnames.h
index f61281975d7..6698cffe171 100644
--- a/games/larn/pathnames.h
+++ b/games/larn/pathnames.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pathnames.h,v 1.2 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $OpenBSD: pathnames.h,v 1.3 1998/10/01 05:31:38 pjanzen Exp $ */
/* $NetBSD: pathnames.h,v 1.7 1997/10/18 20:03:41 christos Exp $ */
/*-
@@ -41,3 +41,5 @@
#define _PATH_HELP "/usr/share/games/larn/larn.help"
#define _PATH_LEVELS "/usr/share/games/larn/larnmaze"
#define _PATH_PLAYERIDS "/var/games/larn/playerids"
+
+#define _PATH_MAIL "/usr/bin/mail"