/*
* IMFS Device Node Handlers
*
* This file contains the set of handlers used to map operations on
* IMFS device nodes onto calls to the RTEMS Classic API IO Manager.
*
* COPYRIGHT (c) 1989-1999.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems.h>
#include <rtems/libio.h>
#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
#include <errno.h>
#include "imfs.h"
/*
* Convert RTEMS status to a UNIX errno
*/
rtems_assoc_t errno_assoc[] = {
{ "OK", RTEMS_SUCCESSFUL, 0 },
{ "BUSY", RTEMS_RESOURCE_IN_USE, EBUSY },
{ "INVALID NAME", RTEMS_INVALID_NAME, EINVAL },
{ "NOT IMPLEMENTED", RTEMS_NOT_IMPLEMENTED, ENOSYS },
{ "TIMEOUT", RTEMS_TIMEOUT, ETIMEDOUT },
{ "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM },
{ "NO DEVICE", RTEMS_UNSATISFIED, ENODEV },
{ "INVALID NUMBER", RTEMS_INVALID_NUMBER, EBADF},
{ "NOT RESOURCE OWNER", RTEMS_NOT_OWNER_OF_RESOURCE, EPERM},
{ "IO ERROR", RTEMS_IO_ERROR, EIO},
{ 0, 0, 0 },
};
static unsigned32
rtems_deviceio_errno(rtems_status_code code)
{
int rc;
if ((rc = rtems_assoc_remote_by_local(errno_assoc, (unsigned32) code)))
{
errno = rc;
return -1;
}
return -1;
}
/*
* device_open
*
* This handler maps an open() operation onto rtems_io_open().
*/
int device_open(
rtems_libio_t *iop,
const char *pathname,
unsigned32 flag,
unsigned32 mode
)
{
rtems_libio_open_close_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
the_jnode = iop->file_info;
args.iop = iop;
args.flags = iop->flags;
args.mode = mode;
status = rtems_io_open(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status ) {
rtems_deviceio_errno(status);
return RTEMS_UNSATISFIED;
}
return 0;
}
/*
* device_close
*
* This handler maps a close() operation onto rtems_io_close().
*/
int device_close(
rtems_libio_t *iop
)
{
rtems_libio_open_close_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
the_jnode = iop->file_info;
args.iop = iop;
args.flags = 0;
args.mode = 0;
status = rtems_io_close(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status ) {
rtems_deviceio_errno(status);
return RTEMS_UNSATISFIED;
}
return 0;
}
/*
* device_read
*
* This handler maps a read() operation onto rtems_io_read().
*/
int device_read(
rtems_libio_t *iop,
void *buffer,
unsigned32 count
)
{
rtems_libio_rw_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
the_jnode = iop->file_info;
args.iop = iop;
args.offset = iop->offset;
args.buffer = buffer;
args.count = count;
args.flags = iop->flags;
args.bytes_moved = 0;
status = rtems_io_read(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status )
return rtems_deviceio_errno(status);
return args.bytes_moved;
}
/*
* device_write
*
* This handler maps a write() operation onto rtems_io_write().
*/
int device_write(
rtems_libio_t *iop,
const void *buffer,
unsigned32 count
)
{
rtems_libio_rw_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
the_jnode = iop->file_info;
args.iop = iop;
args.offset = iop->offset;
args.buffer = (void *) buffer;
args.count = count;
args.flags = iop->flags;
args.bytes_moved = 0;
status = rtems_io_write(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status )
return rtems_deviceio_errno(status);
return args.bytes_moved;
}
/*
* device_ioctl
*
* This handler maps an ioctl() operation onto rtems_io_ioctl().
*/
int device_ioctl(
rtems_libio_t *iop,
unsigned32 command,
void *buffer
)
{
rtems_libio_ioctl_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
args.iop = iop;
args.command = command;
args.buffer = buffer;
the_jnode = iop->file_info;
status = rtems_io_control(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status )
return rtems_deviceio_errno(status);
return args.ioctl_return;
}
/*
* device_lseek
*
* This handler eats all lseek() operations.
*/
int device_lseek(
rtems_libio_t *iop,
off_t offset,
int whence
)
{
return 0;
}
/*
* device_stat
*
* The IMFS_stat() is used.
*/
/*
* device_rmnod
*
* The IMFS_rmnod() is used.
*/