summaryrefslogtreecommitdiffstats
path: root/lib/libkvm
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2009-06-24 13:04:24 +0000
committermillert <millert@openbsd.org>2009-06-24 13:04:24 +0000
commit9938c24341ec0d5787eacf9556da6c95d2e963b5 (patch)
tree338609c6dbe43f0d0e36b18c34ccae8292ffb7cb /lib/libkvm
parentRemove extra psignal/wakeup in exit1() which can cause the parent to (diff)
downloadwireguard-openbsd-9938c24341ec0d5787eacf9556da6c95d2e963b5.tar.xz
wireguard-openbsd-9938c24341ec0d5787eacf9556da6c95d2e963b5.zip
Install ntfs includes and add libkvm (fstat) support. ntfs bits
adapted from NetBSD fstat. OK deraadt@
Diffstat (limited to 'lib/libkvm')
-rw-r--r--lib/libkvm/Makefile4
-rw-r--r--lib/libkvm/kvm_file2.c15
-rw-r--r--lib/libkvm/kvm_ntfs.c88
-rw-r--r--lib/libkvm/kvm_private.h3
4 files changed, 101 insertions, 9 deletions
diff --git a/lib/libkvm/Makefile b/lib/libkvm/Makefile
index 5a5c60ada1c..620ba477483 100644
--- a/lib/libkvm/Makefile
+++ b/lib/libkvm/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.10 2009/06/20 19:50:05 millert Exp $
+# $OpenBSD: Makefile,v 1.11 2009/06/24 13:04:24 millert Exp $
# $NetBSD: Makefile,v 1.11 1996/03/18 22:33:07 thorpej Exp $
# from: @(#)Makefile 8.1 (Berkeley) 6/4/93
@@ -16,7 +16,7 @@ SRCS= kvm_${MACHINE_ARCH}.c
.endif
SRCS+= kvm.c kvm_file.c kvm_file2.c kvm_getloadavg.c kvm_proc.c \
- kvm_cd9660.c kvm_udf.c
+ kvm_cd9660.c kvm_udf.c kvm_ntfs.c
MAN= kvm.3 kvm_dump.3 kvm_geterr.3 kvm_getfiles.3 kvm_getloadavg.3 \
kvm_getprocs.3 kvm_nlist.3 kvm_open.3 kvm_read.3
diff --git a/lib/libkvm/kvm_file2.c b/lib/libkvm/kvm_file2.c
index 8778b63743e..e7e2279b657 100644
--- a/lib/libkvm/kvm_file2.c
+++ b/lib/libkvm/kvm_file2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_file2.c,v 1.8 2009/06/20 20:20:43 millert Exp $ */
+/* $OpenBSD: kvm_file2.c,v 1.9 2009/06/24 13:04:24 millert Exp $ */
/*
* Copyright (c) 2009 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -46,7 +46,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: kvm_file2.c,v 1.8 2009/06/20 20:20:43 millert Exp $";
+static char *rcsid = "$OpenBSD: kvm_file2.c,v 1.9 2009/06/24 13:04:24 millert Exp $";
#endif /* LIBC_SCCS and not lint */
/*
@@ -623,8 +623,8 @@ fill_file2(kvm_t *kd, struct kinfo_file2 *kf, struct file *fp, struct vnode *vp,
return (0);
}
-static mode_t
-getftype(enum vtype v_type)
+mode_t
+_kvm_getftype(enum vtype v_type)
{
mode_t ftype = 0;
@@ -732,7 +732,7 @@ msdos_filestat(kvm_t *kd, struct kinfo_file2 *kf, struct vnode *vp)
kf->va_fsid = de.de_dev & 0xffff;
kf->va_fileid = 0; /* XXX see msdosfs_vptofh() for more info */
- kf->va_mode = (mp.pm_mask & 0777) | getftype(vp->v_type);
+ kf->va_mode = (mp.pm_mask & 0777) | _kvm_getftype(vp->v_type);
kf->va_size = de.de_FileSize;
kf->va_rdev = 0; /* msdosfs doesn't support device files */
@@ -753,7 +753,7 @@ nfs_filestat(kvm_t *kd, struct kinfo_file2 *kf, struct vnode *vp)
kf->va_fileid = nfsnode.n_vattr.va_fileid;
kf->va_size = nfsnode.n_size;
kf->va_rdev = nfsnode.n_vattr.va_rdev;
- kf->va_mode = (mode_t)nfsnode.n_vattr.va_mode | getftype(vp->v_type);
+ kf->va_mode = (mode_t)nfsnode.n_vattr.va_mode | _kvm_getftype(vp->v_type);
return (0);
}
@@ -832,6 +832,9 @@ filestat(kvm_t *kd, struct kinfo_file2 *kf, struct vnode *vp)
case VT_UDF:
ret = _kvm_stat_udf(kd, kf, vp);
break;
+ case VT_NTFS:
+ ret = _kvm_stat_ntfs(kd, kf, vp);
+ break;
case VT_NON:
if (vp->v_flag & VCLONE)
ret = spec_filestat(kd, kf, vp);
diff --git a/lib/libkvm/kvm_ntfs.c b/lib/libkvm/kvm_ntfs.c
new file mode 100644
index 00000000000..fd36f33a8c6
--- /dev/null
+++ b/lib/libkvm/kvm_ntfs.c
@@ -0,0 +1,88 @@
+/* $OpenBSD: kvm_ntfs.c,v 1.1 2009/06/24 13:04:24 millert Exp $ */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jaromir Dolecek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: kvm_ntfs.c,v 1.1 2009/06/24 13:04:24 millert Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/ucred.h>
+#define _KERNEL
+#include <sys/mount.h>
+#undef _KERNEL
+#include <sys/vnode.h>
+#include <sys/sysctl.h>
+
+#include <ntfs/ntfs.h>
+#include <ntfs/ntfs_inode.h>
+
+#include <limits.h>
+#include <kvm.h>
+#include <db.h>
+
+#include "kvm_private.h"
+
+extern mode_t _kvm_getftype(enum vtype);
+
+int
+_kvm_stat_ntfs(kvm_t *kd, struct kinfo_file2 *kf, struct vnode *vp)
+{
+ struct ntnode ntnode;
+ struct fnode fn;
+ struct ntfsmount ntm;
+
+ /*
+ * To get the ntnode, we have to go in two steps - firstly
+ * to read appropriate struct fnode and then getting the address
+ * of ntnode and reading it's contents
+ */
+ if (KREAD(kd, (u_long)VTOF(vp), &fn)) {
+ _kvm_err(kd, kd->program, "can't read fnode at %p", VTOF(vp));
+ return (-1);
+ }
+ if (KREAD(kd, (u_long)FTONT(&fn), &ntnode)) {
+ _kvm_err(kd, kd->program, "can't read ntnode at %p", FTONT(&fn));
+ return (-1);
+ }
+ if (KREAD(kd, (u_long)ntnode.i_mp, &ntm)) {
+ _kvm_err(kd, kd->program, "can't read ntfsmount at %p",
+ ntnode.i_mp);
+ return (-1);
+ }
+
+ kf->va_fsid = ntnode.i_dev & 0xffff;
+ kf->va_fileid = (long)ntnode.i_number;
+ kf->va_mode = (mode_t)ntm.ntm_mode | _kvm_getftype(vp->v_type);
+ kf->va_size = fn.f_size;
+ kf->va_rdev = 0; /* XXX */
+
+ return (0);
+}
diff --git a/lib/libkvm/kvm_private.h b/lib/libkvm/kvm_private.h
index 8c402320f21..3c6b01e9959 100644
--- a/lib/libkvm/kvm_private.h
+++ b/lib/libkvm/kvm_private.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_private.h,v 1.14 2009/06/20 20:20:43 millert Exp $ */
+/* $OpenBSD: kvm_private.h,v 1.15 2009/06/24 13:04:24 millert Exp $ */
/* $NetBSD: kvm_private.h,v 1.7 1996/05/05 04:32:15 gwr Exp $ */
/*-
@@ -106,3 +106,4 @@ ssize_t _kvm_pread(kvm_t *, int, void *, size_t, off_t);
ssize_t _kvm_pwrite(kvm_t *, int, const void *, size_t, off_t);
int _kvm_stat_cd9660(kvm_t *, struct kinfo_file2 *, struct vnode *);
int _kvm_stat_udf(kvm_t *, struct kinfo_file2 *, struct vnode *);
+int _kvm_stat_ntfs(kvm_t *, struct kinfo_file2 *, struct vnode *);