From ba1248ffd88b9ffa1d252220a928191d4b6b0065 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Tue, 16 Oct 2007 07:03:45 +0000 Subject: [PATCH] Snapshot work in progress: Find core files dropped on Linux, which always have the PID added since they're from multithreaded programs. --- debian/patches/find-core-files | 70 ++++++++++++++++++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 71 insertions(+) create mode 100644 debian/patches/find-core-files diff --git a/debian/patches/find-core-files b/debian/patches/find-core-files new file mode 100644 index 000000000..80d412229 --- /dev/null +++ b/debian/patches/find-core-files @@ -0,0 +1,70 @@ +--- openafs.orig/src/bozo/bnode.c ++++ openafs/src/bozo/bnode.c +@@ -28,6 +28,7 @@ + #include + #endif + #include ++#include + + #ifdef HAVE_STRING_H + #include +@@ -105,13 +106,45 @@ + 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; ++ ++ logdir = opendir(AFSDIR_LOGS_DIR); ++ if (logdir == NULL) ++ return; ++ while ((file = readdir(logdir)) != NULL) { ++ if (strncmp(file->d_name, "core.", 5) != 0) ++ continue; ++ p = file->d_name + 5; ++ do { ++ if (!isdigit((unsigned int) *p)) ++ break; ++ p++; ++ } while (*p != '\0'); ++ if (*p == '\0') { ++ length = strlen(AFSDIR_LOGS_DIR) + strlen(file->d_name) + 2; ++ corefile = malloc(length); ++ if (corefile == NULL) ++ return; ++ sprintf(corefile, "%s/%s", AFSDIR_LOGS_DIR, file->d_name); ++ code = 0; ++ break; ++ } ++ } ++ } + if (code) + return; + +@@ -124,7 +157,12 @@ + 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 diff --git a/debian/patches/series b/debian/patches/series index 0179e9a06..7ca93e529 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -7,3 +7,4 @@ bos-permissions compiler-flags no-admin-reference ucontext-everywhere +find-core-files -- 2.39.5