2 * Copyright (c) 2005 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Joerg Sonnenberger <joerg@bec.de>.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * $DragonFly: src/sys/emulation/dragonfly12/dfbsd12_stat.c,v 1.4 2008/09/17 21:44:16 dillon Exp $
37 #include "opt_compatdf12.h"
39 #include <sys/param.h>
40 #include <sys/kern_syscall.h>
41 #include <sys/mount.h>
42 #include <sys/nlookup.h>
46 #include <sys/sysproto.h>
47 #include <sys/systm.h>
48 #include <sys/thread.h>
49 #include <sys/vnode.h>
50 #include <emulation/dragonfly12/stat.h>
52 #include <sys/mplock2.h>
55 cvtstat(struct dfbsd12_stat
*oldstat
, struct stat
*newstat
)
57 bzero(oldstat
, sizeof(oldstat
));
59 oldstat
->st_dev
= newstat
->st_dev
;
60 oldstat
->st_ino
= newstat
->st_ino
; /* truncation */
61 oldstat
->st_mode
= newstat
->st_mode
;
62 oldstat
->st_nlink
= newstat
->st_nlink
; /* truncation */
63 oldstat
->st_uid
= newstat
->st_uid
;
64 oldstat
->st_gid
= newstat
->st_gid
;
65 oldstat
->st_rdev
= newstat
->st_rdev
;
66 oldstat
->st_atimespec
= newstat
->st_atimespec
;
67 oldstat
->st_mtimespec
= newstat
->st_mtimespec
;
68 oldstat
->st_ctimespec
= newstat
->st_ctimespec
;
69 oldstat
->st_size
= newstat
->st_size
;
70 oldstat
->st_blocks
= newstat
->st_blocks
;
71 oldstat
->st_blksize
= newstat
->st_blksize
;
72 oldstat
->st_flags
= newstat
->st_flags
;
73 oldstat
->st_gen
= newstat
->st_gen
;
77 * stat_args(char *path, struct dfbsd12_stat *ub)
79 * Get file status; this version follows links.
84 sys_dfbsd12_stat(struct dfbsd12_stat_args
*uap
)
86 struct nlookupdata nd
;
87 struct dfbsd12_stat ost
;
92 error
= nlookup_init(&nd
, uap
->path
, UIO_USERSPACE
, NLC_FOLLOW
);
94 error
= kern_stat(&nd
, &st
);
97 error
= copyout(&ost
, uap
->ub
, sizeof(ost
));
106 * lstat_args(char *path, struct dfbsd12_stat *ub)
108 * Get file status; this version does not follow links.
113 sys_dfbsd12_lstat(struct dfbsd12_lstat_args
*uap
)
115 struct nlookupdata nd
;
116 struct dfbsd12_stat ost
;
121 error
= nlookup_init(&nd
, uap
->path
, UIO_USERSPACE
, 0);
123 error
= kern_stat(&nd
, &st
);
126 error
= copyout(&ost
, uap
->ub
, sizeof(ost
));
135 * fhstat_args(struct fhandle *u_fhp, struct dfbsd12_stat *sb)
140 sys_dfbsd12_fhstat(struct dfbsd12_fhstat_args
*uap
)
142 struct thread
*td
= curthread
;
143 struct dfbsd12_stat osb
;
153 error
= priv_check(td
, PRIV_ROOT
);
157 error
= copyin(uap
->u_fhp
, &fh
, sizeof(fhandle_t
));
162 if ((mp
= vfs_getvfs(&fh
.fh_fsid
)) == NULL
) {
166 if ((error
= VFS_FHTOVP(mp
, NULL
, &fh
.fh_fid
, &vp
)))
168 error
= vn_stat(vp
, &sb
, td
->td_ucred
);
173 error
= copyout(&osb
, uap
->sb
, sizeof(osb
));
180 * dfbsd12_fstat_args(int fd, struct dfbsd12_stat *sb)
185 sys_dfbsd12_fstat(struct dfbsd12_fstat_args
*uap
)
187 struct dfbsd12_stat ost
;
192 error
= kern_fstat(uap
->fd
, &st
);
197 error
= copyout(&ost
, uap
->sb
, sizeof(ost
));