/* This file is in the public domain. */ #include #include #include #include #include #include #include "config.h" #include "panic.h" static int panicking = 0; void panic_(const char *fxn, const char *file, int line, const char *fmt, ...) { va_list ap; char *msg; int msglen; char *dirname; pid_t ourpid; struct timeval tv; int serial; FILE *f; if (panicking) abort(); panicking = 1; if (! config_bool("panic-core")) abort(); va_start(ap,fmt); msglen = vasprintf(&msg,fmt,ap); va_end(ap); ourpid = getpid(); gettimeofday(&tv,0); do <"found"> { for (serial=0;serial<100;serial++) { asprintf(&dirname,"/tmp/moussh.core.%d.%lu.%06lu.%d", (int)ourpid, (unsigned long int)tv.tv_sec, (unsigned long int)tv.tv_usec, serial ); if (mkdir(dirname,0700) == 0) break <"found">; free(dirname); } abort(); } while (0); if (chdir(dirname) == 0) { f = fopen("panic-msg","w"); if (f) { fprintf(f,"%s(), \"%s\", line %d:\n",fxn,file,line); fwrite(msg,1,msglen,f); if ((msglen < 1) || (msg[msglen-1] != '\n')) fprintf(f,"\n"); fclose(f); } } abort(); }