* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.30.18.39 2008/09/11 23:46:08 tbox Exp $ */
+/* $Id: socket.c,v 1.30.18.40 2008/09/16 17:14:35 explorer Exp $ */
/* This code uses functions which are only available on Server 2003 and
* higher, and Windows XP and higher.
LPFN_ACCEPTEX ISCAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS ISCGetAcceptExSockaddrs;
-/*
- * 0 = no debugging, 1 = write to file "socket.log" in working directory.
- */
-#define XXXMLG_DEBUG 0
-#if XXXMLG_DEBUG
-FILE *logfile = NULL;
-#endif
-
/*
* Run expensive internal consistancy checks.
*/
char msgbuf[2048];
char peerbuf[256];
va_list ap;
-#if XXXMLG_DEBUG
- char timebuf[128];
- isc_time_t now;
-#endif
-#if XXXMLG_DEBUG
- isc_time_now(&now);
- isc_time_formattimestamp(&now, timebuf, sizeof timebuf);
-#endif
-#if XXXMLG_DEBUG == 0
if (!isc_log_wouldlog(isc_lctx, level))
return;
-#endif
va_start(ap, fmt);
vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap);
isc_log_iwrite(isc_lctx, category, module, level,
msgcat, msgset, message,
"socket %p line %d: %s", sock, lineno, msgbuf);
-#if XXXMLG_DEBUG
- if (logfile)
- fprintf(logfile, "%s socket %p line %d: %s:\n",
- timebuf, sock, lineno, msgbuf);
-#endif
} else {
isc_sockaddr_format(address, peerbuf, sizeof(peerbuf));
isc_log_iwrite(isc_lctx, category, module, level,
msgcat, msgset, message,
"socket %p line %d peer %s: %s", sock, lineno,
peerbuf, msgbuf);
-#if XXXMLG_DEBUG
- if (logfile)
- fprintf(logfile, "%s socket %p line %d: %s: %s\n",
- timebuf, sock, lineno, peerbuf, msgbuf);
-#endif
}
-#if XXXMLG_DEBUG
- if (logfile)
- fflush(logfile);
-#endif
}
/*
if (maxsocks != 0)
return (ISC_R_NOTIMPLEMENTED);
-#if XXXMLG_DEBUG
- logfile = fopen("socket.log", "w");
-#endif
-
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
int i;
isc_mem_t *mctx;
-#if XXXMLG_DEBUG
- if (logfile)
- fclose(logfile);
-#endif
-
/*
* Destroy a socket manager.
*/
}
ISC_LINK_INIT(cdev, ev_link);
- /*
- * Queue io completion for an accept().
- */
- lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle,
- HEAP_ZERO_MEMORY,
- sizeof(IoCompletionInfo));
- lpo->cdev = cdev;
- lpo->request_type = SOCKET_CONNECT;
-
- sock->address = *addr;
- ISCConnectEx(sock->fd, &addr->type.sa, addr->length,
- NULL, 0, NULL, (LPOVERLAPPED)lpo);
+ if (sock->type == isc_sockettype_tcp) {
+ /*
+ * Queue io completion for an accept().
+ */
+ lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle,
+ HEAP_ZERO_MEMORY,
+ sizeof(IoCompletionInfo));
+ lpo->cdev = cdev;
+ lpo->request_type = SOCKET_CONNECT;
- /*
- * Attach to task.
- */
- isc_task_attach(task, &ntask);
- cdev->ev_sender = ntask;
+ sock->address = *addr;
+ ISCConnectEx(sock->fd, &addr->type.sa, addr->length,
+ NULL, 0, NULL, (LPOVERLAPPED)lpo);
- sock->pending_connect = 1;
- _set_state(sock, SOCK_CONNECT);
+ /*
+ * Attach to task.
+ */
+ isc_task_attach(task, &ntask);
+ cdev->ev_sender = ntask;
- /*
- * Enqueue the request.
- */
- sock->connect_ev = cdev;
- sock->pending_iocp++;
+ sock->pending_connect = 1;
+ _set_state(sock, SOCK_CONNECT);
+ /*
+ * Enqueue the request.
+ */
+ sock->connect_ev = cdev;
+ sock->pending_iocp++;
+ } else {
+ WSAConnect(sock->fd, &addr->type.sa, addr->length, NULL, NULL, NULL, NULL);
+ cdev->result = ISC_R_SUCCESS;
+ isc_task_send(task, (isc_event_t **)&cdev);
+ }
CONSISTENT(sock);
UNLOCK(&sock->lock);