Changeset 15c5418 in mainline for uspace/lib/c/generic/io/chardev.c
- Timestamp:
- 2017-11-18T20:06:15Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 75fcf9b
- Parents:
- efb9fd08
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/chardev.c
refb9fd08 r15c5418 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 27 28 */ 28 29 30 /** @addtogroup libc 31 * @{ 32 */ 33 /** 34 * @file 35 * @brief Character device client interface 36 */ 37 29 38 #include <errno.h> 30 39 #include <mem.h> 31 40 #include <io/chardev.h> 32 41 #include <ipc/chardev.h> 42 #include <stdlib.h> 33 43 34 ssize_t chardev_read(async_exch_t *exch, void *data, size_t size) 44 /** Open character device. 45 * 46 * @param sess Session with the character device 47 * @param rchardev Place to store pointer to the new character device structure 48 * 49 * @return EOK on success, ENOMEM if out of memory, EIO on I/O error 50 */ 51 int chardev_open(async_sess_t *sess, chardev_t **rchardev) 35 52 { 36 if (!exch) 37 return EBADMEM; 53 chardev_t *chardev; 54 55 chardev = calloc(1, sizeof(chardev_t)); 56 if (chardev == NULL) 57 return ENOMEM; 58 59 chardev->sess = sess; 60 *rchardev = chardev; 61 62 /* EIO might be used in a future implementation */ 63 return EOK; 64 } 65 66 /** Close character device. 67 * 68 * Frees the character device structure. The underlying session is 69 * not affected. 70 * 71 * @param chardev Character device or @c NULL 72 */ 73 void chardev_close(chardev_t *chardev) 74 { 75 free(chardev); 76 } 77 78 ssize_t chardev_read(chardev_t *chardev, void *data, size_t size) 79 { 38 80 if (size > 4 * sizeof(sysarg_t)) 39 81 return ELIMIT; 40 82 83 async_exch_t *exch = async_exchange_begin(chardev->sess); 41 84 sysarg_t message[4] = { 0 }; 42 85 const ssize_t ret = async_req_1_4(exch, CHARDEV_READ, size, 43 86 &message[0], &message[1], &message[2], &message[3]); 87 async_exchange_end(exch); 44 88 if (ret > 0 && (size_t)ret <= size) 45 89 memcpy(data, message, size); … … 47 91 } 48 92 49 ssize_t chardev_write( async_exch_t *exch, const void *data, size_t size)93 ssize_t chardev_write(chardev_t *chardev, const void *data, size_t size) 50 94 { 51 i f (!exch)52 return EBADMEM; 95 int ret; 96 53 97 if (size > 3 * sizeof(sysarg_t)) 54 98 return ELIMIT; 55 99 100 async_exch_t *exch = async_exchange_begin(chardev->sess); 56 101 sysarg_t message[3] = { 0 }; 57 102 memcpy(message, data, size); 58 ret urnasync_req_4_0(exch, CHARDEV_WRITE, size,103 ret = async_req_4_0(exch, CHARDEV_WRITE, size, 59 104 message[0], message[1], message[2]); 105 async_exchange_end(exch); 106 return ret; 60 107 } 108 109 /** @} 110 */
Note:
See TracChangeset
for help on using the changeset viewer.