2 * Copyright (c) 2016 Jiri Svoboda
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup netecho
32 /** @file Network UDP echo diagnostic utility.
37 #include <io/console.h>
44 #define NAME "netecho"
46 static console_ctrl_t
*con
;
49 void netecho_received(void *data
, size_t size
)
54 printf("Received message '");
57 for (i
= 0; i
< size
; i
++)
62 static void key_handle_ctrl(kbd_event_t
*ev
)
73 static void send_char(wchar_t c
)
75 char cbuf
[STR_BOUNDS(1)];
80 chr_encode(c
, cbuf
, &offs
, STR_BOUNDS(1));
82 rc
= comm_send(cbuf
, offs
);
84 printf("[Failed sending data]\n");
88 static void key_handle_unmod(kbd_event_t
*ev
)
95 if (ev
->c
>= 32 || ev
->c
== '\t' || ev
->c
== '\b') {
101 static void key_handle(kbd_event_t
*ev
)
103 if ((ev
->mods
& KM_ALT
) == 0 &&
104 (ev
->mods
& KM_SHIFT
) == 0 &&
105 (ev
->mods
& KM_CTRL
) != 0) {
107 } else if ((ev
->mods
& (KM_CTRL
| KM_ALT
)) == 0) {
108 key_handle_unmod(ev
);
112 static void print_syntax(void)
115 printf("\t%s -l <port>\n", NAME
);
116 printf("\t%s -d <host>:<port> [<message> [<message...>]]\n", NAME
);
119 /* Interactive mode */
120 static void netecho_interact(void)
124 printf("Communication started. Press Ctrl-Q to quit.\n");
126 con
= console_init(stdin
, stdout
);
130 console_get_event(con
, &ev
);
131 if (ev
.type
== CEV_KEY
&& ev
.ev
.key
.type
== KEY_PRESS
)
132 key_handle(&ev
.ev
.key
);
136 static void netecho_send_messages(char **msgs
)
140 while (*msgs
!= NULL
) {
141 rc
= comm_send(*msgs
, str_size(*msgs
));
143 printf("[Failed sending data]\n");
150 int main(int argc
, char *argv
[])
162 if (str_cmp(argv
[1], "-l") == 0) {
171 rc
= comm_open_listen(port
);
173 printf("Error setting up communication.\n");
176 } else if (str_cmp(argv
[1], "-d") == 0) {
186 rc
= comm_open_talkto(hostport
);
188 printf("Error setting up communication.\n");
196 if (msgs
!= NULL
&& *msgs
!= NULL
) {
197 /* Just send messages and quit */
198 netecho_send_messages(msgs
);
200 /* Interactive mode */