The branch, master has been updated via fab8ca07373ad4a50b1af8dabf3a2a55e1d9d190 (commit) via 0e23ab4ccef2848a90b876db3c0e6a796422544c (commit) via 92997b781a035626bef4e84fbcd7f2282f761a3c (commit) via a131b82e95df990528371b1d9ca40ee2be264fc8 (commit) via 1ac96200a7462597b137719b376f40ad0cd85216 (commit) via b8b00aad5d3de0015367a6e23e800950ff7fc2df (commit) via 8e4ae12b4d0559a827f740f60b11f386f27f89dd (commit) via 2056a9ef9e91996c294b5db0a3d01ed415e95e56 (commit) via c5253ad8f7236662d0186dec1080288eb2d38b72 (commit) via 2b67907176805e3df5bd913174617d768277bfff (commit) via f117c7d94a2abb0561540a1fe33dd729b1cb8b34 (commit) via d1f939cede4a1eb7137feb892450e0e2b650cc6c (commit) via 1aae53596dd1bd657d534c7a0392826cbff2265c (commit) via 54782af61632846a48af35b33c056243fea7df8e (commit) via 61605c68839efa51ba049b549e67e62d68616940 (commit) via 8d0819bff16dbfbc61a97135742e1a0f1c144f77 (commit) from fd3b7f357200b85a6f3d6e39bae676c7c70ba082 (commit)
- Log ----------------------------------------------------------------- commit fab8ca07373ad4a50b1af8dabf3a2a55e1d9d190 Author: Thomas Adam <tho...@xteddy.org> Commit: Thomas Adam <tho...@xteddy.org> SYNCING: Make a note about libutils Don't forget that compat/* needs updating periodically as well. --- SYNCING | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/SYNCING b/SYNCING index eba2417..218685c 100644 --- a/SYNCING +++ b/SYNCING @@ -131,6 +131,15 @@ And if happy: % git push origin master +Keeping an eye on libutil in OpenBSD +==================================== + +A lot of the compat/ code in tmux comes from libutil, especially imsg. +Sometimes the API can change, etc., which might cause interesting problems +trying to run the portable version of tmux. It's worth checking +periodically for any changes to libutil in OpenBSD and syncing those files +to compat/ as and when appropriate. + Release tmux for next version ============================= commit 0e23ab4ccef2848a90b876db3c0e6a796422544c Author: Thomas Adam <tho...@xteddy.org> Commit: Thomas Adam <tho...@xteddy.org> Sync libutil from OpenBSD (imsg) Changes in the imsg API need to be reflected here as tmux wasn't creating any clients because of it. --- compat/imsg-buffer.c | 38 +++++++++++--------- compat/imsg.c | 99 +++++++++++++++++++++++++++++++++++++++++--------- compat/imsg.h | 11 ++++-- 3 files changed, 110 insertions(+), 38 deletions(-) diff --git a/compat/imsg-buffer.c b/compat/imsg-buffer.c index 2ddf0f7..2242e01 100644 --- a/compat/imsg-buffer.c +++ b/compat/imsg-buffer.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* $OpenBSD: imsg-buffer.c,v 1.3 2010/05/26 13:56:07 nicm Exp $ */ +/* $OpenBSD: imsg-buffer.c,v 1.4 2014/06/30 00:25:17 deraadt Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henn...@openbsd.org> @@ -17,17 +17,19 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include <sys/param.h> +#include <sys/types.h> +#include <sys/queue.h> #include <sys/socket.h> #include <sys/uio.h> +#include <limits.h> #include <errno.h> #include <stdlib.h> #include <string.h> -#include <strings.h> #include <unistd.h> #include "tmux.h" +#include "imsg.h" int ibuf_realloc(struct ibuf *, size_t); void ibuf_enqueue(struct msgbuf *, struct ibuf *); @@ -158,22 +160,23 @@ ibuf_write(struct msgbuf *msgbuf) i++; } +again: if ((n = writev(msgbuf->fd, iov, i)) == -1) { - if (errno == EAGAIN || errno == ENOBUFS || - errno == EINTR) /* try later */ - return (0); - else - return (-1); + if (errno == EINTR) + goto again; + if (errno == ENOBUFS) + errno = EAGAIN; + return (-1); } if (n == 0) { /* connection closed */ errno = 0; - return (-2); + return (0); } msgbuf_drain(msgbuf, n); - return (0); + return (1); } void @@ -257,17 +260,18 @@ msgbuf_write(struct msgbuf *msgbuf) *(int *)CMSG_DATA(cmsg) = buf->fd; } +again: if ((n = sendmsg(msgbuf->fd, &msg, 0)) == -1) { - if (errno == EAGAIN || errno == ENOBUFS || - errno == EINTR) /* try later */ - return (0); - else - return (-1); + if (errno == EINTR) + goto again; + if (errno == ENOBUFS) + errno = EAGAIN; + return (-1); } if (n == 0) { /* connection closed */ errno = 0; - return (-2); + return (0); } /* @@ -281,7 +285,7 @@ msgbuf_write(struct msgbuf *msgbuf) msgbuf_drain(msgbuf, n); - return (0); + return (1); } void diff --git a/compat/imsg.c b/compat/imsg.c index c4dd191..c99cda1 100644 --- a/compat/imsg.c +++ b/compat/imsg.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* $OpenBSD: imsg.c,v 1.3 2010/05/26 13:56:07 nicm Exp $ */ +/* $OpenBSD: imsg.c,v 1.6 2014/06/30 00:26:22 deraadt Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henn...@openbsd.org> @@ -17,20 +17,55 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include <sys/param.h> +#include <sys/types.h> +#include <sys/queue.h> #include <sys/socket.h> #include <sys/uio.h> #include <errno.h> #include <stdlib.h> #include <string.h> -#include <strings.h> #include <unistd.h> #include "tmux.h" +#include "imsg.h" + +int imsg_fd_overhead = 0; int imsg_get_fd(struct imsgbuf *); +int available_fds(unsigned int); + +/* TA: 2014-09-08: Note that the original code calls getdtablecount() which is + * OpenBSD specific. Until such time that it's ported elsewhere from + * <unistd.h>, I've mimicked what OpenSMTPD are doing, by using available_fds() + * instead. + */ + +int +available_fds(unsigned int n) +{ + unsigned int i; + int ret, fds[256]; + + if (n > (sizeof(fds)/sizeof(fds[0]))) + return (1); + + ret = 0; + for (i = 0; i < n; i++) { + fds[i] = -1; + if ((fds[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + ret = 1; + break; + } + } + + for (i = 0; i < n && fds[i] >= 0; i++) + close(fds[i]); + + return (ret); +} + void imsg_init(struct imsgbuf *ibuf, int fd) { @@ -49,10 +84,10 @@ imsg_read(struct imsgbuf *ibuf) struct cmsghdr *cmsg; union { struct cmsghdr hdr; - char buf[CMSG_SPACE(sizeof(int) * 16)]; + char buf[CMSG_SPACE(sizeof(int) * 1)]; } cmsgbuf; struct iovec iov; - ssize_t n; + ssize_t n = -1; int fd; struct imsg_fd *ifd; @@ -65,11 +100,23 @@ imsg_read(struct imsgbuf *ibuf) msg.msg_control = &cmsgbuf.buf; msg.msg_controllen = sizeof(cmsgbuf.buf); + if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) + return (-1); + +again: + if (available_fds(imsg_fd_overhead + + (CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int))) { + errno = EAGAIN; + free(ifd); + return (-1); + } + if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) { - if (errno != EINTR && errno != EAGAIN) { - return (-1); - } - return (-2); + if (errno == EMSGSIZE) + goto fail; + if (errno != EINTR && errno != EAGAIN) + goto fail; + goto again; } ibuf->r.wpos += n; @@ -78,17 +125,33 @@ imsg_read(struct imsgbuf *ibuf) cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - fd = (*(int *)CMSG_DATA(cmsg)); - if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) { - close(fd); - return (-1); + int i; + int j; + + /* + * We only accept one file descriptor. Due to C + * padding rules, our control buffer might contain + * more than one fd, and we must close them. + */ + j = ((char *)cmsg + cmsg->cmsg_len - + (char *)CMSG_DATA(cmsg)) / sizeof(int); + for (i = 0; i < j; i++) { + fd = ((int *)CMSG_DATA(cmsg))[i]; + if (ifd != NULL) { + ifd->fd = fd; + TAILQ_INSERT_TAIL(&ibuf->fds, ifd, + entry); + ifd = NULL; + } else + close(fd); } - ifd->fd = fd; - TAILQ_INSERT_TAIL(&ibuf->fds, ifd, entry); } /* we do not handle other ctl data level */ } +fail: + if (ifd) + free(ifd); return (n); } @@ -112,7 +175,7 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) return (0); datalen = imsg->hdr.len - IMSG_HEADER_SIZE; ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE; - if ((imsg->data = malloc(datalen)) == NULL && datalen != 0) + if ((imsg->data = malloc(datalen)) == NULL) return (-1); if (imsg->hdr.flags & IMSGF_HASFD) @@ -134,7 +197,7 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) int imsg_compose(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid, - pid_t pid, int fd, void *data, u_int16_t datalen) + pid_t pid, int fd, const void *data, u_int16_t datalen) { struct ibuf *wbuf; @@ -204,7 +267,7 @@ imsg_create(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid, } int -imsg_add(struct ibuf *msg, void *data, u_int16_t datalen) +imsg_add(struct ibuf *msg, const void *data, u_int16_t datalen) { if (datalen) if (ibuf_add(msg, data, datalen) == -1) { diff --git a/compat/imsg.h b/compat/imsg.h index f8a78e2..49a2aeb 100644 --- a/compat/imsg.h +++ b/compat/imsg.h @@ -1,5 +1,5 @@ /* $Id$ */ -/* $OpenBSD: imsg.h,v 1.4 2010/05/26 13:56:07 nicm Exp $ */ +/* $OpenBSD: imsg.h,v 1.3 2013/12/26 17:32:33 eric Exp $ */ /* * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <p...@openbsd.org> @@ -21,6 +21,9 @@ #include "tmux.h" +#ifndef _IMSG_H_ +#define _IMSG_H_ + #define IBUF_READ_SIZE 65535 #define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) #define MAX_IMSGSIZE 16384 @@ -98,13 +101,15 @@ void imsg_init(struct imsgbuf *, int); ssize_t imsg_read(struct imsgbuf *); ssize_t imsg_get(struct imsgbuf *, struct imsg *); int imsg_compose(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, - int, void *, u_int16_t); + int, const void *, u_int16_t); int imsg_composev(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, int, const struct iovec *, int); struct ibuf *imsg_create(struct imsgbuf *, u_int32_t, u_int32_t, pid_t, u_int16_t); -int imsg_add(struct ibuf *, void *, u_int16_t); +int imsg_add(struct ibuf *, const void *, u_int16_t); void imsg_close(struct imsgbuf *, struct ibuf *); void imsg_free(struct imsg *); int imsg_flush(struct imsgbuf *); void imsg_clear(struct imsgbuf *); + +#endif commit 92997b781a035626bef4e84fbcd7f2282f761a3c Author: Thomas Adam <tho...@xteddy.org> Commit: Thomas Adam <tho...@xteddy.org> Add compat/fparseln() for non-BSD systems Linux and friends don't natively have fparseln() so add it to compat/ and ensure autotools can pick it up. --- Makefile.am | 3 +++ cfg.c | 1 - compat.h | 4 ++++ configure.ac | 7 +++++++ 4 files changed, 14 insertions(+), 1 deletions(-) diff --git a/Makefile.am b/Makefile.am index 5f622ac..9fcb45f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -213,6 +213,9 @@ endif if NO_FGETLN nodist_tmux_SOURCES += compat/fgetln.c endif +if NO_FPARSELN +nodist_tmux_SOURCES += compat/fparseln.c +endif if NO_GETOPT nodist_tmux_SOURCES += compat/getopt.c endif diff --git a/cfg.c b/cfg.c index 5a6d67e..0e0f55b 100644 --- a/cfg.c +++ b/cfg.c @@ -23,7 +23,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <util.h> #include "tmux.h" diff --git a/compat.h b/compat.h index 65d6ec7..bf6e536 100644 --- a/compat.h +++ b/compat.h @@ -239,6 +239,10 @@ int vasprintf(char **, const char *, va_list); char *fgetln(FILE *, size_t *); #endif +#ifndef HAVE_FPARSELN +char *fparseln(FILE *, size_t *, size_t *, const char *, int); +#endif + #ifndef HAVE_SETENV /* setenv.c */ int setenv(const char *, const char *, int); diff --git a/configure.ac b/configure.ac index a81ecc4..82533a3 100644 --- a/configure.ac +++ b/configure.ac @@ -295,6 +295,13 @@ if test "x$found_fgetln" = xyes; then fi AM_CONDITIONAL(NO_FGETLN, [test "x$found_fgetln" = xno]) +# Look for fparseln, compat/fparseln.c used if missing. +AC_CHECK_FUNC(fparseln, found_fparseln=yes, found_fparseln=no) +if test "x$found_fparseln" = xyes; then + AC_DEFINE(HAVE_FPARSELN) +fi +AM_CONDITIONAL(NO_FPARSELN, [test "x$found_fparseln" = xno]) + # Look for strcasestr, compat/strcasestr.c used if missing. AC_CHECK_FUNC(strcasestr, found_strcasestr=yes, found_strcasestr=no) if test "x$found_strcasestr" = xyes; then commit a131b82e95df990528371b1d9ca40ee2be264fc8 Merge: fd3b7f3 1ac9620 Author: Thomas Adam <tho...@xteddy.org> Commit: Thomas Adam <tho...@xteddy.org> Merge branch 'obsd-master' Conflicts: client.c cfg.c | 64 +++++++++------------------------- client.c | 42 +++++++++++++++++----- cmd.c | 11 ++++-- format.c | 2 - input-keys.c | 31 ++++------------ input.c | 5 --- key-string.c | 8 ---- osdep-openbsd.c | 2 +- paste.c | 4 +- server-client.c | 7 +++- server.c | 1 + tmux.h | 95 ++++++++++++++++++++++++++++++++++---------------- tty-keys.c | 104 ++++++++++++++++++++++++++++++++++--------------------- tty-term.c | 43 +++++++++++++++++++++++ tty.c | 8 +--- window.c | 3 -- xterm-keys.c | 8 ---- 17 files changed, 249 insertions(+), 189 deletions(-) diff --cc client.c index 0c9f9cb,f5f5556..8e55640 --- a/client.c +++ b/client.c @@@ -233,7 -257,11 +257,7 @@@ client_main(int argc, char **argv, int return (1); } - /* Initialise the client socket and start the server. */ - /* Set process title, log and signals now this is the client. */ - setproctitle("client (%s)", socket_path); - logfile("client"); - + /* Initialize the client socket and start the server. */ fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER); if (fd == -1) { fprintf(stderr, "failed to connect to server: %s\n", diff --cc osdep-openbsd.c index 9d88fb0,7ee076e..9e4df91 --- a/osdep-openbsd.c +++ b/osdep-openbsd.c @@@ -34,12 -33,10 +34,12 @@@ #define is_runnable(p) \ ((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC) #define is_stopped(p) \ - ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD) + ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD) struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); -char *get_proc_name(int, char *); +char *osdep_get_name(int, char *); +char *osdep_get_cwd(int); +struct event_base *osdep_event_init(void); struct kinfo_proc * cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2) commit 1ac96200a7462597b137719b376f40ad0cd85216 Author: nicm <nicm> Commit: nicm <nicm> Remove support for the continuous reporting "any" mouse mode which never really worked properly and is rarely used. --- format.c | 2 -- input.c | 5 ----- server-client.c | 2 +- tmux.h | 4 ++-- tty.c | 8 ++------ 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/format.c b/format.c index e10f08c..400e432 100644 --- a/format.c +++ b/format.c @@ -601,8 +601,6 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp) !!(wp->base.mode & MODE_MOUSE_STANDARD)); format_add(ft, "mouse_button_flag", "%d", !!(wp->base.mode & MODE_MOUSE_BUTTON)); - format_add(ft, "mouse_any_flag", "%d", - !!(wp->base.mode & MODE_MOUSE_ANY)); format_add(ft, "mouse_utf8_flag", "%d", !!(wp->base.mode & MODE_MOUSE_UTF8)); diff --git a/input.c b/input.c index 4c1e073..ac1db67 100644 --- a/input.c +++ b/input.c @@ -1374,7 +1374,6 @@ input_csi_dispatch_rm_private(struct input_ctx *ictx) case 1000: case 1001: case 1002: - case 1003: screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES); break; case 1004: @@ -1451,10 +1450,6 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx) screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES); screen_write_mode_set(&ictx->ctx, MODE_MOUSE_BUTTON); break; - case 1003: - screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES); - screen_write_mode_set(&ictx->ctx, MODE_MOUSE_ANY); - break; case 1004: if (ictx->ctx.s->mode & MODE_FOCUSON) break; diff --git a/server-client.c b/server-client.c index 5616115..4c58170 100644 --- a/server-client.c +++ b/server-client.c @@ -647,7 +647,7 @@ server_client_reset_state(struct client *c) */ mode = s->mode; if ((c->tty.mouse.flags & MOUSE_RESIZE_PANE) && - !(mode & (MODE_MOUSE_BUTTON|MODE_MOUSE_ANY))) + !(mode & MODE_MOUSE_BUTTON)) mode |= MODE_MOUSE_BUTTON; /* diff --git a/tmux.h b/tmux.h index bbf4e9d..614b707 100644 --- a/tmux.h +++ b/tmux.h @@ -682,13 +682,13 @@ struct mode_key_table { #define MODE_WRAP 0x10 /* whether lines wrap */ #define MODE_MOUSE_STANDARD 0x20 #define MODE_MOUSE_BUTTON 0x40 -#define MODE_MOUSE_ANY 0x80 +/* 0x80 unused */ #define MODE_MOUSE_UTF8 0x100 #define MODE_MOUSE_SGR 0x200 #define MODE_BRACKETPASTE 0x400 #define MODE_FOCUSON 0x800 -#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY) +#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON) /* A single UTF-8 character. */ struct utf8_data { diff --git a/tty.c b/tty.c index 3ae21ab..9f57c36 100644 --- a/tty.c +++ b/tty.c @@ -513,16 +513,12 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s) tty_puts(tty, "\033[?1005l"); tty_puts(tty, "\033[?1006h"); - if (mode & MODE_MOUSE_ANY) - tty_puts(tty, "\033[?1003h"); - else if (mode & MODE_MOUSE_BUTTON) + if (mode & MODE_MOUSE_BUTTON) tty_puts(tty, "\033[?1002h"); else if (mode & MODE_MOUSE_STANDARD) tty_puts(tty, "\033[?1000h"); } else { - if (tty->mode & MODE_MOUSE_ANY) - tty_puts(tty, "\033[?1003l"); - else if (tty->mode & MODE_MOUSE_BUTTON) + if (tty->mode & MODE_MOUSE_BUTTON) tty_puts(tty, "\033[?1002l"); else if (tty->mode & MODE_MOUSE_STANDARD) tty_puts(tty, "\033[?1000l"); commit b8b00aad5d3de0015367a6e23e800950ff7fc2df Author: nicm <nicm> Commit: nicm <nicm> Revert the up/down wheel emulation for now, there will be a better way to do this along later for those who want it. --- input-keys.c | 15 --------------- 1 files changed, 0 insertions(+), 15 deletions(-) diff --git a/input-keys.c b/input-keys.c index c75e28d..7ce7193 100644 --- a/input-keys.c +++ b/input-keys.c @@ -205,21 +205,6 @@ input_mouse(struct window_pane *wp, struct session *s, struct mouse_event *m) char buf[40]; size_t len; struct paste_buffer *pb; - u_int i; - - /* - * If the alternate screen is active and hasn't enabled the mouse, send - * up and down key presses for the mouse wheel. - */ - if (wp->saved_grid != NULL && !(wp->screen->mode & ALL_MOUSE_MODES)) { - for (i = 0; i < m->scroll; i++) { - if (m->wheel == MOUSE_WHEEL_UP) - input_key(wp, KEYC_UP); - else - input_key(wp, KEYC_DOWN); - } - return; - } if (wp->screen->mode & ALL_MOUSE_MODES) { /* commit 8e4ae12b4d0559a827f740f60b11f386f27f89dd Author: nicm <nicm> Commit: nicm <nicm> lockf is entirely useless and it was a mistake to change to it, go back to using flock which actually works sensibly. Also always retry the lock to fix a potential race, and add some extra logging. --- client.c | 48 ++++++++++++++++++++++++++++++++++++------------ server.c | 1 + 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/client.c b/client.c index ab7847f..f5f5556 100644 --- a/client.c +++ b/client.c @@ -77,13 +77,18 @@ client_get_lock(char *lockfile) if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1) fatal("open failed"); + log_debug("lock file is %s", lockfile); - if (lockf(lockfd, F_TLOCK, 0) == -1 && errno == EAGAIN) { - while (lockf(lockfd, F_LOCK, 0) == -1 && errno == EINTR) + if (flock(lockfd, LOCK_EX|LOCK_NB) == -1) { + log_debug("flock failed: %s", strerror(errno)); + if (errno != EAGAIN) + return (lockfd); + while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR) /* nothing */; close(lockfd); return (-1); } + log_debug("flock succeeded"); return (lockfd); } @@ -94,8 +99,8 @@ client_connect(char *path, int start_server) { struct sockaddr_un sa; size_t size; - int fd, lockfd; - char *lockfile; + int fd, lockfd = -1, locked = 0; + char *lockfile = NULL; memset(&sa, 0, sizeof sa); sa.sun_family = AF_UNIX; @@ -104,29 +109,48 @@ client_connect(char *path, int start_server) errno = ENAMETOOLONG; return (-1); } + log_debug("socket is %s", path); retry: if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) fatal("socket failed"); + log_debug("trying connect"); if (connect(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1) { + log_debug("connect failed: %s", strerror(errno)); if (errno != ECONNREFUSED && errno != ENOENT) goto failed; if (!start_server) goto failed; close(fd); - xasprintf(&lockfile, "%s.lock", path); - if ((lockfd = client_get_lock(lockfile)) == -1) { - free(lockfile); + if (!locked) { + xasprintf(&lockfile, "%s.lock", path); + if ((lockfd = client_get_lock(lockfile)) == -1) { + log_debug("didn't get lock"); + free(lockfile); + goto retry; + } + log_debug("got lock"); + + /* + * Always retry at least once, even if we got the lock, + * because another client could have taken the lock, + * started the server and released the lock between our + * connect() and flock(). + */ + locked = 1; goto retry; } + if (unlink(path) != 0 && errno != ENOENT) { free(lockfile); close(lockfd); return (-1); } fd = server_start(lockfd, lockfile); + } + if (locked) { free(lockfile); close(lockfd); } @@ -233,7 +257,11 @@ client_main(int argc, char **argv, int flags) return (1); } - /* Initialise the client socket and start the server. */ + /* Set process title, log and signals now this is the client. */ + setproctitle("client (%s)", socket_path); + logfile("client"); + + /* Initialize the client socket and start the server. */ fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER); if (fd == -1) { fprintf(stderr, "failed to connect to server: %s\n", @@ -241,10 +269,6 @@ client_main(int argc, char **argv, int flags) return (1); } - /* Set process title, log and signals now this is the client. */ - setproctitle("client (%s)", socket_path); - logfile("client"); - /* Create imsg. */ imsg_init(&client_ibuf, fd); event_set(&client_event, fd, EV_READ, client_callback, shell_cmd); diff --git a/server.c b/server.c index 7ddc6ec..2cab88f 100644 --- a/server.c +++ b/server.c @@ -111,6 +111,7 @@ server_start(int lockfd, char *lockfile) /* The first client is special and gets a socketpair; create it. */ if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) fatal("socketpair failed"); + log_debug("starting server"); switch (fork()) { case -1: commit 2056a9ef9e91996c294b5db0a3d01ed415e95e56 Author: nicm <nicm> Commit: nicm <nicm> Drop explicit support for F13-F20 and change to match the xterm terminfo entry: F13-F24 are S-F1 to S-F12 F25-F36 are C-F1 to C-F12 F37-F48 are C-S-F1 to C-S-F12 F49-F60 are M-F1 to M-F12 and F61-F63 are M-S-F1 to M-S-F3 This should be no difference for applications inside tmux, but means that any key binding for F13 will need to be replaced by S-F1 and so on. --- input-keys.c | 16 +++++----- key-string.c | 8 ----- tmux.h | 91 ++++++++++++++++++++++++++++++++++++++++------------------ tty-keys.c | 89 ++++++++++++++++++++++++++++++++++++-------------------- tty-term.c | 43 +++++++++++++++++++++++++++ xterm-keys.c | 8 ----- 6 files changed, 171 insertions(+), 84 deletions(-) diff --git a/input-keys.c b/input-keys.c index 24566df..c75e28d 100644 --- a/input-keys.c +++ b/input-keys.c @@ -57,14 +57,14 @@ const struct input_key_ent input_keys[] = { { KEYC_F10, "\033[21~", 0 }, { KEYC_F11, "\033[23~", 0 }, { KEYC_F12, "\033[24~", 0 }, - { KEYC_F13, "\033[25~", 0 }, - { KEYC_F14, "\033[26~", 0 }, - { KEYC_F15, "\033[28~", 0 }, - { KEYC_F16, "\033[29~", 0 }, - { KEYC_F17, "\033[31~", 0 }, - { KEYC_F18, "\033[32~", 0 }, - { KEYC_F19, "\033[33~", 0 }, - { KEYC_F20, "\033[34~", 0 }, + { KEYC_F1|KEYC_SHIFT, "\033[25~", 0 }, + { KEYC_F2|KEYC_SHIFT, "\033[26~", 0 }, + { KEYC_F3|KEYC_SHIFT, "\033[28~", 0 }, + { KEYC_F4|KEYC_SHIFT, "\033[29~", 0 }, + { KEYC_F5|KEYC_SHIFT, "\033[31~", 0 }, + { KEYC_F6|KEYC_SHIFT, "\033[32~", 0 }, + { KEYC_F7|KEYC_SHIFT, "\033[33~", 0 }, + { KEYC_F8|KEYC_SHIFT, "\033[34~", 0 }, { KEYC_IC, "\033[2~", 0 }, { KEYC_DC, "\033[3~", 0 }, { KEYC_HOME, "\033[1~", 0 }, diff --git a/key-string.c b/key-string.c index 7aba190..db96827 100644 --- a/key-string.c +++ b/key-string.c @@ -42,14 +42,6 @@ const struct { { "F10", KEYC_F10 }, { "F11", KEYC_F11 }, { "F12", KEYC_F12 }, - { "F13", KEYC_F13 }, - { "F14", KEYC_F14 }, - { "F15", KEYC_F15 }, - { "F16", KEYC_F16 }, - { "F17", KEYC_F17 }, - { "F18", KEYC_F18 }, - { "F19", KEYC_F19 }, - { "F20", KEYC_F20 }, { "IC", KEYC_IC }, { "DC", KEYC_DC }, { "Home", KEYC_HOME }, diff --git a/tmux.h b/tmux.h index 4f937f3..bbf4e9d 100644 --- a/tmux.h +++ b/tmux.h @@ -195,14 +195,6 @@ enum key_code { KEYC_F10, KEYC_F11, KEYC_F12, - KEYC_F13, - KEYC_F14, - KEYC_F15, - KEYC_F16, - KEYC_F17, - KEYC_F18, - KEYC_F19, - KEYC_F20, KEYC_IC, KEYC_DC, KEYC_HOME, @@ -308,26 +300,69 @@ enum tty_code_code { TTYC_KEND5, TTYC_KEND6, TTYC_KEND7, - TTYC_KF1, /* key_f1, k1 */ - TTYC_KF10, /* key_f10, k; */ - TTYC_KF11, /* key_f11, F1 */ - TTYC_KF12, /* key_f12, F2 */ - TTYC_KF13, /* key_f13, F3 */ - TTYC_KF14, /* key_f14, F4 */ - TTYC_KF15, /* key_f15, F5 */ - TTYC_KF16, /* key_f16, F6 */ - TTYC_KF17, /* key_f17, F7 */ - TTYC_KF18, /* key_f18, F8 */ - TTYC_KF19, /* key_f19, F9 */ - TTYC_KF2, /* key_f2, k2 */ - TTYC_KF20, /* key_f20, F10 */ - TTYC_KF3, /* key_f3, k3 */ - TTYC_KF4, /* key_f4, k4 */ - TTYC_KF5, /* key_f5, k5 */ - TTYC_KF6, /* key_f6, k6 */ - TTYC_KF7, /* key_f7, k7 */ - TTYC_KF8, /* key_f8, k8 */ - TTYC_KF9, /* key_f9, k9 */ + TTYC_KF1, + TTYC_KF10, + TTYC_KF11, + TTYC_KF12, + TTYC_KF13, + TTYC_KF14, + TTYC_KF15, + TTYC_KF16, + TTYC_KF17, + TTYC_KF18, + TTYC_KF19, + TTYC_KF2, + TTYC_KF20, + TTYC_KF21, + TTYC_KF22, + TTYC_KF23, + TTYC_KF24, + TTYC_KF25, + TTYC_KF26, + TTYC_KF27, + TTYC_KF28, + TTYC_KF29, + TTYC_KF3, + TTYC_KF30, + TTYC_KF31, + TTYC_KF32, + TTYC_KF33, + TTYC_KF34, + TTYC_KF35, + TTYC_KF36, + TTYC_KF37, + TTYC_KF38, + TTYC_KF39, + TTYC_KF4, + TTYC_KF40, + TTYC_KF41, + TTYC_KF42, + TTYC_KF43, + TTYC_KF44, + TTYC_KF45, + TTYC_KF46, + TTYC_KF47, + TTYC_KF48, + TTYC_KF49, + TTYC_KF5, + TTYC_KF50, + TTYC_KF51, + TTYC_KF52, + TTYC_KF53, + TTYC_KF54, + TTYC_KF55, + TTYC_KF56, + TTYC_KF57, + TTYC_KF58, + TTYC_KF59, + TTYC_KF6, + TTYC_KF60, + TTYC_KF61, + TTYC_KF62, + TTYC_KF63, + TTYC_KF7, + TTYC_KF8, + TTYC_KF9, TTYC_KHOM2, TTYC_KHOM3, TTYC_KHOM4, diff --git a/tty-keys.c b/tty-keys.c index 932367e..967deca 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -113,14 +113,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = { { "\033[21^", KEYC_F10|KEYC_CTRL }, { "\033[23^", KEYC_F11|KEYC_CTRL }, { "\033[24^", KEYC_F12|KEYC_CTRL }, - { "\033[25^", KEYC_F13|KEYC_CTRL }, - { "\033[26^", KEYC_F14|KEYC_CTRL }, - { "\033[28^", KEYC_F15|KEYC_CTRL }, - { "\033[29^", KEYC_F16|KEYC_CTRL }, - { "\033[31^", KEYC_F17|KEYC_CTRL }, - { "\033[32^", KEYC_F18|KEYC_CTRL }, - { "\033[33^", KEYC_F19|KEYC_CTRL }, - { "\033[34^", KEYC_F20|KEYC_CTRL }, { "\033[2^", KEYC_IC|KEYC_CTRL }, { "\033[3^", KEYC_DC|KEYC_CTRL }, { "\033[7^", KEYC_HOME|KEYC_CTRL }, @@ -140,14 +132,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = { { "\033[21$", KEYC_F10|KEYC_SHIFT }, { "\033[23$", KEYC_F11|KEYC_SHIFT }, { "\033[24$", KEYC_F12|KEYC_SHIFT }, - { "\033[25$", KEYC_F13|KEYC_SHIFT }, - { "\033[26$", KEYC_F14|KEYC_SHIFT }, - { "\033[28$", KEYC_F15|KEYC_SHIFT }, - { "\033[29$", KEYC_F16|KEYC_SHIFT }, - { "\033[31$", KEYC_F17|KEYC_SHIFT }, - { "\033[32$", KEYC_F18|KEYC_SHIFT }, - { "\033[33$", KEYC_F19|KEYC_SHIFT }, - { "\033[34$", KEYC_F20|KEYC_SHIFT }, { "\033[2$", KEYC_IC|KEYC_SHIFT }, { "\033[3$", KEYC_DC|KEYC_SHIFT }, { "\033[7$", KEYC_HOME|KEYC_SHIFT }, @@ -167,14 +151,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = { { "\033[21@", KEYC_F10|KEYC_CTRL|KEYC_SHIFT }, { "\033[23@", KEYC_F11|KEYC_CTRL|KEYC_SHIFT }, { "\033[24@", KEYC_F12|KEYC_CTRL|KEYC_SHIFT }, - { "\033[25@", KEYC_F13|KEYC_CTRL|KEYC_SHIFT }, - { "\033[26@", KEYC_F14|KEYC_CTRL|KEYC_SHIFT }, - { "\033[28@", KEYC_F15|KEYC_CTRL|KEYC_SHIFT }, - { "\033[29@", KEYC_F16|KEYC_CTRL|KEYC_SHIFT }, - { "\033[31@", KEYC_F17|KEYC_CTRL|KEYC_SHIFT }, - { "\033[32@", KEYC_F18|KEYC_CTRL|KEYC_SHIFT }, - { "\033[33@", KEYC_F19|KEYC_CTRL|KEYC_SHIFT }, - { "\033[34@", KEYC_F20|KEYC_CTRL|KEYC_SHIFT }, { "\033[2@", KEYC_IC|KEYC_CTRL|KEYC_SHIFT }, { "\033[3@", KEYC_DC|KEYC_CTRL|KEYC_SHIFT }, { "\033[7@", KEYC_HOME|KEYC_CTRL|KEYC_SHIFT }, @@ -206,14 +182,63 @@ const struct tty_default_key_code tty_default_code_keys[] = { { TTYC_KF10, KEYC_F10 }, { TTYC_KF11, KEYC_F11 }, { TTYC_KF12, KEYC_F12 }, - { TTYC_KF13, KEYC_F13 }, - { TTYC_KF14, KEYC_F14 }, - { TTYC_KF15, KEYC_F15 }, - { TTYC_KF16, KEYC_F16 }, - { TTYC_KF17, KEYC_F17 }, - { TTYC_KF18, KEYC_F18 }, - { TTYC_KF19, KEYC_F19 }, - { TTYC_KF20, KEYC_F20 }, + + { TTYC_KF13, KEYC_F1|KEYC_SHIFT }, + { TTYC_KF14, KEYC_F2|KEYC_SHIFT }, + { TTYC_KF15, KEYC_F3|KEYC_SHIFT }, + { TTYC_KF16, KEYC_F4|KEYC_SHIFT }, + { TTYC_KF17, KEYC_F5|KEYC_SHIFT }, + { TTYC_KF18, KEYC_F6|KEYC_SHIFT }, + { TTYC_KF19, KEYC_F7|KEYC_SHIFT }, + { TTYC_KF20, KEYC_F8|KEYC_SHIFT }, + { TTYC_KF21, KEYC_F9|KEYC_SHIFT }, + { TTYC_KF22, KEYC_F10|KEYC_SHIFT }, + { TTYC_KF23, KEYC_F11|KEYC_SHIFT }, + { TTYC_KF24, KEYC_F12|KEYC_SHIFT }, + + { TTYC_KF25, KEYC_F1|KEYC_CTRL }, + { TTYC_KF26, KEYC_F2|KEYC_CTRL }, + { TTYC_KF27, KEYC_F3|KEYC_CTRL }, + { TTYC_KF28, KEYC_F4|KEYC_CTRL }, + { TTYC_KF29, KEYC_F5|KEYC_CTRL }, + { TTYC_KF30, KEYC_F6|KEYC_CTRL }, + { TTYC_KF31, KEYC_F7|KEYC_CTRL }, + { TTYC_KF32, KEYC_F8|KEYC_CTRL }, + { TTYC_KF33, KEYC_F9|KEYC_CTRL }, + { TTYC_KF34, KEYC_F10|KEYC_CTRL }, + { TTYC_KF35, KEYC_F11|KEYC_CTRL }, + { TTYC_KF36, KEYC_F12|KEYC_CTRL }, + + { TTYC_KF37, KEYC_F1|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF38, KEYC_F2|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF39, KEYC_F3|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF40, KEYC_F4|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF41, KEYC_F5|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF42, KEYC_F6|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF43, KEYC_F7|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF44, KEYC_F8|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF45, KEYC_F9|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF46, KEYC_F10|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF47, KEYC_F11|KEYC_SHIFT|KEYC_CTRL }, + { TTYC_KF48, KEYC_F12|KEYC_SHIFT|KEYC_CTRL }, + + { TTYC_KF49, KEYC_F1|KEYC_ESCAPE }, + { TTYC_KF50, KEYC_F2|KEYC_ESCAPE }, + { TTYC_KF51, KEYC_F3|KEYC_ESCAPE }, + { TTYC_KF52, KEYC_F4|KEYC_ESCAPE }, + { TTYC_KF53, KEYC_F5|KEYC_ESCAPE }, + { TTYC_KF54, KEYC_F6|KEYC_ESCAPE }, + { TTYC_KF55, KEYC_F7|KEYC_ESCAPE }, + { TTYC_KF56, KEYC_F8|KEYC_ESCAPE }, + { TTYC_KF57, KEYC_F9|KEYC_ESCAPE }, + { TTYC_KF58, KEYC_F10|KEYC_ESCAPE }, + { TTYC_KF59, KEYC_F11|KEYC_ESCAPE }, + { TTYC_KF60, KEYC_F12|KEYC_ESCAPE }, + + { TTYC_KF61, KEYC_F1|KEYC_ESCAPE|KEYC_SHIFT }, + { TTYC_KF62, KEYC_F2|KEYC_ESCAPE|KEYC_SHIFT }, + { TTYC_KF63, KEYC_F3|KEYC_ESCAPE|KEYC_SHIFT }, + { TTYC_KICH1, KEYC_IC }, { TTYC_KDCH1, KEYC_DC }, { TTYC_KHOME, KEYC_HOME }, diff --git a/tty-term.c b/tty-term.c index bedf0cf..f866a2d 100644 --- a/tty-term.c +++ b/tty-term.c @@ -113,10 +113,53 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = { { TTYC_KF19, TTYCODE_STRING, "kf19" }, { TTYC_KF2, TTYCODE_STRING, "kf2" }, { TTYC_KF20, TTYCODE_STRING, "kf20" }, + { TTYC_KF21, TTYCODE_STRING, "kf21" }, + { TTYC_KF22, TTYCODE_STRING, "kf22" }, + { TTYC_KF23, TTYCODE_STRING, "kf23" }, + { TTYC_KF24, TTYCODE_STRING, "kf24" }, + { TTYC_KF25, TTYCODE_STRING, "kf25" }, + { TTYC_KF26, TTYCODE_STRING, "kf26" }, + { TTYC_KF27, TTYCODE_STRING, "kf27" }, + { TTYC_KF28, TTYCODE_STRING, "kf28" }, + { TTYC_KF29, TTYCODE_STRING, "kf29" }, { TTYC_KF3, TTYCODE_STRING, "kf3" }, + { TTYC_KF30, TTYCODE_STRING, "kf30" }, + { TTYC_KF31, TTYCODE_STRING, "kf31" }, + { TTYC_KF32, TTYCODE_STRING, "kf32" }, + { TTYC_KF33, TTYCODE_STRING, "kf33" }, + { TTYC_KF34, TTYCODE_STRING, "kf34" }, + { TTYC_KF35, TTYCODE_STRING, "kf35" }, + { TTYC_KF36, TTYCODE_STRING, "kf36" }, + { TTYC_KF37, TTYCODE_STRING, "kf37" }, + { TTYC_KF38, TTYCODE_STRING, "kf38" }, + { TTYC_KF39, TTYCODE_STRING, "kf39" }, { TTYC_KF4, TTYCODE_STRING, "kf4" }, + { TTYC_KF40, TTYCODE_STRING, "kf40" }, + { TTYC_KF41, TTYCODE_STRING, "kf41" }, + { TTYC_KF42, TTYCODE_STRING, "kf42" }, + { TTYC_KF43, TTYCODE_STRING, "kf43" }, + { TTYC_KF44, TTYCODE_STRING, "kf44" }, + { TTYC_KF45, TTYCODE_STRING, "kf45" }, + { TTYC_KF46, TTYCODE_STRING, "kf46" }, + { TTYC_KF47, TTYCODE_STRING, "kf47" }, + { TTYC_KF48, TTYCODE_STRING, "kf48" }, + { TTYC_KF49, TTYCODE_STRING, "kf49" }, { TTYC_KF5, TTYCODE_STRING, "kf5" }, + { TTYC_KF50, TTYCODE_STRING, "kf50" }, + { TTYC_KF51, TTYCODE_STRING, "kf51" }, + { TTYC_KF52, TTYCODE_STRING, "kf52" }, + { TTYC_KF53, TTYCODE_STRING, "kf53" }, + { TTYC_KF54, TTYCODE_STRING, "kf54" }, + { TTYC_KF55, TTYCODE_STRING, "kf55" }, + { TTYC_KF56, TTYCODE_STRING, "kf56" }, + { TTYC_KF57, TTYCODE_STRING, "kf57" }, + { TTYC_KF58, TTYCODE_STRING, "kf58" }, + { TTYC_KF59, TTYCODE_STRING, "kf59" }, { TTYC_KF6, TTYCODE_STRING, "kf6" }, + { TTYC_KF60, TTYCODE_STRING, "kf60" }, + { TTYC_KF61, TTYCODE_STRING, "kf61" }, + { TTYC_KF62, TTYCODE_STRING, "kf62" }, + { TTYC_KF63, TTYCODE_STRING, "kf63" }, { TTYC_KF7, TTYCODE_STRING, "kf7" }, { TTYC_KF8, TTYCODE_STRING, "kf8" }, { TTYC_KF9, TTYCODE_STRING, "kf9" }, diff --git a/xterm-keys.c b/xterm-keys.c index a013cbd..5ca75d8 100644 --- a/xterm-keys.c +++ b/xterm-keys.c @@ -69,14 +69,6 @@ const struct xterm_keys_entry xterm_keys_table[] = { { KEYC_F10, "\033[21;_~" }, { KEYC_F11, "\033[23;_~" }, { KEYC_F12, "\033[24;_~" }, - { KEYC_F13, "\033[25;_~" }, - { KEYC_F14, "\033[26;_~" }, - { KEYC_F15, "\033[28;_~" }, - { KEYC_F16, "\033[29;_~" }, - { KEYC_F17, "\033[31;_~" }, - { KEYC_F18, "\033[32;_~" }, - { KEYC_F19, "\033[33;_~" }, - { KEYC_F20, "\033[34;_~" }, { KEYC_UP, "\033[1;_A" }, { KEYC_DOWN, "\033[1;_B" }, { KEYC_RIGHT, "\033[1;_C" }, commit c5253ad8f7236662d0186dec1080288eb2d38b72 Author: nicm <nicm> Commit: nicm <nicm> Show an error if cmd_find_session can't find the current session, like the other functions. --- cmd.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmd.c b/cmd.c index d8e010c..185d39b 100644 --- a/cmd.c +++ b/cmd.c @@ -795,8 +795,11 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached) int ambiguous; /* A NULL argument means the current session. */ - if (arg == NULL) - return (cmd_current_session(cmdq, prefer_unattached)); + if (arg == NULL) { + if ((s = cmd_current_session(cmdq, prefer_unattached)) == NULL) + cmdq_error(cmdq, "can't establish current session"); + return (s); + } /* Lookup as pane id or window id. */ if ((wp = cmd_lookup_paneid(arg)) != NULL) @@ -813,7 +816,9 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached) /* An empty session name is the current session. */ if (*tmparg == '\0') { free(tmparg); - return (cmd_current_session(cmdq, prefer_unattached)); + if ((s = cmd_current_session(cmdq, prefer_unattached)) == NULL) + cmdq_error(cmdq, "can't establish current session"); + return (s); } /* Find the session, if any. */ commit 2b67907176805e3df5bd913174617d768277bfff Author: krw <krw> Commit: krw <krw> An EOF is a good reason to close a connection. ok nicm@ --- client.c | 2 +- server-client.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client.c b/client.c index ec63fc0..ab7847f 100644 --- a/client.c +++ b/client.c @@ -469,7 +469,7 @@ client_callback(unused int fd, short events, void *data) } if (events & EV_WRITE) { - if (msgbuf_write(&client_ibuf.w) < 0 && errno != EAGAIN) + if (msgbuf_write(&client_ibuf.w) <= 0 && errno != EAGAIN) goto lost_server; } diff --git a/server-client.c b/server-client.c index 1ef3f31..5616115 100644 --- a/server-client.c +++ b/server-client.c @@ -224,7 +224,7 @@ server_client_callback(int fd, short events, void *data) return; if (fd == c->ibuf.fd) { - if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) < 0 && + if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) <= 0 && errno != EAGAIN) goto client_lost; commit f117c7d94a2abb0561540a1fe33dd729b1cb8b34 Author: nicm <nicm> Commit: nicm <nicm> If a client is killed while suspended with ^Z so has gone through the MSG_EXITED dance, don't try to resume it since a) it's pointless and b) the tty structures have been cleaned up and tmux will crash. --- server-client.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/server-client.c b/server-client.c index 0f4d39d..1ef3f31 100644 --- a/server-client.c +++ b/server-client.c @@ -875,6 +875,9 @@ server_client_msg_dispatch(struct client *c) break; c->flags &= ~CLIENT_SUSPENDED; + if (c->tty.fd == -1) /* exited in the meantime */ + break; + if (gettimeofday(&c->activity_time, NULL) != 0) fatal("gettimeofday"); if (c->session != NULL) commit d1f939cede4a1eb7137feb892450e0e2b650cc6c Author: guenther <guenther> Commit: guenther <guenther> Track whether a process is a zombie or not yet fully built via flags PS_{ZOMBIE,EMBRYO} on the process instead of peeking into the process's thread data. This eliminates the need for the thread-level SDEAD state. Change kvm_getprocs() (both the sysctl() and kvm backends) to report the "most active" scheduler state for the process's threads. tweaks kettenis@ feedback and ok matthew@ --- procname.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/procname.c b/procname.c index 5d3bc30..7ee076e 100644 --- a/procname.c +++ b/procname.c @@ -33,7 +33,7 @@ #define is_runnable(p) \ ((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC) #define is_stopped(p) \ - ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD) + ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD) struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); char *get_proc_name(int, char *); commit 1aae53596dd1bd657d534c7a0392826cbff2265c Author: tobias <tobias> Commit: tobias <tobias> Handle escaped back slashes and missing new lines at end of line by using fparseln instead of reimplementing it on our own. with input by and ok nicm@ --- cfg.c | 64 +++++++++++++++++----------------------------------------------- 1 files changed, 17 insertions(+), 47 deletions(-) diff --git a/cfg.c b/cfg.c index 5d98dbe..7502cee 100644 --- a/cfg.c +++ b/cfg.c @@ -23,6 +23,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <util.h> #include "tmux.h" @@ -36,9 +37,10 @@ int load_cfg(const char *path, struct cmd_q *cmdq, char **cause) { FILE *f; - u_int n, found; - char *buf, *copy, *line, *cause1, *msg; - size_t len, oldlen; + char delim[3] = { '\\', '\\', '\0' }; + u_int found; + size_t line = 0; + char *buf, *cause1, *msg, *p; struct cmd_list *cmdlist; log_debug("loading %s", path); @@ -47,60 +49,30 @@ load_cfg(const char *path, struct cmd_q *cmdq, char **cause) return (-1); } - n = found = 0; - line = NULL; - while ((buf = fgetln(f, &len))) { - /* Trim \n. */ - if (buf[len - 1] == '\n') - len--; - log_debug("%s: %.*s", path, (int)len, buf); - - /* Current line is the continuation of the previous one. */ - if (line != NULL) { - oldlen = strlen(line); - line = xrealloc(line, 1, oldlen + len + 1); - } else { - oldlen = 0; - line = xmalloc(len + 1); - } - - /* Append current line to the previous. */ - memcpy(line + oldlen, buf, len); - line[oldlen + len] = '\0'; - n++; - - /* Continuation: get next line? */ - len = strlen(line); - if (len > 0 && line[len - 1] == '\\') { - line[len - 1] = '\0'; - - /* Ignore escaped backslash at EOL. */ - if (len > 1 && line[len - 2] != '\\') - continue; - } - copy = line; - line = NULL; + found = 0; + while ((buf = fparseln(f, NULL, &line, delim, 0))) { + log_debug("%s: %s", path, buf); /* Skip empty lines. */ - buf = copy; - while (isspace((u_char)*buf)) - buf++; - if (*buf == '\0') { - free(copy); + p = buf; + while (isspace((u_char) *p)) + p++; + if (*p == '\0') { + free(buf); continue; } /* Parse and run the command. */ - if (cmd_string_parse(buf, &cmdlist, path, n, &cause1) != 0) { - free(copy); + if (cmd_string_parse(p, &cmdlist, path, line, &cause1) != 0) { + free(buf); if (cause1 == NULL) continue; - xasprintf(&msg, "%s:%u: %s", path, n, cause1); + xasprintf(&msg, "%s:%zu: %s", path, line, cause1); ARRAY_ADD(&cfg_causes, msg); free(cause1); continue; } - free(copy); + free(buf); if (cmdlist == NULL) continue; @@ -108,8 +80,6 @@ load_cfg(const char *path, struct cmd_q *cmdq, char **cause) cmd_list_free(cmdlist); found++; } - if (line != NULL) - free(line); fclose(f); return (found); commit 54782af61632846a48af35b33c056243fea7df8e Author: nicm <nicm> Commit: nicm <nicm> Allow keys and send-keys to invisible panes, from saggy-kun at users dot sf dot net. --- window.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/window.c b/window.c index d29ee2f..a0c53ca 100644 --- a/window.c +++ b/window.c @@ -1051,9 +1051,6 @@ window_pane_key(struct window_pane *wp, struct session *sess, int key) { struct window_pane *wp2; - if (!window_pane_visible(wp)) - return; - if (wp->mode != NULL) { if (wp->mode->key != NULL) wp->mode->key(wp, sess, key); commit 61605c68839efa51ba049b549e67e62d68616940 Author: nicm <nicm> Commit: nicm <nicm> Count mouse clicks correctly, from Balazs Kezes. --- tty-keys.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tty-keys.c b/tty-keys.c index 02be49f..932367e 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -786,25 +786,24 @@ tty_keys_mouse(struct tty *tty, const char *buf, size_t len, size_t *size) m->button = 3; } else if ((b & MOUSE_MASK_BUTTONS) == 3) { - if (~m->event & MOUSE_EVENT_DRAG && x == m->x && y == m->y) + if (~m->event & MOUSE_EVENT_DRAG && x == m->sx && y == m->sy) { m->event = MOUSE_EVENT_CLICK; - else + m->clicks = (m->clicks + 1) % 3; + } else m->event = MOUSE_EVENT_DRAG; m->event |= MOUSE_EVENT_UP; } else { if (b & MOUSE_MASK_DRAG) m->event = MOUSE_EVENT_DRAG; else { - if (m->event & MOUSE_EVENT_UP && x == m->x && y == m->y) - m->clicks = (m->clicks + 1) % 3; - else - m->clicks = 0; - m->sx = x; - m->sy = y; m->event = MOUSE_EVENT_DOWN; + if (x != m->sx || y != m->sy) + m->clicks = 0; } m->button = (b & MOUSE_MASK_BUTTONS); } + m->sx = x; + m->sy = y; return (0); } commit 8d0819bff16dbfbc61a97135742e1a0f1c144f77 Author: nicm <nicm> Commit: nicm <nicm> Comment style nits. --- paste.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paste.c b/paste.c index 245cca3..08f4bab 100644 --- a/paste.c +++ b/paste.c @@ -69,7 +69,7 @@ paste_walk(struct paste_buffer *pb) return (RB_NEXT(paste_time_tree, &paste_by_time, pb)); } -/* Get the most recent automatic buffer */ +/* Get the most recent automatic buffer. */ struct paste_buffer * paste_get_top(void) { @@ -81,7 +81,7 @@ paste_get_top(void) return (pb); } -/* Free the most recent buffer */ +/* Free the most recent buffer. */ int paste_free_top(void) { ----------------------------------------------------------------------- Summary of changes: Makefile.am | 3 + SYNCING | 9 ++++ cfg.c | 63 ++++++++---------------------- client.c | 42 ++++++++++++++++---- cmd.c | 11 ++++- compat.h | 4 ++ compat/imsg-buffer.c | 38 ++++++++++-------- compat/imsg.c | 99 +++++++++++++++++++++++++++++++++++++++--------- compat/imsg.h | 11 ++++- configure.ac | 7 +++ format.c | 2 - input-keys.c | 31 ++++----------- input.c | 5 -- key-string.c | 8 ---- osdep-openbsd.c | 2 +- paste.c | 4 +- server-client.c | 7 ++- server.c | 1 + tmux.h | 95 +++++++++++++++++++++++++++++++-------------- tty-keys.c | 104 ++++++++++++++++++++++++++++++------------------- tty-term.c | 43 ++++++++++++++++++++ tty.c | 8 +--- window.c | 3 - xterm-keys.c | 8 ---- 24 files changed, 381 insertions(+), 227 deletions(-) hooks/post-receive -- tmux ------------------------------------------------------------------------------ _______________________________________________ tmux-cvs mailing list tmux-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-cvs