summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2015-12-23 11:22:13 +0100
committerYorhel <git@yorhel.nl>2015-12-23 11:22:13 +0100
commit7cd0659ea033d74535550019bf09fa0437279fd0 (patch)
tree61154d6d107273ae323626991dd4c9c6b2dac545
parentd9ebdd4921ed7f0c328b9606d90d1dc14ec11e9e (diff)
Better error reporting + handle SIGTERM/INT
-rw-r--r--configure.ac6
-rw-r--r--src/app.c27
-rw-r--r--src/app.h2
-rw-r--r--src/main.c23
4 files changed, 41 insertions, 17 deletions
diff --git a/configure.ac b/configure.ac
index 07c1aac..d940c89 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,6 @@ AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR([build-aux])
m4_include([deps/lean.m4])
AM_INIT_AUTOMAKE([foreign subdir-objects])
-PKG_PROG_PKG_CONFIG([0.18])
AC_PROG_CC
AC_PROG_INSTALL
@@ -45,9 +44,10 @@ if test "x$usesysev" != "xno"; then
usesysev=$havesysev
fi
if test "x$usesysev" = "xno"; then
- # Since we have our own libev, let's disable EV_MULTIPLICITY. Decreases
- # binary size a bit.
+ # Since we have our own libev, let's disable EV_MULTIPLICITY and threading
+ # support. Decreases binary size a bit.
AC_DEFINE(EV_MULTIPLICITY, 0, [Define to disable support for multiple event loops.])
+ AC_DEFINE(EV_NO_THREADS, 1, [Define to disable support for threads.])
m4_include([deps/ev/libev.m4])
fi
AM_CONDITIONAL([HAVE_SYSEV], [test "x$usesysev" = "xyes"])
diff --git a/src/app.c b/src/app.c
index 0d3afda..3303472 100644
--- a/src/app.c
+++ b/src/app.c
@@ -72,22 +72,25 @@ static fcgy_front *front_create(fcgy_app *app, fcgy_front_type t, const char *ad
}
-/* TODO: Better error reporting */
-static int front_bind(fcgy_front *f) {
+static int front_bind(fcgy_front *f, char *err, size_t errlen) {
switch(f->type) {
case FCGY_FRONT_UNIX: {
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
int r = snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", f->addr);
- if(r < 0 || r >= (int)sizeof(addr.sun_path))
+ if(r < 0 || r >= (int)sizeof(addr.sun_path)) {
+ snprintf(err, errlen, "invalid socket path");
return -1;
+ }
f->fd = util_serversock(AF_UNIX, &addr, sizeof(addr), FCGY_CLOEXEC|FCGY_NONBLOCK);
- if(f->fd < 0)
+ if(f->fd < 0) {
+ snprintf(err, errlen, "can't bind socket: %s", strerror(errno));
return -1;
- break;
}
+ }
+ break;
case FCGY_FRONT_TCP:
case FCGY_FRONT_STDIO:
@@ -157,13 +160,15 @@ int app_config(fcgy_app *app, fcgy_config_name name, const char *val, char *err,
}
-/* TODO: Error reporting */
-int app_bind(fcgy_app *app) {
+int app_bind(fcgy_app *app, char *err, size_t errlen) {
fcgy_front *f;
- int n = 0;
- for(f=app->fronts; n == 0 && f; f=f->next)
- n = front_bind(f);
- return n;
+ char ebuff[256];
+ for(f=app->fronts; f; f=f->next)
+ if(front_bind(f, ebuff, sizeof(ebuff)) < 0) {
+ snprintf(err, errlen, "%s: %s", f->addr, ebuff);
+ return -1;
+ }
+ return 0;
}
diff --git a/src/app.h b/src/app.h
index 84a0018..f584efd 100644
--- a/src/app.h
+++ b/src/app.h
@@ -53,7 +53,7 @@ struct fcgy_app {
fcgy_app *app_create();
int app_config(fcgy_app *, fcgy_config_name, const char *, char *, size_t);
-int app_bind(fcgy_app *);
+int app_bind(fcgy_app *, char *, size_t);
void app_run(fcgy_app *);
void app_destroy(fcgy_app *);
diff --git a/src/main.c b/src/main.c
index 71c2d83..cdcec31 100644
--- a/src/main.c
+++ b/src/main.c
@@ -24,6 +24,7 @@
#include <yopt.h>
static fcgy_app *app; /* TODO: Needs to be a global array of apps */
+static ev_signal termsig, intsig;
static const yopt_opt_t cli_options[] = {
@@ -78,15 +79,33 @@ static int parse_args(int argc, char **argv) {
}
+static void shutdown_sig(EV_P_ ev_signal *w, int revents) {
+ ev_signal_stop(EV_DEFAULT_UC_ &termsig);
+ ev_signal_stop(EV_DEFAULT_UC_ &intsig);
+ app_destroy(app);
+}
+
+
int main(int argc, char **argv) {
app = app_create();
if(parse_args(argc, argv) < 0)
return 1;
ev_default_loop(0);
- app_bind(app);
+
+ char ebuff[256];
+ if(app_bind(app, ebuff, sizeof(ebuff)) < 0) {
+ fprintf(stderr, "fcgy: %s\n", ebuff);
+ return 1;
+ }
app_run(app);
+
+ ev_signal_init(&termsig, shutdown_sig, SIGTERM);
+ ev_signal_init(&intsig, shutdown_sig, SIGINT);
+ ev_signal_start(EV_DEFAULT_UC_ &termsig);
+ ev_signal_start(EV_DEFAULT_UC_ &intsig);
+
ev_run(EV_DEFAULT_UC_ 0);
- app_destroy(app);
+ fprintf(stderr, "Clean shutdown.\n");
return 0;
}