From 71c2883bc426937301a3eb07f5c2ed7410ab4c6b Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Fri, 3 Jun 2016 01:55:32 +0200 Subject: add patch series --- ...s0001-trans-crash-xxx-core-file-templates.patch | 220 +++++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 221 insertions(+) create mode 100644 debian/patches/corefiles0001-trans-crash-xxx-core-file-templates.patch diff --git a/debian/patches/corefiles0001-trans-crash-xxx-core-file-templates.patch b/debian/patches/corefiles0001-trans-crash-xxx-core-file-templates.patch new file mode 100644 index 00000000..64301bf2 --- /dev/null +++ b/debian/patches/corefiles0001-trans-crash-xxx-core-file-templates.patch @@ -0,0 +1,220 @@ +From ae4dd9fd78060db8ed1db337b1c0302f32c4829b Mon Sep 17 00:00:00 2001 +From: Justus Winter +Date: Fri, 3 Jun 2016 00:52:06 +0200 +Subject: [PATCH hurd] trans/crash: xxx core file templates + +--- + trans/crash.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 157 insertions(+), 2 deletions(-) + +diff --git a/trans/crash.c b/trans/crash.c +index 5db9974..3a4af12 100644 +--- a/trans/crash.c ++++ b/trans/crash.c +@@ -70,7 +70,106 @@ enum crash_action + #define CRASH_ORPHANS_DEFAULT crash_corefile + + static enum crash_action crash_how, crash_orphans_how; ++static char *corefile_template; + ++ ++ ++/* Template parsing. */ ++static int ++template_valid (const char *template, const char **errp) ++{ ++ int valid = 0; ++ const char *t; ++ int specifier = 0; ++ ++ for (t = template; *t; t++) ++ { ++ if (specifier) ++ switch (*t) ++ { ++ case '%': ++ case 'p': ++ case 's': ++ case 't': ++ specifier = 0; ++ break; ++ default: ++ goto out; ++ } ++ else if (*t == '%') ++ specifier = 1; ++ } ++ ++ valid = ! specifier; ++ ++ out: ++ *errp = valid? NULL: t; ++ return valid; ++} ++ ++static char * ++template_make_file_name (const char *template, ++ task_t task, ++ int signo) ++{ ++ const char *t; ++ char *file_name = NULL; ++ size_t file_name_len = 0; ++ FILE *stream; ++ int specifier = 0; ++ ++ if (! template_valid (template, &t)) ++ { ++ errno = EINVAL; ++ return NULL; ++ } ++ ++ stream = open_memstream (&file_name, &file_name_len); ++ if (stream == NULL) ++ return NULL; ++ ++ for (t = template; *t; t++) ++ { ++ if (specifier) ++ { ++ switch (*t) ++ { ++ case '%': ++ fprintf (stream, "%%"); ++ break; ++ ++ case 'p': ++ fprintf (stream, "%d", task2pid (task)); ++ break; ++ ++ case 's': ++ fprintf (stream, "%d", signo); ++ break; ++ ++ case 't': ++ fprintf (stream, "%d", time (NULL)); ++ break; ++ ++ default: ++ assert (!"reached!"); ++ } ++ specifier = 0; ++ } ++ else if (*t == '%') ++ specifier = 1; ++ else ++ fprintf (stream, "%c", *t); ++ } ++ ++ assert (! specifier); ++ ++ fprintf (stream, "%c", 0); ++ fclose (stream); ++ ++ return file_name; ++} ++ ++ + + /* This is defined in ../exec/elfcore.c, or we could have + different implementations for other formats. */ +@@ -235,10 +334,34 @@ S_crash_dump_task (mach_port_t port, + err = task_suspend (task); + if (!err) + { +- err = dump_core (task, core_file, ++ file_t sink = core_file; ++ if (corefile_template) ++ { ++ char *file_name; ++ ++ file_name = template_make_file_name (corefile_template, ++ task, signo); ++ if (file_name == NULL) ++ error (0, errno, "template_make_file_name"); ++ else ++ { ++ sink = file_name_lookup (file_name, O_WRONLY|O_CREAT, 400); ++ if (! MACH_PORT_VALID (sink)) ++ { ++ error (0, errno, "%s", file_name); ++ sink = core_file; ++ } ++ free (file_name); ++ } ++ } ++ ++ err = dump_core (task, sink, + (off_t) -1, /* XXX should get core limit in RPC */ + signo, sigcode, sigerror); + task_resume (task); ++ ++ if (sink != core_file) ++ mach_port_deallocate (mach_task_self (), sink); + } + break; + +@@ -445,13 +568,25 @@ static const struct argp_option options[] = + {"kill", 'k', 0, 0, "Kill the process", 2}, + {"core-file", 'c', 0, 0, "Dump a core file", 2}, + {"dump-core", 0, 0, OPTION_ALIAS }, ++ {"core-file-name", 'C', "TEMPLATE", 0, ++ "Specify core file name (see below)", 2}, + {0} + }; + static const char doc[] = + "Server to handle crashing tasks and dump core files or equivalent.\v" + "The ACTION values can be `suspend', `kill', or `core-file'.\n\n" + "If `--orphan-action' is not specified, the `--action' value is used for " +-"orphans. The default is `--action=suspend --orphan-action=core-file'."; ++"orphans. The default is `--action=suspend --orphan-action=core-file'.\n" ++"\n" ++"The core file is either written to the file provided by the " ++"crashing process, or if a TEMPLATE value is given, to the file " ++"with the name constructed by expanding TEMPLATE value. " ++"TEMPLATE may contain % specifiers:\n" ++"\n" ++"\t%% just %\n" ++"\t%p the process' PID\n" ++"\t%s the signal number that caused the dump\n" ++"\t%t time of crash in seconds since the EPOCH\n"; + + static error_t + parse_opt (int opt, char *arg, struct argp_state *state) +@@ -489,6 +624,14 @@ parse_opt (int opt, char *arg, struct argp_state *state) + case 's': crash_how = crash_suspend; break; + case 'k': crash_how = crash_kill; break; + case 'c': crash_how = crash_corefile; break; ++ case 'C': ++ { ++ char *errp; ++ if (! template_valid (arg, &errp)) ++ error (1, 0, "Invalid template: ...'%s'", errp); ++ } ++ corefile_template = arg; ++ break; + + case ARGP_KEY_SUCCESS: + if (crash_orphans_how == crash_unspecified) +@@ -531,6 +674,18 @@ trivfs_append_args (struct trivfs_control *fsys, + err = argz_add (argz, argz_len, opt); + } + ++ if (!err && corefile_template) ++ { ++ char *template; ++ if (asprintf (&template, "--core-file-name=%s", corefile_template) < 0) ++ err = errno; ++ else ++ { ++ err = argz_add (argz, argz_len, template); ++ free (template); ++ } ++ } ++ + return err; + } + +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index 26ff97a1..f9dc2522 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -39,3 +39,4 @@ pager-alloc0001-libpager-provide-pager_create_alloc.patch hurdutil0001-libhurdutil-New-library-containing-utils-to-be-used-.patch external.patch crash0001-trans-crash-xxx-core-file-templates.patch +corefiles0001-trans-crash-xxx-core-file-templates.patch -- cgit v1.2.3