From 1870b96578cdc7d6605ce1d08bf2023f54b22935 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Thu, 23 Jul 2009 23:42:59 +0000 Subject: [PATCH] Sync OpenBSD patchset 172: Tidy client message return slightly: convert flags into an enum, and merge error string into struct client_ctx as well. --- client-msg.c | 56 ++++++++++++++++++++++++---------------------------- client.c | 35 +++++++++++++++----------------- tmux.h | 15 ++++++++------ 3 files changed, 51 insertions(+), 55 deletions(-) diff --git a/client-msg.c b/client-msg.c index dbedf563..bf6080c5 100644 --- a/client-msg.c +++ b/client-msg.c @@ -1,4 +1,4 @@ -/* $Id: client-msg.c,v 1.20 2009-07-22 17:38:11 tcunha Exp $ */ +/* $Id: client-msg.c,v 1.21 2009-07-23 23:42:59 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -25,16 +25,16 @@ #include "tmux.h" -int client_msg_fn_detach(struct hdr *, struct client_ctx *, char **); -int client_msg_fn_error(struct hdr *, struct client_ctx *, char **); -int client_msg_fn_shutdown(struct hdr *, struct client_ctx *, char **); -int client_msg_fn_exit(struct hdr *, struct client_ctx *, char **); -int client_msg_fn_exited(struct hdr *, struct client_ctx *, char **); -int client_msg_fn_suspend(struct hdr *, struct client_ctx *, char **); +int client_msg_fn_detach(struct hdr *, struct client_ctx *); +int client_msg_fn_error(struct hdr *, struct client_ctx *); +int client_msg_fn_shutdown(struct hdr *, struct client_ctx *); +int client_msg_fn_exit(struct hdr *, struct client_ctx *); +int client_msg_fn_exited(struct hdr *, struct client_ctx *); +int client_msg_fn_suspend(struct hdr *, struct client_ctx *); struct client_msg { enum hdrtype type; - int (*fn)(struct hdr *, struct client_ctx *, char **); + int (*fn)(struct hdr *, struct client_ctx *); }; struct client_msg client_msg_table[] = { { MSG_DETACH, client_msg_fn_detach }, @@ -46,7 +46,7 @@ struct client_msg client_msg_table[] = { }; int -client_msg_dispatch(struct client_ctx *cctx, char **error) +client_msg_dispatch(struct client_ctx *cctx) { struct hdr hdr; struct client_msg *msg; @@ -61,70 +61,67 @@ client_msg_dispatch(struct client_ctx *cctx, char **error) for (i = 0; i < nitems(client_msg_table); i++) { msg = client_msg_table + i; - if (msg->type == hdr.type) { - if (msg->fn(&hdr, cctx, error) != 0) - return (-1); - return (0); - } + if (msg->type == hdr.type) + return (msg->fn(&hdr, cctx)); } fatalx("unexpected message"); } int -client_msg_fn_error(struct hdr *hdr, struct client_ctx *cctx, char **error) +client_msg_fn_error(struct hdr *hdr, struct client_ctx *cctx) { + char *errstr; + if (hdr->size == SIZE_MAX) fatalx("bad MSG_ERROR size"); - *error = xmalloc(hdr->size + 1); - buffer_read(cctx->srv_in, *error, hdr->size); - (*error)[hdr->size] = '\0'; + errstr = xmalloc(hdr->size + 1); + buffer_read(cctx->srv_in, errstr, hdr->size); + errstr[hdr->size] = '\0'; + cctx->errstr = errstr; return (-1); } int -client_msg_fn_detach( - struct hdr *hdr, struct client_ctx *cctx, unused char **error) +client_msg_fn_detach(struct hdr *hdr, struct client_ctx *cctx) { if (hdr->size != 0) fatalx("bad MSG_DETACH size"); client_write_server(cctx, MSG_EXITING, NULL, 0); - cctx->flags |= CCTX_DETACH; + cctx->exittype = CCTX_DETACH; return (0); } int client_msg_fn_shutdown( - struct hdr *hdr, struct client_ctx *cctx, unused char **error) + struct hdr *hdr, struct client_ctx *cctx) { if (hdr->size != 0) fatalx("bad MSG_SHUTDOWN size"); client_write_server(cctx, MSG_EXITING, NULL, 0); - cctx->flags |= CCTX_SHUTDOWN; + cctx->exittype = CCTX_SHUTDOWN; return (0); } int -client_msg_fn_exit( - struct hdr *hdr, struct client_ctx *cctx, unused char **error) +client_msg_fn_exit(struct hdr *hdr, struct client_ctx *cctx) { if (hdr->size != 0) fatalx("bad MSG_EXIT size"); client_write_server(cctx, MSG_EXITING, NULL, 0); - cctx->flags |= CCTX_EXIT; + cctx->exittype = CCTX_EXIT; return (0); } int -client_msg_fn_exited( - struct hdr *hdr, unused struct client_ctx *cctx, unused char **error) +client_msg_fn_exited(struct hdr *hdr, unused struct client_ctx *cctx) { if (hdr->size != 0) fatalx("bad MSG_EXITED size"); @@ -133,8 +130,7 @@ client_msg_fn_exited( } int -client_msg_fn_suspend( - struct hdr *hdr, unused struct client_ctx *cctx, unused char **error) +client_msg_fn_suspend(struct hdr *hdr, unused struct client_ctx *cctx) { struct sigaction act; diff --git a/client.c b/client.c index 604beba5..65545c6b 100644 --- a/client.c +++ b/client.c @@ -1,4 +1,4 @@ -/* $Id: client.c,v 1.54 2009-07-23 13:15:41 tcunha Exp $ */ +/* $Id: client.c,v 1.55 2009-07-23 23:42:59 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -159,7 +159,7 @@ client_main(struct client_ctx *cctx) sigcont = 0; } - switch (client_msg_dispatch(cctx, &error)) { + switch (client_msg_dispatch(cctx)) { case -1: goto out; case 0: @@ -183,8 +183,10 @@ client_main(struct client_ctx *cctx) fatal("poll failed"); } - if (buffer_poll(&pfd, cctx->srv_in, cctx->srv_out) != 0) - goto server_dead; + if (buffer_poll(&pfd, cctx->srv_in, cctx->srv_out) != 0) { + cctx->exittype = CCTX_DIED; + break; + } } out: @@ -192,28 +194,23 @@ out: printf("[terminated]\n"); return (1); } - - if (cctx->flags & CCTX_SHUTDOWN) { + switch (cctx->exittype) { + case CCTX_DIED: + printf("[lost server]\n"); + return (0); + case CCTX_SHUTDOWN: printf("[server exited]\n"); return (0); - } - - if (cctx->flags & CCTX_EXIT) { + case CCTX_EXIT: printf("[exited]\n"); return (0); - } - - if (cctx->flags & CCTX_DETACH) { + case CCTX_DETACH: printf("[detached]\n"); return (0); + default: + printf("[error: %s]\n", cctx->errstr); + return (1); } - - printf("[error: %s]\n", error); - return (1); - -server_dead: - printf("[lost server]\n"); - return (0); } void diff --git a/tmux.h b/tmux.h index 47cc8aeb..b334b19e 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.387 2009-07-23 13:25:27 tcunha Exp $ */ +/* $Id: tmux.h,v 1.388 2009-07-23 23:42:59 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -844,10 +844,13 @@ struct client_ctx { struct buffer *srv_in; struct buffer *srv_out; -#define CCTX_DETACH 0x1 -#define CCTX_EXIT 0x2 -#define CCTX_SHUTDOWN 0x4 - int flags; + enum { + CCTX_DETACH, + CCTX_EXIT, + CCTX_DIED, + CCTX_SHUTDOWN, + } exittype; + const char *errstr; }; /* Key/command line command. */ @@ -1260,7 +1263,7 @@ int client_init(char *, struct client_ctx *, int, int); int client_main(struct client_ctx *); /* client-msg.c */ -int client_msg_dispatch(struct client_ctx *, char **); +int client_msg_dispatch(struct client_ctx *); /* client-fn.c */ void client_write_server(struct client_ctx *, enum hdrtype, void *, size_t);