Changeset 15c5418 in mainline for uspace/lib/c/generic/io/chardev.c


Ignore:
Timestamp:
2017-11-18T20:06:15Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
75fcf9b
Parents:
efb9fd08
Message:

chardev_open, chardev_close.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/chardev.c

    refb9fd08 r15c5418  
    11/*
    22 * Copyright (c) 2011 Jan Vesely
     3 * Copyright (c) 2017 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    2728 */
    2829
     30/** @addtogroup libc
     31 * @{
     32 */
     33/**
     34 * @file
     35 * @brief Character device client interface
     36 */
     37
    2938#include <errno.h>
    3039#include <mem.h>
    3140#include <io/chardev.h>
    3241#include <ipc/chardev.h>
     42#include <stdlib.h>
    3343
    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 */
     51int chardev_open(async_sess_t *sess, chardev_t **rchardev)
    3552{
    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 */
     73void chardev_close(chardev_t *chardev)
     74{
     75        free(chardev);
     76}
     77
     78ssize_t chardev_read(chardev_t *chardev, void *data, size_t size)
     79{
    3880        if (size > 4 * sizeof(sysarg_t))
    3981                return ELIMIT;
    4082
     83        async_exch_t *exch = async_exchange_begin(chardev->sess);
    4184        sysarg_t message[4] = { 0 };
    4285        const ssize_t ret = async_req_1_4(exch, CHARDEV_READ, size,
    4386            &message[0], &message[1], &message[2], &message[3]);
     87        async_exchange_end(exch);
    4488        if (ret > 0 && (size_t)ret <= size)
    4589                memcpy(data, message, size);
     
    4791}
    4892
    49 ssize_t chardev_write(async_exch_t *exch, const void *data, size_t size)
     93ssize_t chardev_write(chardev_t *chardev, const void *data, size_t size)
    5094{
    51         if (!exch)
    52                 return EBADMEM;
     95        int ret;
     96
    5397        if (size > 3 * sizeof(sysarg_t))
    5498                return ELIMIT;
    5599
     100        async_exch_t *exch = async_exchange_begin(chardev->sess);
    56101        sysarg_t message[3] = { 0 };
    57102        memcpy(message, data, size);
    58         return async_req_4_0(exch, CHARDEV_WRITE, size,
     103        ret = async_req_4_0(exch, CHARDEV_WRITE, size,
    59104            message[0], message[1], message[2]);
     105        async_exchange_end(exch);
     106        return ret;
    60107}
     108
     109/** @}
     110 */
Note: See TracChangeset for help on using the changeset viewer.