From: Vlad S. <ser...@us...> - 2005-11-12 18:30:55
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14311/nsd Modified Files: driver.c info.c sock.c Log Message: Index: info.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/info.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** info.c 7 Nov 2005 14:04:01 -0000 1.9 --- info.c 12 Nov 2005 18:30:40 -0000 1.10 *************** *** 498,505 **** enum { IAddressIdx, IArgv0Idx, IBoottimeIdx, IBuilddateIdx, ICallbacksIdx, ! IConfigIdx, IHomeIdx, hostINameIdx, ILocksIdx, ILogIdx, IMajorIdx, IMinorIdx, INameIdx, INsdIdx, IPageRootIdx, IPatchLevelIdx, IPidIdx, IPlatformIdx, IPoolsIdx, IScheduledIdx, IServerIdx, IServersIdx, ! sockICallbacksIdx, ITagIdx, ITclLibIdx, IThreadsIdx, IUptimeIdx, IVersionIdx, IWinntIdx, IFiltersIdx, ITracesIdx, IRequestProcsIdx, IUrl2FileIdx --- 498,505 ---- enum { IAddressIdx, IArgv0Idx, IBoottimeIdx, IBuilddateIdx, ICallbacksIdx, ! IConfigIdx, IHomeIdx, IHostNameIdx, ILocksIdx, ILogIdx, IMajorIdx, IMinorIdx, INameIdx, INsdIdx, IPageRootIdx, IPatchLevelIdx, IPidIdx, IPlatformIdx, IPoolsIdx, IScheduledIdx, IServerIdx, IServersIdx, ! ISockCallbacksIdx, ITagIdx, ITclLibIdx, IThreadsIdx, IUptimeIdx, IVersionIdx, IWinntIdx, IFiltersIdx, ITracesIdx, IRequestProcsIdx, IUrl2FileIdx *************** *** 539,546 **** return TCL_OK; ! case sockICallbacksIdx: NsGetSockCallbacks(&ds); Tcl_DStringResult(interp, &ds); ! break; case IScheduledIdx: --- 539,546 ---- return TCL_OK; ! case ISockCallbacksIdx: NsGetSockCallbacks(&ds); Tcl_DStringResult(interp, &ds); ! return TCL_OK; case IScheduledIdx: *************** *** 575,579 **** return TCL_OK; ! case hostINameIdx: Tcl_SetResult(interp, Ns_InfoHostname(), TCL_STATIC); return TCL_OK; --- 575,579 ---- return TCL_OK; ! case IHostNameIdx: Tcl_SetResult(interp, Ns_InfoHostname(), TCL_STATIC); return TCL_OK; Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** driver.c 16 Oct 2005 08:52:48 -0000 1.24 --- driver.c 12 Nov 2005 18:30:40 -0000 1.25 *************** *** 89,92 **** --- 89,93 ---- static Sock *firstClosePtr; /* First conn ready for graceful close. */ static int SockRead(Sock *sockPtr); + static int SockParse(Sock *sockPtr); static void SockPoll(Sock *sockPtr, Ns_Time *timeoutPtr); static void SockTimeout(Sock *sockPtr, Ns_Time *nowPtr, int timeout); *************** *** 1084,1088 **** return 1; ! // return status; } --- 1085,1136 ---- return 1; ! } ! ! /* ! *---------------------------------------------------------------------- ! * ! * SetRequest -- ! * ! * Allocates new request struct for the given socket, if data is specified, ! * it becomes parsed request struct, i.e. should be in the form: METHOD URL PROTO ! * ! * Results: ! * None. ! * ! * Side effects: ! * None ! * ! *---------------------------------------------------------------------- ! */ ! ! static Request* ! SetRequest(Sock *sockPtr, char *data) ! { ! Request *reqPtr; ! ! Ns_MutexLock(&reqLock); ! reqPtr = firstReqPtr; ! if (reqPtr != NULL) { ! firstReqPtr = reqPtr->nextPtr; ! } ! Ns_MutexUnlock(&reqLock); ! if (reqPtr == NULL) { ! reqPtr = ns_malloc(sizeof(Request)); ! Tcl_DStringInit(&reqPtr->buffer); ! reqPtr->headers = Ns_SetCreate(NULL); ! reqPtr->request = NULL; ! reqPtr->next = reqPtr->content = NULL; ! reqPtr->length = reqPtr->avail = 0; ! reqPtr->coff = reqPtr->woff = reqPtr->roff = 0; ! reqPtr->leadblanks = 0; ! } ! sockPtr->reqPtr = reqPtr; ! reqPtr->port = ntohs(sockPtr->sa.sin_port); ! strcpy(reqPtr->peer, ns_inet_ntoa(sockPtr->sa.sin_addr)); ! ! if (data) { ! sockPtr->reqPtr->request = Ns_ParseRequest(data); ! } ! return reqPtr; } *************** *** 1365,1392 **** Request *reqPtr; Tcl_DString *bufPtr; ! char *s, *e, save, tbuf[4096]; ! int cnt, len, nread, n; reqPtr = sockPtr->reqPtr; if (reqPtr == NULL) { ! Ns_MutexLock(&reqLock); ! reqPtr = firstReqPtr; ! if (reqPtr != NULL) { ! firstReqPtr = reqPtr->nextPtr; ! } ! Ns_MutexUnlock(&reqLock); ! if (reqPtr == NULL) { ! reqPtr = ns_malloc(sizeof(Request)); ! Tcl_DStringInit(&reqPtr->buffer); ! reqPtr->headers = Ns_SetCreate(NULL); ! reqPtr->request = NULL; ! reqPtr->next = reqPtr->content = NULL; ! reqPtr->length = reqPtr->avail = 0; ! reqPtr->coff = reqPtr->woff = reqPtr->roff = 0; ! reqPtr->leadblanks = 0; ! } ! sockPtr->reqPtr = reqPtr; ! reqPtr->port = ntohs(sockPtr->sa.sin_port); ! strcpy(reqPtr->peer, ns_inet_ntoa(sockPtr->sa.sin_addr)); } --- 1413,1422 ---- Request *reqPtr; Tcl_DString *bufPtr; ! char tbuf[4096]; ! int len, nread, n; reqPtr = sockPtr->reqPtr; if (reqPtr == NULL) { ! reqPtr = SetRequest(sockPtr, 0); } *************** *** 1459,1463 **** --- 1489,1526 ---- reqPtr->woff += n; reqPtr->avail += n; + + return SockParse(sockPtr); + } + + /*---------------------------------------------------------------------- + * + * SockParse -- + * + * Construct the given conn by parsing input buffer until end of + * headers. Return NS_SOCK_READY when finnished parsing. + * + * Results: + * NS_SOCK_READY: Conn is ready for processing. + * NS_SOCK_MORE: More input is required. + * NS_SOCK_ERROR: Malformed request. + * + * Side effects: + * An Ns_Request and/or Ns_Set may be allocated. + * Ns_Conn buffer management offsets updated. + * + *---------------------------------------------------------------------- + */ + + static int + SockParse(Sock *sockPtr) + { + Request *reqPtr; + Tcl_DString *bufPtr; + char *s, *e, save; + int cnt; + reqPtr = sockPtr->reqPtr; + bufPtr = &reqPtr->buffer; + /* * Scan lines until start of content. Index: sock.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/sock.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** sock.c 13 Jun 2005 06:14:26 -0000 1.4 --- sock.c 12 Nov 2005 18:30:40 -0000 1.5 *************** *** 50,53 **** --- 50,122 ---- static SOCKET SockSetup(SOCKET sock); + static int + SockRecv(SOCKET sock, struct iovec *bufs, int nbufs) + { + #ifdef _WIN32 + int n, flags; + + flags = 0; + if (WSARecv(sock, (LPWSABUF)bufs, nbufs, &n, &flags, NULL, NULL) != 0) { + n = -1; + } + return n; + #else + struct msghdr msg; + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = bufs; + msg.msg_iovlen = nbufs; + return recvmsg(sock, &msg, 0); + #endif + } + + + static int + SockSend(SOCKET sock, struct iovec *bufs, int nbufs) + { + #ifdef _WIN32 + int n; + + if (WSASend(sock, (LPWSABUF)bufs, nbufs, &n, 0, NULL, NULL) != 0) { + n = -1; + } + return n; + #else + struct msghdr msg; + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = bufs; + msg.msg_iovlen = nbufs; + return sendmsg(sock, &msg, 0); + #endif + } + + int + Ns_SockRecvBufs(SOCKET sock, struct iovec *bufs, int nbufs, int timeout) + { + int n; + + n = SockRecv(sock, bufs, nbufs); + if (n < 0 + && ns_sockerrno == EWOULDBLOCK + && Ns_SockWait(sock, NS_SOCK_READ, timeout) == NS_OK) { + n = SockRecv(sock, bufs, nbufs); + } + return n; + } + + Ns_SockSendBufs(SOCKET sock, struct iovec *bufs, int nbufs, int timeout) + { + int n; + + n = SockSend(sock, bufs, nbufs); + if (n < 0 + && ns_sockerrno == EWOULDBLOCK + && Ns_SockWait(sock, NS_SOCK_WRITE, timeout) == NS_OK) { + n = SockSend(sock, bufs, nbufs); + } + return n; + } + /* |