nginx-0.0.3-2004-04-08-19:58:25 import
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index c339660..abc577b 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -22,6 +22,8 @@
 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags);
 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags);
 static int ngx_kqueue_process_events(ngx_cycle_t *cycle);
+static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log,
+                                             struct kevent *kev);
 
 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle);
 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf);
@@ -443,17 +445,7 @@
 
     for (i = 0; i < events; i++) {
 
-        ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-
-                       (event_list[i].ident > 0x8000000
-                        && event_list[i].ident != (unsigned) -1) ?
-                        "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:"
-                                                                     PTR_FMT:
-                        "kevent: %d: ft:%d fl:%04X ff:%08X d:%d ud:" PTR_FMT,
-
-                        event_list[i].ident, event_list[i].filter,
-                        event_list[i].flags, event_list[i].fflags,
-                        event_list[i].data, event_list[i].udata);
+        ngx_kqueue_dump_event(cycle->log, &event_list[i]);
 
         if (event_list[i].flags & EV_ERROR) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data,
@@ -472,6 +464,10 @@
             ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);
             ev->returned_instance = instance;
 
+            if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {
+                ngx_kqueue_dump_event(ev->log, &event_list[i]);
+            }
+
             if (!ev->active || ev->instance != instance) {
 
                 /*
@@ -560,6 +556,19 @@
 }
 
 
+static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev)
+{
+    ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,
+                   (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) ?
+                    "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:"
+                                                                       PTR_FMT:
+                    "kevent: %d: ft:%d fl:%04X ff:%08X d:%d ud:" PTR_FMT,
+                    kev->ident, kev->filter,
+                    kev->flags, kev->fflags,
+                    kev->data, kev->udata);
+}
+
+
 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle)
 {
     ngx_kqueue_conf_t  *kcf;
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index ebb56ce..c5ea45d 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -35,6 +35,8 @@
 static char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd,
                                    void *conf);
 static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+static char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd,
+                                        void *conf);
 
 static void *ngx_event_create_conf(ngx_cycle_t *cycle);
 static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);
@@ -117,6 +119,13 @@
       offsetof(ngx_event_conf_t, accept_mutex_delay),
       NULL },
 
+    { ngx_string("debug_connection"),
+      NGX_EVENT_CONF|NGX_CONF_TAKE1,
+      ngx_event_debug_connection,
+      0,
+      0,
+      NULL },
+
       ngx_null_command
 };
 
@@ -517,6 +526,52 @@
 }
 
 
+static char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd,
+                                        void *conf)
+{
+#if (NGX_DEBUG)
+    ngx_event_conf_t  *ecf = conf;
+
+    in_addr_t       *addr;
+    ngx_str_t       *value;
+    struct hostent  *h;
+
+    value = cf->args->elts;
+
+    /* AF_INET only */
+
+    if (!(addr = ngx_push_array(&ecf->debug_connection))) {
+        return NGX_CONF_ERROR;
+    }
+
+    *addr = inet_addr((char *) value[1].data);
+
+    if (*addr != INADDR_NONE) {
+        return NGX_OK;
+    }
+
+    h = gethostbyname((char *) value[1].data);
+
+    if (h == NULL || h->h_addr_list[0] == NULL) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                           "host %s not found", value[1].data);
+        return NGX_CONF_ERROR;
+    }
+
+    *addr = *(in_addr_t *)(h->h_addr_list[0]);
+
+#else
+
+    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                       "\"debug_connection\" is ignored, you need to rebuild "
+                       "nginx using --with-debug option to enable it");
+
+#endif
+
+    return NGX_OK;
+}
+
+
 static void *ngx_event_create_conf(ngx_cycle_t *cycle)
 {
     ngx_event_conf_t  *ecf;
@@ -531,6 +586,11 @@
     ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC;
     ecf->name = (void *) NGX_CONF_UNSET;
 
+#if (NGX_DEBUG)
+    ngx_init_array(ecf->debug_connection, cycle->pool, 5, sizeof(in_addr_t),
+                   NGX_CONF_ERROR);
+#endif
+
     return ecf;
 }
 
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 1dcfe50..433d6cf 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -381,15 +381,19 @@
 
 
 typedef struct {
-    ngx_int_t    connections;
-    ngx_int_t    use;
+    ngx_int_t     connections;
+    ngx_int_t     use;
 
-    ngx_flag_t   multi_accept;
-    ngx_flag_t   accept_mutex;
+    ngx_flag_t    multi_accept;
+    ngx_flag_t    accept_mutex;
 
-    ngx_msec_t   accept_mutex_delay;
+    ngx_msec_t    accept_mutex_delay;
 
-    u_char      *name;
+    u_char       *name;
+
+#if (NGX_DEBUG)
+    ngx_array_t   debug_connection;
+#endif
 } ngx_event_conf_t;
 
 
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index c955bbf..70db78d 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -275,6 +275,25 @@
         ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                        "accept: fd:%d c:%d", s, c->number);
 
+#if (NGX_DEBUG)
+        {
+
+        uint32_t            *addr;
+        in_addr_t            i;
+        struct sockaddr_in  *addr_in;
+
+        addr_in = (struct sockaddr_in *) sa;
+        addr = ecf->debug_connection.elts;
+        for (i = 0; i < ecf->debug_connection.nelts; i++) {
+            if (addr[i] == addr_in->sin_addr.s_addr) {
+                log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
+                break;
+            }
+        }
+
+        }
+#endif
+
         if (ngx_add_conn) {
             if (ngx_add_conn(c) == NGX_ERROR) {
                 if (ngx_close_socket(s) == -1) {