mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
libprocstat: add knowledge about NT_PROCSTAT_KQUEUES core file section
Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D49372
This commit is contained in:
parent
debcd4c057
commit
1c3d6532ca
3 changed files with 36 additions and 2 deletions
|
|
@ -109,6 +109,10 @@ static const struct psc_type_info {
|
|||
.n_type = NT_PTLWPINFO,
|
||||
.structsize = sizeof(struct ptrace_lwpinfo)
|
||||
},
|
||||
[PSC_TYPE_KQUEUES] = {
|
||||
.n_type = NT_PROCSTAT_KQUEUES,
|
||||
.structsize = sizeof(struct kinfo_knote)
|
||||
},
|
||||
};
|
||||
|
||||
static bool core_offset(struct procstat_core *core, off_t offset);
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ enum psc_type {
|
|||
PSC_TYPE_ENVV,
|
||||
PSC_TYPE_AUXV,
|
||||
PSC_TYPE_PTLWPINFO,
|
||||
PSC_TYPE_KQUEUES,
|
||||
PSC_TYPE_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2862,6 +2862,9 @@ struct kinfo_knote *
|
|||
procstat_get_kqueue_info(struct procstat *procstat,
|
||||
struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf)
|
||||
{
|
||||
struct kinfo_knote *kn, *k, *res, *rn;
|
||||
size_t len, kqn;
|
||||
|
||||
switch (procstat->type) {
|
||||
case PROCSTAT_KVM:
|
||||
warnx("kvm method is not supported");
|
||||
|
|
@ -2870,8 +2873,34 @@ procstat_get_kqueue_info(struct procstat *procstat,
|
|||
return (procstat_get_kqueue_info_sysctl(kp->ki_pid, kqfd,
|
||||
count, errbuf));
|
||||
case PROCSTAT_CORE:
|
||||
warnx("core method is not supported");
|
||||
return (NULL);
|
||||
k = procstat_core_get(procstat->core, PSC_TYPE_KQUEUES,
|
||||
NULL, &len);
|
||||
if (k == NULL) {
|
||||
snprintf(errbuf, _POSIX2_LINE_MAX,
|
||||
"getting NT_PROCSTAT_KQUEUES note failed");
|
||||
*count = 0;
|
||||
return (NULL);
|
||||
}
|
||||
for (kqn = 0, kn = k; kn < k + len / sizeof(*kn); kn++) {
|
||||
if (kn->knt_kq_fd == kqfd)
|
||||
kqn++;
|
||||
}
|
||||
res = calloc(kqn, sizeof(*res));
|
||||
if (res == NULL) {
|
||||
free(k);
|
||||
snprintf(errbuf, _POSIX2_LINE_MAX,
|
||||
"no memory");
|
||||
return (NULL);
|
||||
}
|
||||
for (kn = k, rn = res; kn < k + len / sizeof(*kn); kn++) {
|
||||
if (kn->knt_kq_fd != kqfd)
|
||||
continue;
|
||||
*rn = *kn;
|
||||
rn++;
|
||||
}
|
||||
*count = kqn;
|
||||
free(k);
|
||||
return (res);
|
||||
default:
|
||||
warnx("unknown access method: %d", procstat->type);
|
||||
return (NULL);
|
||||
|
|
|
|||
Loading…
Reference in a new issue