123 offsetof (
struct MHD_IPCount,
139 struct MHD_IPCount *key)
146 if (
sizeof (
struct sockaddr_in) == addrlen)
148 const struct sockaddr_in *addr4 = (
const struct sockaddr_in*) addr;
150 key->family = AF_INET;
151 memcpy (&key->addr.ipv4,
153 sizeof(addr4->sin_addr));
159 if (
sizeof (
struct sockaddr_in6) == addrlen)
161 const struct sockaddr_in6 *addr6 = (
const struct sockaddr_in6*) addr;
163 key->family = AF_INET6;
164 memcpy (&key->addr.ipv6,
166 sizeof(addr6->sin6_addr));
189 const struct sockaddr *addr,
192 struct MHD_IPCount *key;
202 if (
NULL == (key = malloc (
sizeof(*key))))
223 MHD_SC_IP_COUNTER_FAILURE,
224 _ (
"Failed to add IP connection count node.\n"));
234 key = (
struct MHD_IPCount *) node;
256 const struct sockaddr *addr,
259 struct MHD_IPCount search_key;
260 struct MHD_IPCount *found_key;
282 MHD_PANIC (
_ (
"Failed to find previously-added IP address.\n"));
284 found_key = (
struct MHD_IPCount *) *nodep;
286 if (0 == found_key->count)
288 MHD_PANIC (
_ (
"Previously-added IP address had counter of zero.\n"));
291 if (0 == --found_key->count)
static void MHD_ip_count_unlock(struct MHD_Daemon *daemon)
static int MHD_ip_addr_compare(const void *a1, const void *a2)
static int MHD_ip_addr_to_key(const struct sockaddr *addr, socklen_t addrlen, struct MHD_IPCount *key)
static void MHD_ip_count_lock(struct MHD_Daemon *daemon)
int MHD_ip_limit_add(struct MHD_Daemon *daemon, const struct sockaddr *addr, socklen_t addrlen)
void MHD_ip_limit_del(struct MHD_Daemon *daemon, const struct sockaddr *addr, socklen_t addrlen)
static struct MHD_Daemon * get_master(struct MHD_Daemon *daemon)
counting of connections per IP
#define MHD_mutex_unlock_chk_(pmutex)
#define MHD_mutex_lock_chk_(pmutex)
void * tsearch(const void *vkey, void **vrootp, int(*compar)(const void *, const void *))
void * tfind(const void *vkey, void *const *vrootp, int(*compar)(const void *, const void *))
void * tdelete(const void *__restrict vkey, void **__restrict vrootp, int(*compar)(const void *, const void *))
internal shared structures
MHD_mutex_ per_ip_connection_mutex
void * per_ip_connection_count
unsigned int ip_connection_limit
struct MHD_Daemon * master