Changeset 75751db6 in mainline for uspace/lib/c/include/io/chardev_srv.h
- Timestamp:
- 2014-08-29T20:32:20Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- af0a2c7
- Parents:
- 312e5ff
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/io/chardev_srv.h
r312e5ff r75751db6 1 1 /* 2 * Copyright (c) 201 1 Jan Vesely2 * Copyright (c) 2014 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 #include <errno.h> 30 #include <mem.h> 31 #include <ipc/dev_iface.h> 32 #include <ddf/log.h> 29 /** @addtogroup libc 30 * @{ 31 */ 32 /** @file 33 */ 33 34 34 #include "chardev.h" 35 #ifndef LIBC_IO_CHARDEV_SRV_H_ 36 #define LIBC_IO_CHARDEV_SRV_H_ 35 37 36 // TODO make this shared 37 enum { 38 IPC_CHAR_READ = DEV_FIRST_CUSTOM_METHOD, 39 IPC_CHAR_WRITE, 38 #include <adt/list.h> 39 #include <async.h> 40 #include <fibril_synch.h> 41 #include <stdbool.h> 42 #include <sys/types.h> 43 44 typedef struct chardev_ops chardev_ops_t; 45 46 /** Service setup (per sevice) */ 47 typedef struct { 48 chardev_ops_t *ops; 49 void *sarg; 50 } chardev_srvs_t; 51 52 /** Server structure (per client session) */ 53 typedef struct { 54 chardev_srvs_t *srvs; 55 void *carg; 56 } chardev_srv_t; 57 58 struct chardev_ops { 59 int (*open)(chardev_srvs_t *, chardev_srv_t *); 60 int (*close)(chardev_srv_t *); 61 int (*read)(chardev_srv_t *, void *, size_t); 62 int (*write)(chardev_srv_t *, const void *, size_t); 40 63 }; 41 64 42 ssize_t chardev_read(async_exch_t *exch, void *data, size_t size) 43 { 44 if (!exch) 45 return EBADMEM; 46 if (size > 4 * sizeof(sysarg_t)) 47 return ELIMIT; 65 extern void chardev_srvs_init(chardev_srvs_t *); 48 66 49 sysarg_t message[4] = { 0 }; 50 const ssize_t ret = async_req_1_4(exch, IPC_CHAR_READ, size, 51 &message[0], &message[1], &message[2], &message[3]); 52 if (ret > 0 && (size_t)ret <= size) 53 memcpy(data, message, size); 54 return ret; 55 } 67 extern int chardev_conn(ipc_callid_t, ipc_call_t *, chardev_srvs_t *); 56 68 57 ssize_t chardev_write(async_exch_t *exch, const void *data, size_t size) 58 { 59 if (!exch) 60 return EBADMEM; 61 if (size > 3 * sizeof(sysarg_t)) 62 return ELIMIT; 69 #endif 63 70 64 sysarg_t message[3] = { 0 }; 65 memcpy(message, data, size); 66 return async_req_4_0(exch, IPC_CHAR_WRITE, size, 67 message[0], message[1], message[2]); 68 } 71 /** @} 72 */
Note:
See TracChangeset
for help on using the changeset viewer.