Ignore:
Timestamp:
12/10/98 23:31:54 (24 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
cdd26ca2
Parents:
6c980128
Message:

Merged Eric Norum's select patch that was based on 4.0 and resolved
all conflicts.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libnetworking/rtems/rtems_syscall.c

    r6c980128 rcca4400  
    2525#include <net/if.h>
    2626#include <net/route.h>
    27 
    28 /*
    29  *********************************************************************
    30  *              Map RTEMS file descriptor to BSD socket              *
    31  *********************************************************************
    32  */
    33 struct fdsock {
    34         int             indexFreeNext;
    35         struct socket   *sock;
    36 };
    37 static struct fdsock *fdsock;
    38 static int fdsockCount;
    39 static int indexFreeHead = -1;
    40 
    41 /*
    42  * Convert an RTEMS file descriptor to a BSD socket pointer.
    43  */
    44 static struct socket *
    45 fdToSocket (int fd)
    46 {
    47         int i;
    48         struct socket *s;
    49 
    50         if ((fd < 0)
    51          || (rtems_file_descriptor_type(fd) != RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET)
    52          || ((i = rtems_file_descriptor_base(fd)) >= fdsockCount)
    53          || ((s = fdsock[i].sock) == NULL)) {
    54                 errno = EBADF;
    55                 return NULL;
    56         }
    57         return s;
    58 }
    59 
    60 /*
    61  * Enlarge the size of the file-descritor/socket pointer map.
    62  */
    63 static int
    64 enlargeFdMap (void)
    65 {
    66         struct fdsock *nfdsock;
    67         int i;
    68 
    69         nfdsock = realloc (fdsock, sizeof *fdsock * (fdsockCount + 20));
    70         if (nfdsock == NULL) {
    71                 errno = ENFILE;
    72                 return 0;
    73         }
    74         fdsock = nfdsock;
    75         for (i = fdsockCount, fdsockCount += 20 ; i < fdsockCount ; i++) {
    76                 fdsock[i].sock = NULL;
    77                 fdsock[i].indexFreeNext = indexFreeHead;
    78                 indexFreeHead = i;
    79         }
    80         return 1;
    81 }
    82 
    83 /*
    84  * Create a file descriptor for a new socket
    85  */
    86 static int
    87 makeFd (struct socket *s)
    88 {
    89         int i;
    90 
    91         if ((indexFreeHead < 0) && !enlargeFdMap ())
    92                 return -1;
    93         i = indexFreeHead;
    94         indexFreeHead = fdsock[i].indexFreeNext;
    95         fdsock[i].sock = s;
    96         return rtems_make_file_descriptor(i,RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET);
    97 }
    9827
    9928/*
     
    12958socket (int domain, int type, int protocol)
    13059{
    131         int fd = -1;
     60        int fd;
    13261        int error;
    13362        struct socket *so;
     
    13665        error = socreate(domain, &so, type, protocol, NULL);
    13766        if (error == 0) {
    138                 fd = makeFd (so);
     67                fd = rtems_bsdnet_makeFdForSocket (so);
    13968                if (fd < 0)
    14069                        soclose (so);
     
    15786
    15887        rtems_bsdnet_semaphore_obtain ();
    159         if ((so = fdToSocket (s)) != NULL) {
     88        if ((so = rtems_bsdnet_fdToSocket (s)) != NULL) {
    16089                error = sockargstombuf (&nam, name, namelen, MT_SONAME);
    16190                if (error == 0) {
     
    184113
    185114        rtems_bsdnet_semaphore_obtain ();
    186         if ((so = fdToSocket (s)) == NULL) {
     115        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    187116                rtems_bsdnet_semaphore_release ();
    188117                return -1;
     
    234163
    235164        rtems_bsdnet_semaphore_obtain ();
    236         if ((so = fdToSocket (s)) != NULL) {
     165        if ((so = rtems_bsdnet_fdToSocket (s)) != NULL) {
    237166                error = solisten (so, backlog);
    238167                if (error == 0)
     
    253182
    254183        rtems_bsdnet_semaphore_obtain ();
    255         if ((head = fdToSocket (s)) == NULL) {
     184        if ((head = rtems_bsdnet_fdToSocket (s)) == NULL) {
    256185                rtems_bsdnet_semaphore_release ();
    257186                return -1;
     
    285214        head->so_qlen--;
    286215
    287         fd = makeFd (so);
     216        fd = rtems_bsdnet_makeFdForSocket (so);
    288217        if (fd < 0) {
    289218                TAILQ_INSERT_HEAD(&head->so_comp, so, so_list);
     
    326255
    327256        rtems_bsdnet_semaphore_obtain ();
    328         if ((so = fdToSocket (s)) == NULL) {
     257        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    329258                rtems_bsdnet_semaphore_release ();
    330259                return -1;
     
    429358
    430359        rtems_bsdnet_semaphore_obtain ();
    431         if ((so = fdToSocket (s)) == NULL) {
     360        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    432361                rtems_bsdnet_semaphore_release ();
    433362                return -1;
     
    548477
    549478        rtems_bsdnet_semaphore_obtain ();
    550         if ((so = fdToSocket (s)) == NULL) {
     479        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    551480                rtems_bsdnet_semaphore_release ();
    552481                return -1;
     
    585514
    586515        rtems_bsdnet_semaphore_obtain ();
    587         if ((so = fdToSocket (s)) == NULL) {
     516        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    588517                rtems_bsdnet_semaphore_release ();
    589518                return -1;
     
    627556
    628557        rtems_bsdnet_semaphore_obtain ();
    629         if ((so = fdToSocket (s)) == NULL) {
     558        if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {
    630559                rtems_bsdnet_semaphore_release ();
    631560                return -1;
     
    677606        struct socket *so;
    678607        int error;
    679         int i;
    680 
    681         rtems_bsdnet_semaphore_obtain ();
    682         if ((so = fdToSocket (fd)) == NULL) {
    683                 rtems_bsdnet_semaphore_release ();
    684                 return -1;
    685         }
    686         i = rtems_file_descriptor_base(fd);
    687         fdsock[i].indexFreeNext = indexFreeHead;;
    688         indexFreeHead = i;
     608
     609        rtems_bsdnet_semaphore_obtain ();
     610        if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
     611                rtems_bsdnet_semaphore_release ();
     612                return -1;
     613        }
    689614        error = soclose (so);
    690615        rtems_bsdnet_semaphore_release ();
     
    738663
    739664        rtems_bsdnet_semaphore_obtain ();
    740         if ((so = fdToSocket (fd)) == NULL) {
     665        if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
    741666                rtems_bsdnet_semaphore_release ();
    742667                return -1;
Note: See TracChangeset for help on using the changeset viewer.