Mon Mar 12 11:56:34 2018 UTC ()
Remove exgtraneous comma


(pgoyette)
diff -r1.15 -r1.16 src/lib/libukfs/ukfs.3

cvs diff -r1.15 -r1.16 src/lib/libukfs/ukfs.3 (switch to unified diff)

--- src/lib/libukfs/ukfs.3 2018/02/08 09:05:17 1.15
+++ src/lib/libukfs/ukfs.3 2018/03/12 11:56:34 1.16
@@ -1,321 +1,321 @@ @@ -1,321 +1,321 @@
1.\" $NetBSD: ukfs.3,v 1.15 2018/02/08 09:05:17 dholland Exp $ 1.\" $NetBSD: ukfs.3,v 1.16 2018/03/12 11:56:34 pgoyette Exp $
2.\" 2.\"
3.\" Copyright (c) 2008 Antti Kantee. All rights reserved. 3.\" Copyright (c) 2008 Antti Kantee. All rights reserved.
4.\" 4.\"
5.\" Redistribution and use in source and binary forms, with or without 5.\" Redistribution and use in source and binary forms, with or without
6.\" modification, are permitted provided that the following conditions 6.\" modification, are permitted provided that the following conditions
7.\" are met: 7.\" are met:
8.\" 1. Redistributions of source code must retain the above copyright 8.\" 1. Redistributions of source code must retain the above copyright
9.\" notice, this list of conditions and the following disclaimer. 9.\" notice, this list of conditions and the following disclaimer.
10.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" 2. Redistributions in binary form must reproduce the above copyright
11.\" notice, this list of conditions and the following disclaimer in the 11.\" notice, this list of conditions and the following disclaimer in the
12.\" documentation and/or other materials provided with the distribution. 12.\" documentation and/or other materials provided with the distribution.
13.\" 13.\"
14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24.\" SUCH DAMAGE. 24.\" SUCH DAMAGE.
25.\" 25.\"
26.Dd February 13, 2014 26.Dd March 12, 2018
27.Dt UKFS 3 27.Dt UKFS 3
28.Os 28.Os
29.Sh NAME 29.Sh NAME
30.Nm ukfs 30.Nm ukfs
31.Nd user kernel file system library interface 31.Nd user kernel file system library interface
32.Sh LIBRARY 32.Sh LIBRARY
33ukfs Library (libukfs, \-lukfs) 33ukfs Library (libukfs, \-lukfs)
34.Sh SYNOPSIS 34.Sh SYNOPSIS
35.In rump/ukfs.h 35.In rump/ukfs.h
36.Sh DESCRIPTION 36.Sh DESCRIPTION
37The 37The
38.Nm 38.Nm
39library provides direct access to file systems without having to 39library provides direct access to file systems without having to
40specially mount a file system. 40specially mount a file system.
41Therefore, accessing a file system through 41Therefore, accessing a file system through
42.Nm 42.Nm
43requires no special kernel support apart from standard POSIX functionality. 43requires no special kernel support apart from standard POSIX functionality.
44As 44As
45.Nm 45.Nm
46is built upon 46is built upon
47.Xr rump 3 47.Xr rump 3
48kernels, all kernel file systems which are supported by rump kernels 48kernels, all kernel file systems which are supported by rump kernels
49are available. 49are available.
50It allows to write utilities for accessing file systems 50It allows to write utilities for accessing file systems
51without having to duplicate file system internals knowledge already 51without having to duplicate file system internals knowledge already
52present in kernel file system drivers. 52present in kernel file system drivers.
53.Pp 53.Pp
54.Nm 54.Nm
55provides a high-level pathname based interface for accessing file systems. 55provides a high-level pathname based interface for accessing file systems.
56If a lower level interface it desired, 56If a lower level interface it desired,
57.Xr rump 3 57.Xr rump 3
58kernels should be used directly. 58kernels should be used directly.
59However, much like system calls, the interfaces of 59However, much like system calls, the interfaces of
60.Nm , 60.Nm
61are self-contained and require no tracking and release of resources. 61are self-contained and require no tracking and release of resources.
62The only exception is the file system handle 62The only exception is the file system handle
63.Ft struct ukfs 63.Ft struct ukfs
64which should be released after use. 64which should be released after use.
65.Sh INITIALIZATION 65.Sh INITIALIZATION
66.Bl -ohang 66.Bl -ohang
67.It Ft int 67.It Ft int
68.Fn ukfs_init 68.Fn ukfs_init
69.It Ft int 69.It Ft int
70.Fn ukfs_modload "const char *fname" 70.Fn ukfs_modload "const char *fname"
71.It Ft int 71.It Ft int
72.Fn ukfs_modload_dir "const char *dirname" 72.Fn ukfs_modload_dir "const char *dirname"
73.It Ft ssize_t 73.It Ft ssize_t
74.Fn ukfs_vfstypes "char *buf" "size_t buflen" 74.Fn ukfs_vfstypes "char *buf" "size_t buflen"
75.It Ft struct ukfs * 75.It Ft struct ukfs *
76.Fn ukfs_mount "const char *vfsname" "const char *devpath" \ 76.Fn ukfs_mount "const char *vfsname" "const char *devpath" \
77"const char *mountpath" "int mntflags" "void *arg" "size_t alen" 77"const char *mountpath" "int mntflags" "void *arg" "size_t alen"
78.It Ft struct ukfs * 78.It Ft struct ukfs *
79.Fn ukfs_mount_disk "const char *vfsname" "const char *devpath" \ 79.Fn ukfs_mount_disk "const char *vfsname" "const char *devpath" \
80"int partition" "const char *mountpath" "int mntflags" \ 80"int partition" "const char *mountpath" "int mntflags" \
81"void *arg" "size_t alen" 81"void *arg" "size_t alen"
82.It Ft int 82.It Ft int
83.Fn ukfs_release "struct ukfs *ukfs" "int flags" 83.Fn ukfs_release "struct ukfs *ukfs" "int flags"
84.El 84.El
85.Pp 85.Pp
86.Fn ukfs_init 86.Fn ukfs_init
87initializes the library and must be called once per process using 87initializes the library and must be called once per process using
88.Nm . 88.Nm .
89.Pp 89.Pp
90.Fn ukfs_modload 90.Fn ukfs_modload
91is used at runtime to dynamically load a library which contains a 91is used at runtime to dynamically load a library which contains a
92file system module. 92file system module.
93For this to succeed, the 93For this to succeed, the
94.Xr rump 3 94.Xr rump 3
95kernel and the module targetted must be compiled with compatible kernel 95kernel and the module targetted must be compiled with compatible kernel
96versions and the application must be dynamically linked. 96versions and the application must be dynamically linked.
97Additionally, since this routine does not handle dependencies, all the 97Additionally, since this routine does not handle dependencies, all the
98dependencies of the library must be loaded beforehand. 98dependencies of the library must be loaded beforehand.
99The routine returns \-1 for fatal error, 0 for dependency failure and 1 99The routine returns \-1 for fatal error, 0 for dependency failure and 1
100for success. 100for success.
101.Pp 101.Pp
102.Fn ukfs_modload_dir 102.Fn ukfs_modload_dir
103loads all 103loads all
104.Xr rump 3 104.Xr rump 3
105kernel file system components in directory 105kernel file system components in directory
106.Fa dirname . 106.Fa dirname .
107It looks for libraries which begin with 107It looks for libraries which begin with
108.Pa librumpfs_ 108.Pa librumpfs_
109and end in 109and end in
110.Pa .so . 110.Pa .so .
111The routine tries to handle dependencies by retrying to load libraries 111The routine tries to handle dependencies by retrying to load libraries
112which failed due to dependencies. 112which failed due to dependencies.
113.Fn ukfs_modload_dir 113.Fn ukfs_modload_dir
114returns the number of vfs modules loaded or sets errno and 114returns the number of vfs modules loaded or sets errno and
115returns \-1 in case of a fatal error in directory searching. 115returns \-1 in case of a fatal error in directory searching.
116In case a fatal error occurs after some modules have already been 116In case a fatal error occurs after some modules have already been
117loaded, the number of loaded module is returned. 117loaded, the number of loaded module is returned.
118Fatal errors in loading the modules themselves are ignored and 118Fatal errors in loading the modules themselves are ignored and
119.Fn ukfs_modload 119.Fn ukfs_modload
120should be used directly if finegrained error reporting is desired. 120should be used directly if finegrained error reporting is desired.
121.Pp 121.Pp
122It should be noted that the above routines affect the whole process, 122It should be noted that the above routines affect the whole process,
123not just a specific instance of 123not just a specific instance of
124.Nm . 124.Nm .
125It is preferable to call them from only one thread, as the underlying 125It is preferable to call them from only one thread, as the underlying
126dynamic library interfaces may not be threadsafe. 126dynamic library interfaces may not be threadsafe.
127.Pp 127.Pp
128.Fn ukfs_vfstypes 128.Fn ukfs_vfstypes
129queries the available file system types and returns a nul-terminated 129queries the available file system types and returns a nul-terminated
130list of types separated by spaces in 130list of types separated by spaces in
131.Fa buf . 131.Fa buf .
132The format of the list is equivalent to the one returned by 132The format of the list is equivalent to the one returned by
133.Xr sysctl 3 133.Xr sysctl 3
134on the name 134on the name
135.Pa vfs.generic.fstypes . 135.Pa vfs.generic.fstypes .
136The function returns the length of the string without the trailing nul 136The function returns the length of the string without the trailing nul
137or \-1 for error. 137or \-1 for error.
138Notably, the return value 0 means there are no file systems available. 138Notably, the return value 0 means there are no file systems available.
139If there is not enough room in the caller's buffer for all file system 139If there is not enough room in the caller's buffer for all file system
140types, as many as fit will be returned. 140types, as many as fit will be returned.
141.Pp 141.Pp
142.Fn ukfs_mount 142.Fn ukfs_mount
143initializes a file system image. 143initializes a file system image.
144The handle resulting from the operation is passed to all other routines 144The handle resulting from the operation is passed to all other routines
145and identifies the instance of the mount analoguous to what a pathname 145and identifies the instance of the mount analoguous to what a pathname
146specifies in a normally mounted file system. 146specifies in a normally mounted file system.
147The parameters are the following: 147The parameters are the following:
148.Bl -tag -width XXX -offset indent 148.Bl -tag -width XXX -offset indent
149.It vfsname 149.It vfsname
150Name of the file system to be used, e.g. 150Name of the file system to be used, e.g.
151.Dv MOUNT_FFS . 151.Dv MOUNT_FFS .
152.It devpath 152.It devpath
153Path of file system image. 153Path of file system image.
154It can be either a regular file, device or, if the file system does 154It can be either a regular file, device or, if the file system does
155not support the concept of a device, an abitrary string, e.g. network 155not support the concept of a device, an abitrary string, e.g. network
156address. 156address.
157.It mountpath 157.It mountpath
158Path where the file system is mounted to. 158Path where the file system is mounted to.
159This parameter is used only by the file system being mounted. 159This parameter is used only by the file system being mounted.
160Most of the time 160Most of the time
161.Dv UKFS_DEFAULTMP 161.Dv UKFS_DEFAULTMP
162is the correct path. 162is the correct path.
163.It mntflags 163.It mntflags
164Flags as passed to the 164Flags as passed to the
165.Xr mount 2 165.Xr mount 2
166system call, for example 166system call, for example
167.Dv MNT_RDONLY . 167.Dv MNT_RDONLY .
168In addition to generic parameters, file system specific parameters such as 168In addition to generic parameters, file system specific parameters such as
169.Dv MNT_LOG 169.Dv MNT_LOG
170(ffs) may be passed here. 170(ffs) may be passed here.
171.It arg 171.It arg
172File system private argument structure. 172File system private argument structure.
173This is passed directly to the file system. 173This is passed directly to the file system.
174It must match what 174It must match what
175.Fa vfsname 175.Fa vfsname
176expects. 176expects.
177.It alen 177.It alen
178Size of said structure. 178Size of said structure.
179.El 179.El
180.Pp 180.Pp
181The 181The
182.Fn ukfs_mount_disk 182.Fn ukfs_mount_disk
183function must be used to mount disk-based file systems. 183function must be used to mount disk-based file systems.
184It takes the same arguments as 184It takes the same arguments as
185.Fn ukfs_mount , 185.Fn ukfs_mount ,
186except for an additional argument signifying the 186except for an additional argument signifying the
187.Fa partition 187.Fa partition
188number. 188number.
189If the image 189If the image
190.Fa devpath 190.Fa devpath
191contains a disklabel, this value specifies the number of the partition 191contains a disklabel, this value specifies the number of the partition
192within the image used as the file system backend. 192within the image used as the file system backend.
193If 193If
194.Fa devpath 194.Fa devpath
195does not contain a disklabel, the value 195does not contain a disklabel, the value
196.Dv UKFS_PARTITION_NONE 196.Dv UKFS_PARTITION_NONE
197must be used to signal that the file system backend is the entire 197must be used to signal that the file system backend is the entire
198image. 198image.
199.Pp 199.Pp
200.Fn ukfs_release 200.Fn ukfs_release
201unmounts the file system and releases the resources associated with 201unmounts the file system and releases the resources associated with
202.Fa ukfs . 202.Fa ukfs .
203The return value signals the return value of the unmount operation. 203The return value signals the return value of the unmount operation.
204If non-zero, 204If non-zero,
205.Fa ukfs 205.Fa ukfs
206will continue to remain valid. 206will continue to remain valid.
207The possible values for flags are: 207The possible values for flags are:
208.Bl -tag -width XUKFS_RELFLAG_NOUNMOUT -offset indent 208.Bl -tag -width XUKFS_RELFLAG_NOUNMOUT -offset indent
209.It Dv UKFS_RELFLAG_NOUNMOUNT 209.It Dv UKFS_RELFLAG_NOUNMOUNT
210Do not unmount file system, just release ukfs handle. 210Do not unmount file system, just release ukfs handle.
211Release always succeeds. 211Release always succeeds.
212.It Dv UKFS_RELFLAG_FORCE 212.It Dv UKFS_RELFLAG_FORCE
213Forcefully unmount the file system. 213Forcefully unmount the file system.
214This means that any busy nodes (due to e.g. 214This means that any busy nodes (due to e.g.
215.Fn ukfs_chdir ) 215.Fn ukfs_chdir )
216will be ignored. 216will be ignored.
217Release always succeeds. 217Release always succeeds.
218.El 218.El
219.Sh OPERATION 219.Sh OPERATION
220.Bl -ohang 220.Bl -ohang
221.It Ft int 221.It Ft int
222.Fn ukfs_chdir "struct ukfs *ukfs" "const char *path" 222.Fn ukfs_chdir "struct ukfs *ukfs" "const char *path"
223.It Ft int 223.It Ft int
224.Fn ukfs_getdents "struct ukfs *ukfs" "const char *dirname" "off_t *off" \ 224.Fn ukfs_getdents "struct ukfs *ukfs" "const char *dirname" "off_t *off" \
225"uint8_t *buf" "size_t bufsize" 225"uint8_t *buf" "size_t bufsize"
226.It Ft ssize_t 226.It Ft ssize_t
227.Fn ukfs_read "struct ukfs *ukfs" "const char *filename" "off_t off" \ 227.Fn ukfs_read "struct ukfs *ukfs" "const char *filename" "off_t off" \
228"uint8_t *buf" "size_t bufsize" 228"uint8_t *buf" "size_t bufsize"
229.It Ft ssize_t 229.It Ft ssize_t
230.Fn ukfs_write "struct ukfs *ukfs" "const char *filename" "off_t off" \ 230.Fn ukfs_write "struct ukfs *ukfs" "const char *filename" "off_t off" \
231"uint8_t *buf" "size_t bufsize" 231"uint8_t *buf" "size_t bufsize"
232.It Ft int 232.It Ft int
233.Fn ukfs_create "struct ukfs *ukfs" "const char *filename" "mode_t mode" 233.Fn ukfs_create "struct ukfs *ukfs" "const char *filename" "mode_t mode"
234.It Ft int 234.It Ft int
235.Fn ukfs_mknod "struct ukfs *ukfs" "const char *path" "mode_t mode" "dev_t dev" 235.Fn ukfs_mknod "struct ukfs *ukfs" "const char *path" "mode_t mode" "dev_t dev"
236.It Ft int 236.It Ft int
237.Fn ukfs_mkfifo "struct ukfs *ukfs" "const char *path" "mode_t mode" 237.Fn ukfs_mkfifo "struct ukfs *ukfs" "const char *path" "mode_t mode"
238.It Ft int 238.It Ft int
239.Fn ukfs_mkdir "struct ukfs *ukfs" "const char *filename" "mode_t mode" 239.Fn ukfs_mkdir "struct ukfs *ukfs" "const char *filename" "mode_t mode"
240.It Ft int 240.It Ft int
241.Fn ukfs_remove "struct ukfs *ukfs" "const char *filename" 241.Fn ukfs_remove "struct ukfs *ukfs" "const char *filename"
242.It Ft int 242.It Ft int
243.Fn ukfs_rmdir "struct ukfs *ukfs" "const char *filename" 243.Fn ukfs_rmdir "struct ukfs *ukfs" "const char *filename"
244.It Ft int 244.It Ft int
245.Fn ukfs_link "struct ukfs *ukfs" "const char *filename" "const char *f_create" 245.Fn ukfs_link "struct ukfs *ukfs" "const char *filename" "const char *f_create"
246.It Ft int 246.It Ft int
247.Fn ukfs_symlink "struct ukfs *ukfs" "const char *filename" \ 247.Fn ukfs_symlink "struct ukfs *ukfs" "const char *filename" \
248"const char *linkname" 248"const char *linkname"
249.It Ft ssize_t 249.It Ft ssize_t
250.Fn ukfs_readlink "struct ukfs *ukfs" "const char *filename" \ 250.Fn ukfs_readlink "struct ukfs *ukfs" "const char *filename" \
251"char *linkbuf" "size_t buflen" 251"char *linkbuf" "size_t buflen"
252.It Ft int 252.It Ft int
253.Fn ukfs_rename "struct ukfs *ukfs" "const char *from" "const char *to" 253.Fn ukfs_rename "struct ukfs *ukfs" "const char *from" "const char *to"
254.It Ft int 254.It Ft int
255.Fn ukfs_stat "struct ukfs *ukfs" "const char *filename" \ 255.Fn ukfs_stat "struct ukfs *ukfs" "const char *filename" \
256"struct stat *file_stat" 256"struct stat *file_stat"
257.It Ft int 257.It Ft int
258.Fn ukfs_lstat "struct ukfs *ukfs" "const char *filename" \ 258.Fn ukfs_lstat "struct ukfs *ukfs" "const char *filename" \
259"struct stat *file_stat" 259"struct stat *file_stat"
260.It Ft int 260.It Ft int
261.Fn ukfs_chmod "struct ukfs *ukfs" "const char *filename" "mode_t mode" 261.Fn ukfs_chmod "struct ukfs *ukfs" "const char *filename" "mode_t mode"
262.It Ft int 262.It Ft int
263.Fn ukfs_lchmod "struct ukfs *ukfs" "const char *filename" "mode_t mode" 263.Fn ukfs_lchmod "struct ukfs *ukfs" "const char *filename" "mode_t mode"
264.It Ft int 264.It Ft int
265.Fn ukfs_chown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \ 265.Fn ukfs_chown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \
266"gid_t gid" 266"gid_t gid"
267.It Ft int 267.It Ft int
268.Fn ukfs_lchown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \ 268.Fn ukfs_lchown "struct ukfs *ukfs" "const char *filename" "uid_t uid" \
269"gid_t gid" 269"gid_t gid"
270.It Ft int 270.It Ft int
271.Fn ukfs_chflags "struct ukfs *ukfs" "const char *filename" "u_long flags" 271.Fn ukfs_chflags "struct ukfs *ukfs" "const char *filename" "u_long flags"
272.It Ft int 272.It Ft int
273.Fn ukfs_lchflags "struct ukfs *ukfs" "const char *filename" "u_long flags" 273.Fn ukfs_lchflags "struct ukfs *ukfs" "const char *filename" "u_long flags"
274.It Ft int 274.It Ft int
275.Fn ukfs_utimes "struct ukfs *ukfs" "const char *filename" \ 275.Fn ukfs_utimes "struct ukfs *ukfs" "const char *filename" \
276"const struct timeval *tptr" 276"const struct timeval *tptr"
277.It Ft int 277.It Ft int
278.Fn ukfs_lutimes "struct ukfs *ukfs" "const char *filename" \ 278.Fn ukfs_lutimes "struct ukfs *ukfs" "const char *filename" \
279"const struct timeval *tptr" 279"const struct timeval *tptr"
280.El 280.El
281.Pp 281.Pp
282The above routines operate like their system call counterparts and the 282The above routines operate like their system call counterparts and the
283system call manual pages without the ukfs_ prefix should be referred to 283system call manual pages without the ukfs_ prefix should be referred to
284for further information on the parameters. 284for further information on the parameters.
285.Pp 285.Pp
286The only call which modifies 286The only call which modifies
287.Fa ukfs 287.Fa ukfs
288state is 288state is
289.Fn ukfs_chdir . 289.Fn ukfs_chdir .
290It works like 290It works like
291.Xr chdir 2 291.Xr chdir 2
292in the sense that it affects the interpretation of relative paths. 292in the sense that it affects the interpretation of relative paths.
293If succesful, all relative pathnames will be resolved starting from the 293If succesful, all relative pathnames will be resolved starting from the
294current directory. 294current directory.
295Currently the call affects all accesses to that particular 295Currently the call affects all accesses to that particular
296.Fa ukfs , 296.Fa ukfs ,
297but it might be later changed to be thread private. 297but it might be later changed to be thread private.
298.Sh UTILITIES 298.Sh UTILITIES
299.Bl -ohang 299.Bl -ohang
300.It Ft int 300.It Ft int
301.Fn ukfs_util_builddirs "struct ukfs *ukfs" "const char *pathname" "mode_t mode" 301.Fn ukfs_util_builddirs "struct ukfs *ukfs" "const char *pathname" "mode_t mode"
302.El 302.El
303.Pp 303.Pp
304Builds a directory hierarchy. 304Builds a directory hierarchy.
305Unlike mkdir, the 305Unlike mkdir, the
306.Fa pathname 306.Fa pathname
307argument may contain multiple levels of hierarchy. 307argument may contain multiple levels of hierarchy.
308It is not considered an error if any of the directories specified exist 308It is not considered an error if any of the directories specified exist
309already. 309already.
310.Sh SEE ALSO 310.Sh SEE ALSO
311.Xr rump 3 311.Xr rump 3
312.Sh HISTORY 312.Sh HISTORY
313.Nm 313.Nm
314first appeared in 314first appeared in
315.Nx 5.0 . 315.Nx 5.0 .
316.Sh AUTHORS 316.Sh AUTHORS
317.An Antti Kantee Aq Mt pooka@cs.hut.fi 317.An Antti Kantee Aq Mt pooka@cs.hut.fi
318.Sh NOTES 318.Sh NOTES
319.Nm 319.Nm
320was an early attempt at an interface for kernel file systems 320was an early attempt at an interface for kernel file systems
321running in userspace. 321running in userspace.