Beispiel #1
0
int FDirectoryLump::FillCache()
{
	Cache = new char[LumpSize];
	FileReader *reader = NewReader();
	reader->Read(Cache, LumpSize);
	delete reader;
	RefCount = 1;
	return 1;
}
Beispiel #2
0
/*
 *----------------------------------------------------------------------
 *
 * FCGX_Accept_r --
 *
 *      Accepts a new request from the HTTP server.
 *
 * Results:
 *	0 for successful call, -1 for error.
 *
 * Side effects:
 *
 *      Finishes the request accepted by (and frees any
 *      storage allocated by) the previous call to FCGX_Accept.
 *      Creates input, output, and error streams and
 *      assigns them to *in, *out, and *err respectively.
 *      Creates a parameters data structure to be accessed
 *      via getenv(3) (if assigned to environ) or by FCGX_GetParam
 *      and assigns it to *envp.
 *
 *      DO NOT retain pointers to the envp array or any strings
 *      contained in it (e.g. to the result of calling FCGX_GetParam),
 *      since these will be freed by the next call to FCGX_Finish
 *      or FCGX_Accept.
 *
 *----------------------------------------------------------------------
 */
int FCGX_Accept_r(FCGX_Request * reqDataPtr)
{
	if (!libInitialized) {
		return -9998;
	}

	/* Finish the current request, if any. */
	FCGX_Finish_r(reqDataPtr);

	for (;;) {
		/*
		 * If a connection isn't open, accept a new connection (blocking).
		 * If an OS error occurs in accepting the connection,
		 * return -1 to the caller, who should exit.
		 */
		if (reqDataPtr->ipcFd < 0) {
			int fail_on_intr =
				reqDataPtr->flags & FCGI_FAIL_ACCEPT_ON_INTR;

			reqDataPtr->ipcFd =
				OS_Accept(reqDataPtr->listen_sock, fail_on_intr,
				webServerAddressList);
			if (reqDataPtr->ipcFd < 0) {
				return (errno > 0) ? (0 - errno) : -9999;
			}
		}
		/*
		 * A connection is open.  Read from the connection in order to
		 * get the request's role and environment.  If protocol or other
		 * errors occur, close the connection and try again.
		 */
		reqDataPtr->isBeginProcessed = FALSE;
		reqDataPtr->in = NewReader(reqDataPtr, 8192, 0);
		FillBuffProc(reqDataPtr->in);
		if (!reqDataPtr->isBeginProcessed) {
			goto TryAgain;
		}
		{
			char *roleStr;
			switch (reqDataPtr->role) {
			case FCGI_RESPONDER:
				roleStr = "FCGI_ROLE=RESPONDER";
				break;
			case FCGI_AUTHORIZER:
				roleStr = "FCGI_ROLE=AUTHORIZER";
				break;
			case FCGI_FILTER:
				roleStr = "FCGI_ROLE=FILTER";
				break;
			default:
				goto TryAgain;
			}
			reqDataPtr->paramsPtr = NewParams(30);
			PutParam(reqDataPtr->paramsPtr, StringCopy(roleStr));
		}
		SetReaderType(reqDataPtr->in, FCGI_PARAMS);
		if (ReadParams(reqDataPtr->paramsPtr, reqDataPtr->in) >= 0) {
			/*
			 * Finished reading the environment.  No errors occurred, so
			 * leave the connection-retry loop.
			 */
			break;
		}

		/*
		 * Close the connection and try again.
		 */
TryAgain:
		FCGX_Free(reqDataPtr, 1);

	}			/* for (;;) */
	/*
	 * Build the remaining data structures representing the new
	 * request and return successfully to the caller.
	 */
	SetReaderType(reqDataPtr->in, FCGI_STDIN);
	reqDataPtr->out = NewWriter(reqDataPtr, 8192, FCGI_STDOUT);
	reqDataPtr->err = NewWriter(reqDataPtr, 512, FCGI_STDERR);
	reqDataPtr->nWriters = 2;
	reqDataPtr->envp = reqDataPtr->paramsPtr->vec;
	return 0;
}