Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/remcons/remcons.c

    rf9b2cb4c r902f0906  
    4040#include <str_error.h>
    4141#include <loc.h>
     42#include <event.h>
    4243#include <io/keycode.h>
    4344#include <align.h>
    4445#include <fibril_synch.h>
    4546#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>
    4950#include <io/console.h>
    5051#include <inttypes.h>
     
    99100};
    100101
    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_conn
    105 };
    106 
    107 static tcp_cb_t conn_cb = {
    108         .connected = NULL
    109 };
    110 
    111102static telnet_user_t *srv_to_user(con_srv_t *srv)
    112103{
     
    121112
    122113        /* 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);
    125116
    126117        return EOK;
     
    217208{
    218209        /* Find the user. */
    219         telnet_user_t *user = telnet_user_get_for_client_connection(IPC_GET_ARG2(*icall));
     210        telnet_user_t *user = telnet_user_get_for_client_connection(IPC_GET_ARG1(*icall));
    220211        if (user == NULL) {
    221212                async_answer_0(iid, ENOENT);
     
    234225{
    235226        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
    237232        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));
    245237                fibril_mutex_lock(&user->guard);
    246238                user->task_finished = true;
     
    257249        task_exit_t task_exit;
    258250        int task_retval;
    259         task_wait(&wait, &task_exit, &task_retval);
     251        task_wait(task, &task_exit, &task_retval);
    260252        telnet_user_log(user, "%s terminated %s, exit code %d.", APP_GETTERM,
    261253            task_exit == TASK_EXIT_NORMAL ? "normally" : "unexpectedly",
     
    282274}
    283275
    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 */
     280static int network_user_fibril(void *arg)
     281{
     282        telnet_user_t *user = arg;
    300283
    301284        int rc = loc_service_register(user->service_name, &user->service_id);
     
    303286                telnet_user_error(user, "Unable to register %s with loc: %s.",
    304287                    user->service_name, str_error(rc));
    305                 return;
     288                return EOK;
    306289        }
    307290
    308291        telnet_user_log(user, "Service %s registerd with id %" PRIun ".",
    309292            user->service_name, user->service_id);
    310 
     293       
    311294        fid_t spawn_fibril = fibril_create(spawn_task_fibril, user);
    312295        assert(spawn_fibril);
    313296        fibril_add_ready(spawn_fibril);
    314 
     297       
    315298        /* Wait for all clients to exit. */
    316299        fibril_mutex_lock(&user->guard);
    317300        while (!user_can_be_destroyed_no_lock(user)) {
    318301                if (user->task_finished) {
    319                         user->conn = NULL;
     302                        closesocket(user->socket);
    320303                        user->socket_closed = true;
    321304                        user->srvs.aborted = true;
     
    329312        }
    330313        fibril_mutex_unlock(&user->guard);
    331 
     314       
    332315        rc = loc_service_unregister(user->service_id);
    333316        if (rc != EOK) {
     
    339322        telnet_user_log(user, "Destroying...");
    340323        telnet_user_destroy(user);
     324
     325        return EOK;
    341326}
    342327
    343328int main(int argc, char *argv[])
    344329{
    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);
    352334        if (rc != EOK) {
    353335                fprintf(stderr, "%s: Unable to register server\n", NAME);
    354336                return rc;
    355337        }
    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;
    371370        }
    372371
    373372        printf("%s: HelenOS Remote console service\n", NAME);
    374373        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
    378402        return 0;
    379403}
Note: See TracChangeset for help on using the changeset viewer.