Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
emulab-devel
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
143
Issues
143
List
Boards
Labels
Service Desk
Milestones
Merge Requests
6
Merge Requests
6
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
emulab
emulab-devel
Commits
a7bdf7a9
Commit
a7bdf7a9
authored
Jan 14, 2005
by
Siddharth Aggarwal
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
adding new files for /var problem
parent
02231633
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
5828 additions
and
0 deletions
+5828
-0
os/shd/mount.h
os/shd/mount.h
+498
-0
os/shd/tty_tty.c
os/shd/tty_tty.c
+203
-0
os/shd/uipc_usrreq.c
os/shd/uipc_usrreq.c
+1354
-0
os/shd/vfs_syscalls.c
os/shd/vfs_syscalls.c
+3773
-0
No files found.
os/shd/mount.h
0 → 100644
View file @
a7bdf7a9
/*
* Copyright (c) 1989, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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.
*
* @(#)mount.h 8.21 (Berkeley) 5/20/95
* $FreeBSD: src/sys/sys/mount.h,v 1.89.2.6 2002/04/26 00:46:00 iedowse Exp $
*/
#ifndef _SYS_MOUNT_H_
#define _SYS_MOUNT_H_
#include <sys/ucred.h>
#ifndef _KERNEL
#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)
#include <sys/stat.h>
#endif
/* !_POSIX_C_SOURCE */
#endif
/* !_KERNEL */
#include <sys/queue.h>
#ifdef _KERNEL
#include <sys/lock.h>
#endif
typedef
struct
fsid
{
int32_t
val
[
2
];
}
fsid_t
;
/* file system id type */
/*
* File identifier.
* These are unique per filesystem on a single machine.
*/
#define MAXFIDSZ 16
struct
fid
{
u_short
fid_len
;
/* length of data in bytes */
u_short
fid_reserved
;
/* force longword alignment */
char
fid_data
[
MAXFIDSZ
];
/* data (variable length) */
};
/*
* file system statistics
*/
#define MFSNAMELEN 16
/* length of fs type name, including null */
#ifdef __i386__
#define MNAMELEN 80
/* length of buffer for returned name */
#endif
#ifdef __alpha__
#define MNAMELEN 72
/* length of buffer for returned name */
#endif
struct
statfs
{
long
f_spare2
;
/* placeholder */
long
f_bsize
;
/* fundamental file system block size */
long
f_iosize
;
/* optimal transfer block size */
long
f_blocks
;
/* total data blocks in file system */
long
f_bfree
;
/* free blocks in fs */
long
f_bavail
;
/* free blocks avail to non-superuser */
long
f_files
;
/* total file nodes in file system */
long
f_ffree
;
/* free file nodes in fs */
fsid_t
f_fsid
;
/* file system id */
uid_t
f_owner
;
/* user that mounted the filesystem */
int
f_type
;
/* type of filesystem */
int
f_flags
;
/* copy of mount exported flags */
long
f_syncwrites
;
/* count of sync writes since mount */
long
f_asyncwrites
;
/* count of async writes since mount */
char
f_fstypename
[
MFSNAMELEN
];
/* fs type name */
char
f_mntonname
[
MNAMELEN
];
/* directory on which mounted */
long
f_syncreads
;
/* count of sync reads since mount */
long
f_asyncreads
;
/* count of async reads since mount */
short
f_spares1
;
/* unused spare */
char
f_mntfromname
[
MNAMELEN
];
/* mounted filesystem */
short
f_spares2
;
/* unused spare */
long
f_spare
[
2
];
/* unused spare */
};
#ifdef _KERNEL
/*
* Structure per mounted file system. Each mounted file system has an
* array of operations and an instance record. The file systems are
* put on a doubly linked list.
*
* NOTE: mnt_nvnodelist and mnt_reservedvnlist. At the moment vnodes
* are linked into mnt_nvnodelist. At some point in the near future the
* vnode list will be split into a 'dirty' and 'clean' list. mnt_nvnodelist
* will become the dirty list and mnt_reservedvnlist will become the 'clean'
* list. Filesystem kld's syncing code should remain compatible since
* they only need to scan the dirty vnode list (nvnodelist -> dirtyvnodelist).
*/
TAILQ_HEAD
(
vnodelst
,
vnode
);
struct
mount
{
TAILQ_ENTRY
(
mount
)
mnt_list
;
/* mount list */
struct
vfsops
*
mnt_op
;
/* operations on fs */
struct
vfsconf
*
mnt_vfc
;
/* configuration info */
struct
vnode
*
mnt_vnodecovered
;
/* vnode we mounted on */
struct
vnode
*
mnt_syncer
;
/* syncer vnode */
struct
vnodelst
mnt_nvnodelist
;
/* list of vnodes this mount */
struct
lock
mnt_lock
;
/* mount structure lock */
int
mnt_flag
;
/* flags shared with user */
int
mnt_kern_flag
;
/* kernel only flags */
int
mnt_maxsymlinklen
;
/* max size of short symlink */
struct
statfs
mnt_stat
;
/* cache of filesystem stats */
qaddr_t
mnt_data
;
/* private data */
time_t
mnt_time
;
/* last time written*/
u_int
mnt_iosize_max
;
/* max IO request size */
struct
vnodelst
mnt_reservedvnlist
;
/* (future) dirty vnode list */
void
*
mnt_prison
;
/* associated prison */
int
mnt_ops_in_progress
;
};
#endif
/* _KERNEL */
/*
* User specifiable flags.
*/
#define MNT_RDONLY 0x00000001
/* read only filesystem */
#define MNT_SYNCHRONOUS 0x00000002
/* file system written synchronously */
#define MNT_NOEXEC 0x00000004
/* can't exec from filesystem */
#define MNT_NOSUID 0x00000008
/* don't honor setuid bits on fs */
#define MNT_NODEV 0x00000010
/* don't interpret special files */
#define MNT_UNION 0x00000020
/* union with underlying filesystem */
#define MNT_ASYNC 0x00000040
/* file system written asynchronously */
#define MNT_SUIDDIR 0x00100000
/* special handling of SUID on dirs */
#define MNT_SOFTDEP 0x00200000
/* soft updates being done */
#define MNT_NOSYMFOLLOW 0x00400000
/* do not follow symlinks */
#define MNT_NOATIME 0x10000000
/* disable update of file access time */
#define MNT_NOCLUSTERR 0x40000000
/* disable cluster read */
#define MNT_NOCLUSTERW 0x80000000
/* disable cluster write */
/*
* NFS export related mount flags.
*/
#define MNT_EXRDONLY 0x00000080
/* exported read only */
#define MNT_EXPORTED 0x00000100
/* file system is exported */
#define MNT_DEFEXPORTED 0x00000200
/* exported to the world */
#define MNT_EXPORTANON 0x00000400
/* use anon uid mapping for everyone */
#define MNT_EXKERB 0x00000800
/* exported with Kerberos uid mapping */
#define MNT_EXPUBLIC 0x20000000
/* public export (WebNFS) */
/*
* Flags set by internal operations,
* but visible to the user.
* XXX some of these are not quite right.. (I've never seen the root flag set)
*/
#define MNT_LOCAL 0x00001000
/* filesystem is stored locally */
#define MNT_QUOTA 0x00002000
/* quotas are enabled on filesystem */
#define MNT_ROOTFS 0x00004000
/* identifies the root filesystem */
#define MNT_USER 0x00008000
/* mounted by a user */
#define MNT_IGNORE 0x00800000
/* do not show entry in df */
/*
* Mask of flags that are visible to statfs()
* XXX I think that this could now become (~(MNT_CMDFLAGS))
* but the 'mount' program may need changing to handle this.
*/
#define MNT_VISFLAGMASK (MNT_RDONLY | MNT_SYNCHRONOUS | MNT_NOEXEC | \
MNT_NOSUID | MNT_NODEV | MNT_UNION | \
MNT_ASYNC | MNT_EXRDONLY | MNT_EXPORTED | \
MNT_DEFEXPORTED | MNT_EXPORTANON| MNT_EXKERB | \
MNT_LOCAL | MNT_USER | MNT_QUOTA | \
MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR| \
MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP | \
MNT_IGNORE | MNT_NOSYMFOLLOW | MNT_EXPUBLIC )
/*
* External filesystem command modifier flags.
* Unmount can use the MNT_FORCE flag.
* XXX These are not STATES and really should be somewhere else.
*/
#define MNT_UPDATE 0x00010000
/* not a real mount, just an update */
#define MNT_DELEXPORT 0x00020000
/* delete export host lists */
#define MNT_RELOAD 0x00040000
/* reload filesystem data */
#define MNT_FORCE 0x00080000
/* force unmount or readonly change */
#define MNT_CMDFLAGS (MNT_UPDATE|MNT_DELEXPORT|MNT_RELOAD|MNT_FORCE)
/*
* Internal filesystem control flags stored in mnt_kern_flag.
*
* MNTK_UNMOUNT locks the mount entry so that name lookup cannot proceed
* past the mount point. This keeps the subtree stable during mounts
* and unmounts.
*
* MNTK_UNMOUNTF permits filesystems to detect a forced unmount while
* dounmount() is still waiting to lock the mountpoint. This allows
* the filesystem to cancel operations that might otherwise deadlock
* with the unmount attempt (used by NFS).
*/
#define MNTK_UNMOUNTF 0x00000001
/* forced unmount in progress */
#define MNTK_UNMOUNT 0x01000000
/* unmount in progress */
#define MNTK_MWAIT 0x02000000
/* waiting for unmount to finish */
#define MNTK_WANTRDWR 0x04000000
/* upgrade to read/write requested */
/*
* Sysctl CTL_VFS definitions.
*
* Second level identifier specifies which filesystem. Second level
* identifier VFS_VFSCONF returns information about all filesystems.
* Second level identifier VFS_GENERIC is non-terminal.
*/
#define VFS_VFSCONF 0
/* get configured filesystems */
#define VFS_GENERIC 0
/* generic filesystem information */
/*
* Third level identifiers for VFS_GENERIC are given below; third
* level identifiers for specific filesystems are given in their
* mount specific header files.
*/
#define VFS_MAXTYPENUM 1
/* int: highest defined filesystem type */
#define VFS_CONF 2
/* struct: vfsconf for filesystem given
as next argument */
/*
* Flags for various system call interfaces.
*
* waitfor flags to vfs_sync() and getfsstat()
*/
#define MNT_WAIT 1
/* synchronously wait for I/O to complete */
#define MNT_NOWAIT 2
/* start all I/O, but do not wait for it */
#define MNT_LAZY 3
/* push data not written by filesystem syncer */
/*
* Generic file handle
*/
struct
fhandle
{
fsid_t
fh_fsid
;
/* File system id of mount point */
struct
fid
fh_fid
;
/* File sys specific id */
};
typedef
struct
fhandle
fhandle_t
;
/*
* Export arguments for local filesystem mount calls.
*/
struct
export_args
{
int
ex_flags
;
/* export related flags */
uid_t
ex_root
;
/* mapping for root uid */
struct
ucred
ex_anon
;
/* mapping for anonymous user */
struct
sockaddr
*
ex_addr
;
/* net address to which exported */
int
ex_addrlen
;
/* and the net address length */
struct
sockaddr
*
ex_mask
;
/* mask of valid bits in saddr */
int
ex_masklen
;
/* and the smask length */
char
*
ex_indexfile
;
/* index file for WebNFS URLs */
};
/*
* Structure holding information for a publicly exported filesystem
* (WebNFS). Currently the specs allow just for one such filesystem.
*/
struct
nfs_public
{
int
np_valid
;
/* Do we hold valid information */
fhandle_t
np_handle
;
/* Filehandle for pub fs (internal) */
struct
mount
*
np_mount
;
/* Mountpoint of exported fs */
char
*
np_index
;
/* Index file */
};
/*
* Filesystem configuration information. One of these exists for each
* type of filesystem supported by the kernel. These are searched at
* mount time to identify the requested filesystem.
*/
struct
vfsconf
{
struct
vfsops
*
vfc_vfsops
;
/* filesystem operations vector */
char
vfc_name
[
MFSNAMELEN
];
/* filesystem type name */
int
vfc_typenum
;
/* historic filesystem type number */
int
vfc_refcount
;
/* number mounted of this type */
int
vfc_flags
;
/* permanent flags */
struct
vfsconf
*
vfc_next
;
/* next in list */
};
struct
ovfsconf
{
void
*
vfc_vfsops
;
char
vfc_name
[
32
];
int
vfc_index
;
int
vfc_refcount
;
int
vfc_flags
;
};
/*
* NB: these flags refer to IMPLEMENTATION properties, not properties of
* any actual mounts; i.e., it does not make sense to change the flags.
*/
#define VFCF_STATIC 0x00010000
/* statically compiled into kernel */
#define VFCF_NETWORK 0x00020000
/* may get data over the network */
#define VFCF_READONLY 0x00040000
/* writes are not implemented */
#define VFCF_SYNTHETIC 0x00080000
/* data does not represent real files */
#define VFCF_LOOPBACK 0x00100000
/* aliases some other mounted FS */
#define VFCF_UNICODE 0x00200000
/* stores file names as Unicode*/
#ifdef _KERNEL
#ifdef MALLOC_DECLARE
MALLOC_DECLARE
(
M_MOUNT
);
#endif
extern
int
maxvfsconf
;
/* highest defined filesystem type */
extern
int
nfs_mount_type
;
/* vfc_typenum for nfs, or -1 */
extern
struct
vfsconf
*
vfsconf
;
/* head of list of filesystem types */
/*
* Operations supported on mounted file system.
*/
#ifdef __STDC__
struct
nameidata
;
struct
mbuf
;
#endif
struct
vfsops
{
int
(
*
vfs_mount
)
__P
((
struct
mount
*
mp
,
char
*
path
,
caddr_t
data
,
struct
nameidata
*
ndp
,
struct
proc
*
p
));
int
(
*
vfs_start
)
__P
((
struct
mount
*
mp
,
int
flags
,
struct
proc
*
p
));
int
(
*
vfs_unmount
)
__P
((
struct
mount
*
mp
,
int
mntflags
,
struct
proc
*
p
));
int
(
*
vfs_root
)
__P
((
struct
mount
*
mp
,
struct
vnode
**
vpp
));
int
(
*
vfs_quotactl
)
__P
((
struct
mount
*
mp
,
int
cmds
,
uid_t
uid
,
caddr_t
arg
,
struct
proc
*
p
));
int
(
*
vfs_statfs
)
__P
((
struct
mount
*
mp
,
struct
statfs
*
sbp
,
struct
proc
*
p
));
int
(
*
vfs_sync
)
__P
((
struct
mount
*
mp
,
int
waitfor
,
struct
ucred
*
cred
,
struct
proc
*
p
));
int
(
*
vfs_vget
)
__P
((
struct
mount
*
mp
,
ino_t
ino
,
struct
vnode
**
vpp
));
int
(
*
vfs_fhtovp
)
__P
((
struct
mount
*
mp
,
struct
fid
*
fhp
,
struct
vnode
**
vpp
));
int
(
*
vfs_checkexp
)
__P
((
struct
mount
*
mp
,
struct
sockaddr
*
nam
,
int
*
extflagsp
,
struct
ucred
**
credanonp
));
int
(
*
vfs_vptofh
)
__P
((
struct
vnode
*
vp
,
struct
fid
*
fhp
));
int
(
*
vfs_init
)
__P
((
struct
vfsconf
*
));
int
(
*
vfs_uninit
)
__P
((
struct
vfsconf
*
));
int
(
*
vfs_extattrctl
)
__P
((
struct
mount
*
mp
,
int
cmd
,
const
char
*
attrname
,
caddr_t
arg
,
struct
proc
*
p
));
};
#define VFS_MOUNT(MP, PATH, DATA, NDP, P) \
(*(MP)->mnt_op->vfs_mount)(MP, PATH, DATA, NDP, P)
#define VFS_START(MP, FLAGS, P) (*(MP)->mnt_op->vfs_start)(MP, FLAGS, P)
#define VFS_UNMOUNT(MP, FORCE, P) (*(MP)->mnt_op->vfs_unmount)(MP, FORCE, P)
#define VFS_ROOT(MP, VPP) (*(MP)->mnt_op->vfs_root)(MP, VPP)
#define VFS_QUOTACTL(MP,C,U,A,P) (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A, P)
#define VFS_STATFS(MP, SBP, P) (*(MP)->mnt_op->vfs_statfs)(MP, SBP, P)
#define VFS_SYNC(MP, WAIT, C, P) (*(MP)->mnt_op->vfs_sync)(MP, WAIT, C, P)
#define VFS_VGET(MP, INO, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, VPP)
#define VFS_FHTOVP(MP, FIDP, VPP) \
(*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP)
#define VFS_VPTOFH(VP, FIDP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP)
#define VFS_CHECKEXP(MP, NAM, EXFLG, CRED) \
(*(MP)->mnt_op->vfs_checkexp)(MP, NAM, EXFLG, CRED)
#define VFS_EXTATTRCTL(MP, C, N, A, P) \
(*(MP)->mnt_op->vfs_extattrctl)(MP, C, N, A, P)
#include <sys/module.h>
#define VFS_SET(vfsops, fsname, flags) \
static struct vfsconf fsname ## _vfsconf = { \
&vfsops, \
#fsname, \
-1, \
0, \
flags \
}; \
static moduledata_t fsname ## _mod = { \
#fsname, \
vfs_modevent, \
& fsname ## _vfsconf \
}; \
DECLARE_MODULE(fsname, fsname ## _mod, SI_SUB_VFS, SI_ORDER_MIDDLE)
#include <net/radix.h>
#define AF_MAX 33
/* XXX */
/*
* Network address lookup element
*/
struct
netcred
{
struct
radix_node
netc_rnodes
[
2
];
int
netc_exflags
;
struct
ucred
netc_anon
;
};
/*
* Network export information
*/
struct
netexport
{
struct
netcred
ne_defexported
;
/* Default export */
struct
radix_node_head
*
ne_rtable
[
AF_MAX
+
1
];
/* Individual exports */
};
extern
char
*
mountrootfsname
;
/*
* exported vnode operations
*/
int
dounmount
__P
((
struct
mount
*
,
int
,
struct
proc
*
));
int
vfs_setpublicfs
/* set publicly exported fs */
__P
((
struct
mount
*
,
struct
netexport
*
,
struct
export_args
*
));
int
vfs_lock
__P
((
struct
mount
*
));
/* lock a vfs */
void
vfs_msync
__P
((
struct
mount
*
,
int
));
void
vfs_unlock
__P
((
struct
mount
*
));
/* unlock a vfs */
int
vfs_busy
__P
((
struct
mount
*
,
int
,
struct
simplelock
*
,
struct
proc
*
));
int
vfs_export
/* process mount export info */
__P
((
struct
mount
*
,
struct
netexport
*
,
struct
export_args
*
));
struct
netcred
*
vfs_export_lookup
/* lookup host in fs export list */
__P
((
struct
mount
*
,
struct
netexport
*
,
struct
sockaddr
*
));
int
vfs_allocate_syncvnode
__P
((
struct
mount
*
));
void
vfs_getnewfsid
__P
((
struct
mount
*
));
dev_t
vfs_getrootfsid
__P
((
struct
mount
*
));
struct
mount
*
vfs_getvfs
__P
((
fsid_t
*
));
/* return vfs given fsid */
int
vfs_modevent
__P
((
module_t
,
int
,
void
*
));
int
vfs_mountedon
__P
((
struct
vnode
*
));
/* is a vfs mounted on vp */
int
vfs_rootmountalloc
__P
((
char
*
,
char
*
,
struct
mount
**
));
void
vfs_unbusy
__P
((
struct
mount
*
,
struct
proc
*
));
void
vfs_unmountall
__P
((
void
));
int
vfs_register
__P
((
struct
vfsconf
*
));
int
vfs_unregister
__P
((
struct
vfsconf
*
));
extern
TAILQ_HEAD
(
mntlist
,
mount
)
mountlist
;
/* mounted filesystem list */
extern
struct
simplelock
mountlist_slock
;
extern
struct
nfs_public
nfs_pub
;
/*
* Declarations for these vfs default operations are located in
* kern/vfs_default.c, they should be used instead of making "dummy"
* functions or casting entries in the VFS op table to "enopnotsupp()".
*/
int
vfs_stdmount
__P
((
struct
mount
*
mp
,
char
*
path
,
caddr_t
data
,
struct
nameidata
*
ndp
,
struct
proc
*
p
));
int
vfs_stdstart
__P
((
struct
mount
*
mp
,
int
flags
,
struct
proc
*
p
));
int
vfs_stdunmount
__P
((
struct
mount
*
mp
,
int
mntflags
,
struct
proc
*
p
));
int
vfs_stdroot
__P
((
struct
mount
*
mp
,
struct
vnode
**
vpp
));
int
vfs_stdquotactl
__P
((
struct
mount
*
mp
,
int
cmds
,
uid_t
uid
,
caddr_t
arg
,
struct
proc
*
p
));
int
vfs_stdstatfs
__P
((
struct
mount
*
mp
,
struct
statfs
*
sbp
,
struct
proc
*
p
));
int
vfs_stdsync
__P
((
struct
mount
*
mp
,
int
waitfor
,
struct
ucred
*
cred
,
struct
proc
*
p
));
int
vfs_stdvget
__P
((
struct
mount
*
mp
,
ino_t
ino
,
struct
vnode
**
vpp
));
int
vfs_stdfhtovp
__P
((
struct
mount
*
mp
,
struct
fid
*
fhp
,
struct
vnode
**
vpp
));
int
vfs_stdcheckexp
__P
((
struct
mount
*
mp
,
struct
sockaddr
*
nam
,
int
*
extflagsp
,
struct
ucred
**
credanonp
));
int
vfs_stdvptofh
__P
((
struct
vnode
*
vp
,
struct
fid
*
fhp
));
int
vfs_stdinit
__P
((
struct
vfsconf
*
));
int
vfs_stduninit
__P
((
struct
vfsconf
*
));
int
vfs_stdextattrctl
__P
((
struct
mount
*
mp
,
int
cmd
,
const
char
*
attrname
,
caddr_t
arg
,
struct
proc
*
p
));
#else
/* !_KERNEL */
#include <sys/cdefs.h>
__BEGIN_DECLS
int
fstatfs
__P
((
int
,
struct
statfs
*
));
int
getfh
__P
((
const
char
*
,
fhandle_t
*
));
int
getfsstat
__P
((
struct
statfs
*
,
long
,
int
));
int
getmntinfo
__P
((
struct
statfs
**
,
int
));
int
mount
__P
((
const
char
*
,
const
char
*
,
int
,
void
*
));
int
statfs
__P
((
const
char
*
,
struct
statfs
*
));
int
unmount
__P
((
const
char
*
,
int
));
int
fhopen
__P
((
const
struct
fhandle
*
,
int
));
int
fhstat
__P
((
const
struct
fhandle
*
,
struct
stat
*
));
int
fhstatfs
__P
((
const
struct
fhandle
*
,
struct
statfs
*
));
/* C library stuff */
void
endvfsent
__P
((
void
));
struct
ovfsconf
*
getvfsbyname
__P
((
const
char
*
));
struct
ovfsconf
*
getvfsbytype
__P
((
int
));
struct
ovfsconf
*
getvfsent
__P
((
void
));
#define getvfsbyname new_getvfsbyname
int
new_getvfsbyname
__P
((
const
char
*
,
struct
vfsconf
*
));
void
setvfsent
__P
((
int
));
int
vfsisloadable
__P
((
const
char
*
));
int
vfsload
__P
((
const
char
*
));
__END_DECLS
#endif
/* _KERNEL */
#endif
/* !_SYS_MOUNT_H_ */
os/shd/tty_tty.c
0 → 100644
View file @
a7bdf7a9
/*-
* Copyright (c) 1982, 1986, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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.
*
* @(#)tty_tty.c 8.2 (Berkeley) 9/23/93
* $FreeBSD: src/sys/kern/tty_tty.c,v 1.30 1999/09/25 18:24:24 phk Exp $
*/
/*
* Indirect driver for controlling tty.
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/lock.h>
#include <sys/proc.h>
#include <sys/ttycom.h>
#include <sys/vnode.h>
#include <sys/kernel.h>
static
d_open_t
cttyopen
;
static
d_read_t
cttyread
;
static
d_write_t
cttywrite
;
static
d_ioctl_t
cttyioctl
;
static
d_poll_t
cttypoll
;
#define CDEV_MAJOR 1
/* Don't make this static, since fdesc_vnops uses it. */
struct
cdevsw
ctty_cdevsw
=
{
/* open */
cttyopen
,
/* close */
nullclose
,
/* read */
cttyread
,
/* write */
cttywrite
,
/* ioctl */
cttyioctl
,
/* poll */
cttypoll
,
/* mmap */
nommap
,
/* strategy */
nostrategy
,
/* name */
"ctty"
,
/* maj */
CDEV_MAJOR
,
/* dump */
nodump
,
/* psize */
nopsize
,
/* flags */
D_TTY
,
/* bmaj */
-
1
};
#define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL)
/*ARGSUSED*/
static
int
cttyopen
(
dev
,
flag
,
mode
,
p
)
dev_t
dev
;
int
flag
,
mode
;
struct
proc
*
p
;
{
struct
vnode
*
ttyvp
=
cttyvp
(
p
);
int
error
;
if
(
ttyvp
==
NULL
)
return
(
ENXIO
);
shd_write_entry
(
ttyvp
,
"cttyopen"
);
vn_lock
(
ttyvp
,
LK_EXCLUSIVE
|
LK_RETRY
,
p
);
#ifdef PARANOID
/*
* Since group is tty and mode is 620 on most terminal lines
* and since sessions protect terminals from processes outside
* your session, this check is probably no longer necessary.
* Since it inhibits setuid root programs that later switch
* to another user from accessing /dev/tty, we have decided
* to delete this test. (mckusick 5/93)
*/
error
=
VOP_ACCESS
(
ttyvp
,
(
flag
&
FREAD
?
VREAD
:
0
)
|
(
flag
&
FWRITE
?
VWRITE
:
0
),
p
->
p_ucred
,
p
);
if
(
!
error
)
#endif
/* PARANOID */
error
=
VOP_OPEN
(
ttyvp
,
flag
,
NOCRED
,
p
);
VOP_UNLOCK
(
ttyvp
,
0
,
p
);
shd_write_exit
(
ttyvp
,
"cttyopen"
);
return
(
error
);
}
/*ARGSUSED*/
static
int
cttyread
(
dev
,
uio
,
flag
)
dev_t
dev
;
struct
uio
*
uio
;
int
flag
;
{
struct
proc
*
p
=
uio
->
uio_procp
;
register
struct
vnode
*
ttyvp
=
cttyvp
(
p
);
int
error
;
if
(
ttyvp
==
NULL
)
return
(
EIO
);
vn_lock
(
ttyvp
,
LK_EXCLUSIVE
|
LK_RETRY
,
p
);
error
=
VOP_READ
(
ttyvp
,
uio
,
flag
,
NOCRED
);
VOP_UNLOCK
(
ttyvp
,
0
,
p
);
return
(
error
);
}
extern
void
shd_write_entry
(
struct
vnode
*
vp
,
char
*
name
);
extern
void
shd_write_exit
(
struct
vnode
*
vp
,
char
*
name
);
/*ARGSUSED*/
static
int
cttywrite
(
dev
,
uio
,
flag
)
dev_t
dev
;
struct
uio
*
uio
;
int
flag
;
{
struct
proc
*
p
=
uio
->
uio_procp
;
struct
vnode
*
ttyvp
=
cttyvp
(
uio
->
uio_procp
);
int
error
;
if
(
ttyvp
==
NULL
)
return
(
EIO
);
shd_write_entry
(
ttyvp
,
"cttywrite"
);
vn_lock
(
ttyvp
,
LK_EXCLUSIVE
|
LK_RETRY
,
p
);
error
=
VOP_WRITE
(
ttyvp
,
uio
,
flag
,
NOCRED
);
VOP_UNLOCK
(
ttyvp
,
0
,
p
);
shd_write_exit
(
ttyvp
,
"cttywrite"
);
return
(
error
);
}
/*ARGSUSED*/
static
int
cttyioctl
(
dev
,
cmd
,
addr
,
flag
,
p
)
dev_t
dev
;