static void resetCmd(MprCmd *cmd) { MprCmdFile *files; int i; files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (cmd->handlers[i]) { mprFree(cmd->handlers[i]); cmd->handlers[i] = 0; } if (files[i].clientFd >= 0) { close(files[i].clientFd); files[i].clientFd = -1; } if (files[i].fd >= 0) { close(files[i].fd); files[i].fd = -1; } } cmd->eofCount = 0; cmd->status = -1; mprResetCond(cmd->completeCond); if (cmd->pid && !(cmd->flags & MPR_CMD_DETACH)) { mprStopCmd(cmd); mprReapCmd(cmd, 0); mprSignalCond(cmd->completeCond); } }
static void closeCgi(MaQueue *q) { MprCmd *cmd; cmd = (MprCmd*) q->queueData; mprAssert(cmd); if (cmd && cmd->pid) { mprStopCmd(cmd); } }
static void waitForCgi(Cgi *cgi, MprEvent *event) { HttpConn *conn; MprCmd *cmd; conn = cgi->conn; cmd = cgi->cmd; if (cmd && !cmd->complete) { if (conn->error && cmd->pid) { mprStopCmd(cmd, -1); mprStopContinuousEvent(event); } } else { mprStopContinuousEvent(event); } }
static void resetCmd(MprCmd *cmd, bool finalizing) { MprCmdFile *files; int i; assert(cmd); files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (cmd->handlers[i]) { mprDestroyWaitHandler(cmd->handlers[i]); cmd->handlers[i] = 0; } if (files[i].clientFd >= 0) { close(files[i].clientFd); files[i].clientFd = -1; } if (files[i].fd >= 0) { close(files[i].fd); files[i].fd = -1; } #if VXWORKS if (files[i].name) { DEV_HDR *dev; cchar *tail; if ((dev = iosDevFind(files[i].name, &tail)) != NULL) { iosDevDelete(dev); } } #endif } cmd->eofCount = 0; cmd->complete = 0; cmd->status = -1; if (cmd->pid && (!(cmd->flags & MPR_CMD_DETACH) || finalizing)) { mprStopCmd(cmd, -1); reapCmd(cmd, finalizing); cmd->pid = 0; } if (cmd->signal) { mprRemoveSignalHandler(cmd->signal); cmd->signal = 0; } }
/* This routine runs after all incoming data has been received */ static void runCgi(MaQueue *q) { MaResponse *resp; MaConn *conn; MprCmd *cmd; conn = q->conn; resp = conn->response; cmd = (MprCmd*) q->queueData; if (cmd == 0) { startCgi(q); cmd = (MprCmd*) q->queueData; if (q->pair->count > 0) { writeToCGI(q->pair); } } /* Close the CGI program's stdin. This will allow it to exit if it was expecting input data. */ mprCloseCmdFd(cmd, MPR_CMD_STDIN); if (conn->requestFailed) { maPutForService(q, maCreateEndPacket(q), 1); return; } while (mprWaitForCmd(cmd, 1000) < 0) { if (mprGetElapsedTime(cmd, cmd->lastActivity) >= conn->host->timeout) { break; } } if (cmd->pid == 0) { maPutForService(q, maCreateEndPacket(q), 1); } else { mprStopCmd(cmd); mprReapCmd(cmd, MPR_TIMEOUT_STOP_TASK); cmd->status = 255; } }