5 #include <sys/sysctl.h>
13 kinfo_getfile(pid_t pid, int *cntp)
20 struct kinfo_file *kif, *kp, *kf;
26 mib[2] = KERN_PROC_FILEDESC;
29 error = sysctl(mib, nitems(mib), NULL, &len, NULL, 0);
36 error = sysctl(mib, nitems(mib), buf, &len, NULL, 0);
41 /* Pass 1: count items */
46 kf = (struct kinfo_file *)(uintptr_t)bp;
47 if (kf->kf_structsize == 0)
49 bp += kf->kf_structsize;
53 kif = calloc(cnt, sizeof(*kif));
63 kf = (struct kinfo_file *)(uintptr_t)bp;
64 if (kf->kf_structsize == 0)
66 /* Copy/expand into pre-zeroed buffer */
67 memcpy(kp, kf, kf->kf_structsize);
68 /* Advance to next packed record */
69 bp += kf->kf_structsize;
70 /* Set field size to fixed length, advance */
71 kp->kf_structsize = sizeof(*kp);
76 return (kif); /* Caller must free() return value */