summaryrefslogtreecommitdiffstats
path: root/client.c
diff options
context:
space:
mode:
authornicm <nicm>2015-11-24 22:45:44 +0000
committernicm <nicm>2015-11-24 22:45:44 +0000
commit73e30cbda8ade3a1c7ba3b771a911545826f76b7 (patch)
treef08e117d864e25c4878bda31ef0ce8607f05317c /client.c
parentc18fbefe93dfbc7525b27e0129f8a0e8e9b70117 (diff)
Actually show something (even if it not that helpful) if the server
fails to start (for example if it can't create the socket), rather than hanging or showing nothing.
Diffstat (limited to 'client.c')
-rw-r--r--client.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/client.c b/client.c
index 595aff9b..5fdfd029 100644
--- a/client.c
+++ b/client.c
@@ -76,8 +76,12 @@ client_get_lock(char *lockfile)
{
int lockfd;
- if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1)
- fatal("open failed");
+ if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1) {
+ lockfd = open("/dev/null", O_WRONLY);
+ if (lockfd == -1)
+ fatal("open failed");
+ return (lockfd);
+ }
log_debug("lock file is %s", lockfile);
if (flock(lockfd, LOCK_EX|LOCK_NB) == -1) {
@@ -114,10 +118,10 @@ client_connect(struct event_base *base, const char *path, int start_server)
retry:
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
- fatal("socket failed");
+ return (-1);
log_debug("trying connect");
- if (connect(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
+ if (connect(fd, (struct sockaddr *)&sa, sizeof sa) == -1) {
log_debug("connect failed: %s", strerror(errno));
if (errno != ECONNREFUSED && errno != ENOENT)
goto failed;
@@ -255,6 +259,9 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
cmd_list_free(cmdlist);
}
+ /* Create client process structure (starts logging). */
+ client_proc = proc_start("client", base, 0, client_signal);
+
/* Initialize the client socket and start the server. */
fd = client_connect(base, socket_path, cmdflags & CMD_STARTSERVER);
if (fd == -1) {
@@ -267,9 +274,6 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
}
return (1);
}
-
- /* Build process state. */
- client_proc = proc_start("client", base, 0, client_signal);
client_peer = proc_add_peer(client_proc, fd, client_dispatch, NULL);
/* Save these before pledge(). */
@@ -365,7 +369,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
printf("%%exit\n");
printf("\033\\");
tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
- }
+ } else
+ fprintf(stderr, "%s\n", client_exit_message());
setblocking(STDIN_FILENO, 1);
return (client_exitval);
}
@@ -517,7 +522,11 @@ client_dispatch(struct imsg *imsg, __unused void *arg)
if (imsg == NULL) {
client_exitreason = CLIENT_EXIT_LOST_SERVER;
client_exitval = 1;
- } else if (client_attached)
+ proc_exit(client_proc);
+ return;
+ }
+
+ if (client_attached)
client_dispatch_attached(imsg);
else
client_dispatch_wait(imsg);