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; }
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; }
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; }
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; }