Date: Tue, 7 Jul 1998 22:04:34 -0400 (EDT) From: "Alok K. Dhir" <adhir@worldbank.org> To: Sean Eric Fagan <sef@kithrup.com> Cc: current@FreeBSD.ORG Subject: Re: cvs commit: src/sys/kern kern_sig.c Message-ID: <Pine.BSF.3.96.980707220347.20939B-100000@shadow.worldbank.org> In-Reply-To: <8A6103670C8BFCA28525663B00026B8B.0001A8048525663B@worldbank.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Good stuff! Perhaps this should be added to rc.conf?
On Tue, 7 Jul 1998, Sean Eric Fagan wrote:
>
>
> In article <199807072341.QAA02595.kithrup.freebsd.cvs-all@dingo.cdrom.com>
> you write:
> >> I wish we had a sysctl variable for the coredump name. Eg.
> >>
> >> kern.coredump.name =
> >>
> >> 0 -> disable core dumps
> >> 1 -> core dump filename 'core'
> >> 2 -> core dump filename 'program.core'
> >> 3 -> core dump filename 'core.program'
> >
> >I think you should buy Sean a beer.
>
> Indeed. I'd just sent Mike some diffs (Jordan's seen 'em too) to do this:
>
> He suggested changes, not all of which I've done yet. But this gives you
> teh
> basic idea. Note that it allows three format specifiers: %N == process
> name,
> %P == process ID, %U == user ID.
>
> Examples of ones I've tested:
>
> sysctl -w kern.corefilename="core"
> sysctl -w kern.corefilename="%N.core"
> sysctl -w kern.corefilename="core.%N"
> sysctl -w kern.corefilename="/tmp/%N-%P.core"
> sysctl -w kern.corefilename="/dev/null"
>
> Index: kern/kern_sig.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/kern/kern_sig.c,v
> retrieving revision 1.26.2.1
> diff -u -r1.26.2.1 kern_sig.c
> --- kern_sig.c 1996/12/21 18:57:24 1.26.2.1
> +++ kern_sig.c 1998/07/04 18:25:22
> @@ -61,6 +61,8 @@
> #include <sys/syslog.h>
> #include <sys/stat.h>
> #include <sys/sysent.h>
> +#include <sys/sysctl.h>
> +#include <sys/malloc.h>
>
> #include <machine/cpu.h>
>
> @@ -75,6 +77,7 @@
> static int coredump __P((struct proc *p));
> static int killpg1 __P((struct proc *cp, int signum, int pgid, int
> all));
> static void stop __P((struct proc *));
> +static char *expand_name __P((const char*, int, int));
>
> /*
> * Can process p, with pcred pc, send the signal signum to process q?
> @@ -1219,6 +1222,75 @@
> /* NOTREACHED */
> }
>
> +static char corefilename[MAXPATHLEN+1] = {"%N.core"};
> +SYSCTL_STRING(_kern, KERN_COREFILENAME, corefilename, CTLFLAG_RW,
> + corefilename, sizeof(corefilename), "");
> +
> +static char *
> +expand_name(name, uid, pid)
> +const char *name; int uid; int pid; {
> + char *temp;
> + char buf[11]; /* Buffer for pid/uid -- max 4B */
> + int i, n;
> + char *format = corefilename;
> +
> + temp = malloc(MAXPATHLEN + 3, M_TEMP, M_NOWAIT);
> + bzero(temp, MAXPATHLEN+3);
> + for (i = 0, n = 0; i < MAXPATHLEN && format[i]; i++) {
> + int l;
> + switch (format[i]) {
> + case '%': /* Format character */
> + i++;
> + switch (format[i]) {
> + case '%':
> + temp[n++] = '%';
> + break;
> + case 'N': /* process name */
> + l = strlen(name);
> + if ((n + l) > MAXPATHLEN) {
> + log(LOG_ERR, "pid %d (%s), uid
> (%d): Path `%s%s' is too long\n",
> + pid, name, uid, temp, name);
> + free(temp, M_TEMP);
> + return NULL;
> + }
> + memcpy(temp+n, name, l);
> + n += l;
> + break;
> + case 'P': /* process id */
> + sprintf(buf, "%u", pid);
> + l = strlen(buf);
> + if ((n + l) > MAXPATHLEN) {
> + log(LOG_ERR, "pid %d (%s), uid
> (%d): Path `%s%s' is too long\n",
> + pid, name, uid, temp, name);
> + free(temp, M_TEMP);
> + return NULL;
> + }
> + memcpy(temp+n, buf, l);
> + n += l;
> + break;
> + case 'U': /* user id */
> + sprintf(buf, "%u", uid);
> + l = strlen(buf);
> + if ((n + l) > MAXPATHLEN) {
> + log(LOG_ERR, "pid %d (%s), uid
> (%d): Path `%s%s' is too long\n",
> + pid, name, uid, temp, name);
> + free(temp, M_TEMP);
> + return NULL;
> + }
> + memcpy(temp+n, buf, l);
> + n += l;
> + break;
> + default:
> + log(LOG_ERR, "Unknown format character %c
> in `%s'\n", format[i], format);
> + }
> + break;
> + default:
> + temp[n++] = format[i];
> + }
> + }
> + return temp;
> +}
> +
> /*
> * Dump core, into a file named "progname.core", unless the process was
> * setuid/setgid.
> @@ -1233,17 +1305,21 @@
> struct nameidata nd;
> struct vattr vattr;
> int error, error1;
> - char name[MAXCOMLEN+6]; /* progname.core */
> + char *name;
>
> if (p->p_flag & P_SUGID)
> return (EFAULT);
> if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >=
> p->p_rlimit[RLIMIT_CORE].rlim_cur)
> return (EFAULT);
> - sprintf(name, "%s.core", p->p_comm);
> +
> + name = expand_name(p->p_comm, p->p_ucred->cr_uid, p->p_pid);
> + if (name == NULL)
> + return(EFAULT);
> NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p);
> - if ((error = vn_open(&nd,
> - O_CREAT | FWRITE, S_IRUSR | S_IWUSR)))
> + error = vn_open(&nd, O_CREAT | FWRITE, S_IRUSR | S_IWUSR);
> + free(name, M_TEMP);
> + if (error)
> return (error);
> vp = nd.ni_vp;
>
> Index: sys/sysctl.h
> ===================================================================
> RCS file: /usr/cvs/src/sys/sys/sysctl.h,v
> retrieving revision 1.48.2.2
> diff -u -r1.48.2.2 sysctl.h
> --- sysctl.h 1997/08/30 14:08:56 1.48.2.2
> +++ sysctl.h 1998/07/03 19:30:28
> @@ -230,7 +230,8 @@
> #define KERN_MAXSOCKBUF 31 /* int: max size of a
> socket buffer */
> #define KERN_PS_STRINGS 32 /* int: address of
> PS_STRINGS */
> #define KERN_USRSTACK 33 /* int: address of USRSTACK
> */
> -#define KERN_MAXID 34 /* number of valid kern ids */
> +#define KERN_COREFILENAME 34 /* string: name of core
> file */
> +#define KERN_MAXID 35 /* number of valid kern ids */
>
> #define CTL_KERN_NAMES { \
> { 0, 0 }, \
> @@ -267,6 +268,7 @@
> { "maxsockbuf", CTLTYPE_INT }, \
> { "ps_strings", CTLTYPE_INT }, \
> { "usrstack", CTLTYPE_INT }, \
> + { "corefile", CTLTYPE_STRING }, \
> }
>
> /*
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe cvs-all" in the body of the message
>
-------------------------------------------------------------------- \||/_
Alok K. Dhir Phone: +1.202.473.2446 oo \
S11-151, ISGMC Email: adhir@worldbank.org L_
The World Bank Group Washington, DC \/
------------------------------------------------------------------------|
"Unix _is_ user friendly - it just chooses friends selectively..."
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.96.980707220347.20939B-100000>
