ibcs2_stat.c revision 141488
1/*- 2 * Copyright (c) 1995 Scott Bartram 3 * Copyright (c) 1995 Steven Wallace 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> 30__FBSDID("$FreeBSD: head/sys/i386/ibcs2/ibcs2_stat.c 141488 2005-02-07 22:02:18Z jhb $"); 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/namei.h> 35#include <sys/file.h> 36#include <sys/stat.h> 37#include <sys/filedesc.h> 38#include <sys/jail.h> 39#include <sys/kernel.h> 40#include <sys/mount.h> 41#include <sys/malloc.h> 42#include <sys/vnode.h> 43#include <sys/syscallsubr.h> 44#include <sys/sysctl.h> 45#include <sys/sysproto.h> 46 47#include <i386/ibcs2/ibcs2_signal.h> 48#include <i386/ibcs2/ibcs2_stat.h> 49#include <i386/ibcs2/ibcs2_statfs.h> 50#include <i386/ibcs2/ibcs2_proto.h> 51#include <i386/ibcs2/ibcs2_util.h> 52#include <i386/ibcs2/ibcs2_utsname.h> 53 54 55static void bsd_stat2ibcs_stat(struct stat *, struct ibcs2_stat *); 56static int cvt_statfs(struct statfs *, caddr_t, int); 57 58static void 59bsd_stat2ibcs_stat(st, st4) 60 struct stat *st; 61 struct ibcs2_stat *st4; 62{ 63 bzero(st4, sizeof(*st4)); 64 st4->st_dev = (ibcs2_dev_t)st->st_dev; 65 st4->st_ino = (ibcs2_ino_t)st->st_ino; 66 st4->st_mode = (ibcs2_mode_t)st->st_mode; 67 st4->st_nlink= (ibcs2_nlink_t)st->st_nlink; 68 st4->st_uid = (ibcs2_uid_t)st->st_uid; 69 st4->st_gid = (ibcs2_gid_t)st->st_gid; 70 st4->st_rdev = (ibcs2_dev_t)st->st_rdev; 71 if (st->st_size < (quad_t)1 << 32) 72 st4->st_size = (ibcs2_off_t)st->st_size; 73 else 74 st4->st_size = -2; 75 st4->st_atim = (ibcs2_time_t)st->st_atime; 76 st4->st_mtim = (ibcs2_time_t)st->st_mtime; 77 st4->st_ctim = (ibcs2_time_t)st->st_ctime; 78} 79 80static int 81cvt_statfs(sp, buf, len) 82 struct statfs *sp; 83 caddr_t buf; 84 int len; 85{ 86 struct ibcs2_statfs ssfs; 87 88 if (len < 0) 89 return (EINVAL); 90 else if (len > sizeof(ssfs)) 91 len = sizeof(ssfs); 92 bzero(&ssfs, sizeof ssfs); 93 ssfs.f_fstyp = 0; 94 ssfs.f_bsize = sp->f_bsize; 95 ssfs.f_frsize = 0; 96 ssfs.f_blocks = sp->f_blocks; 97 ssfs.f_bfree = sp->f_bfree; 98 ssfs.f_files = sp->f_files; 99 ssfs.f_ffree = sp->f_ffree; 100 ssfs.f_fname[0] = 0; 101 ssfs.f_fpack[0] = 0; 102 return copyout((caddr_t)&ssfs, buf, len); 103} 104 105int 106ibcs2_statfs(td, uap) 107 struct thread *td; 108 struct ibcs2_statfs_args *uap; 109{ 110 struct statfs sf; 111 char *path; 112 int error; 113 114 CHECKALTEXIST(td, uap->path, &path); 115 error = kern_statfs(td, path, UIO_SYSSPACE, &sf); 116 free(path, M_TEMP); 117 if (error) 118 return (error); 119 return cvt_statfs(&sf, (caddr_t)uap->buf, uap->len); 120} 121 122int 123ibcs2_fstatfs(td, uap) 124 struct thread *td; 125 struct ibcs2_fstatfs_args *uap; 126{ 127 struct statfs sf; 128 int error; 129 130 error = kern_fstatfs(td, uap->fd, &sf); 131 if (error) 132 return (error); 133 return cvt_statfs(&sf, (caddr_t)uap->buf, uap->len); 134} 135 136int 137ibcs2_stat(td, uap) 138 struct thread *td; 139 struct ibcs2_stat_args *uap; 140{ 141 struct ibcs2_stat ibcs2_st; 142 struct stat st; 143 char *path; 144 int error; 145 146 CHECKALTEXIST(td, uap->path, &path); 147 148 error = kern_stat(td, path, UIO_SYSSPACE, &st); 149 free(path, M_TEMP); 150 if (error) 151 return (error); 152 bsd_stat2ibcs_stat(&st, &ibcs2_st); 153 return copyout((caddr_t)&ibcs2_st, (caddr_t)uap->st, 154 ibcs2_stat_len); 155} 156 157int 158ibcs2_lstat(td, uap) 159 struct thread *td; 160 struct ibcs2_lstat_args *uap; 161{ 162 struct ibcs2_stat ibcs2_st; 163 struct stat st; 164 char *path; 165 int error; 166 167 CHECKALTEXIST(td, uap->path, &path); 168 169 error = kern_lstat(td, path, UIO_SYSSPACE, &st); 170 free(path, M_TEMP); 171 if (error) 172 return (error); 173 bsd_stat2ibcs_stat(&st, &ibcs2_st); 174 return copyout((caddr_t)&ibcs2_st, (caddr_t)uap->st, 175 ibcs2_stat_len); 176} 177 178int 179ibcs2_fstat(td, uap) 180 struct thread *td; 181 struct ibcs2_fstat_args *uap; 182{ 183 struct ibcs2_stat ibcs2_st; 184 struct stat st; 185 int error; 186 187 error = kern_fstat(td, uap->fd, &st); 188 if (error) 189 return (error); 190 bsd_stat2ibcs_stat(&st, &ibcs2_st); 191 return copyout((caddr_t)&ibcs2_st, (caddr_t)uap->st, 192 ibcs2_stat_len); 193} 194 195int 196ibcs2_utssys(td, uap) 197 struct thread *td; 198 struct ibcs2_utssys_args *uap; 199{ 200 switch (uap->flag) { 201 case 0: /* uname(2) */ 202 { 203 char machine_name[9], *p; 204 struct ibcs2_utsname sut; 205 bzero(&sut, ibcs2_utsname_len); 206 207 strncpy(sut.sysname, 208 IBCS2_UNAME_SYSNAME, sizeof(sut.sysname) - 1); 209 strncpy(sut.release, 210 IBCS2_UNAME_RELEASE, sizeof(sut.release) - 1); 211 strncpy(sut.version, 212 IBCS2_UNAME_VERSION, sizeof(sut.version) - 1); 213 getcredhostname(td->td_ucred, machine_name, 214 sizeof(machine_name) - 1); 215 p = index(machine_name, '.'); 216 if ( p ) 217 *p = '\0'; 218 strncpy(sut.nodename, machine_name, sizeof(sut.nodename) - 1); 219 strncpy(sut.machine, machine, sizeof(sut.machine) - 1); 220 221 DPRINTF(("IBCS2 uname: sys=%s rel=%s ver=%s node=%s mach=%s\n", 222 sut.sysname, sut.release, sut.version, sut.nodename, 223 sut.machine)); 224 return copyout((caddr_t)&sut, (caddr_t)uap->a1, 225 ibcs2_utsname_len); 226 } 227 228 case 2: /* ustat(2) */ 229 { 230 return ENOSYS; /* XXX - TODO */ 231 } 232 233 default: 234 return ENOSYS; 235 } 236} 237