From b0d5565114764fc4bceccae55734df7a8bef4796 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Fri, 27 Jun 2008 22:03:20 -0700 Subject: [PATCH] Find core files properly on Linux Linux always appends the PID to core dumps from threaded processes, so search the directory for core dumps instead of assuming a particular name. Suitable upstream. --- src/bozo/bnode.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/bozo/bnode.c b/src/bozo/bnode.c index 20ae5641d..66e26fd26 100644 --- a/src/bozo/bnode.c +++ b/src/bozo/bnode.c @@ -16,6 +16,7 @@ RCSID #include #include #include +#include #include #include #ifdef AFS_NT40_ENV @@ -99,13 +100,45 @@ SaveCore(register struct bnode *abnode, register struct bnode_proc char tbuffer[256]; struct stat tstat; register afs_int32 code; + char *corefile = NULL; #ifdef BOZO_SAVE_CORES struct timeval Start; struct tm *TimeFields; char FileName[256]; #endif + /* Linux always appends the PID to core dumps from threaded processes, so + * we have to scan the directory to find core files under another name. */ code = stat(AFSDIR_SERVER_CORELOG_FILEPATH, &tstat); + if (code) { + DIR *logdir; + struct dirent *file; + char *p; + size_t length; + unsigned long pid; + + logdir = opendir(AFSDIR_LOGS_DIR); + if (logdir == NULL) + return; + while ((file = readdir(logdir)) != NULL) { + if (strncmp(file->d_name, "core.", 5) != 0) + continue; + pid = atol(file->d_name + 5); + if (pid == aproc->pid) { + length = strlen(AFSDIR_LOGS_DIR) + strlen(file->d_name) + 2; + corefile = malloc(length); + if (corefile == NULL) { + closedir(logdir); + return; + } + snprintf(corefile, length, "%s/%s", AFSDIR_LOGS_DIR, + file->d_name); + code = 0; + break; + } + } + closedir(logdir); + } if (code) return; @@ -118,7 +151,12 @@ SaveCore(register struct bnode *abnode, register struct bnode_proc TimeFields->tm_hour, TimeFields->tm_min, TimeFields->tm_sec); strcpy(tbuffer, FileName); #endif - code = renamefile(AFSDIR_SERVER_CORELOG_FILEPATH, tbuffer); + if (corefile == NULL) + code = renamefile(AFSDIR_SERVER_CORELOG_FILEPATH, tbuffer); + else { + code = renamefile(corefile, tbuffer); + free(corefile); + } } int -- 2.39.5