aboutsummaryrefslogtreecommitdiff
path: root/pkgs/games/typespeed
diff options
context:
space:
mode:
authorJonathan Glines <auntieNeo@gmail.com>2014-06-08 22:46:02 -0600
committerJonathan Glines <auntieNeo@gmail.com>2014-06-08 22:46:02 -0600
commit9d04c9021b0b8da15e5a77981721c43886cc9438 (patch)
tree119135ed0e29720de4eaf2f6aa8065ec4db8ff18 /pkgs/games/typespeed
parent54ba3c7ff4855a1e82dc4cede94c9fc5979d8f88 (diff)
Oops, forgot to add patch.
Diffstat (limited to 'pkgs/games/typespeed')
-rw-r--r--pkgs/games/typespeed/typespeed-config-in-home.patch159
1 files changed, 159 insertions, 0 deletions
diff --git a/pkgs/games/typespeed/typespeed-config-in-home.patch b/pkgs/games/typespeed/typespeed-config-in-home.patch
new file mode 100644
index 000000000000..52d9338775b0
--- /dev/null
+++ b/pkgs/games/typespeed/typespeed-config-in-home.patch
@@ -0,0 +1,159 @@
+diff --git a/src/file.c b/src/file.c
+index d1d1982..dc679a2 100644
+--- a/src/file.c
++++ b/src/file.c
+@@ -125,6 +125,8 @@ int hcompar(const void *, const void *);
+ int loadscores(char *);
+ static int parseline(char *, char **, char **);
+ void readconfig(void);
++void mkconfig(char *filename);
++void mkscore(char *filename);
+ static void readfile(char *, int);
+ static void setoptions(char *, char *, int);
+
+@@ -1071,7 +1073,10 @@ parseline(char *line, char **option, char **value)
+ * let's drop it completely.
+ */
+ if ((p = strchr(line, '\n')) == NULL)
++ {
++ printf("yes, we died here\n");
+ return 1;
++ }
+ *p = '\0';
+ if ((p = strchr(line, '\r')) != NULL)
+ *p = '\0';
+@@ -1125,7 +1130,7 @@ void
+ readconfig(void)
+ {
+ char *envhome;
+- char userhigh[MAXPATHLEN], userconf[MAXPATHLEN];
++ char userhigh[MAXPATHLEN], userconf[MAXPATHLEN], confdir[MAXPATHLEN];
+ struct stat sb;
+
+ if (xsnprintf(ruledir, sizeof(ruledir), "%s", RULEDIR)) {
+@@ -1140,18 +1145,33 @@ readconfig(void)
+ readfile(CONFIGFILE, 1);
+
+ if ((envhome = getenv("HOME")) == NULL)
+- return;
++ xerr(1, "readconfig: environment variable HOME not set");
+
+ if (xsnprintf(userconf, sizeof(userconf), "%s/.typespeed/config",
+- envhome))
+- return;
++ envhome))
++ xerr(1, "readconfig: string error");
++ if (xsnprintf(userhigh, sizeof(userhigh), "%s/.typespeed/score",
++ envhome))
++ xerr(1, "readconfig: string error");
+
+ if (stat(userconf, &sb) || (sb.st_mode & S_IFMT) != S_IFREG)
+- return;
+-
+- if (xsnprintf(userhigh, sizeof(userhigh), "%s/.typespeed/score",
+- envhome))
+- return;
++ {
++ if (xsnprintf(confdir, sizeof(confdir), "%s/.typespeed",
++ envhome))
++ xerr(1, "readconfig: string error");
++ if(stat(confdir, &sb) == -1)
++ if(mkdir(confdir, S_IRWXU | S_IRWXG | S_IRWXO))
++ xerr(1, "readconfig: could not create config directory %s",
++ confdir);
++ /* create the user configuration with default values */
++ mkconfig(userconf);
++ }
++ /* check for the high score file */
++ if (stat(userhigh, &sb) || (sb.st_mode & S_IFMT) != S_IFREG)
++ {
++ /* create a blank high score file */
++ mkscore(userhigh);
++ }
+
+ /*
+ * Open a user writable high score.
+@@ -1159,14 +1179,48 @@ readconfig(void)
+ * file. Protect system-wide high score file with group
+ * write permissions: privileged gid already dropped.
+ */
+- if (close(hfd) == -1)
+- xerr(1, "readconfig: close");
+- if ((hfd = open(userhigh, O_RDWR, 0)) == -1)
++ if ((hfd = open(userhigh, O_RDWR)) == -1)
+ xerr(1, "readconfig: open: %s", userhigh);
+
+ readfile(userconf, 1);
+ }
+
++#define DEFAULT_CONFIG "cheat = no\n" \
++ "highorder = score cps tcps\n" \
++ "ruledir = " RULEDIR "\n" \
++ "worddir = " WORDDIR "\n"
++
++/*
++ * Create the user configuration, with default values, at the given path.
++ */
++void
++mkconfig(char *filename)
++{
++ int cfd;
++
++ if((cfd = open(filename, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
++ xerr(1, "mkconfig: open: %s", filename);
++ if(write(cfd, DEFAULT_CONFIG, sizeof(DEFAULT_CONFIG)/sizeof(DEFAULT_CONFIG[0]) - 1) == -1)
++ xerr(1, "mkconfig: write: %s", filename);
++ if(close(cfd) == -1)
++ xerr(1, "mkconfig: close: %s", filename);
++}
++
++/*
++ * Create the user high score file, which is just a blank file.
++ */
++void
++mkscore(char *filename)
++{
++ int sfd;
++ if((sfd = open(filename, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
++ xerr(1, "mkscore: open: %s", filename);
++ if(write(sfd, "", 0) == -1)
++ xerr(1, "mkconfig: write: %s", filename);
++ if(close(sfd) == -1)
++ xerr(1, "mkconfig: close: %s", filename);
++}
++
+ /*
+ * Function used to open configuration and game rule files and to
+ * set options with function setoptions.
+diff --git a/src/typespeed.c b/src/typespeed.c
+index 7ac5ee2..77e9acb 100644
+--- a/src/typespeed.c
++++ b/src/typespeed.c
+@@ -319,8 +319,13 @@ main(int argc, char **argv)
+ progname++;
+
+ /* just open high score file while being setgid games */
+- if ((hfd = open(HIGHFILE, O_RDWR, 0)) == -1)
+- xerr(1, "main: open: %s", HIGHFILE);
++ /*
++ * For NixOS, a global high score file doesn't make sense, so we just comment
++ * this out. A high score file in the user's home directory will be opened
++ * later in readconfig().
++ */
++/* if ((hfd = open(HIGHFILE, O_RDWR, 0)) == -1)
++ xerr(1, "main: open: %s", HIGHFILE); */
+
+ #ifndef WIN32
+ /* drop privileges */
+@@ -348,9 +353,9 @@ main(int argc, char **argv)
+ #endif /* WIN32 */
+
+ /* check file descriptors for consistency */
+- if (hfd == STDIN_FILENO || hfd == STDOUT_FILENO ||
++/* if (hfd == STDIN_FILENO || hfd == STDOUT_FILENO ||
+ hfd == STDERR_FILENO)
+- exit(1);
++ exit(1); */
+ if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO) ||
+ !isatty(STDERR_FILENO))
+ xerrx(1, "not fully connected to a terminal");