rump: import libukfs
This commit is contained in:
parent
dba634132e
commit
3ebab8327b
|
|
@ -1112,6 +1112,9 @@
|
||||||
./usr/lib/libtermlib.so minix-base
|
./usr/lib/libtermlib.so minix-base
|
||||||
./usr/lib/libtermlib.so.0 minix-base
|
./usr/lib/libtermlib.so.0 minix-base
|
||||||
./usr/lib/libtermlib.so.0.6 minix-base
|
./usr/lib/libtermlib.so.0.6 minix-base
|
||||||
|
./usr/lib/libukfs.so.1.0 minix-base rump
|
||||||
|
./usr/lib/libukfs.so.1 minix-base rump
|
||||||
|
./usr/lib/libukfs.so minix-base rump
|
||||||
./usr/lib/libutil.so minix-base
|
./usr/lib/libutil.so minix-base
|
||||||
./usr/lib/libutil.so.7 minix-base
|
./usr/lib/libutil.so.7 minix-base
|
||||||
./usr/lib/libutil.so.7.21 minix-base obsolete
|
./usr/lib/libutil.so.7.21 minix-base obsolete
|
||||||
|
|
|
||||||
|
|
@ -1735,6 +1735,7 @@
|
||||||
./usr/include/rump/rumpuser_port.h minix-comp rump
|
./usr/include/rump/rumpuser_port.h minix-comp rump
|
||||||
./usr/include/rump/rumpvfs_if_pub.h minix-comp rump
|
./usr/include/rump/rumpvfs_if_pub.h minix-comp rump
|
||||||
./usr/include/rump/rumpvnode_if.h minix-comp rump
|
./usr/include/rump/rumpvnode_if.h minix-comp rump
|
||||||
|
./usr/include/rump/ukfs.h minix-comp rump
|
||||||
./usr/include/saslc.h minix-comp crypto
|
./usr/include/saslc.h minix-comp crypto
|
||||||
./usr/include/sched.h minix-comp
|
./usr/include/sched.h minix-comp
|
||||||
./usr/include/search.h minix-comp
|
./usr/include/search.h minix-comp
|
||||||
|
|
@ -2458,6 +2459,7 @@
|
||||||
./usr/lib/libtermlib_pic.a minix-comp
|
./usr/lib/libtermlib_pic.a minix-comp
|
||||||
./usr/lib/libtimers.a minix-comp
|
./usr/lib/libtimers.a minix-comp
|
||||||
./usr/lib/libtimers_pic.a minix-comp
|
./usr/lib/libtimers_pic.a minix-comp
|
||||||
|
./usr/lib/libukfs.a minix-comp rump
|
||||||
./usr/lib/libusb.a minix-comp
|
./usr/lib/libusb.a minix-comp
|
||||||
./usr/lib/libusb_pic.a minix-comp
|
./usr/lib/libusb_pic.a minix-comp
|
||||||
./usr/lib/libutil.a minix-comp
|
./usr/lib/libutil.a minix-comp
|
||||||
|
|
|
||||||
|
|
@ -3070,6 +3070,7 @@
|
||||||
./usr/man/man3/tzsetwall.3 minix-man
|
./usr/man/man3/tzsetwall.3 minix-man
|
||||||
./usr/man/man3/ualarm.3 minix-man
|
./usr/man/man3/ualarm.3 minix-man
|
||||||
./usr/man/man3/uid_from_user.3 minix-man
|
./usr/man/man3/uid_from_user.3 minix-man
|
||||||
|
./usr/man/man3/ukfs.3 minix-man rump
|
||||||
./usr/man/man3/ulimit.3 minix-man
|
./usr/man/man3/ulimit.3 minix-man
|
||||||
./usr/man/man3/uname.3 minix-man
|
./usr/man/man3/uname.3 minix-man
|
||||||
./usr/man/man3/unctrl.3 minix-man
|
./usr/man/man3/unctrl.3 minix-man
|
||||||
|
|
|
||||||
|
|
@ -307,7 +307,7 @@ SUBDIR+= ../external/bsd/mdocml/lib
|
||||||
#==================== 4th library dependency barrier ====================
|
#==================== 4th library dependency barrier ====================
|
||||||
SUBDIR+= .WAIT
|
SUBDIR+= .WAIT
|
||||||
|
|
||||||
#SUBDIR+= libukfs # depends on librumpvfs, librump
|
SUBDIR+= libukfs # depends on librumpvfs, librump
|
||||||
|
|
||||||
.if (${MKTPM} != "no")
|
.if (${MKTPM} != "no")
|
||||||
SUBDIR+= ../crypto/external/cpl/trousers/lib
|
SUBDIR+= ../crypto/external/cpl/trousers/lib
|
||||||
|
|
|
||||||
26
lib/libukfs/Makefile
Normal file
26
lib/libukfs/Makefile
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# $NetBSD: Makefile,v 1.7 2013/09/11 23:04:11 joerg Exp $
|
||||||
|
#
|
||||||
|
|
||||||
|
WARNS= 2
|
||||||
|
|
||||||
|
LIB= ukfs
|
||||||
|
.if defined(__MINIX)
|
||||||
|
LIBDPLIBS+= rump ${.CURDIR}/../librump \
|
||||||
|
rumpvfs ${.CURDIR}/../librumpvfs \
|
||||||
|
mthread ${.CURDIR}/../../minix/lib/libmthread
|
||||||
|
|
||||||
|
CPPFLAGS+= -Wno-unused-function
|
||||||
|
.else
|
||||||
|
LIBDPLIBS+= rump ${.CURDIR}/../librump \
|
||||||
|
rumpvfs ${.CURDIR}/../librumpvfs \
|
||||||
|
pthread ${.CURDIR}/../libpthread
|
||||||
|
.endif # defined(__MINIX)
|
||||||
|
CPPFLAGS+= -I${.CURDIR}
|
||||||
|
|
||||||
|
INCS= ukfs.h
|
||||||
|
INCSDIR= /usr/include/rump
|
||||||
|
|
||||||
|
SRCS= ukfs.c ukfs_disklabel.c
|
||||||
|
MAN= ukfs.3
|
||||||
|
|
||||||
|
.include <bsd.lib.mk>
|
||||||
4
lib/libukfs/shlib_version
Normal file
4
lib/libukfs/shlib_version
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# $NetBSD: shlib_version,v 1.2 2009/01/11 02:47:19 christos Exp $
|
||||||
|
#
|
||||||
|
major=1
|
||||||
|
minor=0
|
||||||
321
lib/libukfs/ukfs.3
Normal file
321
lib/libukfs/ukfs.3
Normal file
|
|
@ -0,0 +1,321 @@
|
||||||
|
.\" $NetBSD: ukfs.3,v 1.14 2014/02/14 07:27:37 wiz Exp $
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 2008 Antti Kantee. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" 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 AUTHOR 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 AUTHOR 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.
|
||||||
|
.\"
|
||||||
|
.Dd February 13, 2014
|
||||||
|
.Dt UKFS 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm ukfs
|
||||||
|
.Nd user kernel file system library interface
|
||||||
|
.Sh LIBRARY
|
||||||
|
ukfs Library (libukfs, \-lukfs)
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In rump/ukfs.h
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
library provides direct access to file systems without having to
|
||||||
|
specially mount a file system.
|
||||||
|
Therefore, accessing a file system through
|
||||||
|
.Nm
|
||||||
|
requires no special kernel support apart from standard POSIX functionality.
|
||||||
|
As
|
||||||
|
.Nm
|
||||||
|
is built upon
|
||||||
|
.Xr rump 3
|
||||||
|
kernels, all kernel file systems which are supported by rump kernels
|
||||||
|
are available.
|
||||||
|
It allows to write utilities for accessing file systems
|
||||||
|
without having to duplicate file system internals knowledge already
|
||||||
|
present in kernel file system drivers.
|
||||||
|
.Pp
|
||||||
|
.Nm
|
||||||
|
provides a high-level pathname based interface for accessing file systems.
|
||||||
|
If a lower level interface it desired,
|
||||||
|
.Xr rump 3
|
||||||
|
kernels should be used directly.
|
||||||
|
However, much like system calls, the interfaces of
|
||||||
|
.Nm ,
|
||||||
|
are self-contained and require no tracking and release of resources.
|
||||||
|
The only exception is the file system handle
|
||||||
|
.Ft struct ukfs
|
||||||
|
which should be released after use.
|
||||||
|
.Sh INITIALIZATION
|
||||||
|
.Bl -ohang
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_init
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_modload "const char *fname"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_modload_dir "const char *dirname"
|
||||||
|
.It Ft ssize_t
|
||||||
|
.Fn ukfs_vfstypes "char *buf" "size_t buflen"
|
||||||
|
.It Ft struct ukfs *
|
||||||
|
.Fn ukfs_mount "const char *vfsname" "const char *devpath" \
|
||||||
|
"const char *mountpath" "int mntflags" "void *arg" "size_t alen"
|
||||||
|
.It Ft struct ukfs *
|
||||||
|
.Fn ukfs_mount_disk "const char *vfsname" "const char *devpath" \
|
||||||
|
"int partition" "const char *mountpath" "int mntflags" \
|
||||||
|
"void *arg" "size_t alen"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_release "struct ukfs *ukfs" "int flags"
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_init
|
||||||
|
intializes the library and must be called once per process using
|
||||||
|
.Nm .
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_modload
|
||||||
|
is used at runtime to dynamically load a library which contains a
|
||||||
|
file system module.
|
||||||
|
For this to succeed, the
|
||||||
|
.Xr rump 3
|
||||||
|
kernel and the module targetted must be compiled with compatible kernel
|
||||||
|
versions and the application must be dynamically linked.
|
||||||
|
Additionally, since this routine does not handle dependencies, all the
|
||||||
|
dependencies of the library must be loaded beforehand.
|
||||||
|
The routine returns \-1 for fatal error, 0 for dependency failure and 1
|
||||||
|
for success.
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_modload_dir
|
||||||
|
loads all
|
||||||
|
.Xr rump 3
|
||||||
|
kernel file system components in directory
|
||||||
|
.Fa dirname .
|
||||||
|
It looks for libraries which begin with
|
||||||
|
.Pa librumpfs_
|
||||||
|
and end in
|
||||||
|
.Pa .so .
|
||||||
|
The routine tries to handle dependencies by retrying to load libraries
|
||||||
|
which failed due to dependencies.
|
||||||
|
.Fn ukfs_modload_dir
|
||||||
|
returns the number of vfs modules loaded or sets errno and
|
||||||
|
returns \-1 in case of a fatal error in directory searching.
|
||||||
|
In case a fatal error occurs after some modules have already been
|
||||||
|
loaded, the number of loaded module is returned.
|
||||||
|
Fatal errors in loading the modules themselves are ignored and
|
||||||
|
.Fn ukfs_modload
|
||||||
|
should be used directly if finegrained error reporting is desired.
|
||||||
|
.Pp
|
||||||
|
It should be noted that the above routines affect the whole process,
|
||||||
|
not just a specific instance of
|
||||||
|
.Nm .
|
||||||
|
It is preferable to call them from only one thread, as the underlying
|
||||||
|
dynamic library interfaces may not be threadsafe.
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_vfstypes
|
||||||
|
queries the available file system types and returns a nul-terminated
|
||||||
|
list of types separated by spaces in
|
||||||
|
.Fa buf .
|
||||||
|
The format of the list is equivalent to the one returned by
|
||||||
|
.Xr sysctl 3
|
||||||
|
on the name
|
||||||
|
.Pa vfs.generic.fstypes .
|
||||||
|
The function returns the length of the string without the trailing nul
|
||||||
|
or \-1 for error.
|
||||||
|
Notably, the return value 0 means there are no file systems available.
|
||||||
|
If there is not enough room in the caller's buffer for all file system
|
||||||
|
types, as many as fit will be returned.
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_mount
|
||||||
|
intializes a file system image.
|
||||||
|
The handle resulting from the operation is passed to all other routines
|
||||||
|
and identifies the instance of the mount analoguous to what a pathname
|
||||||
|
specifies in a normally mounted file system.
|
||||||
|
The parameters are the following:
|
||||||
|
.Bl -tag -width XXX -offset indent
|
||||||
|
.It vfsname
|
||||||
|
Name of the file system to be used, e.g.
|
||||||
|
.Dv MOUNT_FFS .
|
||||||
|
.It devpath
|
||||||
|
Path of file system image.
|
||||||
|
It can be either a regular file, device or, if the file system does
|
||||||
|
not support the concept of a device, an abitrary string, e.g. network
|
||||||
|
address.
|
||||||
|
.It mountpath
|
||||||
|
Path where the file system is mounted to.
|
||||||
|
This parameter is used only by the file system being mounted.
|
||||||
|
Most of the time
|
||||||
|
.Dv UKFS_DEFAULTMP
|
||||||
|
is the correct path.
|
||||||
|
.It mntflags
|
||||||
|
Flags as passed to the
|
||||||
|
.Xr mount 2
|
||||||
|
system call, for example
|
||||||
|
.Dv MNT_RDONLY .
|
||||||
|
In addition to generic parameters, file system specific parameters such as
|
||||||
|
.Dv MNT_LOG
|
||||||
|
(ffs) may be passed here.
|
||||||
|
.It arg
|
||||||
|
File system private argument structure.
|
||||||
|
This is passed directly to the file system.
|
||||||
|
It must match what
|
||||||
|
.Fa vfsname
|
||||||
|
expects.
|
||||||
|
.It alen
|
||||||
|
Size of said structure.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fn ukfs_mount_disk
|
||||||
|
function must be used to mount disk-based file systems.
|
||||||
|
It takes the same arguments as
|
||||||
|
.Fn ukfs_mount ,
|
||||||
|
except for an additional argument signifying the
|
||||||
|
.Fa partition
|
||||||
|
number.
|
||||||
|
If the image
|
||||||
|
.Fa devpath
|
||||||
|
contains a disklabel, this value specifies the number of the partition
|
||||||
|
within the image used as the file system backend.
|
||||||
|
If
|
||||||
|
.Fa devpath
|
||||||
|
does not contain a disklabel, the value
|
||||||
|
.Dv UKFS_PARTITION_NONE
|
||||||
|
must be used to signal that the file system backend is the entire
|
||||||
|
image.
|
||||||
|
.Pp
|
||||||
|
.Fn ukfs_release
|
||||||
|
unmounts the file system and releases the resources associated with
|
||||||
|
.Fa ukfs .
|
||||||
|
The return value signals the return value of the unmount operation.
|
||||||
|
If non-zero,
|
||||||
|
.Fa ukfs
|
||||||
|
will continue to remain valid.
|
||||||
|
The possible values for flags are:
|
||||||
|
.Bl -tag -width XUKFS_RELFLAG_NOUNMOUT -offset indent
|
||||||
|
.It Dv UKFS_RELFLAG_NOUNMOUNT
|
||||||
|
Do not unmount file system, just release ukfs handle.
|
||||||
|
Release always succeeds.
|
||||||
|
.It Dv UKFS_RELFLAG_FORCE
|
||||||
|
Forcefully unmount the file system.
|
||||||
|
This means that any busy nodes (due to e.g.
|
||||||
|
.Fn ukfs_chdir )
|
||||||
|
will be ignored.
|
||||||
|
Release always succeeds.
|
||||||
|
.El
|
||||||
|
.Sh OPERATION
|
||||||
|
.Bl -ohang
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_chdir "struct ukfs *ukfs" "const char *path"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_getdents "struct ukfs *ukfs" "const char *dirname" "off_t *off" \
|
||||||
|
"uint8_t *buf" "size_t bufsize"
|
||||||
|
.It Ft ssize_t
|
||||||
|
.Fn ukfs_read "struct ukfs *ukfs" "const char *filename" "off_t off" \
|
||||||
|
"uint8_t *buf" "size_t bufsize"
|
||||||
|
.It Ft ssize_t
|
||||||
|
.Fn ukfs_write "struct ukfs *ukfs" "const char *filename" "off_t off" \
|
||||||
|
"uint8_t *buf" "size_t bufsize"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_create "struct ukfs *ukfs" "const char *filename" "mode_t mode"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_mknod "struct ukfs *ukfs" "const char *path" "mode_t mode" "dev_t dev"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_mkfifo "struct ukfs *ukfs" "const char *path" "mode_t mode"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_mkdir "struct ukfs *ukfs" "const char *filename" "mode_t mode"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_remove "struct ukfs *ukfs" "const char *filename"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_rmdir "struct ukfs *ukfs" "const char *filename"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_link "struct ukfs *ukfs" "const char *filename" "const char *f_create"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_symlink "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"const char *linkname"
|
||||||
|
.It Ft ssize_t
|
||||||
|
.Fn ukfs_readlink "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"char *linkbuf" "size_t buflen"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_rename "struct ukfs *ukfs" "const char *from" "const char *to"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_stat "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"struct stat *file_stat"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_lstat "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"struct stat *file_stat"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_chmod "struct ukfs *ukfs" "const char *filename" "mode_t mode"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_lchmod "struct ukfs *ukfs" "const char *filename" "mode_t mode"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_chown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \
|
||||||
|
"gid_t gid"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_lchown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \
|
||||||
|
"gid_t gid"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_chflags "struct ukfs *ukfs" "const char *filename" "u_long flags"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_lchflags "struct ukfs *ukfs" "const char *filename" "u_long flags"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_utimes "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"const struct timeval *tptr"
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_lutimes "struct ukfs *ukfs" "const char *filename" \
|
||||||
|
"const struct timeval *tptr"
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The above routines operate like their system call counterparts and the
|
||||||
|
system call manual pages without the ukfs_ prefix should be referred to
|
||||||
|
for further information on the parameters.
|
||||||
|
.Pp
|
||||||
|
The only call which modifies
|
||||||
|
.Fa ukfs
|
||||||
|
state is
|
||||||
|
.Fn ukfs_chdir .
|
||||||
|
It works like
|
||||||
|
.Xr chdir 2
|
||||||
|
in the sense that it affects the interpretation of relative paths.
|
||||||
|
If succesful, all relative pathnames will be resolved starting from the
|
||||||
|
current directory.
|
||||||
|
Currently the call affects all accesses to that particular
|
||||||
|
.Fa ukfs ,
|
||||||
|
but it might be later changed to be thread private.
|
||||||
|
.Sh UTILITIES
|
||||||
|
.Bl -ohang
|
||||||
|
.It Ft int
|
||||||
|
.Fn ukfs_util_builddirs "struct ukfs *ukfs" "const char *pathname" "mode_t mode"
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
Builds a directory hierarchy.
|
||||||
|
Unlike mkdir, the
|
||||||
|
.Fa pathname
|
||||||
|
argument may contain multiple levels of hierarchy.
|
||||||
|
It is not considered an error if any of the directories specified exist
|
||||||
|
already.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr rump 3
|
||||||
|
.Sh HISTORY
|
||||||
|
.Nm
|
||||||
|
first appeared in
|
||||||
|
.Nx 5.0 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
.An Antti Kantee Aq Mt pooka@cs.hut.fi
|
||||||
|
.Sh NOTES
|
||||||
|
.Nm
|
||||||
|
was an early attempt at an interface for kernel file systems
|
||||||
|
running in userspace.
|
||||||
1379
lib/libukfs/ukfs.c
Normal file
1379
lib/libukfs/ukfs.c
Normal file
File diff suppressed because it is too large
Load Diff
153
lib/libukfs/ukfs.h
Normal file
153
lib/libukfs/ukfs.h
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
/* $NetBSD: ukfs.h,v 1.14 2012/07/19 06:33:03 joerg Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Development of this software was supported by the
|
||||||
|
* Finnish Cultural Foundation.
|
||||||
|
*
|
||||||
|
* 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 AUTHOR ``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 AUTHOR 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RUMP_UKFS_H_
|
||||||
|
#define _RUMP_UKFS_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* don't include NetBSD <sys/header.h> for portability */
|
||||||
|
struct vnode;
|
||||||
|
struct stat;
|
||||||
|
struct timeval;
|
||||||
|
|
||||||
|
struct ukfs;
|
||||||
|
struct ukfs_dircookie;
|
||||||
|
struct ukfs_part;
|
||||||
|
|
||||||
|
#define UKFS_DEFAULTMP "/ukfs"
|
||||||
|
|
||||||
|
#define UKFS_RELFLAG_NOUNMOUNT 0x01
|
||||||
|
#define UKFS_RELFLAG_FORCE 0x02
|
||||||
|
|
||||||
|
#define UKFS_VERSION 002 /* secret ukfs 002 */
|
||||||
|
#define ukfs_init() _ukfs_init(UKFS_VERSION)
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
int _ukfs_init(int);
|
||||||
|
struct ukfs *ukfs_mount(const char *, const char *, const char *,
|
||||||
|
int, void *, size_t);
|
||||||
|
struct ukfs *ukfs_mount_disk(const char *, const char *, struct ukfs_part *,
|
||||||
|
const char *, int, void *, size_t);
|
||||||
|
int ukfs_release(struct ukfs *, int);
|
||||||
|
|
||||||
|
int ukfs_opendir(struct ukfs *, const char *,
|
||||||
|
struct ukfs_dircookie **);
|
||||||
|
int ukfs_getdents(struct ukfs *, const char *, off_t *,
|
||||||
|
uint8_t *, size_t);
|
||||||
|
int ukfs_getdents_cookie(struct ukfs *, struct ukfs_dircookie *,
|
||||||
|
off_t *, uint8_t *, size_t);
|
||||||
|
int ukfs_closedir(struct ukfs *, struct ukfs_dircookie *);
|
||||||
|
|
||||||
|
int ukfs_open(struct ukfs *, const char *, int);
|
||||||
|
ssize_t ukfs_read(struct ukfs *, const char *, off_t,
|
||||||
|
uint8_t *, size_t);
|
||||||
|
ssize_t ukfs_read_fd(struct ukfs *, int, off_t, uint8_t *, size_t);
|
||||||
|
ssize_t ukfs_write(struct ukfs *, const char *, off_t,
|
||||||
|
uint8_t *, size_t);
|
||||||
|
ssize_t ukfs_write_fd(struct ukfs *, int, off_t, uint8_t *, size_t,int);
|
||||||
|
int ukfs_close(struct ukfs *, int);
|
||||||
|
|
||||||
|
ssize_t ukfs_readlink(struct ukfs *, const char *, char *, size_t);
|
||||||
|
|
||||||
|
int ukfs_create(struct ukfs *, const char *, mode_t);
|
||||||
|
int ukfs_mkdir(struct ukfs *, const char *, mode_t);
|
||||||
|
int ukfs_mknod(struct ukfs *, const char *, mode_t, dev_t);
|
||||||
|
int ukfs_mkfifo(struct ukfs *, const char *, mode_t);
|
||||||
|
int ukfs_symlink(struct ukfs *, const char *, const char *);
|
||||||
|
|
||||||
|
int ukfs_remove(struct ukfs *, const char *);
|
||||||
|
int ukfs_rmdir(struct ukfs *, const char *);
|
||||||
|
|
||||||
|
int ukfs_link(struct ukfs *, const char *, const char *);
|
||||||
|
int ukfs_rename(struct ukfs *, const char *, const char *);
|
||||||
|
|
||||||
|
int ukfs_chdir(struct ukfs *, const char *);
|
||||||
|
|
||||||
|
int ukfs_stat(struct ukfs *, const char *, struct stat *);
|
||||||
|
int ukfs_lstat(struct ukfs *, const char *, struct stat *);
|
||||||
|
|
||||||
|
int ukfs_chmod(struct ukfs *, const char *, mode_t);
|
||||||
|
int ukfs_lchmod(struct ukfs *, const char *, mode_t);
|
||||||
|
int ukfs_chown(struct ukfs *, const char *, uid_t, gid_t);
|
||||||
|
int ukfs_lchown(struct ukfs *, const char *, uid_t, gid_t);
|
||||||
|
int ukfs_chflags(struct ukfs *, const char *, u_long);
|
||||||
|
int ukfs_lchflags(struct ukfs *, const char *, u_long);
|
||||||
|
|
||||||
|
int ukfs_utimes(struct ukfs *, const char *,
|
||||||
|
const struct timeval *);
|
||||||
|
int ukfs_lutimes(struct ukfs *, const char *,
|
||||||
|
const struct timeval *);
|
||||||
|
|
||||||
|
struct mount *ukfs_getmp(struct ukfs *);
|
||||||
|
struct vnode *ukfs_getrvp(struct ukfs *);
|
||||||
|
void ukfs_setspecific(struct ukfs *, void *);
|
||||||
|
void * ukfs_getspecific(struct ukfs *);
|
||||||
|
|
||||||
|
/* partition magic in device names */
|
||||||
|
extern struct ukfs_part *ukfs_part_none;
|
||||||
|
extern struct ukfs_part *ukfs_part_na;
|
||||||
|
#define UKFS_PARTITION_SCANMAGIC "%PART:" /* deprecated */
|
||||||
|
|
||||||
|
#define UKFS_DISKLABEL_SCANMAGIC "%DISKLABEL:"
|
||||||
|
#define UKFS_DISKLABEL_MAGICLEN (sizeof(UKFS_DISKLABEL_SCANMAGIC "a%")-1)
|
||||||
|
|
||||||
|
#define UKFS_OFFSET_SCANMAGIC "%OFFSET:"
|
||||||
|
#define UKFS_OFFSET_MINLEN (sizeof(UKFS_OFFSET_SCANMAGIC "512,512%")-1)
|
||||||
|
|
||||||
|
#define UKFS_DEVICE_MAXSTR 128 /* unexact science ... */
|
||||||
|
#define UKFS_DEVICE_MAXPATHLEN (MAXPATHLEN+UKFS_DEVICE_MAXSTR)
|
||||||
|
|
||||||
|
#define UKFS_DEVICE_ARGVPROBE(part) \
|
||||||
|
do { \
|
||||||
|
if (argc < 3) \
|
||||||
|
*part = NULL; \
|
||||||
|
else if (ukfs_part_probe(argv[argc-2], part) == -1) \
|
||||||
|
err(1, "ukfs_part_probe"); \
|
||||||
|
} while (/*CONSTCOND*/0)
|
||||||
|
|
||||||
|
int ukfs_part_probe(char *, struct ukfs_part **);
|
||||||
|
void ukfs_part_release(struct ukfs_part *);
|
||||||
|
int ukfs_part_tostring(struct ukfs_part *, char *, size_t);
|
||||||
|
|
||||||
|
/* dynamic loading of library modules */
|
||||||
|
int ukfs_modload(const char *);
|
||||||
|
int ukfs_modload_dir(const char *);
|
||||||
|
ssize_t ukfs_vfstypes(char *, size_t);
|
||||||
|
|
||||||
|
/* Utilities */
|
||||||
|
int ukfs_util_builddirs(struct ukfs *, const char *, mode_t);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* _RUMP_UKFS_H_ */
|
||||||
150
lib/libukfs/ukfs_disklabel.c
Normal file
150
lib/libukfs/ukfs_disklabel.c
Normal file
|
|
@ -0,0 +1,150 @@
|
||||||
|
/* $NetBSD: ukfs_disklabel.c,v 1.3 2011/02/22 15:42:15 pooka Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local copies of libutil disklabel routines. This uncouples libukfs
|
||||||
|
* from the NetBSD-only libutil. All identifiers are prefixed with
|
||||||
|
* ukfs or UKFS, otherwise the routines are the same.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From:
|
||||||
|
* NetBSD: disklabel_scan.c,v 1.3 2009/01/18 12:13:03 lukem Exp
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Roland C. Dowdeswell.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "ukfs_int_disklabel.h"
|
||||||
|
|
||||||
|
#define SCAN_INCR 4
|
||||||
|
|
||||||
|
int
|
||||||
|
ukfs__disklabel_scan(struct ukfs__disklabel *lp, int *isswapped,
|
||||||
|
char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
int imswapped;
|
||||||
|
uint16_t npart;
|
||||||
|
|
||||||
|
/* scan for the correct magic numbers. */
|
||||||
|
|
||||||
|
for (i=0; i <= buflen - sizeof(*lp); i += SCAN_INCR) {
|
||||||
|
memcpy(lp, buf + i, sizeof(*lp));
|
||||||
|
if (lp->d_magic == UKFS_DISKMAGIC &&
|
||||||
|
lp->d_magic2 == UKFS_DISKMAGIC) {
|
||||||
|
imswapped = 0;
|
||||||
|
goto sanity;
|
||||||
|
}
|
||||||
|
if (lp->d_magic == bswap32(UKFS_DISKMAGIC) &&
|
||||||
|
lp->d_magic2 == bswap32(UKFS_DISKMAGIC)) {
|
||||||
|
imswapped = 1;
|
||||||
|
goto sanity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sanity:
|
||||||
|
if (imswapped)
|
||||||
|
npart = bswap16(lp->d_npartitions);
|
||||||
|
else
|
||||||
|
npart = lp->d_npartitions;
|
||||||
|
/* we've found something, let's sanity check it */
|
||||||
|
if (npart > UKFS_MAXPARTITIONS
|
||||||
|
|| ukfs__disklabel_dkcksum(lp, imswapped))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
*isswapped = imswapped;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From:
|
||||||
|
* $NetBSD: disklabel_dkcksum.c,v 1.4 2005/05/15 21:01:34 thorpej Exp
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1991, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
* 3. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
ukfs__disklabel_dkcksum(struct ukfs__disklabel *lp, int imswapped)
|
||||||
|
{
|
||||||
|
uint16_t *start, *end;
|
||||||
|
uint16_t sum;
|
||||||
|
uint16_t npart;
|
||||||
|
|
||||||
|
if (imswapped)
|
||||||
|
npart = bswap16(lp->d_npartitions);
|
||||||
|
else
|
||||||
|
npart = lp->d_npartitions;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
start = (uint16_t *)(void *)lp;
|
||||||
|
end = (uint16_t *)(void *)&lp->d_partitions[npart];
|
||||||
|
while (start < end) {
|
||||||
|
if (imswapped)
|
||||||
|
sum ^= bswap16(*start);
|
||||||
|
else
|
||||||
|
sum ^= *start;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
return (sum);
|
||||||
|
}
|
||||||
158
lib/libukfs/ukfs_int_disklabel.h
Normal file
158
lib/libukfs/ukfs_int_disklabel.h
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
/* $NetBSD: ukfs_int_disklabel.h,v 1.3 2011/02/22 15:42:15 pooka Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Modified copy of disklabel.h so that ukfs doesn't have to depend
|
||||||
|
* on NetBSD headers. Contains just about only "struct disklabel".
|
||||||
|
* The on-disk disklabel doesn't really change format, so no need
|
||||||
|
* to track this against NetBSD changes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1987, 1988, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
* 3. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
|
||||||
|
*
|
||||||
|
* @(#)disklabel.h 8.2 (Berkeley) 7/10/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIB_UKFS_DISKLABEL_H_
|
||||||
|
#define LIB_UKFS_DISKLABEL_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define UKFS_MAXPARTITIONS 22
|
||||||
|
#define UKFS_DISKMAGIC ((uint32_t)0x82564557) /* The disk magic number */
|
||||||
|
|
||||||
|
struct ukfs__disklabel {
|
||||||
|
uint32_t d_magic; /* the magic number */
|
||||||
|
uint16_t d_type; /* drive type */
|
||||||
|
uint16_t d_subtype; /* controller/d_type specific */
|
||||||
|
char d_typename[16]; /* type name, e.g. "eagle" */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* d_packname contains the pack identifier and is returned when
|
||||||
|
* the disklabel is read off the disk or in-core copy.
|
||||||
|
* d_boot0 and d_boot1 are the (optional) names of the
|
||||||
|
* primary (block 0) and secondary (block 1-15) bootstraps
|
||||||
|
* as found in /usr/mdec. These are returned when using
|
||||||
|
* getdiskbyname(3) to retrieve the values from /etc/disktab.
|
||||||
|
*/
|
||||||
|
union {
|
||||||
|
char un_d_packname[16]; /* pack identifier */
|
||||||
|
struct {
|
||||||
|
char *un_d_boot0; /* primary bootstrap name */
|
||||||
|
char *un_d_boot1; /* secondary bootstrap name */
|
||||||
|
} un_b;
|
||||||
|
} d_un;
|
||||||
|
#define d_packname d_un.un_d_packname
|
||||||
|
#define d_boot0 d_un.un_b.un_d_boot0
|
||||||
|
#define d_boot1 d_un.un_b.un_d_boot1
|
||||||
|
|
||||||
|
/* disk geometry: */
|
||||||
|
uint32_t d_secsize; /* # of bytes per sector */
|
||||||
|
uint32_t d_nsectors; /* # of data sectors per track */
|
||||||
|
uint32_t d_ntracks; /* # of tracks per cylinder */
|
||||||
|
uint32_t d_ncylinders; /* # of data cylinders per unit */
|
||||||
|
uint32_t d_secpercyl; /* # of data sectors per cylinder */
|
||||||
|
uint32_t d_secperunit; /* # of data sectors per unit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Spares (bad sector replacements) below are not counted in
|
||||||
|
* d_nsectors or d_secpercyl. Spare sectors are assumed to
|
||||||
|
* be physical sectors which occupy space at the end of each
|
||||||
|
* track and/or cylinder.
|
||||||
|
*/
|
||||||
|
uint16_t d_sparespertrack; /* # of spare sectors per track */
|
||||||
|
uint16_t d_sparespercyl; /* # of spare sectors per cylinder */
|
||||||
|
/*
|
||||||
|
* Alternative cylinders include maintenance, replacement,
|
||||||
|
* configuration description areas, etc.
|
||||||
|
*/
|
||||||
|
uint32_t d_acylinders; /* # of alt. cylinders per unit */
|
||||||
|
|
||||||
|
/* hardware characteristics: */
|
||||||
|
/*
|
||||||
|
* d_interleave, d_trackskew and d_cylskew describe perturbations
|
||||||
|
* in the media format used to compensate for a slow controller.
|
||||||
|
* Interleave is physical sector interleave, set up by the
|
||||||
|
* formatter or controller when formatting. When interleaving is
|
||||||
|
* in use, logically adjacent sectors are not physically
|
||||||
|
* contiguous, but instead are separated by some number of
|
||||||
|
* sectors. It is specified as the ratio of physical sectors
|
||||||
|
* traversed per logical sector. Thus an interleave of 1:1
|
||||||
|
* implies contiguous layout, while 2:1 implies that logical
|
||||||
|
* sector 0 is separated by one sector from logical sector 1.
|
||||||
|
* d_trackskew is the offset of sector 0 on track N relative to
|
||||||
|
* sector 0 on track N-1 on the same cylinder. Finally, d_cylskew
|
||||||
|
* is the offset of sector 0 on cylinder N relative to sector 0
|
||||||
|
* on cylinder N-1.
|
||||||
|
*/
|
||||||
|
uint16_t d_rpm; /* rotational speed */
|
||||||
|
uint16_t d_interleave; /* hardware sector interleave */
|
||||||
|
uint16_t d_trackskew; /* sector 0 skew, per track */
|
||||||
|
uint16_t d_cylskew; /* sector 0 skew, per cylinder */
|
||||||
|
uint32_t d_headswitch; /* head switch time, usec */
|
||||||
|
uint32_t d_trkseek; /* track-to-track seek, usec */
|
||||||
|
uint32_t d_flags; /* generic flags */
|
||||||
|
#define NDDATA 5
|
||||||
|
uint32_t d_drivedata[NDDATA]; /* drive-type specific information */
|
||||||
|
#define NSPARE 5
|
||||||
|
uint32_t d_spare[NSPARE]; /* reserved for future use */
|
||||||
|
uint32_t d_magic2; /* the magic number (again) */
|
||||||
|
uint16_t d_checksum; /* xor of data incl. partitions */
|
||||||
|
|
||||||
|
/* filesystem and partition information: */
|
||||||
|
uint16_t d_npartitions; /* number of partitions in following */
|
||||||
|
uint32_t d_bbsize; /* size of boot area at sn0, bytes */
|
||||||
|
uint32_t d_sbsize; /* max size of fs superblock, bytes */
|
||||||
|
struct ukfs__partition { /* the partition table */
|
||||||
|
uint32_t p_size; /* number of sectors in partition */
|
||||||
|
uint32_t p_offset; /* starting sector */
|
||||||
|
union {
|
||||||
|
uint32_t fsize; /* FFS, ADOS:
|
||||||
|
filesystem basic fragment size */
|
||||||
|
uint32_t cdsession; /* ISO9660: session offset */
|
||||||
|
} __partition_u2;
|
||||||
|
#define p_fsize __partition_u2.fsize
|
||||||
|
#define p_cdsession __partition_u2.cdsession
|
||||||
|
uint8_t p_fstype; /* filesystem type, see below */
|
||||||
|
uint8_t p_frag; /* filesystem fragments per block */
|
||||||
|
union {
|
||||||
|
uint16_t cpg; /* UFS: FS cylinders per group */
|
||||||
|
uint16_t sgs; /* LFS: FS segment shift */
|
||||||
|
} __partition_u1;
|
||||||
|
#define p_cpg __partition_u1.cpg
|
||||||
|
#define p_sgs __partition_u1.sgs
|
||||||
|
} d_partitions[UKFS_MAXPARTITIONS]; /* actually may be more */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t ukfs__disklabel_dkcksum(struct ukfs__disklabel *, int);
|
||||||
|
int ukfs__disklabel_scan(struct ukfs__disklabel *, int *,
|
||||||
|
char *, size_t);
|
||||||
|
|
||||||
|
#endif /* !LIB_UKFS_DISKLABEL_H_ */
|
||||||
Loading…
Reference in New Issue
Block a user