Changeset 99c2e9f3 in mainline for uspace/srv/hid/remcons/remcons.c


Ignore:
Timestamp:
2012-01-12T09:29:00Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2a180307
Parents:
261bbdc
Message:

remcons: more refactoring

File:
1 edited

Legend:

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

    r261bbdc r99c2e9f3  
    7474    sizeof(telnet_force_character_mode_command) / sizeof(telnet_cmd_t);
    7575
    76 /** Creates new keyboard event from given char.
    77  *
    78  * @param type Event type (press / release).
    79  * @param c Pressed character.
    80  */
    81 static kbd_event_t* new_kbd_event(kbd_event_type_t type, wchar_t c) {
    82         kbd_event_t *event = malloc(sizeof(kbd_event_t));
    83         assert(event);
    84 
    85         link_initialize(&event->link);
    86         event->type = type;
    87         event->c = c;
    88         event->mods = 0;
    89         event->key = (c == '\n' ? KC_ENTER : KC_A);
    90 
    91         return event;
    92 }
    9376
    9477/** Handling client requests (VFS and console interface).
     
    10184                ipc_call_t call;
    10285                ipc_callid_t callid = 0;
     86
     87                /*
     88                 * The getterm task might terminate while we are here,
     89                 * waiting for a call. Also, the socket might be closed
     90                 * meanwhile.
     91                 * We want to detect this situation early, so we use a
     92                 * timeout variant of async_get_call().
     93                 */
    10394                while (callid == 0) {
    10495                        callid = async_get_call_timeout(&call, 1000);
    10596
    106                         fibril_mutex_lock(&user->guard);
    107                         bool bail_out = user->socket_closed || user->task_finished;
    108                         fibril_mutex_unlock(&user->guard);
    109 
    110                         if (bail_out) {
     97                        if (telnet_user_is_zombie(user)) {
    11198                                if (callid != 0) {
    11299                                        async_answer_0(callid, EINTR);
     
    117104               
    118105                if (!IPC_GET_IMETHOD(call)) {
    119                         /* Clean-up. */
    120106                        return;
    121107                }
     
    129115                        break;
    130116                case CONSOLE_GET_EVENT: {
    131                         if (list_empty(&user->in_events.list)) {
    132                                 retry:
    133                                 if (user->socket_buffer_len <= user->socket_buffer_pos) {
    134                                         int recv_length = recv(user->socket, user->socket_buffer, BUFFER_SIZE, 0);
    135                                         if ((recv_length == 0) || (recv_length == ENOTCONN)) {
    136                                                 fibril_mutex_lock(&user->guard);
    137                                                 user->socket_closed = true;
    138                                                 fibril_mutex_unlock(&user->guard);
    139                                                 async_answer_0(callid, ENOENT);
    140                                                 return;
    141                                         }
    142                                         if (recv_length < 0) {
    143                                                 async_answer_0(callid, EINVAL);
    144                                                 return;
    145                                         }
    146                                         user->socket_buffer_len = recv_length;
    147                                         user->socket_buffer_pos = 0;
    148                                 }
    149                                 char data = user->socket_buffer[user->socket_buffer_pos++];
    150                                 if (data == 13) {
    151                                         data = 10;
    152                                 }
    153                                 if (data == 0)
    154                                         goto retry;
    155 
    156                                 kbd_event_t *down = new_kbd_event(KEY_PRESS, data);
    157                                 kbd_event_t *up = new_kbd_event(KEY_RELEASE, data);
    158                                 assert(down);
    159                                 assert(up);
    160                                 prodcons_produce(&user->in_events, &down->link);
    161                                 prodcons_produce(&user->in_events, &up->link);
    162                         }
    163 
    164 
    165                         link_t *link = prodcons_consume(&user->in_events);
    166                         kbd_event_t *event = list_get_instance(link, kbd_event_t, link);
    167                         async_answer_4(callid, EOK, event->type, event->key, event->mods, event->c);
    168                         free(event);
     117                        kbd_event_t event;
     118                        int rc = telnet_user_get_next_keyboard_event(user, &event);
     119                        if (rc != EOK) {
     120                                /* Silently ignore. */
     121                                async_answer_0(callid, EOK);
     122                                break;
     123                        }
     124                        async_answer_4(callid, EOK, event.type, event.key, event.mods, event.c);
    169125                        break;
    170126                }
     
    185141                                break;
    186142                        }
    187                         buf_converted = malloc(2 * size);
     143                        buf_converted = malloc(2 * size + 1);
    188144                        assert(buf_converted);
    189145                        int buf_converted_size = 0;
     
    197153                                }
    198154                        }
     155                        /* Add terminating zero for printing purposes. */
     156                        buf_converted[buf_converted_size] = 0;
     157
     158                        fibril_mutex_lock(&user->guard);
    199159                        rc = send(user->socket, buf_converted, buf_converted_size, 0);
     160                        fibril_mutex_unlock(&user->guard);
    200161                        free(buf);
    201162
     
    206167
    207168                        async_answer_1(callid, EOK, size);
    208 
    209169                        break;
    210170                }
     
    249209                return;
    250210        }
     211        async_answer_0(iid, EOK);
    251212
    252213        telnet_user_log(user, "New client connected (%" PRIxn").", iid);
    253 
    254         /* Accept the connection, increment reference. */
    255         async_answer_0(iid, EOK);
    256214
    257215        /* Force character mode. */
     
    259217            telnet_force_character_mode_command_count, 0);
    260218
     219        /* Handle messages. */
    261220        client_connection_message_loop(user);
    262221
    263         /* Announce user disconnection. */
    264222        telnet_user_notify_client_disconnected(user);
    265223        telnet_user_log(user, "Client disconnected (%" PRIxn").", iid);
Note: See TracChangeset for help on using the changeset viewer.