Changeset 984a9ba in mainline for uspace/lib/c/generic/io/con_srv.c
- Timestamp:
- 2018-07-05T09:34:09Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 63d46341
- Parents:
- 76f566d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/con_srv.c
r76f566d r984a9ba 42 42 #include <io/con_srv.h> 43 43 44 static errno_t console_ev_encode(cons_event_t *event, ipc_call_t * call)45 { 46 IPC_SET_ARG1(* call, event->type);44 static errno_t console_ev_encode(cons_event_t *event, ipc_call_t *icall) 45 { 46 IPC_SET_ARG1(*icall, event->type); 47 47 48 48 switch (event->type) { 49 49 case CEV_KEY: 50 IPC_SET_ARG2(* call, event->ev.key.type);51 IPC_SET_ARG3(* call, event->ev.key.key);52 IPC_SET_ARG4(* call, event->ev.key.mods);53 IPC_SET_ARG5(* call, event->ev.key.c);50 IPC_SET_ARG2(*icall, event->ev.key.type); 51 IPC_SET_ARG3(*icall, event->ev.key.key); 52 IPC_SET_ARG4(*icall, event->ev.key.mods); 53 IPC_SET_ARG5(*icall, event->ev.key.c); 54 54 break; 55 55 case CEV_POS: 56 IPC_SET_ARG2(* call, (event->ev.pos.pos_id << 16) | (event->ev.pos.type & 0xffff));57 IPC_SET_ARG3(* call, event->ev.pos.btn_num);58 IPC_SET_ARG4(* call, event->ev.pos.hpos);59 IPC_SET_ARG5(* call, event->ev.pos.vpos);56 IPC_SET_ARG2(*icall, (event->ev.pos.pos_id << 16) | (event->ev.pos.type & 0xffff)); 57 IPC_SET_ARG3(*icall, event->ev.pos.btn_num); 58 IPC_SET_ARG4(*icall, event->ev.pos.hpos); 59 IPC_SET_ARG5(*icall, event->ev.pos.vpos); 60 60 break; 61 61 default: … … 66 66 } 67 67 68 static void con_read_srv(con_srv_t *srv, cap_call_handle_t chandle, 69 ipc_call_t *call) 68 static void con_read_srv(con_srv_t *srv, ipc_call_t *icall) 70 69 { 71 70 void *buf; 72 71 size_t size; 73 72 errno_t rc; 74 cap_call_handle_t rcall_handle; 75 76 if (!async_data_read_receive(& rcall_handle, &size)) {77 async_answer_0( chandle, EINVAL);73 74 ipc_call_t call; 75 if (!async_data_read_receive(&call, &size)) { 76 async_answer_0(icall, EINVAL); 78 77 return; 79 78 } … … 81 80 buf = malloc(size); 82 81 if (buf == NULL) { 83 async_answer_0( rcall_handle, ENOMEM);84 async_answer_0( chandle, ENOMEM);82 async_answer_0(&call, ENOMEM); 83 async_answer_0(icall, ENOMEM); 85 84 return; 86 85 } 87 86 88 87 if (srv->srvs->ops->read == NULL) { 89 async_answer_0( rcall_handle, ENOTSUP);90 async_answer_0( chandle, ENOTSUP);88 async_answer_0(&call, ENOTSUP); 89 async_answer_0(icall, ENOTSUP); 91 90 free(buf); 92 91 return; … … 96 95 rc = srv->srvs->ops->read(srv, buf, size, &nread); 97 96 if (rc != EOK) { 98 async_answer_0( rcall_handle, rc);99 async_answer_0( chandle, rc);97 async_answer_0(&call, rc); 98 async_answer_0(icall, rc); 100 99 free(buf); 101 100 return; 102 101 } 103 102 104 async_data_read_finalize( rcall_handle, buf, nread);103 async_data_read_finalize(&call, buf, nread); 105 104 free(buf); 106 105 107 async_answer_1(chandle, EOK, nread); 108 } 109 110 static void con_write_srv(con_srv_t *srv, cap_call_handle_t chandle, 111 ipc_call_t *call) 106 async_answer_1(icall, EOK, nread); 107 } 108 109 static void con_write_srv(con_srv_t *srv, ipc_call_t *icall) 112 110 { 113 111 void *data; … … 117 115 rc = async_data_write_accept(&data, false, 0, 0, 0, &size); 118 116 if (rc != EOK) { 119 async_answer_0( chandle, rc);117 async_answer_0(icall, rc); 120 118 return; 121 119 } 122 120 123 121 if (srv->srvs->ops->write == NULL) { 124 async_answer_0( chandle, ENOTSUP);122 async_answer_0(icall, ENOTSUP); 125 123 return; 126 124 } … … 130 128 free(data); 131 129 132 async_answer_1(chandle, rc, nwritten); 133 } 134 135 static void con_sync_srv(con_srv_t *srv, cap_call_handle_t chandle, 136 ipc_call_t *call) 130 async_answer_1(icall, rc, nwritten); 131 } 132 133 static void con_sync_srv(con_srv_t *srv, ipc_call_t *icall) 137 134 { 138 135 if (srv->srvs->ops->sync == NULL) { 139 async_answer_0( chandle, ENOTSUP);136 async_answer_0(icall, ENOTSUP); 140 137 return; 141 138 } 142 139 143 140 srv->srvs->ops->sync(srv); 144 async_answer_0(chandle, EOK); 145 } 146 147 static void con_clear_srv(con_srv_t *srv, cap_call_handle_t chandle, 148 ipc_call_t *call) 141 async_answer_0(icall, EOK); 142 } 143 144 static void con_clear_srv(con_srv_t *srv, ipc_call_t *icall) 149 145 { 150 146 if (srv->srvs->ops->clear == NULL) { 151 async_answer_0( chandle, ENOTSUP);147 async_answer_0(icall, ENOTSUP); 152 148 return; 153 149 } 154 150 155 151 srv->srvs->ops->clear(srv); 156 async_answer_0(chandle, EOK); 157 } 158 159 static void con_set_pos_srv(con_srv_t *srv, cap_call_handle_t chandle, 160 ipc_call_t *call) 152 async_answer_0(icall, EOK); 153 } 154 155 static void con_set_pos_srv(con_srv_t *srv, ipc_call_t *icall) 161 156 { 162 157 sysarg_t col; 163 158 sysarg_t row; 164 159 165 col = IPC_GET_ARG1(* call);166 row = IPC_GET_ARG2(* call);160 col = IPC_GET_ARG1(*icall); 161 row = IPC_GET_ARG2(*icall); 167 162 168 163 if (srv->srvs->ops->set_pos == NULL) { 169 async_answer_0( chandle, ENOTSUP);164 async_answer_0(icall, ENOTSUP); 170 165 return; 171 166 } 172 167 173 168 srv->srvs->ops->set_pos(srv, col, row); 174 async_answer_0(chandle, EOK); 175 } 176 177 static void con_get_pos_srv(con_srv_t *srv, cap_call_handle_t chandle, 178 ipc_call_t *call) 169 async_answer_0(icall, EOK); 170 } 171 172 static void con_get_pos_srv(con_srv_t *srv, ipc_call_t *icall) 179 173 { 180 174 errno_t rc; … … 183 177 184 178 if (srv->srvs->ops->get_pos == NULL) { 185 async_answer_0( chandle, ENOTSUP);179 async_answer_0(icall, ENOTSUP); 186 180 return; 187 181 } 188 182 189 183 rc = srv->srvs->ops->get_pos(srv, &col, &row); 190 async_answer_2(chandle, rc, col, row); 191 } 192 193 static void con_get_size_srv(con_srv_t *srv, cap_call_handle_t chandle, 194 ipc_call_t *call) 184 async_answer_2(icall, rc, col, row); 185 } 186 187 static void con_get_size_srv(con_srv_t *srv, ipc_call_t *icall) 195 188 { 196 189 errno_t rc; … … 199 192 200 193 if (srv->srvs->ops->get_size == NULL) { 201 async_answer_0( chandle, ENOTSUP);194 async_answer_0(icall, ENOTSUP); 202 195 return; 203 196 } 204 197 205 198 rc = srv->srvs->ops->get_size(srv, &cols, &rows); 206 async_answer_2(chandle, rc, cols, rows); 207 } 208 209 static void con_get_color_cap_srv(con_srv_t *srv, cap_call_handle_t chandle, 210 ipc_call_t *call) 199 async_answer_2(icall, rc, cols, rows); 200 } 201 202 static void con_get_color_cap_srv(con_srv_t *srv, ipc_call_t *icall) 211 203 { 212 204 errno_t rc; … … 214 206 215 207 if (srv->srvs->ops->get_color_cap == NULL) { 216 async_answer_0( chandle, ENOTSUP);208 async_answer_0(icall, ENOTSUP); 217 209 return; 218 210 } 219 211 220 212 rc = srv->srvs->ops->get_color_cap(srv, &ccap); 221 async_answer_1(chandle, rc, (sysarg_t)ccap); 222 } 223 224 static void con_set_style_srv(con_srv_t *srv, cap_call_handle_t chandle, 225 ipc_call_t *call) 213 async_answer_1(icall, rc, (sysarg_t)ccap); 214 } 215 216 static void con_set_style_srv(con_srv_t *srv, ipc_call_t *icall) 226 217 { 227 218 console_style_t style; 228 219 229 style = IPC_GET_ARG1(* call);220 style = IPC_GET_ARG1(*icall); 230 221 231 222 if (srv->srvs->ops->set_style == NULL) { 232 async_answer_0( chandle, ENOTSUP);223 async_answer_0(icall, ENOTSUP); 233 224 return; 234 225 } 235 226 236 227 srv->srvs->ops->set_style(srv, style); 237 async_answer_0(chandle, EOK); 238 } 239 240 static void con_set_color_srv(con_srv_t *srv, cap_call_handle_t chandle, 241 ipc_call_t *call) 228 async_answer_0(icall, EOK); 229 } 230 231 static void con_set_color_srv(con_srv_t *srv, ipc_call_t *icall) 242 232 { 243 233 console_color_t bgcolor; … … 245 235 console_color_attr_t flags; 246 236 247 bgcolor = IPC_GET_ARG1(* call);248 fgcolor = IPC_GET_ARG2(* call);249 flags = IPC_GET_ARG3(* call);237 bgcolor = IPC_GET_ARG1(*icall); 238 fgcolor = IPC_GET_ARG2(*icall); 239 flags = IPC_GET_ARG3(*icall); 250 240 251 241 if (srv->srvs->ops->set_color == NULL) { 252 async_answer_0( chandle, ENOTSUP);242 async_answer_0(icall, ENOTSUP); 253 243 return; 254 244 } 255 245 256 246 srv->srvs->ops->set_color(srv, bgcolor, fgcolor, flags); 257 async_answer_0(chandle, EOK); 258 } 259 260 static void con_set_rgb_color_srv(con_srv_t *srv, cap_call_handle_t chandle, 261 ipc_call_t *call) 247 async_answer_0(icall, EOK); 248 } 249 250 static void con_set_rgb_color_srv(con_srv_t *srv, ipc_call_t *icall) 262 251 { 263 252 pixel_t bgcolor; 264 253 pixel_t fgcolor; 265 254 266 bgcolor = IPC_GET_ARG1(* call);267 fgcolor = IPC_GET_ARG2(* call);255 bgcolor = IPC_GET_ARG1(*icall); 256 fgcolor = IPC_GET_ARG2(*icall); 268 257 269 258 if (srv->srvs->ops->set_rgb_color == NULL) { 270 async_answer_0( chandle, ENOTSUP);259 async_answer_0(icall, ENOTSUP); 271 260 return; 272 261 } 273 262 274 263 srv->srvs->ops->set_rgb_color(srv, bgcolor, fgcolor); 275 async_answer_0(chandle, EOK); 276 } 277 278 static void con_set_cursor_visibility_srv(con_srv_t *srv, cap_call_handle_t chandle, 279 ipc_call_t *call) 264 async_answer_0(icall, EOK); 265 } 266 267 static void con_set_cursor_visibility_srv(con_srv_t *srv, ipc_call_t *icall) 280 268 { 281 269 bool show; 282 270 283 show = IPC_GET_ARG1(* call);271 show = IPC_GET_ARG1(*icall); 284 272 285 273 if (srv->srvs->ops->set_cursor_visibility == NULL) { 286 async_answer_0( chandle, ENOTSUP);274 async_answer_0(icall, ENOTSUP); 287 275 return; 288 276 } 289 277 290 278 srv->srvs->ops->set_cursor_visibility(srv, show); 291 async_answer_0(chandle, EOK); 292 } 293 294 static void con_get_event_srv(con_srv_t *srv, cap_call_handle_t chandle, 295 ipc_call_t *call) 279 async_answer_0(icall, EOK); 280 } 281 282 static void con_get_event_srv(con_srv_t *srv, ipc_call_t *icall) 296 283 { 297 284 errno_t rc; … … 300 287 301 288 if (srv->srvs->ops->get_event == NULL) { 302 async_answer_0( chandle, ENOTSUP);289 async_answer_0(icall, ENOTSUP); 303 290 return; 304 291 } … … 306 293 rc = srv->srvs->ops->get_event(srv, &event); 307 294 if (rc != EOK) { 308 async_answer_0( chandle, rc);295 async_answer_0(icall, rc); 309 296 return; 310 297 } … … 312 299 rc = console_ev_encode(&event, &result); 313 300 if (rc != EOK) { 314 async_answer_0( chandle, rc);315 return; 316 } 317 318 async_answer_5( chandle, rc, IPC_GET_ARG1(result), IPC_GET_ARG2(result),301 async_answer_0(icall, rc); 302 return; 303 } 304 305 async_answer_5(icall, rc, IPC_GET_ARG1(result), IPC_GET_ARG2(result), 319 306 IPC_GET_ARG3(result), IPC_GET_ARG4(result), IPC_GET_ARG5(result)); 320 307 } … … 340 327 } 341 328 342 errno_t con_conn( cap_call_handle_t icall_handle,ipc_call_t *icall, con_srvs_t *srvs)329 errno_t con_conn(ipc_call_t *icall, con_srvs_t *srvs) 343 330 { 344 331 con_srv_t *srv; … … 346 333 347 334 /* Accept the connection */ 348 async_answer_0(icall _handle, EOK);335 async_answer_0(icall, EOK); 349 336 350 337 srv = con_srv_create(srvs); … … 360 347 while (true) { 361 348 ipc_call_t call; 362 cap_call_handle_t chandle = 0;363 364 while ( chandle == 0) {349 bool received = false; 350 351 while (!received) { 365 352 /* XXX Need to be able to abort immediately */ 366 chandle= async_get_call_timeout(&call,353 received = async_get_call_timeout(&call, 367 354 srvs->abort_timeout); 368 355 369 356 if (srv->srvs->aborted) { 370 if ( chandle != 0)371 async_answer_0( chandle, EINTR);357 if (received) 358 async_answer_0(&call, EINTR); 372 359 break; 373 360 } 374 361 } 375 362 376 if ( chandle == 0)363 if (!received) 377 364 break; 378 365 … … 381 368 if (!method) { 382 369 /* The other side has hung up */ 383 async_answer_0( chandle, EOK);370 async_answer_0(&call, EOK); 384 371 break; 385 372 } … … 387 374 switch (method) { 388 375 case VFS_OUT_READ: 389 con_read_srv(srv, chandle,&call);376 con_read_srv(srv, &call); 390 377 break; 391 378 case VFS_OUT_WRITE: 392 con_write_srv(srv, chandle,&call);379 con_write_srv(srv, &call); 393 380 break; 394 381 case VFS_OUT_SYNC: 395 con_sync_srv(srv, chandle,&call);382 con_sync_srv(srv, &call); 396 383 break; 397 384 case CONSOLE_CLEAR: 398 con_clear_srv(srv, chandle,&call);385 con_clear_srv(srv, &call); 399 386 break; 400 387 case CONSOLE_SET_POS: 401 con_set_pos_srv(srv, chandle,&call);388 con_set_pos_srv(srv, &call); 402 389 break; 403 390 case CONSOLE_GET_POS: 404 con_get_pos_srv(srv, chandle,&call);391 con_get_pos_srv(srv, &call); 405 392 break; 406 393 case CONSOLE_GET_SIZE: 407 con_get_size_srv(srv, chandle,&call);394 con_get_size_srv(srv, &call); 408 395 break; 409 396 case CONSOLE_GET_COLOR_CAP: 410 con_get_color_cap_srv(srv, chandle,&call);397 con_get_color_cap_srv(srv, &call); 411 398 break; 412 399 case CONSOLE_SET_STYLE: 413 con_set_style_srv(srv, chandle,&call);400 con_set_style_srv(srv, &call); 414 401 break; 415 402 case CONSOLE_SET_COLOR: 416 con_set_color_srv(srv, chandle,&call);403 con_set_color_srv(srv, &call); 417 404 break; 418 405 case CONSOLE_SET_RGB_COLOR: 419 con_set_rgb_color_srv(srv, chandle,&call);406 con_set_rgb_color_srv(srv, &call); 420 407 break; 421 408 case CONSOLE_SET_CURSOR_VISIBILITY: 422 con_set_cursor_visibility_srv(srv, chandle,&call);409 con_set_cursor_visibility_srv(srv, &call); 423 410 break; 424 411 case CONSOLE_GET_EVENT: 425 con_get_event_srv(srv, chandle,&call);412 con_get_event_srv(srv, &call); 426 413 break; 427 414 default: 428 async_answer_0( chandle, ENOTSUP);415 async_answer_0(&call, ENOTSUP); 429 416 } 430 417 }
Note:
See TracChangeset
for help on using the changeset viewer.