aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_sem.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2014-09-22 16:20:47 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2014-09-22 16:20:47 +0000
commit9696feebe2320c9976607df4090f91a34c6549c3 (patch)
tree1934338f5bf1e12f3ce97b74e9e403dcf5a32bc8 /sys/kern/uipc_sem.c
parent447666f08b3bcb4cd9662c3ed0bd388170a0a30d (diff)
downloadsrc-9696feebe2320c9976607df4090f91a34c6549c3.tar.gz
src-9696feebe2320c9976607df4090f91a34c6549c3.zip
Notes
Diffstat (limited to 'sys/kern/uipc_sem.c')
-rw-r--r--sys/kern/uipc_sem.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 593c2a368e22..63b1cec0e036 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysproto.h>
#include <sys/systm.h>
#include <sys/sx.h>
+#include <sys/user.h>
#include <sys/vnode.h>
#include <security/mac/mac_framework.h>
@@ -130,6 +131,7 @@ static fo_stat_t ksem_stat;
static fo_close_t ksem_closef;
static fo_chmod_t ksem_chmod;
static fo_chown_t ksem_chown;
+static fo_fill_kinfo_t ksem_fill_kinfo;
/* File descriptor operations. */
static struct fileops ksem_ops = {
@@ -144,6 +146,7 @@ static struct fileops ksem_ops = {
.fo_chmod = ksem_chmod,
.fo_chown = ksem_chown,
.fo_sendfile = invfo_sendfile,
+ .fo_fill_kinfo = ksem_fill_kinfo,
.fo_flags = DFLAG_PASSABLE
};
@@ -252,6 +255,26 @@ ksem_closef(struct file *fp, struct thread *td)
return (0);
}
+static int
+ksem_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp)
+{
+ struct ksem *ks;
+
+ kif->kf_type = KF_TYPE_SEM;
+ ks = fp->f_data;
+ mtx_lock(&sem_lock);
+ kif->kf_un.kf_sem.kf_sem_value = ks->ks_value;
+ kif->kf_un.kf_sem.kf_sem_mode = S_IFREG | ks->ks_mode; /* XXX */
+ mtx_unlock(&sem_lock);
+ if (ks->ks_path != NULL) {
+ sx_slock(&ksem_dict_lock);
+ if (ks->ks_path != NULL)
+ strlcpy(kif->kf_path, ks->ks_path, sizeof(kif->kf_path));
+ sx_sunlock(&ksem_dict_lock);
+ }
+ return (0);
+}
+
/*
* ksem object management including creation and reference counting
* routines.
@@ -388,20 +411,6 @@ ksem_remove(char *path, Fnv32_t fnv, struct ucred *ucred)
return (ENOENT);
}
-static void
-ksem_info_impl(struct ksem *ks, char *path, size_t size, uint32_t *value)
-{
-
- if (ks->ks_path == NULL)
- return;
- sx_slock(&ksem_dict_lock);
- if (ks->ks_path != NULL)
- strlcpy(path, ks->ks_path, size);
- if (value != NULL)
- *value = ks->ks_value;
- sx_sunlock(&ksem_dict_lock);
-}
-
static int
ksem_create_copyout_semid(struct thread *td, semid_t *semidp, int fd,
int compat32)
@@ -983,7 +992,6 @@ ksem_module_init(void)
p31b_setcfg(CTL_P1003_1B_SEMAPHORES, 200112L);
p31b_setcfg(CTL_P1003_1B_SEM_NSEMS_MAX, SEM_MAX);
p31b_setcfg(CTL_P1003_1B_SEM_VALUE_MAX, SEM_VALUE_MAX);
- ksem_info = ksem_info_impl;
error = syscall_helper_register(ksem_syscalls);
if (error)
@@ -1005,7 +1013,6 @@ ksem_module_destroy(void)
#endif
syscall_helper_unregister(ksem_syscalls);
- ksem_info = NULL;
p31b_setcfg(CTL_P1003_1B_SEMAPHORES, 0);
hashdestroy(ksem_dictionary, M_KSEM, ksem_hash);
sx_destroy(&ksem_dict_lock);