예제 #1
0
파일: os.cpp 프로젝트: embedthis/appweb-2
int MprCmd::makeStdio()
{
	char	path[MPR_MAX_FNAME];
	int		i, fdRead, fdWrite;

	for (i = 0; i < MPR_CMD_MAX_FD; i++) {
		mprMakeTempFileName(path, sizeof(path), 0);
		files.name[i] = mprStrdup(path);

		fdWrite = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
		fdRead = open(path, O_RDONLY);
		if (fdRead < 0 || fdWrite < 0) {
			mprError(MPR_L, MPR_LOG, "Can't create stdio files\n");
			return -1;
		}
		if (i == MPR_CMD_IN) {
			files.fd[i] = fdRead;
			files.clientFd[i] = fdWrite;
		} else {
			files.fd[i] = fdWrite;
			files.clientFd[i] = fdRead;
		}
		mprLog(7, log, "makeStdio: file %s handles[%d] read %d, write %d\n", files.name[i], i, fdRead, fdWrite);
	}
	return 0;
}
예제 #2
0
static int updatePassFile(char *passFile)
{
	User	*up;
	char	tempFile[MPR_MAX_FNAME];
	int		fd;

	mprMakeTempFileName(tempFile, sizeof(tempFile), "httpPass", 1);
	fd = open(tempFile, O_CREAT | O_TRUNC | O_WRONLY | O_TEXT, 0664);
	if (fd < 0) {
		mprError(MPR_L, MPR_USER, "Can't open %s\n", tempFile);
		return MPR_ERR_CANT_OPEN;
	}
	up = (User*) users.getFirst();
	while (up) {
		if (mprFprintf(fd, "%d: %s: %s: %s\n", up->getEnabled(), up->getName(), 
				up->getRealm(), up->getPassword()) < 0) {
			mprError(MPR_L, MPR_USER, "Can't write to %s\n", tempFile);
			return MPR_ERR_CANT_WRITE;
		}
		up = (User*) users.getNext(up);
	}
	close(fd);
	unlink(passFile);
	if (rename(tempFile, passFile) < 0) {
		mprError(MPR_L, MPR_USER, "Can't rename %s to %s\n", tempFile, 
			passFile);
		return MPR_ERR_CANT_WRITE;
	}
	return 0;
}
예제 #3
0
파일: os.cpp 프로젝트: OPSF/uClinux
int MprCmd::makeStdioFiles(char *prefix, int fileFlags)
{
	SECURITY_ATTRIBUTES	clientAtt, serverAtt, *att;
	HANDLE				fileHandle;
	char				path[MPR_MAX_FNAME];
	int					i, fdRead, fdWrite;

	memset(&clientAtt, 0, sizeof(clientAtt));
	clientAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
	clientAtt.bInheritHandle = TRUE;

	memset(&serverAtt, 0, sizeof(serverAtt));
	serverAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
	serverAtt.bInheritHandle = FALSE;

	for (i = 0; i < MPR_CMD_MAX_FD - 1; i++) {
		if ((fileFlags & (1 << (i + MPR_CMD_FD_SHIFT))) == 0) {
			continue;
		}

		mprMakeTempFileName(path, sizeof(path), prefix, 1);
		files.name[i] = mprStrdup(path);

		att = (i != MPR_CMD_IN) ? &clientAtt : &serverAtt;
		fileHandle = CreateFile(path, GENERIC_WRITE, 
			FILE_SHARE_READ | FILE_SHARE_WRITE, att, 
			OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
		mprAssert(fileHandle);
		fdWrite = (int) _open_osfhandle((long) fileHandle, 0);

		att = (i == MPR_CMD_IN) ? &clientAtt : &serverAtt;
		fileHandle = CreateFile(path, GENERIC_READ, 
			FILE_SHARE_READ | FILE_SHARE_WRITE, att, 
			OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
		mprAssert(fileHandle);
		fdRead = (int) _open_osfhandle((long) fileHandle, 0);

		if (fdRead < 0 || fdWrite < 0) {
			mprError(MPR_L, MPR_LOG, "Can't create stdio files\n");
			return -1;
		}
		if (i == MPR_CMD_IN) {
			files.clientFd[i] = fdRead;
			files.serverFd[i] = fdWrite;
		} else {
			files.clientFd[i] = fdWrite;
			files.serverFd[i] = fdRead;
		}
	}
	return 0;
}
예제 #4
0
파일: os.cpp 프로젝트: OPSF/uClinux
int MprCmd::makeStdioPipes(char *prefix, int fileFlags)
{
	SECURITY_ATTRIBUTES	clientAtt, serverAtt, *att;
	HANDLE				fileHandle;
	char				pipeBuf[MPR_MAX_FNAME];
	int					openMode, pipeMode, i, fdRead, fdWrite;

	openMode = PIPE_ACCESS_INBOUND;
#if FUTURE
	if (fileFlags & MPR_CMD_NON_BLOCK) {
		openMode |= FILE_FLAG_OVERLAPPED;
	}
#endif

	//
	//	The difference is server fds are not inherited by the child
	//
	memset(&clientAtt, 0, sizeof(clientAtt));
	clientAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
	clientAtt.bInheritHandle = TRUE;

	memset(&serverAtt, 0, sizeof(serverAtt));
	serverAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
	serverAtt.bInheritHandle = FALSE;


	fileFlags |= MPR_CMD_STDWAIT;

	for (i = 0; i < MPR_CMD_MAX_FD - 1; i++) {
		if ((fileFlags & (1 << (i + MPR_CMD_FD_SHIFT))) == 0) {
			continue;
		}
		att = (i == MPR_CMD_IN) ? &clientAtt : &serverAtt;
		mprMakeTempFileName(pipeBuf, sizeof(pipeBuf), "\\\\.\\pipe\\", 0);

		pipeMode = (i == MPR_CMD_OUT) ? PIPE_NOWAIT : 0;

		fileHandle = CreateNamedPipe(pipeBuf, openMode, 
			pipeMode, 1, 0, 65536, 1, att);
		fdRead = (int) _open_osfhandle((long) fileHandle, 0);

		att = (i != MPR_CMD_IN) ? &clientAtt : &serverAtt;
		fileHandle = CreateFile(pipeBuf, GENERIC_WRITE, 
			0, att, OPEN_EXISTING, openMode, 0);
		fdWrite = (int) _open_osfhandle((long) fileHandle, 0);

		if (fdRead < 0 || fdWrite < 0) {
			mprError(MPR_L, MPR_LOG, "Can't create stdio pipes. Err %d\n",
				mprGetOsError());
			mprAssert(0);
			return -1;
		}
		if (i == MPR_CMD_IN) {
			files.clientFd[i] = fdRead;
			files.serverFd[i] = fdWrite;
		} else {
			files.clientFd[i] = fdWrite;
			files.serverFd[i] = fdRead;
		}
	}
	return 0;
}