- sprintf(core_name, "/cores/core.%d", p->p_pid);
- NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, core_name, p);
- if(error = vn_open(&nd, O_CREAT | FWRITE | O_NOFOLLOW, S_IRUSR ))
- return (error);
- vp = nd.ni_vp;
-
+ MALLOC(alloced_name, char *, MAXPATHLEN, M_TEMP, M_NOWAIT | M_ZERO);
+
+ /* create name according to sysctl'able format string */
+ /* if name creation fails, fall back to historical behaviour... */
+ if (proc_core_name(core_proc->p_comm, kauth_cred_getuid(cred),
+ core_proc->p_pid, alloced_name, MAXPATHLEN)) {
+ snprintf(stack_name, sizeof(stack_name),
+ "/cores/core.%d", core_proc->p_pid);
+ name = stack_name;
+ } else
+ name = alloced_name;
+
+ if ((error = vnode_open(name, (O_CREAT | FWRITE | O_NOFOLLOW), S_IRUSR, VNODE_LOOKUP_NOFOLLOW, &vp, ctx)))
+ goto out2;
+
+ VATTR_INIT(&va);
+ VATTR_WANTED(&va, va_nlink);