summaryrefslogtreecommitdiffstats
path: root/c/src/libnetworking/rtems/rtems_syscall.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-01 22:40:08 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-01 22:40:08 +0000
commit73f6236bc09b3cadf0aa030e16396154421f3e30 (patch)
tree30c344abe6e8091d860d583e0a1342af575ae791 /c/src/libnetworking/rtems/rtems_syscall.c
parentPart of the automake VI patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>: (diff)
downloadrtems-73f6236bc09b3cadf0aa030e16396154421f3e30.tar.bz2
Patch from Eric Norum <eric@skatter.usask.ca> to eliminate external
IO handlers scheme that was implemented originally just to support sockets. The file system IO switch is more general and works fine.
Diffstat (limited to '')
-rw-r--r--c/src/libnetworking/rtems/rtems_syscall.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/c/src/libnetworking/rtems/rtems_syscall.c b/c/src/libnetworking/rtems/rtems_syscall.c
index 4a871f78fb..141b7ceeba 100644
--- a/c/src/libnetworking/rtems/rtems_syscall.c
+++ b/c/src/libnetworking/rtems/rtems_syscall.c
@@ -26,6 +26,13 @@
#include <net/route.h>
/*
+ * Hooks to RTEMS I/O system
+ */
+static const rtems_filesystem_file_handlers_r socket_handlers;
+int rtems_bsdnet_makeFdForSocket(void *so, const rtems_filesystem_file_handlers_r *h);
+struct socket *rtems_bsdnet_fdToSocket(int fd);
+
+/*
* Package system call argument into mbuf.
*/
static int
@@ -64,7 +71,7 @@ socket (int domain, int type, int protocol)
rtems_bsdnet_semaphore_obtain ();
error = socreate(domain, &so, type, protocol, NULL);
if (error == 0) {
- fd = rtems_bsdnet_makeFdForSocket (so);
+ fd = rtems_bsdnet_makeFdForSocket (so, &socket_handlers);
if (fd < 0)
soclose (so);
}
@@ -213,7 +220,7 @@ accept (int s, struct sockaddr *name, int *namelen)
TAILQ_REMOVE(&head->so_comp, so, so_list);
head->so_qlen--;
- fd = rtems_bsdnet_makeFdForSocket (so);
+ fd = rtems_bsdnet_makeFdForSocket (so, &socket_handlers);
if (fd < 0) {
TAILQ_INSERT_HEAD(&head->so_comp, so, so_list);
head->so_qlen++;
@@ -600,17 +607,18 @@ getsockname (int s, struct sockaddr *name, int *namelen)
/*
************************************************************************
- * RTEMS EXTERNAL I/O HANDLER ROUTINES *
+ * RTEMS I/O HANDLER ROUTINES *
************************************************************************
*/
static int
-rtems_bsdnet_close (int fd)
+rtems_bsdnet_close (rtems_libio_t *iop)
{
struct socket *so;
int error;
rtems_bsdnet_semaphore_obtain ();
- if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
+ if ((so = iop->data1) == NULL) {
+ errno = EBADF;
rtems_bsdnet_semaphore_release ();
return -1;
}
@@ -624,15 +632,15 @@ rtems_bsdnet_close (int fd)
}
static int
-rtems_bsdnet_read (int fd, void *buffer, unsigned32 count)
+rtems_bsdnet_read (rtems_libio_t *iop, void *buffer, unsigned32 count)
{
- return recv (fd, buffer, count, 0);
+ return recv (iop->data0, buffer, count, 0);
}
static int
-rtems_bsdnet_write (int fd, const void *buffer, unsigned32 count)
+rtems_bsdnet_write (rtems_libio_t *iop, const void *buffer, unsigned32 count)
{
- return send (fd, buffer, count, 0);
+ return send (iop->data0, buffer, count, 0);
}
static int
@@ -659,13 +667,14 @@ so_ioctl (struct socket *so, unsigned32 command, void *buffer)
}
static int
-rtems_bsdnet_ioctl (int fd, unsigned32 command, void *buffer)
+rtems_bsdnet_ioctl (rtems_libio_t *iop, unsigned32 command, void *buffer)
{
struct socket *so;
int error;
rtems_bsdnet_semaphore_obtain ();
- if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
+ if ((so = iop->data1) == NULL) {
+ errno = EBADF;
rtems_bsdnet_semaphore_release ();
return -1;
}
@@ -678,12 +687,24 @@ rtems_bsdnet_ioctl (int fd, unsigned32 command, void *buffer)
return 0;
}
-rtems_libio_handler_t rtems_bsdnet_io_handler = {
+static int
+rtems_bsdnet_fstat (rtems_filesystem_location_info_t *loc, struct stat *sp)
+{
+ sp->st_mode = S_IFSOCK;
+ return 0;
+}
+
+static const rtems_filesystem_file_handlers_r socket_handlers = {
NULL, /* open */
rtems_bsdnet_close, /* close */
rtems_bsdnet_read, /* read */
rtems_bsdnet_write, /* write */
rtems_bsdnet_ioctl, /* ioctl */
NULL, /* lseek */
+ rtems_bsdnet_fstat, /* fstat */
+ NULL, /* fchmod */
+ NULL, /* ftruncate */
+ NULL, /* fpathconf */
+ NULL, /* fsync */
+ NULL, /* fdatasync */
};
-