Changes in / [e4f2656:55132b8] in mainline
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/ipc.h
re4f2656 r55132b8 115 115 */ 116 116 #define IPC_FF_ROUTE_FROM_ME (1 << 0) 117 118 /* Data transfer flags. */ 119 #define IPC_XF_NONE 0 120 121 /** Restrict the transfer size if necessary. */ 122 #define IPC_XF_RESTRICT (1 << 0) 117 123 118 124 /** Kernel IPC interfaces -
kernel/generic/src/ipc/sysipc.c
re4f2656 r55132b8 426 426 case IPC_M_DATA_READ: { 427 427 size_t size = IPC_GET_ARG2(call->data); 428 if ( (size <= 0 || (size > DATA_XFER_LIMIT)))428 if (size <= 0) 429 429 return ELIMIT; 430 430 if (size > DATA_XFER_LIMIT) { 431 int flags = IPC_GET_ARG3(call->data); 432 if (flags & IPC_XF_RESTRICT) 433 IPC_SET_ARG2(call->data, DATA_XFER_LIMIT); 434 else 435 return ELIMIT; 436 } 431 437 break; 432 438 } … … 435 441 size_t size = IPC_GET_ARG2(call->data); 436 442 437 if (size > DATA_XFER_LIMIT) 438 return ELIMIT; 443 if (size > DATA_XFER_LIMIT) { 444 int flags = IPC_GET_ARG3(call->data); 445 if (flags & IPC_XF_RESTRICT) { 446 size = DATA_XFER_LIMIT; 447 IPC_SET_ARG2(call->data, size); 448 } else 449 return ELIMIT; 450 } 439 451 440 452 call->buffer = (uint8_t *) malloc(size, 0); -
uspace/lib/c/generic/async.c
re4f2656 r55132b8 1572 1572 * @param dst Address of the beginning of the destination buffer. 1573 1573 * @param size Size of the destination buffer. 1574 * @param flags Flags to control the data transfer. 1574 1575 * 1575 1576 * @return Zero on success or a negative error code from errno.h. 1576 1577 * 1577 1578 */ 1578 int async_data_read_start(int phoneid, void *dst, size_t size) 1579 { 1580 return async_req_2_0(phoneid, IPC_M_DATA_READ, (sysarg_t) dst, 1581 (sysarg_t) size); 1579 int 1580 async_data_read_start_flexible(int phoneid, void *dst, size_t size, int flags) 1581 { 1582 return async_req_3_0(phoneid, IPC_M_DATA_READ, (sysarg_t) dst, 1583 (sysarg_t) size, (sysarg_t) flags); 1582 1584 } 1583 1585 … … 1669 1671 * @param src Address of the beginning of the source buffer. 1670 1672 * @param size Size of the source buffer. 1673 * @param flags Flags to control the data transfer. 1671 1674 * 1672 1675 * @return Zero on success or a negative error code from errno.h. 1673 1676 * 1674 1677 */ 1675 int async_data_write_start(int phoneid, const void *src, size_t size) 1676 { 1677 return async_req_2_0(phoneid, IPC_M_DATA_WRITE, (sysarg_t) src, 1678 (sysarg_t) size); 1678 int 1679 async_data_write_start_flexible(int phoneid, const void *src, size_t size, 1680 int flags) 1681 { 1682 return async_req_3_0(phoneid, IPC_M_DATA_WRITE, (sysarg_t) src, 1683 (sysarg_t) size, (sysarg_t) flags); 1679 1684 } 1680 1685 -
uspace/lib/c/generic/vfs/vfs.c
re4f2656 r55132b8 378 378 379 379 req = async_send_1(vfs_phone, VFS_IN_READ, fildes, &answer); 380 rc = async_data_read_start(vfs_phone, (void *)buf, nbyte); 380 rc = async_data_read_start_flexible(vfs_phone, (void *) buf, nbyte, 381 IPC_XF_RESTRICT); 381 382 if (rc != EOK) { 382 383 vfs_exchange_end(vfs_phone); … … 407 408 408 409 req = async_send_1(vfs_phone, VFS_IN_WRITE, fildes, &answer); 409 rc = async_data_write_start(vfs_phone, (void *)buf, nbyte); 410 rc = async_data_write_start_flexible(vfs_phone, (void *) buf, nbyte, 411 IPC_XF_RESTRICT); 410 412 if (rc != EOK) { 411 413 vfs_exchange_end(vfs_phone); -
uspace/lib/c/include/async.h
re4f2656 r55132b8 340 340 (arg4), (answer)) 341 341 342 extern int async_data_read_start(int, void *, size_t); 342 #define async_data_read_start(p, buf, len) \ 343 async_data_read_start_flexible((p), (buf), (len), IPC_XF_NONE) 344 345 extern int async_data_read_start_flexible(int, void *, size_t, int); 343 346 extern bool async_data_read_receive(ipc_callid_t *, size_t *); 344 347 extern int async_data_read_finalize(ipc_callid_t, const void *, size_t); … … 379 382 (arg4), (answer)) 380 383 381 extern int async_data_write_start(int, const void *, size_t); 384 #define async_data_write_start(p, buf, len) \ 385 async_data_write_start_flexible((p), (buf), (len), IPC_XF_NONE) 386 387 extern int async_data_write_start_flexible(int, const void *, size_t, int); 382 388 extern bool async_data_write_receive(ipc_callid_t *, size_t *); 383 389 extern int async_data_write_finalize(ipc_callid_t, void *, size_t);
Note:
See TracChangeset
for help on using the changeset viewer.