Rev 2658 | Rev 2664 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2658 | Rev 2663 | ||
|---|---|---|---|
| Line 280... | Line 280... | ||
| 280 | void tmpfs_read(ipc_callid_t rid, ipc_call_t *request) |
280 | void tmpfs_read(ipc_callid_t rid, ipc_call_t *request) |
| 281 | { |
281 | { |
| 282 | int dev_handle = IPC_GET_ARG1(*request); |
282 | int dev_handle = IPC_GET_ARG1(*request); |
| 283 | unsigned long index = IPC_GET_ARG2(*request); |
283 | unsigned long index = IPC_GET_ARG2(*request); |
| 284 | off_t pos = IPC_GET_ARG3(*request); |
284 | off_t pos = IPC_GET_ARG3(*request); |
| 285 | size_t size = IPC_GET_ARG4(*request); |
- | |
| 286 | 285 | ||
| 287 | /* |
286 | /* |
| 288 | * Lookup the respective dentry. |
287 | * Lookup the respective dentry. |
| 289 | */ |
288 | */ |
| 290 | link_t *hlp; |
289 | link_t *hlp; |
| Line 295... | Line 294... | ||
| 295 | } |
294 | } |
| 296 | tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
295 | tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
| 297 | dh_link); |
296 | dh_link); |
| 298 | 297 | ||
| 299 | /* |
298 | /* |
| 300 | * Receive the communication area. |
299 | * Receive the read request. |
| 301 | */ |
300 | */ |
| 302 | ipc_callid_t callid; |
301 | ipc_callid_t callid; |
| 303 | ipc_call_t call; |
302 | size_t size; |
| 304 | callid = async_get_call(&call); |
- | |
| 305 | if (IPC_GET_METHOD(call) != IPC_M_AS_AREA_SEND) { |
303 | if (!ipc_data_read_receive(&callid, size)) { |
| 306 | ipc_answer_0(callid, EINVAL); |
304 | ipc_answer_0(callid, EINVAL); |
| 307 | ipc_answer_0(rid, EINVAL); |
305 | ipc_answer_0(rid, EINVAL); |
| 308 | return; |
306 | return; |
| 309 | } |
307 | } |
| 310 | 308 | ||
| 311 | int flags = IPC_GET_ARG3(call); |
- | |
| 312 | if (!(flags & AS_AREA_WRITE)) { |
- | |
| 313 | ipc_answer_0(callid, EINVAL); |
- | |
| 314 | ipc_answer_0(rid, EINVAL); |
- | |
| 315 | return; |
- | |
| 316 | } |
- | |
| 317 | size_t sz = IPC_GET_ARG2(call); |
- | |
| 318 | uint8_t *buf = as_get_mappable_page(sz); |
- | |
| 319 | if (!buf) { |
- | |
| 320 | ipc_answer_0(callid, ENOMEM); |
- | |
| 321 | ipc_answer_0(rid, ENOMEM); |
- | |
| 322 | return; |
- | |
| 323 | } |
- | |
| 324 | ipc_answer_1(callid, EOK, buf); /* commit to share the area */ |
- | |
| 325 | - | ||
| 326 | size_t bytes = max(0, min(dentry->size - pos, size)); |
309 | size_t bytes = max(0, min(dentry->size - pos, size)); |
| 327 | memcpy(buf, dentry->data + pos, bytes); |
310 | (void) ipc_data_read_deliver(callid, dentry->data + pos, bytes); |
| 328 | - | ||
| 329 | (void) as_area_destroy(buf); |
- | |
| 330 | - | ||
| 331 | ipc_answer_1(rid, EOK, bytes); |
- | |
| 332 | } |
311 | } |
| 333 | 312 | ||
| 334 | /** |
313 | /** |
| 335 | * @} |
314 | * @} |
| 336 | */ |
315 | */ |