Oops, forgot to add patch.
This commit is contained in:
parent
54ba3c7ff4
commit
9d04c9021b
159
pkgs/games/typespeed/typespeed-config-in-home.patch
Normal file
159
pkgs/games/typespeed/typespeed-config-in-home.patch
Normal file
|
@ -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");
|
Loading…
Reference in a new issue