/** * write stacktrace to oscam.crash. file is always appended * Usage: * 1. compile oscam with debug parameters (Makefile: DS_OPTS="-ggdb") * 2. you need gdb installed and working on the local machine * 3. start oscam with parameter: -a */ static void cs_dumpstack(int32_t sig) { FILE *fp = fopen("oscam.crash", "a+"); time_t timep; char buf[200]; time(&timep); cs_ctime_r(&timep, buf); fprintf(stderr, "crashed with signal %d on %swriting oscam.crash\n", sig, buf); fprintf(fp, "%sOSCam cardserver v%s, build r%s (%s)\n", buf, CS_VERSION, CS_SVN_VERSION, CS_TARGET); fprintf(fp, "FATAL: Signal %d: %s Fault. Logged StackTrace:\n\n", sig, (sig == SIGSEGV) ? "Segmentation" : ((sig == SIGBUS) ? "Bus" : "Unknown")); fclose(fp); FILE *cmd = fopen("/tmp/gdbcmd", "w"); fputs("bt\n", cmd); fputs("thread apply all bt\n", cmd); fclose(cmd); snprintf(buf, sizeof(buf)-1, "gdb %s %d -batch -x /tmp/gdbcmd >> oscam.crash", prog_name, getpid()); if(system(buf) == -1) fprintf(stderr, "Fatal error on trying to start gdb process."); exit(-1); }
int32_t cs_open_logfiles(void) { char *starttext; if(logStarted) starttext = "log switched"; else starttext = "started"; if (!fp && cfg.logfile) { //log to file if ((fp = fopen(cfg.logfile, "a+")) <= (FILE *)0) { fp = (FILE *)0; fprintf(stderr, "couldn't open logfile: %s (errno %d %s)\n", cfg.logfile, errno, strerror(errno)); } else { setvbuf(fp, NULL, _IOFBF, 8*1024); time_t t; char line[80]; memset(line, '-', sizeof(line)); line[(sizeof(line)/sizeof(char)) - 1] = '\0'; time(&t); if (!cfg.disablelog){ char buf[28]; cs_ctime_r(&t, buf); fprintf(fp, "\n%s\n>> OSCam << cardserver %s at %s%s\n", line, starttext, buf, line); } } } // according to syslog docu: calling closelog is not necessary and calling openlog multiple times is safe // We use openlog to set the default syslog settings so that it's possible to allow switching syslog on and off openlog("oscam", LOG_NDELAY, LOG_DAEMON); cs_log_nolock(">> OSCam << cardserver %s, version " CS_VERSION ", build #" CS_SVN_VERSION " (" CS_TARGET ")", starttext); cs_log_config(); return(fp <= (FILE *)0); }