static void defaultLogHandler(MPR_LOC_DEC(ctx, loc), int flags, int level, const char *msg) { MprApp *app; char *prefix; app = mprGetApp(ctx); prefix = app->name; while (*msg == '\n') { mprPrintf(ctx, "\n"); msg++; } if (flags & MPR_LOG_SRC) { #if BREW && !BREW_SIMULATOR mprPrintf(ctx, "%s\n", msg); #else mprPrintf(ctx, "%s: %d: %s\n", prefix, level, msg); #endif } else if (flags & MPR_ERROR_SRC) { /* * Use static printing to avoid malloc when the messages are small. * This is important for memory allocation errors. */ if (strlen(msg) < (MPR_MAX_STRING - 32)) { mprStaticPrintf(ctx, "%s: Error: %s\n", prefix, msg); } else { mprPrintf(ctx, "%s: Error: %s\n", prefix, msg); } } else if (flags & MPR_FATAL_SRC) { mprPrintf(ctx, "%s: Fatal: %s\n", prefix, msg); } else if (flags & MPR_ASSERT_SRC) { #if BLD_FEATURE_ALLOC_LEAK_TRACK mprPrintf(ctx, "%s: Assertion %s, failed at %s\n", prefix, msg, loc); #else mprPrintf(ctx, "%s: Assertion %s, failed\n", prefix, msg); #endif } else if (flags & MPR_RAW) { mprPrintf(ctx, "%s", msg); } else { return; } }
static void logHandler(MprCtx ctx, int flags, int level, const char *msg) { Mpr *mpr; MprFile *file; char *prefix; mpr = mprGetMpr(ctx); file = (MprFile*) mpr->logHandlerData; prefix = mpr->name; while (*msg == '\n') { mprFprintf(file, "\n"); msg++; } if (flags & MPR_LOG_SRC) { mprFprintf(file, "%s: %d: %s\n", prefix, level, msg); } else if (flags & MPR_ERROR_SRC) { /* * Use static printing to avoid malloc when the messages are small. * This is important for memory allocation errors. */ if (strlen(msg) < (MPR_MAX_STRING - 32)) { mprStaticPrintf(file, "%s: Error: %s\n", prefix, msg); } else { mprFprintf(file, "%s: Error: %s\n", prefix, msg); } } else if (flags & MPR_FATAL_SRC) { mprFprintf(file, "%s: Fatal: %s\n", prefix, msg); } else if (flags & MPR_ASSERT_SRC) { mprFprintf(file, "%s: Assertion %s, failed\n", prefix, msg); } else if (flags & MPR_RAW) { mprFprintf(file, "%s", msg); } if (flags & (MPR_ERROR_SRC | MPR_FATAL_SRC | MPR_ASSERT_SRC)) { mprBreakpoint(); } }
int MprCmd::start(char *program, char **argv, char **envp, MprCmdProc fn, void *fnData, int userFlags) { char dir[MPR_MAX_FNAME]; int pid, i, err; mprAssert(program != 0); mprAssert(argv != 0); mprLog(4, log, "start: %s\n", program); reset(); flags |= (userFlags & MPR_CMD_USER_FLAGS); for (i = 0; argv[i]; i++) { mprLog(6, log, " arg[%d]: %s\n", i, argv[i]); } if (envp) { for (i = 0; envp[i]; i++) { mprLog(6, log, " envp[%d]: %s\n", i, envp[i]); } } if (access(program, X_OK) < 0) { mprLog(5, log, "start: can't access %s, errno %d\n", program, mprGetOsError()); return MPR_ERR_CANT_ACCESS; } data = fnData; cmdDoneProc = fn; reapIndex = -1; // // Create the child // pid = vfork(); if (pid < 0) { mprLog(0, log, "Can't fork a new process to run %s\n", program); return MPR_ERR_CANT_INITIALIZE; } else if (pid == 0) { // // Child // umask(022); if (flags & MPR_CMD_NEW_SESSION) { setsid(); } if (flags & MPR_CMD_CHDIR) { if (cwd) { chdir(cwd); } else { mprGetDirName(dir, sizeof(dir), program); chdir(dir); } } // // FUTURE -- could chroot as a security feature (perhaps cgi-bin) // if (files.clientFd[MPR_CMD_OUT] >= 0) { dup2(files.clientFd[MPR_CMD_OUT], 0); // Client stdin } else { close(0); } if (files.clientFd[MPR_CMD_IN] >= 0) { dup2(files.clientFd[MPR_CMD_IN], 1); // Client stdout dup2(files.clientFd[MPR_CMD_IN], 2); // Client stderr } else { close(1); close(2); } // // FUTURE -- need to get a better max file limit than this // for (i = 3; i < 128; i++) { close(i); } if (envp) { execve(program, argv, envp); } else { // // Do this rather than user execv to avoid errors in valgrind // char *env[2]; env[0] = "_appweb=1"; env[1] = 0; execve(program, argv, (char**) &env); } err = errno; getcwd(dir, sizeof(dir)); mprStaticPrintf("Can't exec %s, err %d, cwd %s\n", program, err, dir); mprAssert(0); exit(-(MPR_ERR_CANT_INITIALIZE)); } else { // // Close the client handles // for (i = 0; i < MPR_CMD_MAX_FD; i++) { if (files.clientFd[i] >= 0) { close(files.clientFd[i]); files.clientFd[i] = -1; } } data = fnData; cmdDoneProc = fn; process = (ulong) pid; if (flags & MPR_CMD_DETACHED) { process = 0; return 0; } else if (flags & MPR_CMD_WAIT) { waitForChild(INT_MAX); if (getExitCode() < 0) { return MPR_ERR_BAD_STATE; } return exitStatus; } else { mprGetMpr()->cmdService->startWatcher(); } } return 0; }