| Commit | Line | Data |
|---|---|---|
| f91a71dd JS |
1 | /*- |
| 2 | * Copyright (c) 2005 The DragonFly Project. All rights reserved. | |
| 3 | * | |
| 4 | * This code is derived from software contributed to The DragonFly Project | |
| 5 | * by Joerg Sonnenberger <joerg@bec.de>. | |
| 6 | * | |
| 7 | * Redistribution and use in source and binary forms, with or without | |
| 8 | * modification, are permitted provided that the following conditions | |
| 9 | * are met: | |
| 10 | * | |
| 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 | |
| 16 | * distribution. | |
| 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. | |
| 20 | * | |
| 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 | |
| 32 | * SUCH DAMAGE. | |
| 33 | * | |
| 67863d04 | 34 | * $DragonFly: src/sys/emulation/dragonfly12/dfbsd12_stat.c,v 1.4 2008/09/17 21:44:16 dillon Exp $ |
| f91a71dd JS |
35 | */ |
| 36 | ||
| 37 | #include "opt_compatdf12.h" | |
| 38 | ||
| 39 | #include <sys/param.h> | |
| 40 | #include <sys/kern_syscall.h> | |
| 41 | #include <sys/mount.h> | |
| 42 | #include <sys/nlookup.h> | |
| 43 | #include <sys/proc.h> | |
| 895c1f85 | 44 | #include <sys/priv.h> |
| f91a71dd JS |
45 | #include <sys/stat.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> | |
| 51 | ||
| 52 | static void | |
| 53 | cvtstat(struct dfbsd12_stat *oldstat, struct stat *newstat) | |
| 54 | { | |
| 55 | bzero(oldstat, sizeof(oldstat)); | |
| 56 | ||
| 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; | |
| 72 | } | |
| 73 | ||
| 74 | /* | |
| 75 | * stat_args(char *path, struct dfbsd12_stat *ub) | |
| 76 | * | |
| 77 | * Get file status; this version follows links. | |
| 3919ced0 MD |
78 | * |
| 79 | * MPALMOSTSAFE | |
| f91a71dd JS |
80 | */ |
| 81 | int | |
| 753fd850 | 82 | sys_dfbsd12_stat(struct dfbsd12_stat_args *uap) |
| f91a71dd JS |
83 | { |
| 84 | struct nlookupdata nd; | |
| 85 | struct dfbsd12_stat ost; | |
| 86 | struct stat st; | |
| 87 | int error; | |
| 88 | ||
| 3919ced0 | 89 | get_mplock(); |
| f91a71dd JS |
90 | error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); |
| 91 | if (error == 0) { | |
| 92 | error = kern_stat(&nd, &st); | |
| 93 | if (error == 0) { | |
| 94 | cvtstat(&ost, &st); | |
| 95 | error = copyout(&ost, uap->ub, sizeof(ost)); | |
| 96 | } | |
| 97 | } | |
| 98 | nlookup_done(&nd); | |
| 3919ced0 | 99 | rel_mplock(); |
| f91a71dd JS |
100 | return (error); |
| 101 | } | |
| 102 | ||
| 103 | /* | |
| 104 | * lstat_args(char *path, struct dfbsd12_stat *ub) | |
| 105 | * | |
| 106 | * Get file status; this version does not follow links. | |
| 3919ced0 MD |
107 | * |
| 108 | * MPALMOSTSAFE | |
| f91a71dd JS |
109 | */ |
| 110 | int | |
| 753fd850 | 111 | sys_dfbsd12_lstat(struct dfbsd12_lstat_args *uap) |
| f91a71dd JS |
112 | { |
| 113 | struct nlookupdata nd; | |
| 114 | struct dfbsd12_stat ost; | |
| 115 | struct stat st; | |
| 116 | int error; | |
| 117 | ||
| 3919ced0 | 118 | get_mplock(); |
| f91a71dd JS |
119 | error = nlookup_init(&nd, uap->path, UIO_USERSPACE, 0); |
| 120 | if (error == 0) { | |
| 121 | error = kern_stat(&nd, &st); | |
| 122 | if (error == 0) { | |
| 123 | cvtstat(&ost, &st); | |
| 124 | error = copyout(&ost, uap->ub, sizeof(ost)); | |
| 125 | } | |
| 126 | } | |
| 127 | nlookup_done(&nd); | |
| 3919ced0 | 128 | rel_mplock(); |
| f91a71dd JS |
129 | return (error); |
| 130 | } | |
| 131 | ||
| 132 | /* | |
| 133 | * fhstat_args(struct fhandle *u_fhp, struct dfbsd12_stat *sb) | |
| 3919ced0 MD |
134 | * |
| 135 | * MPALMOSTSAFE | |
| f91a71dd JS |
136 | */ |
| 137 | int | |
| 753fd850 | 138 | sys_dfbsd12_fhstat(struct dfbsd12_fhstat_args *uap) |
| f91a71dd JS |
139 | { |
| 140 | struct thread *td = curthread; | |
| 141 | struct dfbsd12_stat osb; | |
| 142 | struct stat sb; | |
| 143 | fhandle_t fh; | |
| 144 | struct mount *mp; | |
| 145 | struct vnode *vp; | |
| 146 | int error; | |
| 147 | ||
| 148 | /* | |
| 149 | * Must be super user | |
| 150 | */ | |
| 895c1f85 | 151 | error = priv_check(td, PRIV_ROOT); |
| f91a71dd JS |
152 | if (error) |
| 153 | return (error); | |
| 154 | ||
| 155 | error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t)); | |
| 156 | if (error) | |
| 157 | return (error); | |
| 158 | ||
| 3919ced0 MD |
159 | get_mplock(); |
| 160 | if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL) { | |
| 161 | error = ESTALE; | |
| 162 | goto done; | |
| 163 | } | |
| 67863d04 | 164 | if ((error = VFS_FHTOVP(mp, NULL, &fh.fh_fid, &vp))) |
| 3919ced0 | 165 | goto done; |
| 9910d07b | 166 | error = vn_stat(vp, &sb, td->td_ucred); |
| f91a71dd JS |
167 | vput(vp); |
| 168 | if (error) | |
| 3919ced0 | 169 | goto done; |
| f91a71dd JS |
170 | cvtstat(&osb, &sb); |
| 171 | error = copyout(&osb, uap->sb, sizeof(osb)); | |
| 3919ced0 MD |
172 | done: |
| 173 | rel_mplock(); | |
| f91a71dd JS |
174 | return (error); |
| 175 | } | |
| 176 | ||
| 177 | /* | |
| 178 | * dfbsd12_fstat_args(int fd, struct dfbsd12_stat *sb) | |
| 3919ced0 MD |
179 | * |
| 180 | * MPALMOSTSAFE | |
| f91a71dd JS |
181 | */ |
| 182 | int | |
| 753fd850 | 183 | sys_dfbsd12_fstat(struct dfbsd12_fstat_args *uap) |
| f91a71dd JS |
184 | { |
| 185 | struct dfbsd12_stat ost; | |
| 186 | struct stat st; | |
| 187 | int error; | |
| 188 | ||
| 3919ced0 | 189 | get_mplock(); |
| f91a71dd | 190 | error = kern_fstat(uap->fd, &st); |
| 3919ced0 | 191 | rel_mplock(); |
| f91a71dd JS |
192 | |
| 193 | if (error == 0) { | |
| 194 | cvtstat(&ost, &st); | |
| 195 | error = copyout(&ost, uap->sb, sizeof(ost)); | |
| 196 | } | |
| 197 | return (error); | |
| 198 | } |