summaryrefslogtreecommitdiffstats
path: root/lib/libprocstat
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2011-08-14 00:42:09 +0000
committerrwatson <rwatson@FreeBSD.org>2011-08-14 00:42:09 +0000
commit35b7068df54aac6d028b50251a320efb190b6c41 (patch)
treeca429aeb22aa1af4b3462fdb8fb86944947b7dde /lib/libprocstat
parentae4052d3f376c0fa7111ebe2cc007fd43435d701 (diff)
downloadFreeBSD-src-35b7068df54aac6d028b50251a320efb190b6c41.zip
FreeBSD-src-35b7068df54aac6d028b50251a320efb190b6c41.tar.gz
Updates to libprocstat(3) and procstat(1) to allow monitoring Capsicum
capability mode and capabilities. Right now no attempt is made to unwrap capabilities when operating on a crashdump, so further refinement is required. Approved by: re (bz) Sponsored by: Google Inc
Diffstat (limited to 'lib/libprocstat')
-rw-r--r--lib/libprocstat/libprocstat.c28
-rw-r--r--lib/libprocstat/libprocstat.h2
2 files changed, 19 insertions, 11 deletions
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c
index 22ca668..facce11 100644
--- a/lib/libprocstat/libprocstat.c
+++ b/lib/libprocstat/libprocstat.c
@@ -282,7 +282,7 @@ procstat_freefiles(struct procstat *procstat, struct filestat_list *head)
static struct filestat *
filestat_new_entry(void *typedep, int type, int fd, int fflags, int uflags,
- int refcount, off_t offset, char *path)
+ int refcount, off_t offset, char *path, cap_rights_t cap_rights)
{
struct filestat *entry;
@@ -299,6 +299,7 @@ filestat_new_entry(void *typedep, int type, int fd, int fflags, int uflags,
entry->fs_ref_count = refcount;
entry->fs_offset = offset;
entry->fs_path = path;
+ entry->fs_cap_rights = cap_rights;
return (entry);
}
@@ -381,21 +382,21 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
/* root directory vnode, if one. */
if (filed.fd_rdir) {
entry = filestat_new_entry(filed.fd_rdir, PS_FST_TYPE_VNODE, -1,
- PS_FST_FFLAG_READ, PS_FST_UFLAG_RDIR, 0, 0, NULL);
+ PS_FST_FFLAG_READ, PS_FST_UFLAG_RDIR, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
/* current working directory vnode. */
if (filed.fd_cdir) {
entry = filestat_new_entry(filed.fd_cdir, PS_FST_TYPE_VNODE, -1,
- PS_FST_FFLAG_READ, PS_FST_UFLAG_CDIR, 0, 0, NULL);
+ PS_FST_FFLAG_READ, PS_FST_UFLAG_CDIR, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
/* jail root, if any. */
if (filed.fd_jdir) {
entry = filestat_new_entry(filed.fd_jdir, PS_FST_TYPE_VNODE, -1,
- PS_FST_FFLAG_READ, PS_FST_UFLAG_JAIL, 0, 0, NULL);
+ PS_FST_FFLAG_READ, PS_FST_UFLAG_JAIL, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -403,14 +404,14 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
if (kp->ki_tracep) {
entry = filestat_new_entry(kp->ki_tracep, PS_FST_TYPE_VNODE, -1,
PS_FST_FFLAG_READ | PS_FST_FFLAG_WRITE,
- PS_FST_UFLAG_TRACE, 0, 0, NULL);
+ PS_FST_UFLAG_TRACE, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
/* text vnode, if one */
if (kp->ki_textvp) {
entry = filestat_new_entry(kp->ki_textvp, PS_FST_TYPE_VNODE, -1,
- PS_FST_FFLAG_READ, PS_FST_UFLAG_TEXT, 0, 0, NULL);
+ PS_FST_FFLAG_READ, PS_FST_UFLAG_TEXT, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -418,7 +419,7 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
if ((vp = getctty(kd, kp)) != NULL) {
entry = filestat_new_entry(vp, PS_FST_TYPE_VNODE, -1,
PS_FST_FFLAG_READ | PS_FST_FFLAG_WRITE,
- PS_FST_UFLAG_CTTY, 0, 0, NULL);
+ PS_FST_UFLAG_CTTY, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -471,8 +472,9 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
default:
continue;
}
+ /* XXXRW: No capability rights support for kvm yet. */
entry = filestat_new_entry(data, type, i,
- to_filestat_flags(file.f_flag), 0, 0, 0, NULL);
+ to_filestat_flags(file.f_flag), 0, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -531,7 +533,7 @@ do_mmapped:
*/
entry = filestat_new_entry(object.handle,
PS_FST_TYPE_VNODE, -1, fflags,
- PS_FST_UFLAG_MMAP, 0, 0, NULL);
+ PS_FST_UFLAG_MMAP, 0, 0, NULL, 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -586,6 +588,7 @@ kinfo_fflags2fst(int kfflags)
} kfflags2fst[] = {
{ KF_FLAG_APPEND, PS_FST_FFLAG_APPEND },
{ KF_FLAG_ASYNC, PS_FST_FFLAG_ASYNC },
+ { KF_FLAG_CAPABILITY, PS_FST_FFLAG_CAPABILITY },
{ KF_FLAG_CREAT, PS_FST_FFLAG_CREAT },
{ KF_FLAG_DIRECT, PS_FST_FFLAG_DIRECT },
{ KF_FLAG_EXCL, PS_FST_FFLAG_EXCL },
@@ -644,6 +647,7 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m
int cnt, fd, fflags;
int i, type, uflags;
int refcount;
+ cap_rights_t cap_rights;
assert(kp);
if (kp->ki_fd == NULL)
@@ -676,12 +680,13 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m
path = strdup(kif->kf_path);
else
path = NULL;
+ cap_rights = kif->kf_cap_rights;
/*
* Create filestat entry.
*/
entry = filestat_new_entry(kif, type, fd, fflags, uflags,
- refcount, offset, path);
+ refcount, offset, path, cap_rights);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
@@ -707,7 +712,8 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m
else
path = NULL;
entry = filestat_new_entry(kve, PS_FST_TYPE_VNODE, -1,
- fflags, PS_FST_UFLAG_MMAP, refcount, offset, path);
+ fflags, PS_FST_UFLAG_MMAP, refcount, offset, path,
+ 0);
if (entry != NULL)
STAILQ_INSERT_TAIL(head, entry, next);
}
diff --git a/lib/libprocstat/libprocstat.h b/lib/libprocstat/libprocstat.h
index 62b1bd5..f1ca109 100644
--- a/lib/libprocstat/libprocstat.h
+++ b/lib/libprocstat/libprocstat.h
@@ -88,6 +88,7 @@
#define PS_FST_FFLAG_DIRECT 0x1000
#define PS_FST_FFLAG_EXEC 0x2000
#define PS_FST_FFLAG_HASLOCK 0x4000
+#define PS_FST_FFLAG_CAPABILITY 0x8000
struct procstat;
struct filestat {
@@ -101,6 +102,7 @@ struct filestat {
void *fs_typedep; /* Type dependent data. */
char *fs_path;
STAILQ_ENTRY(filestat) next;
+ cap_rights_t fs_cap_rights; /* Capability rights, if flag set. */
};
struct vnstat {
uint64_t vn_fileid;
OpenPOWER on IntegriCloud