+ exit1(p, W_EXITCODE(0, signum));
+ /* NOTREACHED */
+}
+
+/*
+ * Dump core, into a file named "core.progname".
+ * Do not drop core if the process was setuid/setgid.
+ */
+coredump(p)
+ register struct proc *p;
+{
+ register struct vnode *vp;
+ register struct pcred *pcred = p->p_cred;
+ register struct ucred *cred = pcred->pc_ucred;
+ register struct vmspace *vm = p->p_vmspace;
+ struct vattr vattr;
+ int error, error1;
+ struct nameidata nd;
+ char name[MAXCOMLEN+6]; /* progname.core */
+
+ if (pcred->p_svuid != pcred->p_ruid || pcred->p_svgid != pcred->p_rgid)
+ 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);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p);
+ if (error = vn_open(&nd,
+ O_CREAT | FWRITE, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))
+ return (error);
+ vp = nd.ni_vp;
+
+ /* Don't dump to non-regular files or files with links. */
+ if (vp->v_type != VREG ||
+ VOP_GETATTR(vp, &vattr, cred, p) || vattr.va_nlink != 1) {
+ error = EFAULT;