summaryrefslogtreecommitdiffstats
path: root/c/src/exec/libnetworking
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/exec/libnetworking
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 'c/src/exec/libnetworking')
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h2
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_glue.c8
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_select.c1
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_syscall.c47
4 files changed, 35 insertions, 23 deletions
diff --git a/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h b/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
index 8cbba180d6..adaecbd5f9 100644
--- a/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
+++ b/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
@@ -174,8 +174,6 @@ void arpintr (void);
void bootpc_init(void);
int socket (int, int, int);
int ioctl (int, unsigned long, ...);
-struct socket *rtems_bsdnet_fdToSocket (int fd);
-int rtems_bsdnet_makeFdForSocket (void *);
/*
* Events used by networking routines.
diff --git a/c/src/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c
index 5eb885e70e..0601e5659f 100644
--- a/c/src/exec/libnetworking/rtems/rtems_glue.c
+++ b/c/src/exec/libnetworking/rtems/rtems_glue.c
@@ -78,8 +78,6 @@ struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
sizeof rtems_bsdnet_config.name_server[0]];
int rtems_bsdnet_nameserver_count;
-extern rtems_libio_handler_t rtems_bsdnet_io_handler;
-
/*
* Perform FreeBSD memory allocation.
* FIXME: This should be modified to keep memory allocation statistics.
@@ -231,12 +229,6 @@ rtems_bsdnet_initialize (void)
networkDaemonTid = rtems_bsdnet_newproc ("ntwk", 4096, networkDaemon, NULL);
/*
- * Register as an external I/O handler
- */
- rtems_register_libio_handler (LIBIO_FLAGS_HANDLER_SOCK,
- &rtems_bsdnet_io_handler);
-
- /*
* Let other network tasks begin
*/
rtems_bsdnet_semaphore_release ();
diff --git a/c/src/exec/libnetworking/rtems/rtems_select.c b/c/src/exec/libnetworking/rtems/rtems_select.c
index 2487edf9fc..972bf2d650 100644
--- a/c/src/exec/libnetworking/rtems/rtems_select.c
+++ b/c/src/exec/libnetworking/rtems/rtems_select.c
@@ -46,6 +46,7 @@
*/
static __inline int imin(int a, int b) { return (a < b ? a : b); }
+struct socket *rtems_bsdnet_fdToSocket(int fd);
static int
socket_select (struct socket *so, int which, rtems_id tid)
diff --git a/c/src/exec/libnetworking/rtems/rtems_syscall.c b/c/src/exec/libnetworking/rtems/rtems_syscall.c
index 4a871f78fb..141b7ceeba 100644
--- a/c/src/exec/libnetworking/rtems/rtems_syscall.c
+++ b/c/src/exec/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 */
};
-