net-snmp 5.7
large_fd_set.h
Go to the documentation of this file.
00001 
00008 #ifndef LARGE_FD_SET_H
00009 #define LARGE_FD_SET_H
00010 
00011 
00012 #include <net-snmp/net-snmp-config.h>
00013 #include <net-snmp/types.h>
00014 
00015 #ifdef HAVE_SYS_SELECT_H
00016 #include <sys/select.h>
00017 #endif
00018 
00019 #if defined(HAVE_WINSOCK_H) && ! defined(_WINSOCKAPI_) && ! defined(_WINSOCK_H)
00020 #error <winsock.h> or <winsock2.h> must have been included before this file.
00021 #endif
00022 
00023 
00024 #ifdef __cplusplus
00025 extern "C" {
00026 #endif
00027 
00028 
00029 
00034 #define NETSNMP_LARGE_FD_SET(fd, fdset) \
00035                     netsnmp_large_fd_setfd(fd, fdset)
00036 
00042 #define NETSNMP_LARGE_FD_CLR(fd, fdset) \
00043                     netsnmp_large_fd_clr(fd, fdset)
00044 
00049 #define NETSNMP_LARGE_FD_ISSET(fd, fdset) \
00050                     netsnmp_large_fd_is_set(fd, fdset)
00051 
00052 #if ! defined(cygwin) && defined(HAVE_WINSOCK_H)
00053 
00055 #define NETSNMP_FD_SET_BYTES(setsize) (sizeof(fd_set) + sizeof(SOCKET) * (setsize - FD_SETSIZE))
00056 
00058 #define NETSNMP_LARGE_FD_ZERO(fdset) \
00059     do { (fdset)->lfs_setptr->fd_count = 0; } while(0)
00060 
00061 
00062 NETSNMP_IMPORT
00063 void   netsnmp_large_fd_setfd( SOCKET fd, netsnmp_large_fd_set *fdset);
00064 NETSNMP_IMPORT
00065 void   netsnmp_large_fd_clr(   SOCKET fd, netsnmp_large_fd_set *fdset);
00066 NETSNMP_IMPORT
00067 int    netsnmp_large_fd_is_set(SOCKET fd, netsnmp_large_fd_set *fdset);
00068 
00069 #else
00070 
00077 #define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits)
00078 
00080 #define NETSNMP_BITS_PER_FD_MASK (8 * NETSNMP_FD_MASK_SIZE)
00081 
00083 #define NETSNMP_FD_SET_ELEM_COUNT(setsize) \
00084     (setsize + NETSNMP_BITS_PER_FD_MASK - 1) / NETSNMP_BITS_PER_FD_MASK
00085 
00087 #define NETSNMP_FD_SET_BYTES(setsize) \
00088     (NETSNMP_FD_SET_ELEM_COUNT(setsize) * NETSNMP_FD_MASK_SIZE)
00089 
00091 #define NETSNMP_LARGE_FD_ZERO(fdset)                       \
00092   do {                                                     \
00093     int __i;                                               \
00094     fd_set *__arr = &(fdset)->lfs_set;                     \
00095     __i = NETSNMP_FD_SET_ELEM_COUNT((fdset)->lfs_setsize); \
00096     for ( ; __i > 0; __i--)                                \
00097       __arr->fds_bits[__i - 1] = 0;                        \
00098   } while (0)
00099 
00100 
00101 void   netsnmp_large_fd_setfd( int fd, netsnmp_large_fd_set *fdset);
00102 void   netsnmp_large_fd_clr(   int fd, netsnmp_large_fd_set *fdset);
00103 int    netsnmp_large_fd_is_set(int fd, netsnmp_large_fd_set *fdset);
00104 
00105 #endif
00106 
00115 NETSNMP_IMPORT
00116 void   netsnmp_large_fd_set_init(   netsnmp_large_fd_set *fdset, int setsize);
00117 
00122 void   netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize);
00123 
00132 NETSNMP_IMPORT
00133 int    netsnmp_large_fd_set_select(int numfds, netsnmp_large_fd_set *readfds,
00134                             netsnmp_large_fd_set *writefds,
00135                             netsnmp_large_fd_set *exceptfds,
00136                             struct timeval *timeout);
00137 
00139 NETSNMP_IMPORT
00140 void   netsnmp_large_fd_set_cleanup(netsnmp_large_fd_set *fdset);
00141 
00147 void   netsnmp_copy_fd_set_to_large_fd_set(netsnmp_large_fd_set *dst,
00148                                                    const fd_set *src);
00149 
00156 int    netsnmp_copy_large_fd_set_to_fd_set(              fd_set *dst,
00157                                      const netsnmp_large_fd_set *src);
00158 
00159 #ifdef __cplusplus
00160 }
00161 #endif
00162 
00163 
00164 #endif /* LARGE_FD_SET_H */