Merge branch 'obsd-master'

pull/2020/head
Thomas Adam 2019-12-13 08:01:24 +00:00
commit e24e9867ec
1 changed files with 30 additions and 24 deletions

View File

@ -45,6 +45,7 @@ static enum {
CLIENT_EXIT_EXITED, CLIENT_EXIT_EXITED,
CLIENT_EXIT_SERVER_EXITED, CLIENT_EXIT_SERVER_EXITED,
} client_exitreason = CLIENT_EXIT_NONE; } client_exitreason = CLIENT_EXIT_NONE;
static int client_exitflag;
static int client_exitval; static int client_exitval;
static enum msgtype client_exittype; static enum msgtype client_exittype;
static const char *client_exitsession; static const char *client_exitsession;
@ -209,6 +210,27 @@ client_exit_message(void)
return ("unknown reason"); return ("unknown reason");
} }
/* Exit if all streams flushed. */
static void
client_exit(void)
{
struct client_file *cf;
size_t left;
int waiting = 0;
RB_FOREACH (cf, client_files, &client_files) {
if (cf->event == NULL)
continue;
left = EVBUFFER_LENGTH(cf->event->output);
if (left != 0) {
waiting++;
log_debug("file %u %zu bytes left", cf->stream, left);
}
}
if (waiting == 0)
proc_exit(client_proc);
}
/* Client main loop. */ /* Client main loop. */
int int
client_main(struct event_base *base, int argc, char **argv, int flags) client_main(struct event_base *base, int argc, char **argv, int flags)
@ -439,6 +461,9 @@ client_write_error_callback(__unused struct bufferevent *bev,
close(cf->fd); close(cf->fd);
cf->fd = -1; cf->fd = -1;
if (client_exitflag)
client_exit();
} }
/* File write callback. */ /* File write callback. */
@ -453,6 +478,9 @@ client_write_callback(__unused struct bufferevent *bev, void *arg)
RB_REMOVE(client_files, &client_files, cf); RB_REMOVE(client_files, &client_files, cf);
file_free(cf); file_free(cf);
} }
if (client_exitflag)
client_exit();
} }
/* Open write file. */ /* Open write file. */
@ -726,29 +754,6 @@ client_signal(int sig)
} }
} }
/* Exit if all streams flushed. */
static void
client_exit(__unused int fd, __unused short events, __unused void *arg)
{
struct client_file *cf;
size_t left;
int waiting = 0;
RB_FOREACH (cf, client_files, &client_files) {
if (cf->event == NULL)
continue;
left = EVBUFFER_LENGTH(cf->event->output);
if (left != 0) {
waiting++;
log_debug("file %u %zu bytes left", cf->stream, left);
}
}
if (waiting == 0)
proc_exit(client_proc);
else
event_once(-1, EV_TIMEOUT, client_exit, NULL, NULL);
}
/* Callback for client read events. */ /* Callback for client read events. */
static void static void
client_dispatch(struct imsg *imsg, __unused void *arg) client_dispatch(struct imsg *imsg, __unused void *arg)
@ -801,7 +806,8 @@ client_dispatch_wait(struct imsg *imsg)
memcpy(&retval, data, sizeof retval); memcpy(&retval, data, sizeof retval);
client_exitval = retval; client_exitval = retval;
} }
event_once(-1, EV_TIMEOUT, client_exit, NULL, NULL); client_exitflag = 1;
client_exit();
break; break;
case MSG_READY: case MSG_READY:
if (datalen != 0) if (datalen != 0)