/******************************************************************************* @purpose: log each error or just system message in server work @input: message to be written in file *******************************************************************************/ void logError(char *Caption){ char sendBuff[BUFF_LEN] = {0}; if (fileLogError == 0) { if (initErrorLog(NULL) == 0) { printf("There was an error, but we can't write it to log:\n%s\n", Caption); return; } } //FILE *fileLogError = fopen("log/error.log", "a+"); fseek(fileLogError, 0, SEEK_END); memset(sendBuff, 0, sizeof(sendBuff)); snprintf(sendBuff, sizeof(sendBuff), "[%s] \"%s\"\n", getTimeS(), Caption); fwrite (sendBuff , sizeof(char), strlen(sendBuff), fileLogError); //fclose(fileLogError); }
/* Contructor */ Engine::Engine(){ initialize(); initializeGL(); //Start the timer timer.start(); state.lastTicks = timer.getTicks(); //Initializes the error log initErrorLog(); //Initializes the engine state state.mouseFocus = true; state.keyboardFocus = true; state.running = true; state.focus = true; state.done = false; loadResources(); mouse.setCustom(true); }
int main(int argc, char **argv) { int oldpid, oldumask, fd, parentPid; char *pt, *errorLogFile, **opts; /* make sure at least world write access is disabled */ if (((oldumask = umask(022)) & 002) == 002) (void)umask(oldumask); /* give /dev/null as stdin */ if ((fd = open("/dev/null", O_RDONLY)) > 0) { dup2(fd, 0); close(fd); } if (fcntl(1, F_GETFD) < 0) dup2(0, 1); if (fcntl(2, F_GETFD) < 0) dup2(0, 2); #ifndef nowMonotonic nowMonotonic = sysconf(_SC_MONOTONIC_CLOCK) >= 200112L; #endif #if KDM_LIBEXEC_STRIP == -1 prog = strrchr(argv[0], '/'); progname = prog = prog ? prog + 1 : argv[0]; #else if (argv[0][0] == '/') { if (!strDup(&progpath, argv[0])) panic("Out of memory"); } else # ifdef __linux__ { /* note that this will resolve symlinks ... */ int len; char fullpath[PATH_MAX]; if ((len = readlink("/proc/self/exe", fullpath, sizeof(fullpath))) < 0) panic("Invoke with full path specification or mount /proc"); if (!strNDup(&progpath, fullpath, len)) panic("Out of memory"); } # else # if 0 panic("Must be invoked with full path specification"); # else { char directory[PATH_MAX+1]; if (!getcwd(directory, sizeof(directory))) panic("Can't find myself (getcwd failed)"); if (strchr(argv[0], '/')) { strApp(&progpath, directory, "/", argv[0], (char *)0); } else { int len; char *path, *pathe, *name, *thenam, nambuf[PATH_MAX+1]; if (!(path = getenv("PATH"))) panic("Can't find myself (no PATH)"); len = strlen(argv[0]); name = nambuf + PATH_MAX - len; memcpy(name, argv[0], len + 1); *--name = '/'; do { if (!(pathe = strchr(path, ':'))) pathe = path + strlen(path); len = pathe - path; if (!len || (len == 1 && *path == '.')) { len = strlen(directory); path = directory; } thenam = name - len; if (thenam >= nambuf) { memcpy(thenam, path, len); if (!access(thenam, X_OK)) goto found; } path = pathe; } while (*path++ != '\0'); panic("Can't find myself (not in PATH)"); found: if (!strDup(&progpath, thenam)) panic("Out of memory"); } } # endif # endif prog = strrchr(progpath, '/') + 1; # if KDM_LIBEXEC_STRIP for (progname = pt = prog, fd = 0; fd < KDM_LIBEXEC_STRIP + 1; fd++) { for (;;) { pt--; if (pt == progpath) panic("Executable is obviously located outside BINDIR"); if (*pt == '/') break; } } *pt = 0; # endif #endif #if !defined(HAVE_SETPROCTITLE) && !defined(NOXDMTITLE) title = argv[0]; titleLen = (argv[argc - 1] + strlen(argv[argc - 1])) - title; #endif /* * Parse command line options */ parentPid = getppid(); errorLogFile = 0; if (!(opts = Malloc(2 * sizeof(char *)))) return 1; opts[0] = (char *)""; opts[1] = 0; while (*++argv) { if (**argv != '-') break; pt = *argv + 1; if (*pt == '-') pt++; if (!strcmp(pt, "help") || !strcmp(pt, "h")) { printf("Usage: %s [options] [tty]\n" " -daemon\t - Daemonize even when started by init\n" " -nodaemon\t - Do not daemonize even when started from command line\n" " -config <file> - Use alternative master configuration file\n" " -xrm <res>\t - Override frontend-specific resource\n" " -error <file>\t - Use alternative log file\n" " -debug <num>\t - Debug option bitfield:\n" "\t\t\t0x1 - core log\n" "\t\t\t0x2 - config reader log\n" "\t\t\t0x4 - greeter log\n" "\t\t\t0x8 - IPC log\n" "\t\t\t0x10 - session sub-daemon post-fork delay\n" "\t\t\t0x20 - config reader post-start delay\n" "\t\t\t0x40 - greeter post-start delay\n" "\t\t\t0x80 - do not use syslog\n" "\t\t\t0x100 - core Xauth log\n" "\t\t\t0x200 - debug greeter theming\n" "\t\t\t0x400 - valgrind config reader and greeter\n" "\t\t\t0x800 - strace config reader and greeter\n" , prog); exit(0); } else if (!strcmp(pt, "daemon")) { parentPid = 0; } else if (!strcmp(pt, "nodaemon")) { parentPid = 1; } else if (argv[1] && !strcmp(pt, "config")) { strDup(opts, *++argv); } else if (argv[1] && !strcmp(pt, "xrm")) { opts = addStrArr(opts, *++argv, -1); } else if (argv[1] && !strcmp(pt, "debug")) { sscanf(*++argv, "%i", &debugLevel); } else if (argv[1] && (!strcmp(pt, "error") || !strcmp(pt, "logfile"))) { errorLogFile = *++argv; } else { fprintf(stderr, "\"%s\" is an unknown option or is missing a parameter\n", *argv); exit(1); } } /* * Only allow root to run in non-debug mode to avoid problems */ if (!debugLevel && getuid()) { fprintf(stderr, "Only root wants to run %s\n", prog); exit(1); } initErrorLog(errorLogFile); if (parentPid != 1) becomeDaemon(); /* * Step 1 - load configuration parameters */ if (!initResources(opts) || scanConfigs(False) < 0) logPanic("Config reader failed. Aborting ...\n"); /* SUPPRESS 560 */ if ((oldpid = storePid())) { if (oldpid == -1) logError("Cannot create/lock pid file %s\n", pidFile); else logError("Cannot lock pid file %s, another xdm is running (pid %d)\n", pidFile, oldpid); exit(1); } #ifdef NEED_ENTROPY addOtherEntropy(); #endif /* * We used to clean up old authorization files here. As authDir is * supposed to be /var/run/xauth or /tmp, we needn't to care for it. */ #ifdef XDMCP initXdmcp(); #else debug("not compiled for XDMCP\n"); #endif if (pipe(signalFds)) logPanic("Unable to create signal notification pipe.\n"); registerInput(signalFds[0]); registerCloseOnFork(signalFds[0]); registerCloseOnFork(signalFds[1]); (void)Signal(SIGTERM, sigHandler); (void)Signal(SIGINT, sigHandler); (void)Signal(SIGHUP, sigHandler); (void)Signal(SIGCHLD, sigHandler); (void)Signal(SIGUSR1, sigHandler); /* * Step 2 - run a sub-daemon for each entry */ openCtrl(0); #ifdef XDMCP updateListenSockets(); #endif mainLoop(); closeCtrl(0); if (sdRec.how) { int pid; commitBootOption(); if (Fork(&pid) <= 0) { char *cmd = sdRec.how == SHUT_HALT ? cmdHalt : cmdReboot; execute(parseArgs((char **)0, cmd), (char **)0); logError("Failed to execute shutdown command %\"s\n", cmd); exit(1); } else { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGCHLD); sigaddset(&mask, SIGHUP); sigsuspend(&mask); } } debug("nothing left to do, exiting\n"); return 0; }
int InitServer() { char ErrBuff[256] = {0}; FILE* fileLogTmp; //############## CONFIGURATE SERVER ############### // Read parameters from 'conf/httpd.conf' to list List *lstConf = initList(); if (0 != getParamsFromFile("conf/httpd.conf", lstConf, '=')) { puts("Could not read configuration file..."); return 1; } // Apply parameters from list (or set to default, if they are absent) int port = getParamInt(lstConf, "portListen", 80); int maxConn = getParamInt(lstConf, "maxConnection", 100); char *logAccessPath = getParamS(lstConf, "logAccess", "log/access.log"); char *logErrorPath = getParamS(lstConf, "logError", "log/error.log"); defaultPage = getParamS(lstConf, "defaultPage", "/index.htm"); rootFolder = getParamS(lstConf, "rootFolder", "www/"); char *interface = getParamS(lstConf, "interfaceToListen", ""); // Open new log files if ( initErrorLog(logErrorPath) == 0 ) { return 1; } if ( !( fileLogAccess = fopen(logAccessPath, "a") ) ) { snprintf(ErrBuff, sizeof(ErrBuff), "Could not open '%s'!", logAccessPath); puts(ErrBuff); logError(ErrBuff); return 1; } // Check if default page exists char *fullPath = malloc(strlen(rootFolder)+strlen(defaultPage)+1); strcpy(fullPath, rootFolder); strcat(fullPath, defaultPage); if (fileExists(fullPath) != 0) { snprintf(ErrBuff, sizeof(ErrBuff), "Could not find default page following next path: '%s'!", fullPath); puts(ErrBuff); logError(ErrBuff); } // Free data with configuration from memory removeAll(lstConf); //############# START SERVER ############### struct sockaddr_in saddr; // used for getting IP _ socklen_t len = sizeof( saddr );// of incomming connection _ char IP_Buff[INET_ADDRSTRLEN]; // defined in <netinet/in.h> . int listenSocket = 0, connSocket = 0; pid_t child_pid; // Try to start server listenSocket = startServer(interface, port, maxConn); if (listenSocket > 0) { #ifndef __DEBUG_MODE__ logError("#Server started Successfully!"); #endif printf("\n\nServer started Successfully!\n\n"); //############# MAIN PROCESSING LOOP ############### while(1) { // Wait few second, if there's no connections - continue if (wait4Socket(listenSocket, ACCEPT_TIMEOUT) > 0) { connSocket = accept( listenSocket, ( struct sockaddr* )&saddr, &len ); if ( listenSocket < 0 ) { logError("Accept Error..."); break; } child_pid = fork (); if (child_pid == 0) //#### child thread #### { #ifndef __DEBUG_MODE__ close (STDIN_FILENO); //child don't need to print anything, close (STDOUT_FILENO); // so close input/output streams #endif close (listenSocket); //close a child-copy of listening port if ( inet_ntop( AF_INET, &saddr.sin_addr, IP_Buff, INET_ADDRSTRLEN ) == NULL ) { logError("Can't convert IP addr"); close(connSocket); exit(1); } procConn(IP_Buff, connSocket); exit (0); // close child process } else if (child_pid > 0) // #### parent thread #### { close (connSocket); #ifdef __DEBUG_MODE__ if (getComm() == 0) { break; } #endif } else logError("Can't fork"); // if can't create child } } close(listenSocket); // close parent listenSocket #ifndef __DEBUG_MODE__ logError("#Server closed Successfully!"); #endif printf("\n\nServer closed Successfully!\n\n"); return 0; } logError("#Server was not started!"); printf("\n\nServer was not started! See error.log to get more information!\n\n"); return 1; }