source: mainline/uspace/app/netecho/netecho.c@ 08e103d4

Last change on this file since 08e103d4 was 08e103d4, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

Use clearer naming for string length functions

This and the following commit change the names of functions, as well as
their documentation, to use unambiguous terms "bytes" and "code points"
instead of ambiguous terms "size", "length", and "characters".

  • 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_bytes(*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.