diff options
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_syscall.c | 103 |
1 files changed, 14 insertions, 89 deletions
diff --git a/c/src/lib/libnetworking/rtems/rtems_syscall.c b/c/src/lib/libnetworking/rtems/rtems_syscall.c index 93ecd47c6f..63d34bd817 100644 --- a/c/src/lib/libnetworking/rtems/rtems_syscall.c +++ b/c/src/lib/libnetworking/rtems/rtems_syscall.c @@ -26,77 +26,6 @@ #include <net/route.h> /* - ********************************************************************* - * 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. */ static int @@ -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; } |