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>
53 cvtstat(struct dfbsd12_stat
*oldstat
, struct stat
*newstat
)
55 bzero(oldstat
, sizeof(oldstat
));
57 oldstat
->st_dev
= newstat
->st_dev
;
58 oldstat
->st_ino
= newstat
->st_ino
; /* truncation */
59 oldstat
->st_mode
= newstat
->st_mode
;
60 oldstat
->st_nlink
= newstat
->st_nlink
; /* truncation */
61 oldstat
->st_uid
= newstat
->st_uid
;
62 oldstat
->st_gid
= newstat
->st_gid
;
63 oldstat
->st_rdev
= newstat
->st_rdev
;
64 oldstat
->st_atimespec
= newstat
->st_atimespec
;
65 oldstat
->st_mtimespec
= newstat
->st_mtimespec
;
66 oldstat
->st_ctimespec
= newstat
->st_ctimespec
;
67 oldstat
->st_size
= newstat
->st_size
;
68 oldstat
->st_blocks
= newstat
->st_blocks
;
69 oldstat
->st_blksize
= newstat
->st_blksize
;
70 oldstat
->st_flags
= newstat
->st_flags
;
71 oldstat
->st_gen
= newstat
->st_gen
;
75 * stat_args(char *path, struct dfbsd12_stat *ub)
77 * Get file status; this version follows links.
80 sys_dfbsd12_stat(struct dfbsd12_stat_args
*uap
)
82 struct nlookupdata nd
;
83 struct dfbsd12_stat ost
;
87 error
= nlookup_init(&nd
, uap
->path
, UIO_USERSPACE
, NLC_FOLLOW
);
89 error
= kern_stat(&nd
, &st
);
92 error
= copyout(&ost
, uap
->ub
, sizeof(ost
));
100 * lstat_args(char *path, struct dfbsd12_stat *ub)
102 * Get file status; this version does not follow links.
105 sys_dfbsd12_lstat(struct dfbsd12_lstat_args
*uap
)
107 struct nlookupdata nd
;
108 struct dfbsd12_stat ost
;
112 error
= nlookup_init(&nd
, uap
->path
, UIO_USERSPACE
, 0);
114 error
= kern_stat(&nd
, &st
);
117 error
= copyout(&ost
, uap
->ub
, sizeof(ost
));
125 * fhstat_args(struct fhandle *u_fhp, struct dfbsd12_stat *sb)
128 sys_dfbsd12_fhstat(struct dfbsd12_fhstat_args
*uap
)
130 struct thread
*td
= curthread
;
131 struct dfbsd12_stat osb
;
141 error
= priv_check(td
, PRIV_ROOT
);
145 error
= copyin(uap
->u_fhp
, &fh
, sizeof(fhandle_t
));
149 if ((mp
= vfs_getvfs(&fh
.fh_fsid
)) == NULL
)
151 if ((error
= VFS_FHTOVP(mp
, NULL
, &fh
.fh_fid
, &vp
)))
153 error
= vn_stat(vp
, &sb
, td
->td_proc
->p_ucred
);
158 error
= copyout(&osb
, uap
->sb
, sizeof(osb
));
163 * dfbsd12_fstat_args(int fd, struct dfbsd12_stat *sb)
166 sys_dfbsd12_fstat(struct dfbsd12_fstat_args
*uap
)
168 struct dfbsd12_stat ost
;
172 error
= kern_fstat(uap
->fd
, &st
);
176 error
= copyout(&ost
, uap
->sb
, sizeof(ost
));