Changes in uspace/srv/hid/remcons/remcons.c [f9b2cb4c:902f0906] in mainline
- File:
-
- 1 edited
-
uspace/srv/hid/remcons/remcons.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/remcons/remcons.c
rf9b2cb4c r902f0906 40 40 #include <str_error.h> 41 41 #include <loc.h> 42 #include <event.h> 42 43 #include <io/keycode.h> 43 44 #include <align.h> 44 45 #include <fibril_synch.h> 45 46 #include <task.h> 46 #include < inet/addr.h>47 #include < inet/endpoint.h>48 #include < inet/tcp.h>47 #include <net/in.h> 48 #include <net/inet.h> 49 #include <net/socket.h> 49 50 #include <io/console.h> 50 51 #include <inttypes.h> … … 99 100 }; 100 101 101 static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn);102 103 static tcp_listen_cb_t listen_cb = {104 .new_conn = remcons_new_conn105 };106 107 static tcp_cb_t conn_cb = {108 .connected = NULL109 };110 111 102 static telnet_user_t *srv_to_user(con_srv_t *srv) 112 103 { … … 121 112 122 113 /* Force character mode. */ 123 (void) tcp_conn_send(user->conn, (void *)telnet_force_character_mode_command,124 telnet_force_character_mode_command_count );114 send(user->socket, (void *)telnet_force_character_mode_command, 115 telnet_force_character_mode_command_count, 0); 125 116 126 117 return EOK; … … 217 208 { 218 209 /* Find the user. */ 219 telnet_user_t *user = telnet_user_get_for_client_connection(IPC_GET_ARG 2(*icall));210 telnet_user_t *user = telnet_user_get_for_client_connection(IPC_GET_ARG1(*icall)); 220 211 if (user == NULL) { 221 212 async_answer_0(iid, ENOENT); … … 234 225 { 235 226 telnet_user_t *user = arg; 236 227 int rc; 228 229 char term[LOC_NAME_MAXLEN]; 230 snprintf(term, LOC_NAME_MAXLEN, "%s/%s", "/loc", user->service_name); 231 237 232 task_id_t task; 238 task_wait_t wait; 239 int rc = task_spawnl(&task, &wait, APP_GETTERM, APP_GETTERM, user->service_name, 240 "/loc", "--msg", "--", APP_SHELL, NULL); 241 if (rc != EOK) { 242 telnet_user_error(user, "Spawning `%s %s /loc --msg -- %s' " 243 "failed: %s.", APP_GETTERM, user->service_name, APP_SHELL, 244 str_error(rc)); 233 rc = task_spawnl(&task, APP_GETTERM, APP_GETTERM, "-w", term, APP_SHELL, NULL); 234 if (rc != EOK) { 235 telnet_user_error(user, "Spawning `%s -w %s %s' failed: %s.", 236 APP_GETTERM, term, APP_SHELL, str_error(rc)); 245 237 fibril_mutex_lock(&user->guard); 246 238 user->task_finished = true; … … 257 249 task_exit_t task_exit; 258 250 int task_retval; 259 task_wait( &wait, &task_exit, &task_retval);251 task_wait(task, &task_exit, &task_retval); 260 252 telnet_user_log(user, "%s terminated %s, exit code %d.", APP_GETTERM, 261 253 task_exit == TASK_EXIT_NORMAL ? "normally" : "unexpectedly", … … 282 274 } 283 275 284 /** Handle network connection. 285 * 286 * @param lst Listener 287 * @param conn Connection 288 */ 289 static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn) 290 { 291 telnet_user_t *user = telnet_user_create(conn); 292 assert(user); 293 294 con_srvs_init(&user->srvs); 295 user->srvs.ops = &con_ops; 296 user->srvs.sarg = user; 297 user->srvs.abort_timeout = 1000; 298 299 telnet_user_add(user); 276 /** Fibril for each accepted socket. 277 * 278 * @param arg Corresponding @c telnet_user_t structure. 279 */ 280 static int network_user_fibril(void *arg) 281 { 282 telnet_user_t *user = arg; 300 283 301 284 int rc = loc_service_register(user->service_name, &user->service_id); … … 303 286 telnet_user_error(user, "Unable to register %s with loc: %s.", 304 287 user->service_name, str_error(rc)); 305 return ;288 return EOK; 306 289 } 307 290 308 291 telnet_user_log(user, "Service %s registerd with id %" PRIun ".", 309 292 user->service_name, user->service_id); 310 293 311 294 fid_t spawn_fibril = fibril_create(spawn_task_fibril, user); 312 295 assert(spawn_fibril); 313 296 fibril_add_ready(spawn_fibril); 314 297 315 298 /* Wait for all clients to exit. */ 316 299 fibril_mutex_lock(&user->guard); 317 300 while (!user_can_be_destroyed_no_lock(user)) { 318 301 if (user->task_finished) { 319 user->conn = NULL;302 closesocket(user->socket); 320 303 user->socket_closed = true; 321 304 user->srvs.aborted = true; … … 329 312 } 330 313 fibril_mutex_unlock(&user->guard); 331 314 332 315 rc = loc_service_unregister(user->service_id); 333 316 if (rc != EOK) { … … 339 322 telnet_user_log(user, "Destroying..."); 340 323 telnet_user_destroy(user); 324 325 return EOK; 341 326 } 342 327 343 328 int main(int argc, char *argv[]) 344 329 { 345 int rc; 346 tcp_listener_t *lst; 347 tcp_t *tcp; 348 inet_ep_t ep; 349 350 async_set_fallback_port_handler(client_connection, NULL); 351 rc = loc_server_register(NAME); 330 int port = 2223; 331 332 async_set_client_connection(client_connection); 333 int rc = loc_server_register(NAME); 352 334 if (rc != EOK) { 353 335 fprintf(stderr, "%s: Unable to register server\n", NAME); 354 336 return rc; 355 337 } 356 357 rc = tcp_create(&tcp); 358 if (rc != EOK) { 359 fprintf(stderr, "%s: Error initializing TCP.\n", NAME); 360 return rc; 361 } 362 363 inet_ep_init(&ep); 364 ep.port = 2223; 365 366 rc = tcp_listener_create(tcp, &ep, &listen_cb, NULL, &conn_cb, NULL, 367 &lst); 368 if (rc != EOK) { 369 fprintf(stderr, "%s: Error creating listener.\n", NAME); 370 return rc; 338 339 struct sockaddr_in addr; 340 341 addr.sin_family = AF_INET; 342 addr.sin_port = htons(port); 343 344 rc = inet_pton(AF_INET, "127.0.0.1", (void *) 345 &addr.sin_addr.s_addr); 346 if (rc != EOK) { 347 fprintf(stderr, "Error parsing network address: %s.\n", 348 str_error(rc)); 349 return 2; 350 } 351 352 int listen_sd = socket(PF_INET, SOCK_STREAM, 0); 353 if (listen_sd < 0) { 354 fprintf(stderr, "Error creating listening socket: %s.\n", 355 str_error(listen_sd)); 356 return 3; 357 } 358 359 rc = bind(listen_sd, (struct sockaddr *) &addr, sizeof(addr)); 360 if (rc != EOK) { 361 fprintf(stderr, "Error binding socket: %s.\n", 362 str_error(rc)); 363 return 4; 364 } 365 366 rc = listen(listen_sd, BACKLOG_SIZE); 367 if (rc != EOK) { 368 fprintf(stderr, "listen() failed: %s.\n", str_error(rc)); 369 return 5; 371 370 } 372 371 373 372 printf("%s: HelenOS Remote console service\n", NAME); 374 373 task_retval(0); 375 async_manager(); 376 377 /* Not reached */ 374 375 while (true) { 376 struct sockaddr_in raddr; 377 socklen_t raddr_len = sizeof(raddr); 378 int conn_sd = accept(listen_sd, (struct sockaddr *) &raddr, 379 &raddr_len); 380 381 if (conn_sd < 0) { 382 fprintf(stderr, "accept() failed: %s.\n", 383 str_error(rc)); 384 continue; 385 } 386 387 telnet_user_t *user = telnet_user_create(conn_sd); 388 assert(user); 389 390 con_srvs_init(&user->srvs); 391 user->srvs.ops = &con_ops; 392 user->srvs.sarg = user; 393 user->srvs.abort_timeout = 1000; 394 395 telnet_user_add(user); 396 397 fid_t fid = fibril_create(network_user_fibril, user); 398 assert(fid); 399 fibril_add_ready(fid); 400 } 401 378 402 return 0; 379 403 }
Note:
See TracChangeset
for help on using the changeset viewer.
