Changeset d3109ff in mainline for uspace/srv/hid/remcons/user.c
- Timestamp:
- 2024-09-24T17:59:36Z (6 months ago)
- Branches:
- master
- Children:
- 6a753a9c
- Parents:
- 3fcea34
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/remcons/user.c
r3fcea34 rd3109ff 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2012 Vojtech Horky 3 4 * All rights reserved. … … 37 38 #include <adt/prodcons.h> 38 39 #include <errno.h> 40 #include <mem.h> 39 41 #include <str_error.h> 40 42 #include <loc.h> … … 48 50 #include <inttypes.h> 49 51 #include <assert.h> 52 #include "remcons.h" 50 53 #include "user.h" 51 54 #include "telnet.h" … … 90 93 91 94 user->cursor_x = 0; 95 user->cursor_y = 0; 92 96 93 97 return user; … … 182 186 } 183 187 188 static errno_t telnet_user_fill_recv_buf(telnet_user_t *user) 189 { 190 errno_t rc; 191 size_t recv_length; 192 193 rc = tcp_conn_recv_wait(user->conn, user->socket_buffer, 194 BUFFER_SIZE, &recv_length); 195 if (rc != EOK) 196 return rc; 197 198 if (recv_length == 0) { 199 user->socket_closed = true; 200 user->srvs.aborted = true; 201 return ENOENT; 202 } 203 204 user->socket_buffer_len = recv_length; 205 user->socket_buffer_pos = 0; 206 207 return EOK; 208 } 209 184 210 /** Receive next byte from a socket (use buffering. 185 211 * We need to return the value via extra argument because the read byte … … 188 214 static errno_t telnet_user_recv_next_byte_no_lock(telnet_user_t *user, char *byte) 189 215 { 216 errno_t rc; 217 190 218 /* No more buffered data? */ 191 219 if (user->socket_buffer_len <= user->socket_buffer_pos) { 192 errno_t rc; 193 size_t recv_length; 194 195 rc = tcp_conn_recv_wait(user->conn, user->socket_buffer, 196 BUFFER_SIZE, &recv_length); 220 rc = telnet_user_fill_recv_buf(user); 197 221 if (rc != EOK) 198 222 return rc; 199 200 if (recv_length == 0) {201 user->socket_closed = true;202 user->srvs.aborted = true;203 return ENOENT;204 }205 206 user->socket_buffer_len = recv_length;207 user->socket_buffer_pos = 0;208 223 } 209 224 210 225 *byte = user->socket_buffer[user->socket_buffer_pos++]; 211 226 return EOK; 227 } 228 229 errno_t telnet_user_recv(telnet_user_t *user, void *data, size_t size, 230 size_t *nread) 231 { 232 errno_t rc; 233 size_t nb; 234 235 /* No more buffered data? */ 236 if (user->socket_buffer_len <= user->socket_buffer_pos) { 237 rc = telnet_user_fill_recv_buf(user); 238 if (rc != EOK) 239 return rc; 240 } 241 242 nb = user->socket_buffer_len - user->socket_buffer_pos; 243 memcpy(data, user->socket_buffer + user->socket_buffer_pos, nb); 244 user->socket_buffer_pos += nb; 245 *nread = nb; 212 246 return EOK; 213 247 } … … 283 317 /* Skip zeros, bail-out on error. */ 284 318 while (next_byte == 0) { 319 fibril_mutex_unlock(&user->guard); 320 285 321 errno_t rc = telnet_user_recv_next_byte_no_lock(user, &next_byte); 286 if (rc != EOK) { 287 fibril_mutex_unlock(&user->guard); 322 if (rc != EOK) 288 323 return rc; 289 } 324 290 325 uint8_t byte = (uint8_t) next_byte; 326 fibril_mutex_lock(&user->guard); 291 327 292 328 /* Skip telnet commands. */ … … 339 375 * @param size Size of @p data buffer in bytes. 340 376 */ 341 static errno_t telnet_user_send_data_no_lock(telnet_user_t *user, uint8_t *data, size_t size) 377 static errno_t telnet_user_send_data_no_lock(telnet_user_t *user, 378 const char *data, size_t size) 342 379 { 343 380 uint8_t *converted = malloc(3 * size + 1); … … 351 388 converted[converted_size++] = 10; 352 389 user->cursor_x = 0; 390 if (user->cursor_y < user->rows - 1) 391 ++user->cursor_y; 353 392 } else { 354 393 converted[converted_size++] = data[i]; … … 373 412 * @param size Size of @p data buffer in bytes. 374 413 */ 375 errno_t telnet_user_send_data(telnet_user_t *user, uint8_t *data, size_t size) 414 errno_t telnet_user_send_data(telnet_user_t *user, const char *data, 415 size_t size) 376 416 { 377 417 fibril_mutex_lock(&user->guard); … … 395 435 fibril_mutex_lock(&user->guard); 396 436 if (user->cursor_x - 1 == new_x) { 397 uint8_tdata = '\b';437 char data = '\b'; 398 438 /* Ignore errors. */ 399 439 telnet_user_send_data_no_lock(user, &data, 1);
Note:
See TracChangeset
for help on using the changeset viewer.