1 /* $NetBSD: vfs_syscalls_50.c,v 1.4 2009/01/26 13:00:04 njoly Exp $ */
4 * Copyright (c) 2008 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_50.c,v 1.4 2009/01/26 13:00:04 njoly Exp $");
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/namei.h>
44 #include <sys/filedesc.h>
45 #include <sys/kernel.h>
48 #include <sys/socketvar.h>
49 #include <sys/vnode.h>
50 #include <sys/mount.h>
53 #include <sys/dirent.h>
54 #include <sys/malloc.h>
55 #include <sys/kauth.h>
57 #include <sys/vfs_syscalls.h>
61 #include <sys/syscallargs.h>
63 #include <ufs/lfs/lfs_extern.h>
65 #include <compat/common/compat_util.h>
66 #include <compat/sys/time.h>
67 #include <compat/sys/stat.h>
68 #include <compat/sys/dirent.h>
69 #include <compat/sys/mount.h>
71 static void cvtstat(struct stat30
*, const struct stat
*);
74 * Convert from a new to an old stat structure.
77 cvtstat(struct stat30
*ost
, const struct stat
*st
)
80 ost
->st_dev
= st
->st_dev
;
81 ost
->st_ino
= st
->st_ino
;
82 ost
->st_mode
= st
->st_mode
;
83 ost
->st_nlink
= st
->st_nlink
;
84 ost
->st_uid
= st
->st_uid
;
85 ost
->st_gid
= st
->st_gid
;
86 ost
->st_rdev
= st
->st_rdev
;
87 timespec_to_timespec50(&st
->st_atimespec
, &ost
->st_atimespec
);
88 timespec_to_timespec50(&st
->st_mtimespec
, &ost
->st_mtimespec
);
89 timespec_to_timespec50(&st
->st_ctimespec
, &ost
->st_ctimespec
);
90 timespec_to_timespec50(&st
->st_birthtimespec
, &ost
->st_birthtimespec
);
91 ost
->st_size
= st
->st_size
;
92 ost
->st_blocks
= st
->st_blocks
;
93 ost
->st_blksize
= st
->st_blksize
;
94 ost
->st_flags
= st
->st_flags
;
95 ost
->st_gen
= st
->st_gen
;
99 * Get file status; this version follows links.
103 compat_50_sys___stat30(struct lwp
*l
, const struct compat_50_sys___stat30_args
*uap
, register_t
*retval
)
106 syscallarg(const char *) path;
107 syscallarg(struct stat30 *) ub;
113 error
= do_sys_stat(SCARG(uap
, path
), FOLLOW
, &sb
);
117 error
= copyout(&osb
, SCARG(uap
, ub
), sizeof (osb
));
123 * Get file status; this version does not follow links.
127 compat_50_sys___lstat30(struct lwp
*l
, const struct compat_50_sys___lstat30_args
*uap
, register_t
*retval
)
130 syscallarg(const char *) path;
131 syscallarg(struct stat30 *) ub;
137 error
= do_sys_stat(SCARG(uap
, path
), NOFOLLOW
, &sb
);
141 error
= copyout(&osb
, SCARG(uap
, ub
), sizeof (osb
));
146 * Return status information about a file descriptor.
150 compat_50_sys___fstat30(struct lwp
*l
, const struct compat_50_sys___fstat30_args
*uap
, register_t
*retval
)
154 syscallarg(struct stat30 *) sb;
160 error
= do_sys_fstat(SCARG(uap
, fd
), &sb
);
164 error
= copyout(&osb
, SCARG(uap
, sb
), sizeof (osb
));
170 compat_50_sys___fhstat40(struct lwp
*l
, const struct compat_50_sys___fhstat40_args
*uap
, register_t
*retval
)
173 syscallarg(const void *) fhp;
174 syscallarg(size_t) fh_size;
175 syscallarg(struct stat30 *) sb;
181 error
= do_fhstat(l
, SCARG(uap
, fhp
), SCARG(uap
, fh_size
), &sb
);
185 error
= copyout(&osb
, SCARG(uap
, sb
), sizeof (osb
));
190 compat_50_do_sys_utimes(struct lwp
*l
, struct vnode
*vp
, const char *path
,
191 int flag
, const struct timeval50
*tptr
)
193 struct timeval tv
[2], *tvp
;
194 struct timeval50 tv50
[2];
196 int error
= copyin(tptr
, tv50
, sizeof(tv50
));
199 timeval50_to_timeval(&tv50
[0], &tv
[0]);
200 timeval50_to_timeval(&tv50
[1], &tv
[1]);
204 return do_sys_utimes(l
, vp
, path
, flag
, tvp
, UIO_SYSSPACE
);
208 * Set the access and modification times given a path name; this
209 * version follows links.
213 compat_50_sys_utimes(struct lwp
*l
, const struct compat_50_sys_utimes_args
*uap
,
217 syscallarg(const char *) path;
218 syscallarg(const struct timeval50 *) tptr;
221 return compat_50_do_sys_utimes(l
, NULL
, SCARG(uap
, path
), FOLLOW
,
226 * Set the access and modification times given a file descriptor.
230 compat_50_sys_futimes(struct lwp
*l
,
231 const struct compat_50_sys_futimes_args
*uap
, register_t
*retval
)
235 syscallarg(const struct timeval50 *) tptr;
240 /* fd_getvnode() will use the descriptor for us */
241 if ((error
= fd_getvnode(SCARG(uap
, fd
), &fp
)) != 0)
243 error
= compat_50_do_sys_utimes(l
, fp
->f_data
, NULL
, 0,
245 fd_putfile(SCARG(uap
, fd
));
250 * Set the access and modification times given a path name; this
251 * version does not follow links.
254 compat_50_sys_lutimes(struct lwp
*l
,
255 const struct compat_50_sys_lutimes_args
*uap
, register_t
*retval
)
258 syscallarg(const char *) path;
259 syscallarg(const struct timeval50 *) tptr;
262 return compat_50_do_sys_utimes(l
, NULL
, SCARG(uap
, path
), NOFOLLOW
,
267 compat_50_sys_lfs_segwait(struct lwp
*l
,
268 const struct compat_50_sys_lfs_segwait_args
*uap
, register_t
*retval
)
271 syscallarg(fsid_t *) fsidp;
272 syscallarg(struct timeval50 *) tv;
276 struct timeval50 atv50
;
280 /* XXX need we be su to segwait? */
281 if ((error
= kauth_authorize_generic(l
->l_cred
, KAUTH_GENERIC_ISSUSER
,
284 if ((error
= copyin(SCARG(uap
, fsidp
), &fsid
, sizeof(fsid_t
))) != 0)
287 if (SCARG(uap
, tv
)) {
288 error
= copyin(SCARG(uap
, tv
), &atv50
, sizeof(atv50
));
291 timeval50_to_timeval(&atv50
, &atv
);
294 } else /* NULL or invalid */
295 atv
.tv_sec
= atv
.tv_usec
= 0;
296 return lfs_segwait(&fsid
, &atv
);
303 compat_50_sys_mknod(struct lwp
*l
,
304 const struct compat_50_sys_mknod_args
*uap
, register_t
*retval
)
307 syscallarg(const char *) path;
308 syscallarg(mode_t) mode;
309 syscallarg(uint32_t) dev;
311 return do_sys_mknod(l
, SCARG(uap
, path
), SCARG(uap
, mode
),
312 SCARG(uap
, dev
), retval
, UIO_USERSPACE
);