4 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
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.
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.
19 #include <sys/types.h>
28 * Show client message log.
31 enum cmd_retval
cmd_show_messages_exec(struct cmd
*, struct cmd_q
*);
33 const struct cmd_entry cmd_show_messages_entry
= {
34 "show-messages", "showmsgs",
36 "[-IJT] " CMD_TARGET_CLIENT_USAGE
,
39 cmd_show_messages_exec
42 const struct cmd_entry cmd_server_info_entry
= {
43 "server-info", "info",
48 cmd_show_messages_exec
51 void cmd_show_messages_server(struct cmd_q
*);
52 void cmd_show_messages_terminals(struct cmd_q
*);
53 void cmd_show_messages_jobs(struct cmd_q
*);
56 cmd_show_messages_server(struct cmd_q
*cmdq
)
60 tim
= ctime(&start_time
);
61 *strchr(tim
, '\n') = '\0';
63 cmdq_print(cmdq
, "started %s", tim
);
64 cmdq_print(cmdq
, "socket path %s", socket_path
);
65 cmdq_print(cmdq
, "debug level %d", debug_level
);
66 cmdq_print(cmdq
, "protocol version %d", PROTOCOL_VERSION
);
70 cmd_show_messages_terminals(struct cmd_q
*cmdq
)
72 struct tty_term
*term
;
73 const struct tty_term_code_entry
*ent
;
74 struct tty_code
*code
;
79 LIST_FOREACH(term
, &tty_terms
, entry
) {
81 "Terminal %u: %s [references=%u, flags=0x%x]:",
82 n
, term
->name
, term
->references
, term
->flags
);
84 for (i
= 0; i
< NTTYCODE
; i
++) {
85 ent
= &tty_term_codes
[i
];
86 code
= &term
->codes
[ent
->code
];
89 cmdq_print(cmdq
, "%4u: %s: [missing]",
90 ent
->code
, ent
->name
);
93 strnvis(out
, sizeof out
, code
->value
.string
,
94 VIS_OCTAL
|VIS_TAB
|VIS_NL
);
95 cmdq_print(cmdq
, "%4u: %s: (string) %s",
96 ent
->code
, ent
->name
, out
);
99 cmdq_print(cmdq
, "%4u: %s: (number) %d",
100 ent
->code
, ent
->name
, code
->value
.number
);
103 cmdq_print(cmdq
, "%4u: %s: (flag) %s",
104 ent
->code
, ent
->name
,
105 code
->value
.flag
? "true" : "false");
113 cmd_show_messages_jobs(struct cmd_q
*cmdq
)
119 LIST_FOREACH(job
, &all_jobs
, lentry
) {
121 "Job %u: %s [fd=%d, pid=%d, status=%d]",
122 n
, job
->cmd
, job
->fd
, job
->pid
, job
->status
);
128 cmd_show_messages_exec(struct cmd
*self
, struct cmd_q
*cmdq
)
130 struct args
*args
= self
->args
;
132 struct message_entry
*msg
;
138 if (args_has(args
, 'I') || self
->entry
== &cmd_server_info_entry
) {
139 cmd_show_messages_server(cmdq
);
142 if (args_has(args
, 'T') || self
->entry
== &cmd_server_info_entry
) {
144 cmdq_print(cmdq
, "%s", "");
145 cmd_show_messages_terminals(cmdq
);
148 if (args_has(args
, 'J') || self
->entry
== &cmd_server_info_entry
) {
150 cmdq_print(cmdq
, "%s", "");
151 cmd_show_messages_jobs(cmdq
);
155 return (CMD_RETURN_NORMAL
);
157 if ((c
= cmd_find_client(cmdq
, args_get(args
, 't'), 0)) == NULL
)
158 return (CMD_RETURN_ERROR
);
160 for (i
= 0; i
< ARRAY_LENGTH(&c
->message_log
); i
++) {
161 msg
= &ARRAY_ITEM(&c
->message_log
, i
);
163 tim
= ctime(&msg
->msg_time
);
164 *strchr(tim
, '\n') = '\0';
166 cmdq_print(cmdq
, "%s %s", tim
, msg
->msg
);
169 return (CMD_RETURN_NORMAL
);