GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/tmux/cmd-show-messages.c Lines: 0 34 0.0 %
Date: 2016-12-06 Branches: 0 22 0.0 %

Line Branch Exec Source
1
/* $OpenBSD: cmd-show-messages.c,v 1.20 2016/01/19 15:59:12 nicm Exp $ */
2
3
/*
4
 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <sys/types.h>
20
21
#include <string.h>
22
#include <time.h>
23
#include <unistd.h>
24
#include <vis.h>
25
26
#include "tmux.h"
27
28
/*
29
 * Show client message log.
30
 */
31
32
enum cmd_retval	 cmd_show_messages_exec(struct cmd *, struct cmd_q *);
33
34
const struct cmd_entry cmd_show_messages_entry = {
35
	.name = "show-messages",
36
	.alias = "showmsgs",
37
38
	.args = { "JTt:", 0, 0 },
39
	.usage = "[-JT] " CMD_TARGET_CLIENT_USAGE,
40
41
	.tflag = CMD_CLIENT,
42
43
	.flags = 0,
44
	.exec = cmd_show_messages_exec
45
};
46
47
const struct cmd_entry cmd_server_info_entry = {
48
	.name = "server-info",
49
	.alias = "info",
50
51
	.args = { "", 0, 0 },
52
	.usage = "",
53
54
	.flags = 0,
55
	.exec = cmd_show_messages_exec
56
};
57
58
int	cmd_show_messages_terminals(struct cmd_q *, int);
59
int	cmd_show_messages_jobs(struct cmd_q *, int);
60
61
int
62
cmd_show_messages_terminals(struct cmd_q *cmdq, int blank)
63
{
64
	struct tty_term	*term;
65
	u_int		 i, n;
66
67
	n = 0;
68
	LIST_FOREACH(term, &tty_terms, entry) {
69
		if (blank) {
70
			cmdq_print(cmdq, "%s", "");
71
			blank = 0;
72
		}
73
		cmdq_print(cmdq, "Terminal %u: %s [references=%u, flags=0x%x]:",
74
		    n, term->name, term->references, term->flags);
75
		n++;
76
		for (i = 0; i < tty_term_ncodes(); i++)
77
			cmdq_print(cmdq, "%s", tty_term_describe(term, i));
78
	}
79
	return (n != 0);
80
}
81
82
int
83
cmd_show_messages_jobs(struct cmd_q *cmdq, int blank)
84
{
85
	struct job	*job;
86
	u_int		 n;
87
88
	n = 0;
89
	LIST_FOREACH(job, &all_jobs, lentry) {
90
		if (blank) {
91
			cmdq_print(cmdq, "%s", "");
92
			blank = 0;
93
		}
94
		cmdq_print(cmdq, "Job %u: %s [fd=%d, pid=%d, status=%d]",
95
		    n, job->cmd, job->fd, job->pid, job->status);
96
		n++;
97
	}
98
	return (n != 0);
99
}
100
101
enum cmd_retval
102
cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
103
{
104
	struct args		*args = self->args;
105
	struct client		*c = cmdq->state.c;
106
	struct message_entry	*msg;
107
	char			*tim;
108
	int			 done, blank;
109
110
	done = blank = 0;
111
	if (args_has(args, 'T') || self->entry == &cmd_server_info_entry) {
112
		blank = cmd_show_messages_terminals(cmdq, blank);
113
		done = 1;
114
	}
115
	if (args_has(args, 'J') || self->entry == &cmd_server_info_entry) {
116
		cmd_show_messages_jobs(cmdq, blank);
117
		done = 1;
118
	}
119
	if (done)
120
		return (CMD_RETURN_NORMAL);
121
122
	TAILQ_FOREACH(msg, &c->message_log, entry) {
123
		tim = ctime(&msg->msg_time);
124
		*strchr(tim, '\n') = '\0';
125
126
		cmdq_print(cmdq, "%s %s", tim, msg->msg);
127
	}
128
129
	return (CMD_RETURN_NORMAL);
130
}