summaryrefslogtreecommitdiff
path: root/usr.bin/fstat
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2013-05-03 21:11:57 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2013-05-03 21:11:57 +0000
commit958aa57537952c7e7018518bb9d643b81e85e827 (patch)
tree4b4ec8c6d14c8986e2139b96edf75a870d996980 /usr.bin/fstat
parent14303aa88998c64be2962e89ea48306fb44b4037 (diff)
downloadsrc-test-958aa57537952c7e7018518bb9d643b81e85e827.tar.gz
src-test-958aa57537952c7e7018518bb9d643b81e85e827.zip
Similar to 233760 and 236717, export some more useful info about the
kernel-based POSIX semaphore descriptors to userland via procstat(1) and fstat(1): - Change sem file descriptors to track the pathname they are associated with and add a ksem_info() method to copy the path out to a caller-supplied buffer. - Use the fo_stat() method of shared memory objects and ksem_info() to export the path, mode, and value of a semaphore via struct kinfo_file. - Add a struct semstat to the libprocstat(3) interface along with a procstat_get_sem_info() to export the mode and value of a semaphore. - Teach fstat about semaphores and to display their path, mode, and value. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=250223
Diffstat (limited to 'usr.bin/fstat')
-rw-r--r--usr.bin/fstat/fstat.12
-rw-r--r--usr.bin/fstat/fstat.c29
2 files changed, 31 insertions, 0 deletions
diff --git a/usr.bin/fstat/fstat.1 b/usr.bin/fstat/fstat.1
index 7403a8e725ee2..268b70f4526f7 100644
--- a/usr.bin/fstat/fstat.1
+++ b/usr.bin/fstat/fstat.1
@@ -155,6 +155,8 @@ using a symbolic format (see
otherwise, the mode is printed
as an octal number.
.It Li SZ\&|DV
+If the file is a semaphore,
+prints the current value of the semaphore.
If the file is not a character or block special, prints the size of
the file in bytes.
Otherwise, if the
diff --git a/usr.bin/fstat/fstat.c b/usr.bin/fstat/fstat.c
index 265791d1daacf..1aeee67511dd7 100644
--- a/usr.bin/fstat/fstat.c
+++ b/usr.bin/fstat/fstat.c
@@ -84,6 +84,8 @@ static void print_pipe_info(struct procstat *procstat,
struct filestat *fst);
static void print_pts_info(struct procstat *procstat,
struct filestat *fst);
+static void print_sem_info(struct procstat *procstat,
+ struct filestat *fst);
static void print_shm_info(struct procstat *procstat,
struct filestat *fst);
static void print_socket_info(struct procstat *procstat,
@@ -294,6 +296,9 @@ print_file_info(struct procstat *procstat, struct filestat *fst,
case PS_FST_TYPE_SHM:
print_shm_info(procstat, fst);
break;
+ case PS_FST_TYPE_SEM:
+ print_sem_info(procstat, fst);
+ break;
default:
if (vflg)
fprintf(stderr,
@@ -424,6 +429,30 @@ print_pts_info(struct procstat *procstat, struct filestat *fst)
}
static void
+print_sem_info(struct procstat *procstat, struct filestat *fst)
+{
+ struct semstat sem;
+ char errbuf[_POSIX2_LINE_MAX];
+ char mode[15];
+ int error;
+
+ error = procstat_get_sem_info(procstat, fst, &sem, errbuf);
+ if (error != 0) {
+ printf("* error");
+ return;
+ }
+ if (nflg) {
+ printf(" ");
+ (void)snprintf(mode, sizeof(mode), "%o", sem.mode);
+ } else {
+ printf(" %-15s", fst->fs_path != NULL ? fst->fs_path : "-");
+ strmode(sem.mode, mode);
+ }
+ printf(" %10s %6u", mode, sem.value);
+ print_access_flags(fst->fs_fflags);
+}
+
+static void
print_shm_info(struct procstat *procstat, struct filestat *fst)
{
struct shmstat shm;