disclaimer:  I didn't write this.

Dean

diff -ruN pre-2.0.32-1/fs/binfmt_elf.c linux/fs/binfmt_elf.c
--- pre-2.0.32-1/fs/binfmt_elf.c	Wed Oct 15 23:56:43 1997
+++ linux/fs/binfmt_elf.c	Wed Nov 12 00:56:19 1997
@@ -979,7 +979,7 @@
 	struct file file;
 	struct inode *inode;
 	unsigned short fs;
-	char corefile[6+sizeof(current->comm)];
+	char corefile[12+5+sizeof(current->comm)];
 	int segs;
 	int i;
 	size_t size;
@@ -993,8 +993,26 @@
 	elf_fpregset_t fpu;		/* NT_PRFPREG */
 	struct elf_prpsinfo psinfo;	/* NT_PRPSINFO */
 	
-	if (!current->dumpable || limit < PAGE_SIZE || current->mm->count != 1)
+	if (cdmp_options & CDMP_OPT_VARCORE) {
+		sprintf(corefile, "/var/core/%s.%d", current->comm, current->pid);
+	} else {
+		memcpy(corefile,"core.",5);
+#if 0
+		memcpy(corefile+5,current->comm,sizeof(current->comm));
+#else
+		corefile[4] = '\0';
+#endif
+	}
+	if (cdmp_options & CDMP_OPT_LOG)
+		printk(KERN_INFO "%s: Dumping core in %s\n",current->comm, corefile);
+	if (!current->dumpable || limit < PAGE_SIZE || current->mm->count != 1) {
+		if (cdmp_options & CDMP_OPT_LOG)
+			printk(KERN_INFO "%s: No coredump, %s%s%s\n", current->comm,
+				! current->dumpable ? "Not dumpable" : "",
+				limit < PAGE_SIZE ? "RLIMIT_CORE setting" : "",
+				current->mm->count != 1 ? "mm->count != 1" : "");
 		return 0;
+	}
 	current->dumpable = 0;
 
 #ifndef CONFIG_BINFMT_ELF
@@ -1044,13 +1062,11 @@
 	
 	fs = get_fs();
 	set_fs(KERNEL_DS);
-	memcpy(corefile,"core.",5);
-#if 0
-	memcpy(corefile+5,current->comm,sizeof(current->comm));
-#else
-	corefile[4] = '\0';
-#endif
+
 	if (open_namei(corefile,O_CREAT | 2 | O_TRUNC,0600,&inode,NULL)) {
+		if (cdmp_options & CDMP_OPT_LOG)
+			printk(KERN_INFO "%s: Could not create %s\n", current->comm,
+				corefile);
 		inode = NULL;
 		goto end_coredump;
 	}
diff -ruN pre-2.0.32-1/fs/exec.c linux/fs/exec.c
--- pre-2.0.32-1/fs/exec.c	Mon Nov 10 17:04:45 1997
+++ linux/fs/exec.c	Wed Nov 12 00:56:19 1997
@@ -483,8 +483,8 @@
 
 	flush_thread();
 
-	if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || 
-	    permission(bprm->inode,MAY_READ))
+	if (((bprm->e_uid != current->euid || bprm->e_gid != current->egid) &&
+	    (cdmp_options & CDMP_OPT_INISETUID) == 0) || permission(bprm->inode,MAY_READ))
 		current->dumpable = 0;
 
 	flush_old_signals(current->sig);
diff -ruN pre-2.0.32-1/include/linux/sched.h linux/include/linux/sched.h
--- pre-2.0.32-1/include/linux/sched.h	Thu Oct 16 00:22:05 1997
+++ linux/include/linux/sched.h	Wed Nov 12 00:56:19 1997
@@ -332,7 +332,12 @@
 extern unsigned long prof_len;
 extern unsigned long prof_shift;
 
-extern int securelevel;	/* system security level */
+extern int securelevel;			/* system security level */
+extern int cdmp_options;		/* coredump options*/
+#define	CDMP_OPT_LOG 1			/* log coredumps KERN_INFO */
+#define	CDMP_OPT_INISETUID 2	/* allow setuid programs */
+#define	CDMP_OPT_CHGSETUID 4	/* allow programs that change uid/gid */
+#define	CDMP_OPT_VARCORE 8		/* dump core in /var/core */
 
 #define CURRENT_TIME (xtime.tv_sec)
 
diff -ruN pre-2.0.32-1/include/linux/sysctl.h linux/include/linux/sysctl.h
--- pre-2.0.32-1/include/linux/sysctl.h	Tue Aug 12 23:06:35 1997
+++ linux/include/linux/sysctl.h	Wed Nov 12 00:56:19 1997
@@ -61,6 +61,7 @@
 #define KERN_NFSRADDRS	18	/* NFS root addresses */
 #define KERN_JAVA_INTERPRETER 19 /* path to Java(tm) interpreter */
 #define KERN_JAVA_APPLETVIEWER 20 /* path to Java(tm) appletviewer */
+#define KERN_COREDUMP_OPT 21  /* several ways to facilitate coredumps */
 
 /* CTL_VM names: */
 #define VM_SWAPCTL	1	/* struct: Set vm swapping control */
diff -ruN pre-2.0.32-1/init/main.c linux/init/main.c
--- pre-2.0.32-1/init/main.c	Thu Aug 14 19:30:08 1997
+++ linux/init/main.c	Wed Nov 12 00:56:19 1997
@@ -671,6 +671,12 @@
 			execute_command = line;
 			continue;
 		}
+		if (!strncmp(line,"init-rlimit-core=",17)) {
+			line += 17;
+			init_task.rlim[RLIMIT_CORE].rlim_cur = simple_strtoul(line, NULL, 10);
+			continue;
+		}
+
 		if (checksetup(line))
 			continue;
 		/*
diff -ruN pre-2.0.32-1/init/patches/coredump.pinfo linux/init/patches/coredump.pinfo
--- pre-2.0.32-1/init/patches/coredump.pinfo	Thu Jan  1 01:00:00 1970
+++ linux/init/patches/coredump.pinfo	Wed Nov 12 00:56:20 1997
@@ -0,0 +1 @@
+Coredump-ability of daemons, cronjobs, setuid-prgs etc. (Han Holl <jeholl@euronet.nl>)
diff -ruN pre-2.0.32-1/kernel/sched.c linux/kernel/sched.c
--- pre-2.0.32-1/kernel/sched.c	Mon Nov 10 17:04:46 1997
+++ linux/kernel/sched.c	Wed Nov 12 00:56:20 1997
@@ -47,6 +47,7 @@
  */
 
 int securelevel = 0;			/* system security level */
+int cdmp_options = 0;			/* system security level */
 
 long tick = (1000000 + HZ/2) / HZ;	/* timer interrupt period */
 volatile struct timeval xtime;		/* The current time */
diff -ruN pre-2.0.32-1/kernel/sys.c linux/kernel/sys.c
--- pre-2.0.32-1/kernel/sys.c	Tue Aug  5 02:15:07 1997
+++ linux/kernel/sys.c	Wed Nov 12 00:56:20 1997
@@ -268,7 +268,7 @@
 	    (egid != (gid_t) -1 && egid != old_rgid))
 		current->sgid = current->egid;
 	current->fsgid = current->egid;
-	if (current->egid != old_egid)
+	if (current->egid != old_egid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return 0;
 }
@@ -286,7 +286,7 @@
 		current->egid = current->fsgid = gid;
 	else
 		return -EPERM;
-	if (current->egid != old_egid)
+	if (current->egid != old_egid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return 0;
 }
@@ -477,7 +477,7 @@
 	    (euid != (uid_t) -1 && euid != old_ruid))
 		current->suid = current->euid;
 	current->fsuid = current->euid;
-	if (current->euid != old_euid)
+	if (current->euid != old_euid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return 0;
 }
@@ -503,7 +503,7 @@
 		current->fsuid = current->euid = uid;
 	else
 		return -EPERM;
-	if (current->euid != old_euid)
+	if (current->euid != old_euid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return(0);
 }
@@ -521,7 +521,7 @@
 	if (uid == current->uid || uid == current->euid ||
 	    uid == current->suid || uid == current->fsuid || suser())
 		current->fsuid = uid;
-	if (current->fsuid != old_fsuid)
+	if (current->fsuid != old_fsuid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return old_fsuid;
 }
@@ -536,7 +536,7 @@
 	if (gid == current->gid || gid == current->egid ||
 	    gid == current->sgid || gid == current->fsgid || suser())
 		current->fsgid = gid;
-	if (current->fsgid != old_fsgid)
+	if (current->fsgid != old_fsgid && (cdmp_options & CDMP_OPT_CHGSETUID) == 0)
 		current->dumpable = 0;
 	return old_fsgid;
 }
diff -ruN pre-2.0.32-1/kernel/sysctl.c linux/kernel/sysctl.c
--- pre-2.0.32-1/kernel/sysctl.c	Thu Aug 14 00:02:42 1997
+++ linux/kernel/sysctl.c	Wed Nov 12 00:56:20 1997
@@ -126,6 +126,8 @@
 	 0644, NULL, &proc_dointvec},
 	{KERN_NRFILE, "file-nr", &nr_files, sizeof(int),
 	 0444, NULL, &proc_dointvec},
+	{KERN_COREDUMP_OPT, "coredump", &cdmp_options, sizeof(int),
+	 0644, NULL, &proc_dointvec},
 	{KERN_MAXFILE, "file-max", &max_files, sizeof(int),
 	 0644, NULL, &proc_dointvec},
 	{KERN_SECURELVL, "securelevel", &securelevel, sizeof(int),
