From cca44008d81209e9fa992157637d9de0384e0536 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 10 Dec 1998 23:31:54 +0000 Subject: Merged Eric Norum's select patch that was based on 4.0 and resolved all conflicts. --- c/src/exec/libnetworking/rtems/rtems_glue.c | 36 ++------- c/src/exec/libnetworking/rtems/rtems_syscall.c | 103 ++++--------------------- 2 files changed, 20 insertions(+), 119 deletions(-) (limited to 'c/src/exec/libnetworking') diff --git a/c/src/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c index f2449831f5..28fb179c22 100644 --- a/c/src/exec/libnetworking/rtems/rtems_glue.c +++ b/c/src/exec/libnetworking/rtems/rtems_glue.c @@ -30,19 +30,6 @@ #include #include -/* - * Events used by networking routines. - * Everything will break if the application - * tries to use these events or if the `sleep' - * events are equal to any of the NETISR * events. - */ -#define SBWAIT_EVENT RTEMS_EVENT_24 -#define SOSLEEP_EVENT RTEMS_EVENT_25 -#define NETISR_IP_EVENT (1 << NETISR_IP) -#define NETISR_ARP_EVENT (1 << NETISR_ARP) -#define NETISR_EVENTS (NETISR_IP_EVENT|NETISR_ARP_EVENT) - - /* * Memory allocation */ @@ -246,7 +233,7 @@ rtems_bsdnet_initialize (void) /* * Register as an external I/O handler */ - rtems_register_libio_handler (RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET, + rtems_register_libio_handler (LIBIO_FLAGS_HANDLER_SOCK, &rtems_bsdnet_io_handler); /* @@ -305,16 +292,9 @@ sbwait(sb) /* * Set this task as the target of the wakeup operation. */ - if (sb->sb_sel.si_pid) - rtems_panic ("Another task is already sleeping on that socket buffer"); rtems_task_ident (RTEMS_SELF, 0, &tid); sb->sb_sel.si_pid = tid; - /* - * Mark the socket buffer as waiting. - */ - sb->sb_flags |= SB_WAIT; - /* * Release the network semaphore. */ @@ -330,12 +310,6 @@ sbwait(sb) */ rtems_bsdnet_semaphore_obtain (); - /* - * Relinquish ownership of the socket buffer - */ - sb->sb_flags &= ~SB_WAIT; - sb->sb_sel.si_pid = 0; - /* * Return the status of the wait. */ @@ -355,9 +329,11 @@ sowakeup(so, sb) register struct socket *so; register struct sockbuf *sb; { - if (sb->sb_flags & SB_WAIT) { - sb->sb_flags &= ~SB_WAIT; - rtems_event_send (sb->sb_sel.si_pid, SBWAIT_EVENT); + rtems_id tid; + + if ((tid = sb->sb_sel.si_pid) != 0) { + sb->sb_sel.si_pid = 0; + rtems_event_send (tid, SBWAIT_EVENT); } } diff --git a/c/src/exec/libnetworking/rtems/rtems_syscall.c b/c/src/exec/libnetworking/rtems/rtems_syscall.c index 93ecd47c6f..63d34bd817 100644 --- a/c/src/exec/libnetworking/rtems/rtems_syscall.c +++ b/c/src/exec/libnetworking/rtems/rtems_syscall.c @@ -25,77 +25,6 @@ #include #include -/* - ********************************************************************* - * Map RTEMS file descriptor to BSD socket * - ********************************************************************* - */ -struct fdsock { - int indexFreeNext; - struct socket *sock; -}; -static struct fdsock *fdsock; -static int fdsockCount; -static int indexFreeHead = -1; - -/* - * Convert an RTEMS file descriptor to a BSD socket pointer. - */ -static struct socket * -fdToSocket (int fd) -{ - int i; - struct socket *s; - - if ((fd < 0) - || (rtems_file_descriptor_type(fd) != RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET) - || ((i = rtems_file_descriptor_base(fd)) >= fdsockCount) - || ((s = fdsock[i].sock) == NULL)) { - errno = EBADF; - return NULL; - } - return s; -} - -/* - * Enlarge the size of the file-descritor/socket pointer map. - */ -static int -enlargeFdMap (void) -{ - struct fdsock *nfdsock; - int i; - - nfdsock = realloc (fdsock, sizeof *fdsock * (fdsockCount + 20)); - if (nfdsock == NULL) { - errno = ENFILE; - return 0; - } - fdsock = nfdsock; - for (i = fdsockCount, fdsockCount += 20 ; i < fdsockCount ; i++) { - fdsock[i].sock = NULL; - fdsock[i].indexFreeNext = indexFreeHead; - indexFreeHead = i; - } - return 1; -} - -/* - * Create a file descriptor for a new socket - */ -static int -makeFd (struct socket *s) -{ - int i; - - if ((indexFreeHead < 0) && !enlargeFdMap ()) - return -1; - i = indexFreeHead; - indexFreeHead = fdsock[i].indexFreeNext; - fdsock[i].sock = s; - return rtems_make_file_descriptor(i,RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET); -} - /* * Package system call argument into mbuf. */ @@ -128,14 +57,14 @@ sockargstombuf (struct mbuf **mp, const void *buf, int buflen, int type) int socket (int domain, int type, int protocol) { - int fd = -1; + int fd; int error; struct socket *so; rtems_bsdnet_semaphore_obtain (); error = socreate(domain, &so, type, protocol, NULL); if (error == 0) { - fd = makeFd (so); + fd = rtems_bsdnet_makeFdForSocket (so); if (fd < 0) soclose (so); } @@ -156,7 +85,7 @@ bind (int s, struct sockaddr *name, int namelen) struct mbuf *nam; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) != NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) != NULL) { error = sockargstombuf (&nam, name, namelen, MT_SONAME); if (error == 0) { error = sobind (so, nam); @@ -183,7 +112,7 @@ connect (int s, struct sockaddr *name, int namelen) struct mbuf *nam; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -233,7 +162,7 @@ listen (int s, int backlog) struct socket *so; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) != NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) != NULL) { error = solisten (so, backlog); if (error == 0) ret = 0; @@ -252,7 +181,7 @@ accept (int s, struct sockaddr *name, int *namelen) struct mbuf *nam; rtems_bsdnet_semaphore_obtain (); - if ((head = fdToSocket (s)) == NULL) { + if ((head = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -284,7 +213,7 @@ accept (int s, struct sockaddr *name, int *namelen) TAILQ_REMOVE(&head->so_comp, so, so_list); head->so_qlen--; - fd = makeFd (so); + fd = rtems_bsdnet_makeFdForSocket (so); if (fd < 0) { TAILQ_INSERT_HEAD(&head->so_comp, so, so_list); head->so_qlen++; @@ -325,7 +254,7 @@ sendmsg (int s, const struct msghdr *mp, int flags) int len; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -428,7 +357,7 @@ recvmsg (int s, struct msghdr *mp, int flags) int len; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -547,7 +476,7 @@ setsockopt (int s, int level, int name, const void *val, int len) int error; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -584,7 +513,7 @@ getsockopt (int s, int level, int name, void *aval, int *avalsize) int error; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -626,7 +555,7 @@ getpeersockname (int s, struct sockaddr *name, int *namelen, int pflag) int error; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (s)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } @@ -676,16 +605,12 @@ rtems_bsdnet_close (int fd) { struct socket *so; int error; - int i; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (fd)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } - i = rtems_file_descriptor_base(fd); - fdsock[i].indexFreeNext = indexFreeHead;; - indexFreeHead = i; error = soclose (so); rtems_bsdnet_semaphore_release (); if (error) { @@ -737,7 +662,7 @@ rtems_bsdnet_ioctl (int fd, unsigned32 command, void *buffer) int error; rtems_bsdnet_semaphore_obtain (); - if ((so = fdToSocket (fd)) == NULL) { + if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) { rtems_bsdnet_semaphore_release (); return -1; } -- cgit v1.2.3