diff options
author | Paul Janzen <pjanzen@cvs.openbsd.org> | 1998-10-01 05:31:39 +0000 |
---|---|---|
committer | Paul Janzen <pjanzen@cvs.openbsd.org> | 1998-10-01 05:31:39 +0000 |
commit | 37050e0ebb79a0adf6c41ad88f985cf4fb639998 (patch) | |
tree | f6bef751af27447e66f2c329fdad516b66c861d8 /games/larn/bill.c | |
parent | 5ebd1c7d9b5bb0f04af00115afa948dcaad1376a (diff) |
'Spam' winners a bit more safely
Diffstat (limited to 'games/larn/bill.c')
-rw-r--r-- | games/larn/bill.c | 81 |
1 files changed, 49 insertions, 32 deletions
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); } |