GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libkvm/kvm_udf.c Lines: 0 35 0.0 %
Date: 2017-11-07 Branches: 0 10 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: kvm_udf.c,v 1.10 2016/10/02 23:11:55 guenther Exp $	*/
2
3
/*
4
 * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org>
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
 * SUCH DAMAGE.
27
 */
28
29
#include <sys/param.h>
30
#include <sys/ucred.h>
31
#define _KERNEL
32
#include <sys/mount.h>
33
#undef _KERNEL
34
#include <sys/lock.h>
35
#include <sys/vnode.h>
36
#include <sys/sysctl.h>
37
#include <sys/specdev.h>
38
39
#include <crypto/siphash.h>
40
41
#include <isofs/udf/ecma167-udf.h>
42
#include <isofs/udf/udf.h>
43
44
#include <stdint.h>
45
#include <limits.h>
46
#include <kvm.h>
47
#include <db.h>
48
49
#include "kvm_private.h"
50
#include "kvm_file.h"
51
52
/* Convert file entry permission (5 bits per owner/group/user) to a mode_t */
53
static mode_t
54
udf_permtomode(struct unode *up)
55
{
56
	uint32_t perm;
57
	uint16_t flags;
58
	mode_t mode;
59
60
	perm = letoh32(up->u_fentry->perm);
61
	flags = letoh16(up->u_fentry->icbtag.flags);
62
63
	mode = perm & UDF_FENTRY_PERM_USER_MASK;
64
	mode |= ((perm & UDF_FENTRY_PERM_GRP_MASK) >> 2);
65
	mode |= ((perm & UDF_FENTRY_PERM_OWNER_MASK) >> 4);
66
	mode |= ((flags & UDF_ICB_TAG_FLAGS_STICKY) << 4);
67
	mode |= ((flags & UDF_ICB_TAG_FLAGS_SETGID) << 6);
68
	mode |= ((flags & UDF_ICB_TAG_FLAGS_SETUID) << 8);
69
70
	return (mode);
71
}
72
73
int
74
_kvm_stat_udf(kvm_t *kd, struct kinfo_file *kf, struct vnode *vp)
75
{
76
	struct unode up;
77
	struct file_entry fentry;
78
	struct umount um;
79
80
	if (KREAD(kd, (u_long)VTOU(vp), &up)) {
81
		_kvm_err(kd, kd->program, "can't read unode at %p", VTOU(vp));
82
		return (-1);
83
	}
84
	if (KREAD(kd, (u_long)up.u_fentry, &fentry)) {
85
		_kvm_err(kd, kd->program, "can't read file_entry at %p",
86
		    up.u_fentry);
87
		return (-1);
88
	}
89
	if (KREAD(kd, (u_long)up.u_ump, &um)) {
90
		_kvm_err(kd, kd->program, "can't read umount at %p",
91
		    up.u_ump);
92
		return (-1);
93
	}
94
	kf->va_fsid = up.u_dev;
95
	kf->va_fileid = (long)up.u_ino;
96
	kf->va_mode = udf_permtomode(&up); /* XXX */
97
	kf->va_rdev = 0;
98
	kf->va_nlink = letoh16(fentry.link_cnt);
99
	if (vp->v_type & VDIR) {
100
		/*
101
		 * Directories that are recorded within their ICB will show
102
		 * as having 0 blocks recorded.  Since tradition dictates
103
		 * that directories consume at least one logical block,
104
		 * make it appear so.
105
		 */
106
		if (fentry.logblks_rec != 0) {
107
			kf->va_size =
108
			    letoh64(fentry.logblks_rec) * um.um_bsize;
109
		} else {
110
			kf->va_size = um.um_bsize;
111
		}
112
	} else {
113
		kf->va_size = letoh64(fentry.inf_len);
114
	}
115
116
	return (0);
117
}