about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--scooper.135
-rw-r--r--server.c23
2 files changed, 53 insertions, 5 deletions
diff --git a/scooper.1 b/scooper.1
index c00974a..0bd63b0 100644
--- a/scooper.1
+++ b/scooper.1
@@ -28,6 +28,11 @@ provides a CGI or FastCGI
 web interface for the
 .Xr litterbox 1
 IRC log database.
+To use FastCGI,
+run
+.Nm
+under
+.Xr kfcgi 8 .
 .
 .Pp
 The arguments are as follows:
@@ -72,6 +77,36 @@ The path to the
 database.
 .El
 .
+.Sh ENVIRONMENT
+In addition to the standard CGI environment variables,
+.Nm
+reads the following:
+.Pp
+.Bl -tag -width "SCOOPER_STYLESHEET" -compact
+.It Ev SCOOPER_DATABASE
+The path to the
+.Xr litterbox 1
+database.
+.It Ev SCOOPER_GAP
+Equivalent to
+.Fl g .
+.It Ev SCOOPER_LIMIT
+Equivalent to
+.Fl l .
+.It Ev SCOOPER_OVERLAP
+Equivalent to
+.Fl o .
+.It Ev SCOOPER_PUBLIC
+Equivalent to
+.Fl p .
+.It Ev SCOOPER_RECENT
+Equivalent to
+.Fl r .
+.It Ev SCOOPER_STYLESHEET
+Equivalent to
+.Fl s .
+.El
+.
 .Sh SEE ALSO
 .Xr kfcgi 8 ,
 .Xr litterbox 1
diff --git a/server.c b/server.c
index c384020..0ed1c9c 100644
--- a/server.c
+++ b/server.c
@@ -77,25 +77,38 @@ static enum kcgi_err dispatch(struct kreq *req) {
 	}
 }
 
+#define ENV "SCOOPER_"
+
 int main(int argc, char *argv[]) {
+	const char *path = NULL;
 	bool test = false;
 
+	const char *val;
+	if ((val = getenv(ENV "DATABASE"))) path = val;
+	if ((val = getenv(ENV "GAP"))) eventsGap = strtol(val, NULL, 10);
+	if ((val = getenv(ENV "LIMIT"))) eventsLimit = strtol(val, NULL, 10);
+	if ((val = getenv(ENV "OVERLAP"))) eventsOverlap = strtol(val, NULL, 10);
+	if ((val = getenv(ENV "PUBLIC"))) contextsPublic = (val[0] != '0');
+	if ((val = getenv(ENV "RECENT"))) contextsRecent = strtol(val, NULL, 10);
+	if ((val = getenv(ENV "STYLESHEET"))) htmlStylesheet = val;
+
 	for (int opt; 0 < (opt = getopt(argc, argv, "cg:l:o:pr:s:"));) {
 		switch (opt) {
-			break; case 'g': eventsGap = strtol(optarg, NULL, 10);
-			break; case 'o': eventsOverlap = strtol(optarg, NULL, 10);
 			break; case 'c': test = true;
+			break; case 'g': eventsGap = strtol(optarg, NULL, 10);
 			break; case 'l': eventsLimit = strtol(optarg, NULL, 10);
+			break; case 'o': eventsOverlap = strtol(optarg, NULL, 10);
 			break; case 'p': contextsPublic = true;
 			break; case 'r': contextsRecent = strtol(optarg, NULL, 10);
 			break; case 's': htmlStylesheet = optarg;
 			break; default:  return EX_USAGE;
 		}
 	}
-	if (optind == argc) errx(EX_USAGE, "database path required");
+	if (optind < argc) path = argv[optind];
+	if (!path) errx(EX_USAGE, "database path required");
 
-	int error = sqlite3_open_v2(argv[optind], &db, SQLITE_OPEN_READONLY, NULL);
-	if (error) errx(EX_NOINPUT, "%s: %s", argv[optind], sqlite3_errmsg(db));
+	int error = sqlite3_open_v2(path, &db, SQLITE_OPEN_READONLY, NULL);
+	if (error) errx(EX_NOINPUT, "%s: %s", path, sqlite3_errmsg(db));
 	atexit(finalizeAll);
 
 	sqlite3_stmt *check;