diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-01 22:40:08 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-01 22:40:08 +0000 |
commit | 73f6236bc09b3cadf0aa030e16396154421f3e30 (patch) | |
tree | 30c344abe6e8091d860d583e0a1342af575ae791 /c/src/lib/libnetworking | |
parent | Part of the automake VI patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>: (diff) | |
download | rtems-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/lib/libnetworking')
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h | 2 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_glue.c | 8 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_select.c | 1 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_syscall.c | 47 |
4 files changed, 35 insertions, 23 deletions
diff --git a/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h b/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h index 8cbba180d6..adaecbd5f9 100644 --- a/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h +++ b/c/src/lib/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/lib/libnetworking/rtems/rtems_glue.c b/c/src/lib/libnetworking/rtems/rtems_glue.c index 5eb885e70e..0601e5659f 100644 --- a/c/src/lib/libnetworking/rtems/rtems_glue.c +++ b/c/src/lib/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/lib/libnetworking/rtems/rtems_select.c b/c/src/lib/libnetworking/rtems/rtems_select.c index 2487edf9fc..972bf2d650 100644 --- a/c/src/lib/libnetworking/rtems/rtems_select.c +++ b/c/src/lib/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/lib/libnetworking/rtems/rtems_syscall.c b/c/src/lib/libnetworking/rtems/rtems_syscall.c index 4a871f78fb..141b7ceeba 100644 --- a/c/src/lib/libnetworking/rtems/rtems_syscall.c +++ b/c/src/lib/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 */ }; - |