Annotation of sys/compat/common/vfs_syscalls_35.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: vfs_syscalls_35.c,v 1.3 2004/07/14 18:57:57 millert Exp $ */
2:
3: /*
4: * Copyright (c) 1989, 1993
5: * The Regents of the University of California. All rights reserved.
6: * (c) UNIX System Laboratories, Inc.
7: * All or some portions of this file are derived from material licensed
8: * to the University of California by American Telephone and Telegraph
9: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10: * the permission of UNIX System Laboratories, Inc.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. Neither the name of the University nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: * @(#)vfs_syscalls.c 8.28 (Berkeley) 12/10/94
37: */
38:
39: #include <sys/param.h>
40: #include <sys/systm.h>
41: #include <sys/filedesc.h>
42: #include <sys/kernel.h>
43: #include <sys/proc.h>
44: #include <sys/file.h>
45: #include <sys/vnode.h>
46: #include <sys/namei.h>
47: #include <sys/dirent.h>
48: #include <sys/socket.h>
49: #include <sys/socketvar.h>
50: #include <sys/stat.h>
51:
52: #include <sys/mount.h>
53: #include <sys/syscallargs.h>
54:
55: static void cvtstat(struct stat *, struct stat35 *);
56:
57: /*
58: * Convert from a new to an old stat structure.
59: */
60: static void
61: cvtstat(struct stat *st, struct stat35 *ost)
62: {
63:
64: ost->st_dev = st->st_dev;
65: ost->st_ino = st->st_ino;
66: ost->st_mode = st->st_mode & 0xffff;
67: ost->st_nlink = st->st_nlink & 0xffff;
68: ost->st_uid = st->st_uid;
69: ost->st_gid = st->st_gid;
70: ost->st_rdev = st->st_rdev;
71: ost->st_atimespec = st->st_atimespec;
72: ost->st_mtimespec = st->st_mtimespec;
73: ost->st_ctimespec = st->st_ctimespec;
74: ost->st_size = st->st_size;
75: ost->st_blocks = st->st_blocks;
76: ost->st_blksize = st->st_blksize;
77: ost->st_flags = st->st_flags;
78: ost->st_gen = st->st_gen;
79: }
80:
81: /*
82: * Get file status; this version follows links.
83: */
84: /* ARGSUSED */
85: int
86: compat_35_sys_stat(struct proc *p, void *v, register_t *retval)
87: {
88: struct compat_35_sys_stat_args /* {
89: syscallarg(char *) path;
90: syscallarg(struct stat35 *) ub;
91: } */ *uap = v;
92: struct stat sb;
93: struct stat35 osb;
94: int error;
95: struct nameidata nd;
96:
97: NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
98: SCARG(uap, path), p);
99: if ((error = namei(&nd)) != 0)
100: return (error);
101: error = vn_stat(nd.ni_vp, &sb, p);
102: vput(nd.ni_vp);
103: if (error)
104: return (error);
105: /* Don't let non-root see generation numbers (for NFS security) */
106: if (suser(p, 0))
107: sb.st_gen = 0;
108: cvtstat(&sb, &osb);
109: error = copyout(&osb, SCARG(uap, ub), sizeof(osb));
110: return (error);
111: }
112:
113: /*
114: * Get file status; this version does not follow links.
115: */
116: /* ARGSUSED */
117: int
118: compat_35_sys_lstat(struct proc *p, void *v, register_t *retval)
119: {
120: struct compat_35_sys_lstat_args /* {
121: syscallarg(char *) path;
122: syscallarg(struct stat35 *) ub;
123: } */ *uap = v;
124: struct stat sb;
125: struct stat35 osb;
126: int error;
127: struct nameidata nd;
128:
129: NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
130: SCARG(uap, path), p);
131: if ((error = namei(&nd)) != 0)
132: return (error);
133: error = vn_stat(nd.ni_vp, &sb, p);
134: vput(nd.ni_vp);
135: if (error)
136: return (error);
137: /* Don't let non-root see generation numbers (for NFS security) */
138: if (suser(p, 0))
139: sb.st_gen = 0;
140: cvtstat(&sb, &osb);
141: error = copyout(&osb, SCARG(uap, ub), sizeof(osb));
142: return (error);
143: }
144:
145: /*
146: * Return status information about a file descriptor.
147: */
148: /* ARGSUSED */
149: int
150: compat_35_sys_fstat(struct proc *p, void *v, register_t *retval)
151: {
152: struct compat_35_sys_fstat_args /* {
153: syscallarg(int) fd;
154: syscallarg(struct stat35 *) sb;
155: } */ *uap = v;
156: int fd = SCARG(uap, fd);
157: struct filedesc *fdp = p->p_fd;
158: struct file *fp;
159: struct stat ub;
160: struct stat35 oub;
161: int error;
162:
163: if ((fp = fd_getfile(fdp, fd)) == NULL)
164: return (EBADF);
165: FREF(fp);
166: error = (*fp->f_ops->fo_stat)(fp, &ub, p);
167: FRELE(fp);
168: if (error == 0) {
169: /* Don't let non-root see generation numbers
170: (for NFS security) */
171: if (suser(p, 0))
172: ub.st_gen = 0;
173: cvtstat(&ub, &oub);
174: error = copyout(&oub, SCARG(uap, sb), sizeof(oub));
175: }
176: return (error);
177: }
178:
179: /* ARGSUSED */
180: int
181: compat_35_sys_fhstat(struct proc *p, void *v, register_t *retval)
182: {
183: struct sys_fhstat_args /* {
184: syscallarg(const fhandle_t *) fhp;
185: syscallarg(struct stat35 *) sb;
186: } */ *uap = v;
187: struct stat ub;
188: struct stat35 oub;
189: int error;
190: fhandle_t fh;
191: struct mount *mp;
192: struct vnode *vp;
193:
194: /*
195: * Must be super user
196: */
197: if ((error = suser(p, 0)))
198: return (error);
199:
200: if ((error = copyin(SCARG(uap, fhp), &fh, sizeof(fhandle_t))) != 0)
201: return (error);
202:
203: if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
204: return (ESTALE);
205: if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
206: return (error);
207: error = vn_stat(vp, &ub, p);
208: vput(vp);
209: if (error)
210: return (error);
211: cvtstat(&ub, &oub);
212: error = copyout(&oub, SCARG(uap, sb), sizeof(oub));
213: return (error);
214: }
CVSweb