⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_win32.c

📁 FastCGI,语言无关的、可伸缩架构的CGI开放扩展
💻 C
📖 第 1 页 / 共 4 页
字号:
     * the thread doing I/O on standard in.  This port will carry read     * and possibly thread termination requests to the StdinThread.     */    if (hStdinCompPort == INVALID_HANDLE_VALUE) {	hStdinCompPort = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL,					      0, 1);	if(hStdinCompPort == INVALID_HANDLE_VALUE) {	    printf("<H2>OS_LibInit Failed CreateIoCompletionPort: STDIN!  ERROR: %d</H2>\r\n\r\n",	       GetLastError());	    return -1;	}    }    /*     * Create the thread that will read stdin if the CONTENT_LENGTH     * is non-zero.     */    if((cLenPtr = getenv("CONTENT_LENGTH")) != NULL &&       atoi(cLenPtr) > 0) {        hStdinThread = (HANDLE) _beginthread(StdinThread, 0, NULL);	if (hStdinThread == (HANDLE) -1) {	    printf("<H2>OS_LibInit Failed to create STDIN thread!  ERROR: %d</H2>\r\n\r\n",		   GetLastError());	    return -1;        }    }    /*     * STDOUT will be used synchronously.     *     * XXX: May want to convert this so that it could be used for OVERLAPPED     *      I/O later.  If so, model it after the Stdin I/O as stdout is     *      also incapable of async I/O on some servers.     */    stdioHandles[STDOUT_FILENO] = GetStdHandle(STD_OUTPUT_HANDLE);    if(!SetHandleInformation(stdioHandles[STDOUT_FILENO],			     HANDLE_FLAG_INHERIT, FALSE)) {        DebugBreak();	exit(99);    }    if ((fakeFd = Win32NewDescriptor(FD_PIPE_SYNC,				     (int)stdioHandles[STDOUT_FILENO],				     STDOUT_FILENO)) == -1) {        return -1;    } else {        /*	 * Set stdout equal to our pseudo FD	 */	stdioFds[STDOUT_FILENO] = fakeFd;    }    stdioHandles[STDERR_FILENO] = GetStdHandle(STD_ERROR_HANDLE);    if(!SetHandleInformation(stdioHandles[STDERR_FILENO],			     HANDLE_FLAG_INHERIT, FALSE)) {        DebugBreak();	exit(99);    }    if ((fakeFd = Win32NewDescriptor(FD_PIPE_SYNC,				     (int)stdioHandles[STDERR_FILENO],				     STDERR_FILENO)) == -1) {        return -1;    } else {        /*	 * Set stderr equal to our pseudo FD	 */	stdioFds[STDERR_FILENO] = fakeFd;    }    return 0;}/* *-------------------------------------------------------------- * * OS_LibShutdown -- * *	Shutdown the OS library. * * Results: *	None. * * Side effects: *	Memory freed, handles closed. * *-------------------------------------------------------------- */void OS_LibShutdown(){    if (hIoCompPort != INVALID_HANDLE_VALUE)     {        CloseHandle(hIoCompPort);        hIoCompPort = INVALID_HANDLE_VALUE;    }    if (hStdinCompPort != INVALID_HANDLE_VALUE)     {        CloseHandle(hStdinCompPort);        hStdinCompPort = INVALID_HANDLE_VALUE;    }    if (acceptMutex != INVALID_HANDLE_VALUE)     {        ReleaseMutex(acceptMutex);    }    DisconnectNamedPipe(hListen);    CancelIo(hListen);    WSACleanup();}/* *-------------------------------------------------------------- * * Win32FreeDescriptor -- * *	Free I/O descriptor entry in fdTable. * * Results: *	Frees I/O descriptor entry in fdTable. * * Side effects: *	None. * *-------------------------------------------------------------- */static void Win32FreeDescriptor(int fd){    /* Catch it if fd is a bogus value */    ASSERT((fd >= 0) && (fd < WIN32_OPEN_MAX));    EnterCriticalSection(&fdTableCritical);        if (fdTable[fd].type != FD_UNUSED)    {           switch (fdTable[fd].type)         {	    case FD_FILE_SYNC:	    case FD_FILE_ASYNC:        	        /* Free file path string */	        ASSERT(fdTable[fd].path != NULL);	        free(fdTable[fd].path);	        fdTable[fd].path = NULL;	        break;	    default:	        break;        }        ASSERT(fdTable[fd].path == NULL);        fdTable[fd].type = FD_UNUSED;        fdTable[fd].path = NULL;        fdTable[fd].Errno = NO_ERROR;        fdTable[fd].offsetHighPtr = fdTable[fd].offsetLowPtr = NULL;        if (fdTable[fd].hMapMutex != NULL)         {            CloseHandle(fdTable[fd].hMapMutex);            fdTable[fd].hMapMutex = NULL;        }    }    LeaveCriticalSection(&fdTableCritical);    return;}static short getPort(const char * bindPath){    short port = 0;    char * p = strchr(bindPath, ':');    if (p && *++p)     {        char buf[6];        strncpy(buf, p, 6);        buf[5] = '\0';        port = (short) atoi(buf);    }     return port;}/* * OS_CreateLocalIpcFd -- * *   This procedure is responsible for creating the listener pipe *   on Windows NT for local process communication.  It will create a *   named pipe and return a file descriptor to it to the caller. * * Results: *      Listener pipe created.  This call returns either a valid *      pseudo file descriptor or -1 on error. * * Side effects: *      Listener pipe and IPC address are stored in the FCGI info *         structure. *      'errno' will set on errors (-1 is returned). * *---------------------------------------------------------------------- */int OS_CreateLocalIpcFd(const char *bindPath, int backlog){    int pseudoFd = -1;    short port = getPort(bindPath);    if (acceptMutex == INVALID_HANDLE_VALUE)    {        acceptMutex = CreateMutex(NULL, FALSE, NULL);        if (acceptMutex == NULL) return -2;        if (! SetHandleInformation(acceptMutex, HANDLE_FLAG_INHERIT, TRUE)) return -3;    }    // There's nothing to be gained (at the moment) by a shutdown Event        if (port && *bindPath != ':' && strncmp(bindPath, LOCALHOST, strlen(LOCALHOST)))    {	    fprintf(stderr, "To start a service on a TCP port can not "			    "specify a host name.\n"			    "You should either use \"localhost:<port>\" or "			    " just use \":<port>.\"\n");	    exit(1);    }    listenType = (port) ? FD_SOCKET_SYNC : FD_PIPE_ASYNC;        if (port)     {        SOCKET listenSock;        struct  sockaddr_in	sockAddr;        int sockLen = sizeof(sockAddr);                memset(&sockAddr, 0, sizeof(sockAddr));        sockAddr.sin_family = AF_INET;        sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);        sockAddr.sin_port = htons(port);        listenSock = socket(AF_INET, SOCK_STREAM, 0);        if (listenSock == INVALID_SOCKET)         {	        return -4;	    }	    if (bind(listenSock, (struct sockaddr *) &sockAddr, sockLen)  )        {	        return -12;	    }	    if (listen(listenSock, backlog))         {	        return -5;	    }        pseudoFd = Win32NewDescriptor(listenType, listenSock, -1);                if (pseudoFd == -1)         {            closesocket(listenSock);            return -6;        }        hListen = (HANDLE) listenSock;            }    else    {        HANDLE hListenPipe = INVALID_HANDLE_VALUE;        char *pipePath = malloc(strlen(bindPathPrefix) + strlen(bindPath) + 1);                if (! pipePath)         {            return -7;        }        strcpy(pipePath, bindPathPrefix);        strcat(pipePath, bindPath);        hListenPipe = CreateNamedPipe(pipePath,		        PIPE_ACCESS_DUPLEX,		        PIPE_TYPE_BYTE | PIPE_WAIT | PIPE_READMODE_BYTE,		        PIPE_UNLIMITED_INSTANCES,		        4096, 4096, 0, NULL);                free(pipePath);        if (hListenPipe == INVALID_HANDLE_VALUE)        {            return -8;        }        if (! SetHandleInformation(hListenPipe, HANDLE_FLAG_INHERIT, TRUE))        {            return -9;        }        pseudoFd = Win32NewDescriptor(listenType, (int) hListenPipe, -1);                if (pseudoFd == -1)         {            CloseHandle(hListenPipe);            return -10;        }        hListen = (HANDLE) hListenPipe;    }    return pseudoFd;}/* *---------------------------------------------------------------------- * * OS_FcgiConnect -- * *	Create the pipe pathname connect to the remote application if *      possible. * * Results: *      -1 if fail or a valid handle if connection succeeds. * * Side effects: *      Remote connection established. * *---------------------------------------------------------------------- */int OS_FcgiConnect(char *bindPath){    short port = getPort(bindPath);    int pseudoFd = -1;        if (port)     {	    struct hostent *hp;        char *host = NULL;        struct sockaddr_in sockAddr;        int sockLen = sizeof(sockAddr);        SOCKET sock;                if (*bindPath != ':')        {            char * p = strchr(bindPath, ':');            int len = p - bindPath + 1;            host = malloc(len);            strncpy(host, bindPath, len);            host[len] = '\0';        }                hp = gethostbyname(host ? host : LOCALHOST);        if (host)        {            free(host);        }	    if (hp == NULL)         {	        fprintf(stderr, "Unknown host: %s\n", bindPath);	        return -1;	    }               memset(&sockAddr, 0, sizeof(sockAddr));        sockAddr.sin_family = AF_INET;	    memcpy(&sockAddr.sin_addr, hp->h_addr, hp->h_length);	    sockAddr.sin_port = htons(port);	    sock = socket(AF_INET, SOCK_STREAM, 0);        if (sock == INVALID_SOCKET)        {            return -1;        }	    if (! connect(sock, (struct sockaddr *) &sockAddr, sockLen))         {	        closesocket(sock);	        return -1;	    }	    pseudoFd = Win32NewDescriptor(FD_SOCKET_SYNC, sock, -1);	    if (pseudoFd == -1)         {	        closesocket(sock);            return -1;	    }    }    else    {        char *pipePath = malloc(strlen(bindPathPrefix) + strlen(bindPath) + 1);        HANDLE hPipe;                if (! pipePath)         {            return -1;        }        strcpy(pipePath, bindPathPrefix);        strcat(pipePath, bindPath);        hPipe = CreateFile(pipePath,			    GENERIC_WRITE | GENERIC_READ,			    FILE_SHARE_READ | FILE_SHARE_WRITE,			    NULL,			    OPEN_EXISTING,			    FILE_FLAG_OVERLAPPED,			    NULL);        free(pipePath);        if( hPipe == INVALID_HANDLE_VALUE)         {            return -1;        }        pseudoFd = Win32NewDescriptor(FD_PIPE_ASYNC, (int) hPipe, -1);                if (pseudoFd == -1)         {            CloseHandle(hPipe);            return -1;        }                 /*	     * Set stdin equal to our pseudo FD and create the I/O completion	     * port to be used for async I/O.	     */        if (! CreateIoCompletionPort(hPipe, hIoCompPort, pseudoFd, 1))        {	        Win32FreeDescriptor(pseudoFd);	        CloseHandle(hPipe);	        return -1;	    }    }    return pseudoFd;    }/* *-------------------------------------------------------------- * * OS_Read -- * *	Pass through to the appropriate NT read function. * * Results: *	Returns number of byes read. Mimics unix read:. *		n bytes read, 0 or -1 failure: errno contains actual error * * Side effects: *	None. * *-------------------------------------------------------------- */int OS_Read(int fd, char * buf, size_t len){    DWORD bytesRead;    int ret = -1;    ASSERT((fd >= 0) && (fd < WIN32_OPEN_MAX));    if (shutdownNow) return -1;    switch (fdTable[fd].type)     {	case FD_FILE_SYNC:	case FD_FILE_ASYNC:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -