source: mainline/uspace/app/netecho/netecho.c@ 09ab0a9a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 09ab0a9a was 09ab0a9a, checked in by Jiri Svoboda <jiri@…>, 7 years ago

Fix vertical spacing with new Ccheck revision.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/*
2 * Copyright (c) 2016 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
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.
16 *
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.
27 */
28
29/** @addtogroup netecho
30 * @{
31 */
32/** @file Network UDP echo diagnostic utility.
33 */
34
35#include <stdbool.h>
36#include <errno.h>
37#include <io/console.h>
38#include <stdio.h>
39#include <str.h>
40
41#include "comm.h"
42#include "netecho.h"
43
44#define NAME "netecho"
45
46static console_ctrl_t *con;
47static bool done;
48
49void netecho_received(void *data, size_t size)
50{
51 char *p;
52 size_t i;
53
54 printf("Received message '");
55 p = data;
56
57 for (i = 0; i < size; i++)
58 putchar(p[i]);
59 printf("'.\n");
60}
61
62static void key_handle_ctrl(kbd_event_t *ev)
63{
64 switch (ev->key) {
65 case KC_Q:
66 done = true;
67 break;
68 default:
69 break;
70 }
71}
72
73static void send_char(wchar_t c)
74{
75 char cbuf[STR_BOUNDS(1)];
76 size_t offs;
77 errno_t rc;
78
79 offs = 0;
80 chr_encode(c, cbuf, &offs, STR_BOUNDS(1));
81
82 rc = comm_send(cbuf, offs);
83 if (rc != EOK) {
84 printf("[Failed sending data]\n");
85 }
86}
87
88static void key_handle_unmod(kbd_event_t *ev)
89{
90 switch (ev->key) {
91 case KC_ENTER:
92 send_char('\n');
93 break;
94 default:
95 if (ev->c >= 32 || ev->c == '\t' || ev->c == '\b') {
96 send_char(ev->c);
97 }
98 }
99}
100
101static void key_handle(kbd_event_t *ev)
102{
103 if ((ev->mods & KM_ALT) == 0 &&
104 (ev->mods & KM_SHIFT) == 0 &&
105 (ev->mods & KM_CTRL) != 0) {
106 key_handle_ctrl(ev);
107 } else if ((ev->mods & (KM_CTRL | KM_ALT)) == 0) {
108 key_handle_unmod(ev);
109 }
110}
111
112static void print_syntax(void)
113{
114 printf("syntax:\n");
115 printf("\t%s -l <port>\n", NAME);
116 printf("\t%s -d <host>:<port> [<message> [<message...>]]\n", NAME);
117}
118
119/* Interactive mode */
120static void netecho_interact(void)
121{
122 cons_event_t ev;
123
124 printf("Communication started. Press Ctrl-Q to quit.\n");
125
126 con = console_init(stdin, stdout);
127
128 done = false;
129 while (!done) {
130 console_get_event(con, &ev);
131 if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS)
132 key_handle(&ev.ev.key);
133 }
134}
135
136static void netecho_send_messages(char **msgs)
137{
138 errno_t rc;
139
140 while (*msgs != NULL) {
141 rc = comm_send(*msgs, str_size(*msgs));
142 if (rc != EOK) {
143 printf("[Failed sending data]\n");
144 }
145
146 ++msgs;
147 }
148}
149
150int main(int argc, char *argv[])
151{
152 char *hostport;
153 char *port;
154 char **msgs;
155 errno_t rc;
156
157 if (argc < 2) {
158 print_syntax();
159 return 1;
160 }
161
162 if (str_cmp(argv[1], "-l") == 0) {
163 if (argc != 3) {
164 print_syntax();
165 return 1;
166 }
167
168 port = argv[2];
169 msgs = NULL;
170
171 rc = comm_open_listen(port);
172 if (rc != EOK) {
173 printf("Error setting up communication.\n");
174 return 1;
175 }
176 } else if (str_cmp(argv[1], "-d") == 0) {
177 if (argc < 3) {
178 print_syntax();
179 return 1;
180 }
181
182 hostport = argv[2];
183 port = NULL;
184 msgs = argv + 3;
185
186 rc = comm_open_talkto(hostport);
187 if (rc != EOK) {
188 printf("Error setting up communication.\n");
189 return 1;
190 }
191 } else {
192 print_syntax();
193 return 1;
194 }
195
196 if (msgs != NULL && *msgs != NULL) {
197 /* Just send messages and quit */
198 netecho_send_messages(msgs);
199 } else {
200 /* Interactive mode */
201 netecho_interact();
202 }
203
204 comm_close();
205 return 0;
206}
207
208/** @}
209 */
Note: See TracBrowser for help on using the repository browser.