summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2015-04-25 10:02:46 +0000
committerThomas Adam <thomas@xteddy.org>2015-04-25 10:02:46 +0000
commit56e1132db485aeb0730ce7782533ca441e63afef (patch)
tree310f172893f10f8f2f3a249ee88fed51b03b39cc
parent0a88377086329786c438d4973365fdb21186f4e4 (diff)
parentaeedb464a6ee038289ddcfefae437928ab020cb1 (diff)
Merge branch 'obsd-master'
-rw-r--r--client.c6
-rw-r--r--cmd-attach-session.c8
-rw-r--r--cmd-choose-client.c24
-rw-r--r--cmd-detach-client.c13
-rw-r--r--cmd-if-shell.c15
-rw-r--r--cmd-list-clients.c15
-rw-r--r--cmd-run-shell.c15
-rw-r--r--cmd-set-option.c52
-rw-r--r--cmd.c26
-rw-r--r--control-notify.c28
-rw-r--r--grid.c2
-rw-r--r--job.c5
-rw-r--r--notify.c6
-rw-r--r--resize.c14
-rw-r--r--server-client.c51
-rw-r--r--server-fn.c62
-rw-r--r--server-window.c50
-rw-r--r--server.c95
-rw-r--r--session.c6
-rw-r--r--status.c2
-rw-r--r--tmux.h15
-rw-r--r--tty.c6
-rw-r--r--window-copy.c2
-rw-r--r--window.c72
24 files changed, 236 insertions, 354 deletions
diff --git a/client.c b/client.c
index 1929b2a8..f3fdecaf 100644
--- a/client.c
+++ b/client.c
@@ -258,6 +258,9 @@ client_main(int argc, char **argv, int flags)
return (1);
}
+ /* Establish signal handlers. */
+ set_signals(client_signal);
+
/* Initialize the client socket and start the server. */
fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER);
if (fd == -1) {
@@ -305,9 +308,6 @@ client_main(int argc, char **argv, int flags)
tcsetattr(STDIN_FILENO, TCSANOW, &tio);
}
- /* Establish signal handlers. */
- set_signals(client_signal);
-
/* Send identify messages. */
client_send_identify(flags);
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index a67ec82c..79e14616 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -51,7 +51,6 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
struct window_pane *wp = NULL;
const char *update;
char *cause;
- u_int i;
int fd;
struct format_tree *ft;
char *cp;
@@ -92,11 +91,8 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
* Can't use server_write_session in case attaching to
* the same session as currently attached to.
*/
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session != s)
- continue;
- if (c == cmdq->client)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != s || c == cmdq->client)
continue;
server_write_client(c, MSG_DETACH,
c->session->name,
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index 3002f7ba..49fe2a34 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -59,7 +59,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
struct winlink *wl;
const char *template;
char *action;
- u_int i, idx, cur;
+ u_int idx, cur;
if ((c = cmd_current_client(cmdq)) == NULL) {
cmdq_error(cmdq, "no client available");
@@ -81,24 +81,24 @@ cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
action = xstrdup("detach-client -t '%%'");
cur = idx = 0;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c1 = ARRAY_ITEM(&clients, i);
- if (c1 == NULL || c1->session == NULL || c1->tty.path == NULL)
+ TAILQ_FOREACH(c1, &clients, entry) {
+ if (c1->session == NULL || c1->tty.path == NULL)
continue;
if (c1 == cmdq->client)
cur = idx;
- idx++;
cdata = window_choose_data_create(TREE_OTHER, c, c->session);
- cdata->idx = i;
+ cdata->idx = idx;
cdata->ft_template = xstrdup(template);
- format_add(cdata->ft, "line", "%u", i);
+ format_add(cdata->ft, "line", "%u", idx);
format_defaults(cdata->ft, c1, NULL, NULL, NULL);
cdata->command = cmd_template_replace(action, c1->tty.path, 1);
window_choose_add(wl->window->active, cdata);
+
+ idx++;
}
free(action);
@@ -112,15 +112,19 @@ void
cmd_choose_client_callback(struct window_choose_data *cdata)
{
struct client *c;
+ u_int idx;
if (cdata == NULL)
return;
if (cdata->start_client->flags & CLIENT_DEAD)
return;
- if (cdata->idx > ARRAY_LENGTH(&clients) - 1)
- return;
- c = ARRAY_ITEM(&clients, cdata->idx);
+ idx = 0;
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (idx == cdata->idx)
+ break;
+ idx++;
+ }
if (c == NULL || c->session == NULL)
return;
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index 7f87d2c6..4bae9997 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -51,7 +51,6 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
struct client *c, *cloop;
struct session *s;
enum msgtype msgtype;
- u_int i;
if (self->entry == &cmd_suspend_client_entry) {
if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
@@ -72,9 +71,8 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
if (s == NULL)
return (CMD_RETURN_ERROR);
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- cloop = ARRAY_ITEM(&clients, i);
- if (cloop == NULL || cloop->session != s)
+ TAILQ_FOREACH(cloop, &clients, entry) {
+ if (cloop->session != s)
continue;
server_write_client(cloop, msgtype,
cloop->session->name,
@@ -88,11 +86,8 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_ERROR);
if (args_has(args, 'a')) {
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- cloop = ARRAY_ITEM(&clients, i);
- if (cloop == NULL || cloop->session == NULL)
- continue;
- if (cloop == c)
+ TAILQ_FOREACH(cloop, &clients, entry) {
+ if (cloop->session == NULL || cloop == c)
continue;
server_write_client(cloop, msgtype,
cloop->session->name,
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index cdd2135c..a307bd2f 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -66,16 +66,24 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
struct winlink *wl = NULL;
struct window_pane *wp = NULL;
struct format_tree *ft;
+ int cwd;
- if (args_has(args, 't'))
+ if (args_has(args, 't')) {
wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
- else {
+ cwd = wp->cwd;
+ } else {
c = cmd_find_client(cmdq, NULL, 1);
if (c != NULL && c->session != NULL) {
s = c->session;
wl = s->curw;
wp = wl->window->active;
}
+ if (cmdq->client != NULL && cmdq->client->session == NULL)
+ cwd = cmdq->client->cwd;
+ else if (s != NULL)
+ cwd = s->cwd;
+ else
+ cwd = -1;
}
ft = format_create();
@@ -118,7 +126,8 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
cmdq->references++;
cdata->references = 1;
- job_run(shellcmd, s, cmd_if_shell_callback, cmd_if_shell_free, cdata);
+ job_run(shellcmd, s, cwd, cmd_if_shell_callback, cmd_if_shell_free,
+ cdata);
free(shellcmd);
if (cdata->bflag)
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 893a6d05..372b5283 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -51,7 +51,7 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
struct session *s;
struct format_tree *ft;
const char *template;
- u_int i;
+ u_int idx;
char *line;
if (args_has(args, 't')) {
@@ -64,16 +64,13 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
if ((template = args_get(args, 'F')) == NULL)
template = LIST_CLIENTS_TEMPLATE;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
-
- if (s != NULL && s != c->session)
+ idx = 0;
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session == NULL || (s != NULL && s != c->session))
continue;
ft = format_create();
- format_add(ft, "line", "%u", i);
+ format_add(ft, "line", "%u", idx);
format_defaults(ft, c, NULL, NULL, NULL);
line = format_expand(ft, template);
@@ -81,6 +78,8 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
free(line);
format_free(ft);
+
+ idx++;
}
return (CMD_RETURN_NORMAL);
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index 5d6d178b..134cbeba 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -80,16 +80,24 @@ cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
struct winlink *wl = NULL;
struct window_pane *wp = NULL;
struct format_tree *ft;
+ int cwd;
- if (args_has(args, 't'))
+ if (args_has(args, 't')) {
wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
- else {
+ cwd = wp->cwd;
+ } else {
c = cmd_find_client(cmdq, NULL, 1);
if (c != NULL && c->session != NULL) {
s = c->session;
wl = s->curw;
wp = wl->window->active;
}
+ if (cmdq->client != NULL && cmdq->client->session == NULL)
+ cwd = cmdq->client->cwd;
+ else if (s != NULL)
+ cwd = s->cwd;
+ else
+ cwd = -1;
}
ft = format_create();
@@ -105,7 +113,8 @@ cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
cdata->cmdq = cmdq;
cmdq->references++;
- job_run(shellcmd, s, cmd_run_shell_callback, cmd_run_shell_free, cdata);
+ job_run(shellcmd, s, cwd, cmd_run_shell_callback, cmd_run_shell_free,
+ cdata);
if (cdata->bflag)
return (CMD_RETURN_NORMAL);
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 01d691d5..83d31b93 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -91,7 +91,6 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
struct options *oo;
struct window *w;
const char *optstr, *valstr;
- u_int i;
/* Get the option name and value. */
optstr = args->argv[0];
@@ -176,9 +175,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
/* Start or stop timers when automatic-rename changed. */
if (strcmp(oe->name, "automatic-rename") == 0) {
- for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
- if ((w = ARRAY_ITEM(&windows, i)) == NULL)
- continue;
+ RB_FOREACH(w, windows, &windows) {
if (options_get_number(&w->options, "automatic-rename"))
queue_window_name(w);
else if (event_initialized(&w->name_timer))
@@ -188,9 +185,8 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
/* Update sizes and redraw. May not need it but meh. */
recalculate_sizes();
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c != NULL && c->session != NULL)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != NULL)
server_redraw_client(c);
}
@@ -291,9 +287,15 @@ cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
{
struct options_entry *o;
- if (oe->type != OPTIONS_TABLE_FLAG && value == NULL) {
- cmdq_error(cmdq, "empty value");
- return (-1);
+ switch (oe->type) {
+ case OPTIONS_TABLE_FLAG:
+ case OPTIONS_TABLE_CHOICE:
+ break;
+ default:
+ if (value == NULL) {
+ cmdq_error(cmdq, "empty value");
+ return (-1);
+ }
}
o = NULL;
@@ -457,21 +459,27 @@ cmd_set_option_choice(unused struct cmd *self, struct cmd_q *cmdq,
const char **choicep;
int n, choice = -1;
- n = 0;
- for (choicep = oe->choices; *choicep != NULL; choicep++) {
- n++;
- if (strncmp(*choicep, value, strlen(value)) != 0)
- continue;
+ if (value == NULL) {
+ choice = options_get_number(oo, oe->name);
+ if (choice < 2)
+ choice = !choice;
+ } else {
+ n = 0;
+ for (choicep = oe->choices; *choicep != NULL; choicep++) {
+ n++;
+ if (strncmp(*choicep, value, strlen(value)) != 0)
+ continue;
- if (choice != -1) {
- cmdq_error(cmdq, "ambiguous value: %s", value);
+ if (choice != -1) {
+ cmdq_error(cmdq, "ambiguous value: %s", value);
+ return (NULL);
+ }
+ choice = n - 1;
+ }
+ if (choice == -1) {
+ cmdq_error(cmdq, "unknown value: %s", value);
return (NULL);
}
- choice = n - 1;
- }
- if (choice == -1) {
- cmdq_error(cmdq, "unknown value: %s", value);
- return (NULL);
}
return (options_set_number(oo, oe->name, choice));
diff --git a/cmd.c b/cmd.c
index 880a1034..8378ddf0 100644
--- a/cmd.c
+++ b/cmd.c
@@ -115,10 +115,12 @@ const struct cmd_entry *cmd_table[] = {
NULL
};
+ARRAY_DECL(client_list, struct client *);
+
int cmd_session_better(struct session *, struct session *, int);
struct session *cmd_choose_session_list(struct sessionslist *);
struct session *cmd_choose_session(int);
-struct client *cmd_choose_client(struct clients *);
+struct client *cmd_choose_client(struct client_list *);
struct client *cmd_lookup_client(const char *);
struct session *cmd_lookup_session(struct cmd_q *, const char *, int *);
struct session *cmd_lookup_session_id(const char *);
@@ -451,8 +453,7 @@ cmd_current_client(struct cmd_q *cmdq)
{
struct session *s;
struct client *c;
- struct clients cc;
- u_int i;
+ struct client_list cc;
if (cmdq->client != NULL && cmdq->client->session != NULL)
return (cmdq->client);
@@ -464,9 +465,7 @@ cmd_current_client(struct cmd_q *cmdq)
s = cmd_current_session(cmdq, 0);
if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
ARRAY_INIT(&cc);
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- if ((c = ARRAY_ITEM(&clients, i)) == NULL)
- continue;
+ TAILQ_FOREACH(c, &clients, entry) {
if (s == c->session)
ARRAY_ADD(&cc, c);
}
@@ -477,12 +476,17 @@ cmd_current_client(struct cmd_q *cmdq)
return (c);
}
- return (cmd_choose_client(&clients));
+ ARRAY_INIT(&cc);
+ TAILQ_FOREACH(c, &clients, entry)
+ ARRAY_ADD(&cc, c);
+ c = cmd_choose_client(&cc);
+ ARRAY_FREE(&cc);
+ return (c);
}
/* Choose the most recently used client from a list. */
struct client *
-cmd_choose_client(struct clients *cc)
+cmd_choose_client(struct client_list *cc)
{
struct client *c, *cbest;
struct timeval *tv = NULL;
@@ -614,11 +618,9 @@ cmd_lookup_client(const char *name)
{
struct client *c;
const char *path;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL || c->tty.path == NULL)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session == NULL || c->tty.path == NULL)
continue;
path = c->tty.path;
diff --git a/control-notify.c b/control-notify.c
index 747ef5b4..943d670c 100644
--- a/control-notify.c
+++ b/control-notify.c
@@ -64,11 +64,9 @@ control_notify_window_layout_changed(struct window *w)
struct session *s;
struct format_tree *ft;
struct winlink *wl;
- u_int i;
const char *template;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL)
continue;
s = c->session;
@@ -100,10 +98,8 @@ control_notify_window_unlinked(unused struct session *s, struct window *w)
{
struct client *c;
struct session *cs;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL)
continue;
cs = c->session;
@@ -120,10 +116,8 @@ control_notify_window_linked(unused struct session *s, struct window *w)
{
struct client *c;
struct session *cs;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL)
continue;
cs = c->session;
@@ -140,10 +134,8 @@ control_notify_window_renamed(struct window *w)
{
struct client *c;
struct session *cs;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL)
continue;
cs = c->session;
@@ -174,10 +166,8 @@ void
control_notify_session_renamed(struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c))
continue;
@@ -189,10 +179,8 @@ void
control_notify_session_created(unused struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c))
continue;
@@ -204,10 +192,8 @@ void
control_notify_session_close(unused struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
+ TAILQ_FOREACH(c, &clients, entry) {
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c))
continue;
diff --git a/grid.c b/grid.c
index ef7c374b..2dc266d7 100644
--- a/grid.c
+++ b/grid.c
@@ -657,7 +657,7 @@ grid_duplicate_lines(struct grid *dst, u_int dy, struct grid *src, u_int sy,
memcpy(dstl, srcl, sizeof *dstl);
if (srcl->cellsize != 0) {
- dstl->celldata = xcalloc(
+ dstl->celldata = xreallocarray(NULL,
srcl->cellsize, sizeof *dstl->celldata);
memcpy(dstl->celldata, srcl->celldata,
srcl->cellsize * sizeof *dstl->celldata);
diff --git a/job.c b/job.c
index 023a1d47..74b316ed 100644
--- a/job.c
+++ b/job.c
@@ -40,7 +40,7 @@ struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
/* Start a job running, if it isn't already. */
struct job *
-job_run(const char *cmd, struct session *s,
+job_run(const char *cmd, struct session *s, int cwd,
void (*callbackfn)(struct job *), void (*freefn)(void *), void *data)
{
struct job *job;
@@ -66,6 +66,9 @@ job_run(const char *cmd, struct session *s,
case 0: /* child */
clear_signals(1);
+ if (cwd != -1 && fchdir(cwd) != 0)
+ chdir("/");
+
environ_push(&env);
environ_free(&env);
diff --git a/notify.c b/notify.c
index 47945aec..10fd5ce1 100644
--- a/notify.c
+++ b/notify.c
@@ -135,7 +135,6 @@ void
notify_input(struct window_pane *wp, struct evbuffer *input)
{
struct client *c;
- u_int i;
/*
* notify_input() is not queued and only does anything when
@@ -144,9 +143,8 @@ notify_input(struct window_pane *wp, struct evbuffer *input)
if (!notify_enabled)
return;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c != NULL && (c->flags & CLIENT_CONTROL))
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->flags & CLIENT_CONTROL)
control_notify_input(c, wp, input);
}
}
diff --git a/resize.c b/resize.c
index 9ad73c81..3606bfeb 100644
--- a/resize.c
+++ b/resize.c
@@ -49,7 +49,7 @@ recalculate_sizes(void)
struct client *c;
struct window *w;
struct window_pane *wp;
- u_int i, j, ssx, ssy, has, limit;
+ u_int ssx, ssy, has, limit;
int flag, has_status, is_zoomed, forced;
RB_FOREACH(s, sessions, &sessions) {
@@ -57,9 +57,8 @@ recalculate_sizes(void)
s->attached = 0;
ssx = ssy = UINT_MAX;
- for (j = 0; j < ARRAY_LENGTH(&clients); j++) {
- c = ARRAY_ITEM(&clients, j);
- if (c == NULL || c->flags & CLIENT_SUSPENDED)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->flags & CLIENT_SUSPENDED)
continue;
if (c->session == s) {
if (c->tty.sx < ssx)
@@ -92,9 +91,8 @@ recalculate_sizes(void)
s->sy = ssy;
}
- for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
- w = ARRAY_ITEM(&windows, i);
- if (w == NULL || w->active == NULL)
+ RB_FOREACH(w, windows, &windows) {
+ if (w->active == NULL)
continue;
flag = options_get_number(&w->options, "aggressive-resize");
@@ -105,7 +103,7 @@ recalculate_sizes(void)
if (flag)
has = s->curw->window == w;
else
- has = session_has(s, w) != NULL;
+ has = session_has(s, w);
if (has) {
if (s->sx < ssx)
ssx = s->sx;
diff --git a/server-client.c b/server-client.c
index 72edbdc8..f221a150 100644
--- a/server-client.c
+++ b/server-client.c
@@ -59,7 +59,6 @@ void
server_client_create(int fd)
{
struct client *c;
- u_int i;
setblocking(fd, 0);
@@ -107,13 +106,7 @@ server_client_create(int fd)
evtimer_set(&c->repeat_timer, server_client_repeat_timer, c);
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- if (ARRAY_ITEM(&clients, i) == NULL) {
- ARRAY_SET(&clients, i, c);
- return;
- }
- }
- ARRAY_ADD(&clients, c);
+ TAILQ_INSERT_TAIL(&clients, c, entry);
log_debug("new client %d", fd);
}
@@ -147,10 +140,7 @@ server_client_lost(struct client *c)
struct message_entry *msg;
u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- if (ARRAY_ITEM(&clients, i) == c)
- ARRAY_SET(&clients, i, NULL);
- }
+ TAILQ_REMOVE(&clients, c, entry);
log_debug("lost client %d", c->ibuf.fd);
/*
@@ -204,14 +194,7 @@ server_client_lost(struct client *c)
if (event_initialized(&c->event))
event_del(&c->event);
- for (i = 0; i < ARRAY_LENGTH(&dead_clients); i++) {
- if (ARRAY_ITEM(&dead_clients, i) == NULL) {
- ARRAY_SET(&dead_clients, i, c);
- break;
- }
- }
- if (i == ARRAY_LENGTH(&dead_clients))
- ARRAY_ADD(&dead_clients, c);
+ TAILQ_INSERT_TAIL(&dead_clients, c, entry);
c->flags |= CLIENT_DEAD;
server_add_accept(0); /* may be more file descriptors now */
@@ -262,16 +245,14 @@ server_client_status_timer(void)
struct client *c;
struct session *s;
struct timeval tv;
- u_int i;
int interval;
time_t difference;
if (gettimeofday(&tv, NULL) != 0)
fatal("gettimeofday failed");
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session == NULL)
continue;
if (c->message_string != NULL || c->prompt_string != NULL) {
/*
@@ -701,13 +682,8 @@ server_client_loop(void)
struct client *c;
struct window *w;
struct window_pane *wp;
- u_int i;
-
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL)
- continue;
+ TAILQ_FOREACH(c, &clients, entry) {
server_client_check_exit(c);
if (c->session != NULL) {
server_client_check_redraw(c);
@@ -719,11 +695,7 @@ server_client_loop(void)
* Any windows will have been redrawn as part of clients, so clear
* their flags now. Also check pane focus and resize.
*/
- for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
- w = ARRAY_ITEM(&windows, i);
- if (w == NULL)
- continue;
-
+ RB_FOREACH(w, windows, &windows) {
w->flags &= ~WINDOW_REDRAW;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->fd != -1) {
@@ -768,7 +740,6 @@ server_client_check_resize(struct window_pane *wp)
void
server_client_check_focus(struct window_pane *wp)
{
- u_int i;
struct client *c;
int push;
@@ -796,12 +767,8 @@ server_client_check_focus(struct window_pane *wp)
* If our window is the current window in any focused clients with an
* attached session, we're focused.
*/
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
-
- if (!(c->flags & CLIENT_FOCUSED))
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session == NULL || !(c->flags & CLIENT_FOCUSED))
continue;
if (c->session->flags & SESSION_UNATTACHED)
continue;
diff --git a/server-fn.c b/server-fn.c
index f2b2e269..043463fd 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -77,12 +77,8 @@ server_write_session(struct session *s, enum msgtype type, const void *buf,
size_t len)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
+ TAILQ_FOREACH(c, &clients, entry) {
if (c->session == s)
server_write_client(c, type, buf, len);
}
@@ -104,12 +100,8 @@ void
server_redraw_session(struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
+ TAILQ_FOREACH(c, &clients, entry) {
if (c->session == s)
server_redraw_client(c);
}
@@ -132,12 +124,8 @@ void
server_status_session(struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
+ TAILQ_FOREACH(c, &clients, entry) {
if (c->session == s)
server_status_client(c);
}
@@ -160,13 +148,9 @@ void
server_redraw_window(struct window *w)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
- if (c->session->curw->window == w)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != NULL && c->session->curw->window == w)
server_redraw_client(c);
}
w->flags |= WINDOW_REDRAW;
@@ -176,13 +160,9 @@ void
server_redraw_window_borders(struct window *w)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
- if (c->session->curw->window == w)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != NULL && c->session->curw->window == w)
c->flags |= CLIENT_BORDERS;
}
}
@@ -199,7 +179,7 @@ server_status_window(struct window *w)
*/
RB_FOREACH(s, sessions, &sessions) {
- if (session_has(s, w) != NULL)
+ if (session_has(s, w))
server_status_session(s);
}
}
@@ -208,13 +188,10 @@ void
server_lock(void)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL)
- continue;
- server_lock_client(c);
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != NULL)
+ server_lock_client(c);
}
}
@@ -222,13 +199,10 @@ void
server_lock_session(struct session *s)
{
struct client *c;
- u_int i;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session == NULL || c->session != s)
- continue;
- server_lock_client(c);
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session == s)
+ server_lock_client(c);
}
}
@@ -268,7 +242,7 @@ server_kill_window(struct window *w)
s = next_s;
next_s = RB_NEXT(sessions, &sessions, s);
- if (session_has(s, w) == NULL)
+ if (!session_has(s, w))
continue;
server_unzoom_window(w);
while ((wl = winlink_find_by_window(&s->windows, w)) != NULL) {
@@ -433,16 +407,14 @@ server_destroy_session(struct session *s)
{
struct client *c;
struct session *s_new;
- u_int i;
if (!options_get_number(&s->options, "detach-on-destroy"))
s_new = server_next_session(s);
else
s_new = NULL;
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session != s)
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->session != s)
continue;
if (s_new == NULL) {
c->session = NULL;
diff --git a/server-window.c b/server-window.c
index a2355701..4385dd90 100644
--- a/server-window.c
+++ b/server-window.c
@@ -34,24 +34,20 @@ void
server_window_loop(void)
{
struct window *w;
- struct winlink *wl;
struct session *s;
- u_int i;
-
- for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
- w = ARRAY_ITEM(&windows, i);
- if (w == NULL)
- continue;
+ struct winlink *wl;
+ RB_FOREACH(w, windows, &windows) {
RB_FOREACH(s, sessions, &sessions) {
- wl = session_has(s, w);
- if (wl == NULL)
- continue;
-
- if (server_window_check_bell(s, wl) ||
- server_window_check_activity(s, wl) ||
- server_window_check_silence(s, wl))
- server_status_session(s);
+ RB_FOREACH(wl, winlinks, &s->windows) {
+ if (wl->window != w)
+ continue;
+
+ if (server_window_check_bell(s, wl) ||
+ server_window_check_activity(s, wl) ||