1*8fd04b83SRoger A. Faulkner /* 2*8fd04b83SRoger A. Faulkner * CDDL HEADER START 3*8fd04b83SRoger A. Faulkner * 4*8fd04b83SRoger A. Faulkner * The contents of this file are subject to the terms of the 5*8fd04b83SRoger A. Faulkner * Common Development and Distribution License (the "License"). 6*8fd04b83SRoger A. Faulkner * You may not use this file except in compliance with the License. 7*8fd04b83SRoger A. Faulkner * 8*8fd04b83SRoger A. Faulkner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*8fd04b83SRoger A. Faulkner * or http://www.opensolaris.org/os/licensing. 10*8fd04b83SRoger A. Faulkner * See the License for the specific language governing permissions 11*8fd04b83SRoger A. Faulkner * and limitations under the License. 12*8fd04b83SRoger A. Faulkner * 13*8fd04b83SRoger A. Faulkner * When distributing Covered Code, include this CDDL HEADER in each 14*8fd04b83SRoger A. Faulkner * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*8fd04b83SRoger A. Faulkner * If applicable, add the following below this CDDL HEADER, with the 16*8fd04b83SRoger A. Faulkner * fields enclosed by brackets "[]" replaced with your own identifying 17*8fd04b83SRoger A. Faulkner * information: Portions Copyright [yyyy] [name of copyright owner] 18*8fd04b83SRoger A. Faulkner * 19*8fd04b83SRoger A. Faulkner * CDDL HEADER END 20*8fd04b83SRoger A. Faulkner */ 21*8fd04b83SRoger A. Faulkner 22*8fd04b83SRoger A. Faulkner /* 23*8fd04b83SRoger A. Faulkner * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24*8fd04b83SRoger A. Faulkner * Use is subject to license terms. 25*8fd04b83SRoger A. Faulkner */ 26*8fd04b83SRoger A. Faulkner 27*8fd04b83SRoger A. Faulkner #include <stdio.h> 28*8fd04b83SRoger A. Faulkner #include <stdlib.h> 29*8fd04b83SRoger A. Faulkner #include <unistd.h> 30*8fd04b83SRoger A. Faulkner #include <fcntl.h> 31*8fd04b83SRoger A. Faulkner #include <utime.h> 32*8fd04b83SRoger A. Faulkner #include <errno.h> 33*8fd04b83SRoger A. Faulkner #include <sys/types.h> 34*8fd04b83SRoger A. Faulkner #include <sys/stat.h> 35*8fd04b83SRoger A. Faulkner #include <sys/siginfo.h> 36*8fd04b83SRoger A. Faulkner #include <sys/time.h> 37*8fd04b83SRoger A. Faulkner #include <sys/poll.h> 38*8fd04b83SRoger A. Faulkner #include <sys/wait.h> 39*8fd04b83SRoger A. Faulkner #include <sys/file.h> 40*8fd04b83SRoger A. Faulkner #include <sys/syscall.h> 41*8fd04b83SRoger A. Faulkner 42*8fd04b83SRoger A. Faulkner #include <s10_brand.h> 43*8fd04b83SRoger A. Faulkner #include <s10_misc.h> 44*8fd04b83SRoger A. Faulkner 45*8fd04b83SRoger A. Faulkner /* 46*8fd04b83SRoger A. Faulkner * This file contains the emulation functions for all of the 47*8fd04b83SRoger A. Faulkner * obsolete system call traps that existed in Solaris 10 but 48*8fd04b83SRoger A. Faulkner * that have been deleted in the current version of Solaris. 49*8fd04b83SRoger A. Faulkner */ 50*8fd04b83SRoger A. Faulkner 51*8fd04b83SRoger A. Faulkner static int 52*8fd04b83SRoger A. Faulkner s10_fstatat(sysret_t *rval, 53*8fd04b83SRoger A. Faulkner int fd, const char *path, struct stat *sb, int flags) 54*8fd04b83SRoger A. Faulkner { 55*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 56*8fd04b83SRoger A. Faulkner fd, path, sb, flags)); 57*8fd04b83SRoger A. Faulkner } 58*8fd04b83SRoger A. Faulkner 59*8fd04b83SRoger A. Faulkner int 60*8fd04b83SRoger A. Faulkner s10_stat(sysret_t *rval, const char *path, struct stat *sb) 61*8fd04b83SRoger A. Faulkner { 62*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 63*8fd04b83SRoger A. Faulkner AT_FDCWD, path, sb, 0)); 64*8fd04b83SRoger A. Faulkner } 65*8fd04b83SRoger A. Faulkner 66*8fd04b83SRoger A. Faulkner int 67*8fd04b83SRoger A. Faulkner s10_lstat(sysret_t *rval, const char *path, struct stat *sb) 68*8fd04b83SRoger A. Faulkner { 69*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 70*8fd04b83SRoger A. Faulkner AT_FDCWD, path, sb, AT_SYMLINK_NOFOLLOW)); 71*8fd04b83SRoger A. Faulkner } 72*8fd04b83SRoger A. Faulkner 73*8fd04b83SRoger A. Faulkner int 74*8fd04b83SRoger A. Faulkner s10_fstat(sysret_t *rval, int filedes, struct stat *sb) 75*8fd04b83SRoger A. Faulkner { 76*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 77*8fd04b83SRoger A. Faulkner filedes, NULL, sb, 0)); 78*8fd04b83SRoger A. Faulkner } 79*8fd04b83SRoger A. Faulkner 80*8fd04b83SRoger A. Faulkner #if !defined(_LP64) 81*8fd04b83SRoger A. Faulkner 82*8fd04b83SRoger A. Faulkner static int 83*8fd04b83SRoger A. Faulkner s10_fstatat64(sysret_t *rval, 84*8fd04b83SRoger A. Faulkner int fd, const char *path, struct stat64 *sb, int flags) 85*8fd04b83SRoger A. Faulkner { 86*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat64 + 1024, 87*8fd04b83SRoger A. Faulkner fd, path, sb, flags)); 88*8fd04b83SRoger A. Faulkner } 89*8fd04b83SRoger A. Faulkner 90*8fd04b83SRoger A. Faulkner int 91*8fd04b83SRoger A. Faulkner s10_stat64(sysret_t *rval, const char *path, struct stat64 *sb) 92*8fd04b83SRoger A. Faulkner { 93*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat64 + 1024, 94*8fd04b83SRoger A. Faulkner AT_FDCWD, path, sb, 0)); 95*8fd04b83SRoger A. Faulkner } 96*8fd04b83SRoger A. Faulkner 97*8fd04b83SRoger A. Faulkner int 98*8fd04b83SRoger A. Faulkner s10_lstat64(sysret_t *rval, const char *path, struct stat64 *sb) 99*8fd04b83SRoger A. Faulkner { 100*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat64 + 1024, 101*8fd04b83SRoger A. Faulkner AT_FDCWD, path, sb, AT_SYMLINK_NOFOLLOW)); 102*8fd04b83SRoger A. Faulkner } 103*8fd04b83SRoger A. Faulkner 104*8fd04b83SRoger A. Faulkner int 105*8fd04b83SRoger A. Faulkner s10_fstat64(sysret_t *rval, int filedes, struct stat64 *sb) 106*8fd04b83SRoger A. Faulkner { 107*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat64 + 1024, 108*8fd04b83SRoger A. Faulkner filedes, NULL, sb, 0)); 109*8fd04b83SRoger A. Faulkner } 110*8fd04b83SRoger A. Faulkner 111*8fd04b83SRoger A. Faulkner #endif /* !_LP64 */ 112*8fd04b83SRoger A. Faulkner 113*8fd04b83SRoger A. Faulkner static int 114*8fd04b83SRoger A. Faulkner s10_openat(sysret_t *rval, int fd, const char *path, int oflag, mode_t mode) 115*8fd04b83SRoger A. Faulkner { 116*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat + 1024, 117*8fd04b83SRoger A. Faulkner fd, path, oflag, mode)); 118*8fd04b83SRoger A. Faulkner } 119*8fd04b83SRoger A. Faulkner 120*8fd04b83SRoger A. Faulkner int 121*8fd04b83SRoger A. Faulkner s10_open(sysret_t *rval, char *path, int oflag, mode_t mode) 122*8fd04b83SRoger A. Faulkner { 123*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat + 1024, 124*8fd04b83SRoger A. Faulkner AT_FDCWD, path, oflag, mode)); 125*8fd04b83SRoger A. Faulkner } 126*8fd04b83SRoger A. Faulkner 127*8fd04b83SRoger A. Faulkner int 128*8fd04b83SRoger A. Faulkner s10_creat(sysret_t *rval, char *path, mode_t mode) 129*8fd04b83SRoger A. Faulkner { 130*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat + 1024, 131*8fd04b83SRoger A. Faulkner AT_FDCWD, path, O_WRONLY | O_CREAT | O_TRUNC, mode)); 132*8fd04b83SRoger A. Faulkner } 133*8fd04b83SRoger A. Faulkner 134*8fd04b83SRoger A. Faulkner #if !defined(_LP64) 135*8fd04b83SRoger A. Faulkner 136*8fd04b83SRoger A. Faulkner static int 137*8fd04b83SRoger A. Faulkner s10_openat64(sysret_t *rval, int fd, const char *path, int oflag, mode_t mode) 138*8fd04b83SRoger A. Faulkner { 139*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat64 + 1024, 140*8fd04b83SRoger A. Faulkner fd, path, oflag, mode)); 141*8fd04b83SRoger A. Faulkner } 142*8fd04b83SRoger A. Faulkner 143*8fd04b83SRoger A. Faulkner int 144*8fd04b83SRoger A. Faulkner s10_open64(sysret_t *rval, char *path, int oflag, mode_t mode) 145*8fd04b83SRoger A. Faulkner { 146*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat64 + 1024, 147*8fd04b83SRoger A. Faulkner AT_FDCWD, path, oflag, mode)); 148*8fd04b83SRoger A. Faulkner } 149*8fd04b83SRoger A. Faulkner 150*8fd04b83SRoger A. Faulkner int 151*8fd04b83SRoger A. Faulkner s10_creat64(sysret_t *rval, char *path, mode_t mode) 152*8fd04b83SRoger A. Faulkner { 153*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_openat64 + 1024, 154*8fd04b83SRoger A. Faulkner AT_FDCWD, path, O_WRONLY | O_CREAT | O_TRUNC, mode)); 155*8fd04b83SRoger A. Faulkner } 156*8fd04b83SRoger A. Faulkner 157*8fd04b83SRoger A. Faulkner #endif /* !_LP64 */ 158*8fd04b83SRoger A. Faulkner 159*8fd04b83SRoger A. Faulkner int 160*8fd04b83SRoger A. Faulkner s10_fork1(sysret_t *rval) 161*8fd04b83SRoger A. Faulkner { 162*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_forksys + 1024, 0, 0)); 163*8fd04b83SRoger A. Faulkner } 164*8fd04b83SRoger A. Faulkner 165*8fd04b83SRoger A. Faulkner int 166*8fd04b83SRoger A. Faulkner s10_forkall(sysret_t *rval) 167*8fd04b83SRoger A. Faulkner { 168*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_forksys + 1024, 1, 0)); 169*8fd04b83SRoger A. Faulkner } 170*8fd04b83SRoger A. Faulkner 171*8fd04b83SRoger A. Faulkner int 172*8fd04b83SRoger A. Faulkner s10_dup(sysret_t *rval, int fd) 173*8fd04b83SRoger A. Faulkner { 174*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fcntl + 1024, fd, F_DUPFD, 0)); 175*8fd04b83SRoger A. Faulkner } 176*8fd04b83SRoger A. Faulkner 177*8fd04b83SRoger A. Faulkner int 178*8fd04b83SRoger A. Faulkner s10_poll(sysret_t *rval, struct pollfd *fds, nfds_t nfd, int timeout) 179*8fd04b83SRoger A. Faulkner { 180*8fd04b83SRoger A. Faulkner timespec_t ts; 181*8fd04b83SRoger A. Faulkner timespec_t *tsp; 182*8fd04b83SRoger A. Faulkner 183*8fd04b83SRoger A. Faulkner if (timeout < 0) 184*8fd04b83SRoger A. Faulkner tsp = NULL; 185*8fd04b83SRoger A. Faulkner else { 186*8fd04b83SRoger A. Faulkner ts.tv_sec = timeout / MILLISEC; 187*8fd04b83SRoger A. Faulkner ts.tv_nsec = (timeout % MILLISEC) * MICROSEC; 188*8fd04b83SRoger A. Faulkner tsp = &ts; 189*8fd04b83SRoger A. Faulkner } 190*8fd04b83SRoger A. Faulkner 191*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_pollsys + 1024, 192*8fd04b83SRoger A. Faulkner fds, nfd, tsp, NULL)); 193*8fd04b83SRoger A. Faulkner } 194*8fd04b83SRoger A. Faulkner 195*8fd04b83SRoger A. Faulkner int 196*8fd04b83SRoger A. Faulkner s10_lwp_mutex_lock(sysret_t *rval, void *mp) 197*8fd04b83SRoger A. Faulkner { 198*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_lwp_mutex_timedlock + 1024, 199*8fd04b83SRoger A. Faulkner mp, NULL, 0)); 200*8fd04b83SRoger A. Faulkner } 201*8fd04b83SRoger A. Faulkner 202*8fd04b83SRoger A. Faulkner int 203*8fd04b83SRoger A. Faulkner s10_lwp_sema_wait(sysret_t *rval, void *sp) 204*8fd04b83SRoger A. Faulkner { 205*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_lwp_sema_timedwait + 1024, 206*8fd04b83SRoger A. Faulkner sp, NULL, 0)); 207*8fd04b83SRoger A. Faulkner } 208*8fd04b83SRoger A. Faulkner 209*8fd04b83SRoger A. Faulkner static int 210*8fd04b83SRoger A. Faulkner s10_fchownat(sysret_t *rval, 211*8fd04b83SRoger A. Faulkner int fd, const char *name, uid_t uid, gid_t gid, int flags) 212*8fd04b83SRoger A. Faulkner { 213*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fchownat + 1024, 214*8fd04b83SRoger A. Faulkner fd, name, uid, gid, flags)); 215*8fd04b83SRoger A. Faulkner } 216*8fd04b83SRoger A. Faulkner 217*8fd04b83SRoger A. Faulkner int 218*8fd04b83SRoger A. Faulkner s10_chown(sysret_t *rval, const char *name, uid_t uid, gid_t gid) 219*8fd04b83SRoger A. Faulkner { 220*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fchownat + 1024, 221*8fd04b83SRoger A. Faulkner AT_FDCWD, name, uid, gid, 0)); 222*8fd04b83SRoger A. Faulkner } 223*8fd04b83SRoger A. Faulkner 224*8fd04b83SRoger A. Faulkner int 225*8fd04b83SRoger A. Faulkner s10_lchown(sysret_t *rval, const char *name, uid_t uid, gid_t gid) 226*8fd04b83SRoger A. Faulkner { 227*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fchownat + 1024, 228*8fd04b83SRoger A. Faulkner AT_FDCWD, name, uid, gid, AT_SYMLINK_NOFOLLOW)); 229*8fd04b83SRoger A. Faulkner } 230*8fd04b83SRoger A. Faulkner 231*8fd04b83SRoger A. Faulkner int 232*8fd04b83SRoger A. Faulkner s10_fchown(sysret_t *rval, int filedes, uid_t uid, gid_t gid) 233*8fd04b83SRoger A. Faulkner { 234*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fchownat + 1024, 235*8fd04b83SRoger A. Faulkner filedes, NULL, uid, gid, 0)); 236*8fd04b83SRoger A. Faulkner } 237*8fd04b83SRoger A. Faulkner 238*8fd04b83SRoger A. Faulkner static int 239*8fd04b83SRoger A. Faulkner s10_unlinkat(sysret_t *rval, int fd, const char *name, int flags) 240*8fd04b83SRoger A. Faulkner { 241*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_unlinkat + 1024, 242*8fd04b83SRoger A. Faulkner fd, name, flags)); 243*8fd04b83SRoger A. Faulkner } 244*8fd04b83SRoger A. Faulkner 245*8fd04b83SRoger A. Faulkner int 246*8fd04b83SRoger A. Faulkner s10_unlink(sysret_t *rval, const char *name) 247*8fd04b83SRoger A. Faulkner { 248*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_unlinkat + 1024, 249*8fd04b83SRoger A. Faulkner AT_FDCWD, name, 0)); 250*8fd04b83SRoger A. Faulkner } 251*8fd04b83SRoger A. Faulkner 252*8fd04b83SRoger A. Faulkner int 253*8fd04b83SRoger A. Faulkner s10_rmdir(sysret_t *rval, const char *name) 254*8fd04b83SRoger A. Faulkner { 255*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_unlinkat + 1024, 256*8fd04b83SRoger A. Faulkner AT_FDCWD, name, AT_REMOVEDIR)); 257*8fd04b83SRoger A. Faulkner } 258*8fd04b83SRoger A. Faulkner 259*8fd04b83SRoger A. Faulkner static int 260*8fd04b83SRoger A. Faulkner s10_renameat(sysret_t *rval, 261*8fd04b83SRoger A. Faulkner int oldfd, const char *oldname, int newfd, const char *newname) 262*8fd04b83SRoger A. Faulkner { 263*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_renameat + 1024, 264*8fd04b83SRoger A. Faulkner oldfd, oldname, newfd, newname)); 265*8fd04b83SRoger A. Faulkner } 266*8fd04b83SRoger A. Faulkner 267*8fd04b83SRoger A. Faulkner int 268*8fd04b83SRoger A. Faulkner s10_rename(sysret_t *rval, const char *oldname, const char *newname) 269*8fd04b83SRoger A. Faulkner { 270*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_renameat + 1024, 271*8fd04b83SRoger A. Faulkner AT_FDCWD, oldname, AT_FDCWD, newname)); 272*8fd04b83SRoger A. Faulkner } 273*8fd04b83SRoger A. Faulkner 274*8fd04b83SRoger A. Faulkner static int 275*8fd04b83SRoger A. Faulkner s10_faccessat(sysret_t *rval, int fd, const char *fname, int amode, int flag) 276*8fd04b83SRoger A. Faulkner { 277*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_faccessat + 1024, 278*8fd04b83SRoger A. Faulkner fd, fname, amode, flag)); 279*8fd04b83SRoger A. Faulkner } 280*8fd04b83SRoger A. Faulkner 281*8fd04b83SRoger A. Faulkner int 282*8fd04b83SRoger A. Faulkner s10_access(sysret_t *rval, const char *fname, int amode) 283*8fd04b83SRoger A. Faulkner { 284*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_faccessat + 1024, 285*8fd04b83SRoger A. Faulkner AT_FDCWD, fname, amode, 0)); 286*8fd04b83SRoger A. Faulkner } 287*8fd04b83SRoger A. Faulkner 288*8fd04b83SRoger A. Faulkner int 289*8fd04b83SRoger A. Faulkner s10_utime(sysret_t *rval, const char *path, const struct utimbuf *times) 290*8fd04b83SRoger A. Faulkner { 291*8fd04b83SRoger A. Faulkner struct utimbuf ltimes; 292*8fd04b83SRoger A. Faulkner timespec_t ts[2]; 293*8fd04b83SRoger A. Faulkner timespec_t *tsp; 294*8fd04b83SRoger A. Faulkner 295*8fd04b83SRoger A. Faulkner if (times == NULL) { 296*8fd04b83SRoger A. Faulkner tsp = NULL; 297*8fd04b83SRoger A. Faulkner } else { 298*8fd04b83SRoger A. Faulkner if (s10_uucopy(times, <imes, sizeof (ltimes)) != 0) 299*8fd04b83SRoger A. Faulkner return (EFAULT); 300*8fd04b83SRoger A. Faulkner ts[0].tv_sec = ltimes.actime; 301*8fd04b83SRoger A. Faulkner ts[0].tv_nsec = 0; 302*8fd04b83SRoger A. Faulkner ts[1].tv_sec = ltimes.modtime; 303*8fd04b83SRoger A. Faulkner ts[1].tv_nsec = 0; 304*8fd04b83SRoger A. Faulkner tsp = ts; 305*8fd04b83SRoger A. Faulkner } 306*8fd04b83SRoger A. Faulkner 307*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_utimesys + 1024, 1, 308*8fd04b83SRoger A. Faulkner AT_FDCWD, path, tsp, 0)); 309*8fd04b83SRoger A. Faulkner } 310*8fd04b83SRoger A. Faulkner 311*8fd04b83SRoger A. Faulkner int 312*8fd04b83SRoger A. Faulkner s10_utimes(sysret_t *rval, const char *path, const struct timeval times[2]) 313*8fd04b83SRoger A. Faulkner { 314*8fd04b83SRoger A. Faulkner struct timeval ltimes[2]; 315*8fd04b83SRoger A. Faulkner timespec_t ts[2]; 316*8fd04b83SRoger A. Faulkner timespec_t *tsp; 317*8fd04b83SRoger A. Faulkner 318*8fd04b83SRoger A. Faulkner if (times == NULL) { 319*8fd04b83SRoger A. Faulkner tsp = NULL; 320*8fd04b83SRoger A. Faulkner } else { 321*8fd04b83SRoger A. Faulkner if (s10_uucopy(times, ltimes, sizeof (ltimes)) != 0) 322*8fd04b83SRoger A. Faulkner return (EFAULT); 323*8fd04b83SRoger A. Faulkner ts[0].tv_sec = ltimes[0].tv_sec; 324*8fd04b83SRoger A. Faulkner ts[0].tv_nsec = ltimes[0].tv_usec * 1000; 325*8fd04b83SRoger A. Faulkner ts[1].tv_sec = ltimes[1].tv_sec; 326*8fd04b83SRoger A. Faulkner ts[1].tv_nsec = ltimes[1].tv_usec * 1000; 327*8fd04b83SRoger A. Faulkner tsp = ts; 328*8fd04b83SRoger A. Faulkner } 329*8fd04b83SRoger A. Faulkner 330*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_utimesys + 1024, 1, 331*8fd04b83SRoger A. Faulkner AT_FDCWD, path, tsp, 0)); 332*8fd04b83SRoger A. Faulkner } 333*8fd04b83SRoger A. Faulkner 334*8fd04b83SRoger A. Faulkner static int 335*8fd04b83SRoger A. Faulkner s10_futimesat(sysret_t *rval, 336*8fd04b83SRoger A. Faulkner int fd, const char *path, const struct timeval times[2]) 337*8fd04b83SRoger A. Faulkner { 338*8fd04b83SRoger A. Faulkner struct timeval ltimes[2]; 339*8fd04b83SRoger A. Faulkner timespec_t ts[2]; 340*8fd04b83SRoger A. Faulkner timespec_t *tsp; 341*8fd04b83SRoger A. Faulkner 342*8fd04b83SRoger A. Faulkner if (times == NULL) { 343*8fd04b83SRoger A. Faulkner tsp = NULL; 344*8fd04b83SRoger A. Faulkner } else { 345*8fd04b83SRoger A. Faulkner if (s10_uucopy(times, ltimes, sizeof (ltimes)) != 0) 346*8fd04b83SRoger A. Faulkner return (EFAULT); 347*8fd04b83SRoger A. Faulkner ts[0].tv_sec = ltimes[0].tv_sec; 348*8fd04b83SRoger A. Faulkner ts[0].tv_nsec = ltimes[0].tv_usec * 1000; 349*8fd04b83SRoger A. Faulkner ts[1].tv_sec = ltimes[1].tv_sec; 350*8fd04b83SRoger A. Faulkner ts[1].tv_nsec = ltimes[1].tv_usec * 1000; 351*8fd04b83SRoger A. Faulkner tsp = ts; 352*8fd04b83SRoger A. Faulkner } 353*8fd04b83SRoger A. Faulkner 354*8fd04b83SRoger A. Faulkner if (path == NULL) 355*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_utimesys + 1024, 0, fd, tsp)); 356*8fd04b83SRoger A. Faulkner 357*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_utimesys + 1024, 1, fd, path, tsp, 0)); 358*8fd04b83SRoger A. Faulkner } 359*8fd04b83SRoger A. Faulkner 360*8fd04b83SRoger A. Faulkner #if defined(__x86) 361*8fd04b83SRoger A. Faulkner 362*8fd04b83SRoger A. Faulkner /* ARGSUSED */ 363*8fd04b83SRoger A. Faulkner int 364*8fd04b83SRoger A. Faulkner s10_xstat(sysret_t *rval, int version, const char *path, struct stat *statb) 365*8fd04b83SRoger A. Faulkner { 366*8fd04b83SRoger A. Faulkner #if defined(__amd64) 367*8fd04b83SRoger A. Faulkner return (EINVAL); 368*8fd04b83SRoger A. Faulkner #else 369*8fd04b83SRoger A. Faulkner if (version != _STAT_VER) 370*8fd04b83SRoger A. Faulkner return (EINVAL); 371*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 372*8fd04b83SRoger A. Faulkner AT_FDCWD, path, statb, 0)); 373*8fd04b83SRoger A. Faulkner #endif 374*8fd04b83SRoger A. Faulkner } 375*8fd04b83SRoger A. Faulkner 376*8fd04b83SRoger A. Faulkner /* ARGSUSED */ 377*8fd04b83SRoger A. Faulkner int 378*8fd04b83SRoger A. Faulkner s10_lxstat(sysret_t *rval, int version, const char *path, struct stat *statb) 379*8fd04b83SRoger A. Faulkner { 380*8fd04b83SRoger A. Faulkner #if defined(__amd64) 381*8fd04b83SRoger A. Faulkner return (EINVAL); 382*8fd04b83SRoger A. Faulkner #else 383*8fd04b83SRoger A. Faulkner if (version != _STAT_VER) 384*8fd04b83SRoger A. Faulkner return (EINVAL); 385*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 386*8fd04b83SRoger A. Faulkner AT_FDCWD, path, statb, AT_SYMLINK_NOFOLLOW)); 387*8fd04b83SRoger A. Faulkner #endif 388*8fd04b83SRoger A. Faulkner } 389*8fd04b83SRoger A. Faulkner 390*8fd04b83SRoger A. Faulkner /* ARGSUSED */ 391*8fd04b83SRoger A. Faulkner int 392*8fd04b83SRoger A. Faulkner s10_fxstat(sysret_t *rval, int version, int fd, struct stat *statb) 393*8fd04b83SRoger A. Faulkner { 394*8fd04b83SRoger A. Faulkner #if defined(__amd64) 395*8fd04b83SRoger A. Faulkner return (EINVAL); 396*8fd04b83SRoger A. Faulkner #else 397*8fd04b83SRoger A. Faulkner if (version != _STAT_VER) 398*8fd04b83SRoger A. Faulkner return (EINVAL); 399*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_fstatat + 1024, 400*8fd04b83SRoger A. Faulkner fd, NULL, statb, 0)); 401*8fd04b83SRoger A. Faulkner #endif 402*8fd04b83SRoger A. Faulkner } 403*8fd04b83SRoger A. Faulkner 404*8fd04b83SRoger A. Faulkner /* ARGSUSED */ 405*8fd04b83SRoger A. Faulkner int 406*8fd04b83SRoger A. Faulkner s10_xmknod(sysret_t *rval, int version, const char *path, 407*8fd04b83SRoger A. Faulkner mode_t mode, dev_t dev) 408*8fd04b83SRoger A. Faulkner { 409*8fd04b83SRoger A. Faulkner #if defined(__amd64) 410*8fd04b83SRoger A. Faulkner return (EINVAL); 411*8fd04b83SRoger A. Faulkner #else 412*8fd04b83SRoger A. Faulkner if (version != _MKNOD_VER) 413*8fd04b83SRoger A. Faulkner return (EINVAL); 414*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_mknod + 1024, path, mode, dev)); 415*8fd04b83SRoger A. Faulkner #endif 416*8fd04b83SRoger A. Faulkner } 417*8fd04b83SRoger A. Faulkner 418*8fd04b83SRoger A. Faulkner #endif /* __x86 */ 419*8fd04b83SRoger A. Faulkner 420*8fd04b83SRoger A. Faulkner /* 421*8fd04b83SRoger A. Faulkner * This is the fsat() system call trap in s10. 422*8fd04b83SRoger A. Faulkner * It has been removed in the current system. 423*8fd04b83SRoger A. Faulkner */ 424*8fd04b83SRoger A. Faulkner int 425*8fd04b83SRoger A. Faulkner s10_fsat(sysret_t *rval, 426*8fd04b83SRoger A. Faulkner int code, uintptr_t arg1, uintptr_t arg2, 427*8fd04b83SRoger A. Faulkner uintptr_t arg3, uintptr_t arg4, uintptr_t arg5) 428*8fd04b83SRoger A. Faulkner { 429*8fd04b83SRoger A. Faulkner switch (code) { 430*8fd04b83SRoger A. Faulkner case 0: /* openat */ 431*8fd04b83SRoger A. Faulkner return (s10_openat(rval, (int)arg1, 432*8fd04b83SRoger A. Faulkner (const char *)arg2, (int)arg3, (mode_t)arg4)); 433*8fd04b83SRoger A. Faulkner case 1: /* openat64 */ 434*8fd04b83SRoger A. Faulkner #if defined(_LP64) 435*8fd04b83SRoger A. Faulkner return (EINVAL); 436*8fd04b83SRoger A. Faulkner #else 437*8fd04b83SRoger A. Faulkner return (s10_openat64(rval, (int)arg1, 438*8fd04b83SRoger A. Faulkner (const char *)arg2, (int)arg3, (mode_t)arg4)); 439*8fd04b83SRoger A. Faulkner #endif 440*8fd04b83SRoger A. Faulkner case 2: /* fstatat64 */ 441*8fd04b83SRoger A. Faulkner #if defined(_LP64) 442*8fd04b83SRoger A. Faulkner return (EINVAL); 443*8fd04b83SRoger A. Faulkner #else 444*8fd04b83SRoger A. Faulkner return (s10_fstatat64(rval, (int)arg1, 445*8fd04b83SRoger A. Faulkner (const char *)arg2, (struct stat64 *)arg3, (int)arg4)); 446*8fd04b83SRoger A. Faulkner #endif 447*8fd04b83SRoger A. Faulkner case 3: /* fstatat */ 448*8fd04b83SRoger A. Faulkner return (s10_fstatat(rval, (int)arg1, 449*8fd04b83SRoger A. Faulkner (const char *)arg2, (struct stat *)arg3, (int)arg4)); 450*8fd04b83SRoger A. Faulkner case 4: /* fchownat */ 451*8fd04b83SRoger A. Faulkner return (s10_fchownat(rval, (int)arg1, (char *)arg2, 452*8fd04b83SRoger A. Faulkner (uid_t)arg3, (gid_t)arg4, (int)arg5)); 453*8fd04b83SRoger A. Faulkner case 5: /* unlinkat */ 454*8fd04b83SRoger A. Faulkner return (s10_unlinkat(rval, (int)arg1, (char *)arg2, 455*8fd04b83SRoger A. Faulkner (int)arg3)); 456*8fd04b83SRoger A. Faulkner case 6: /* futimesat */ 457*8fd04b83SRoger A. Faulkner return (s10_futimesat(rval, (int)arg1, 458*8fd04b83SRoger A. Faulkner (const char *)arg2, (const struct timeval *)arg3)); 459*8fd04b83SRoger A. Faulkner case 7: /* renameat */ 460*8fd04b83SRoger A. Faulkner return (s10_renameat(rval, (int)arg1, (char *)arg2, 461*8fd04b83SRoger A. Faulkner (int)arg3, (char *)arg4)); 462*8fd04b83SRoger A. Faulkner case 8: /* faccessat */ 463*8fd04b83SRoger A. Faulkner return (s10_faccessat(rval, (int)arg1, (char *)arg2, 464*8fd04b83SRoger A. Faulkner (int)arg3, (int)arg4)); 465*8fd04b83SRoger A. Faulkner case 9: /* openattrdirat */ 466*8fd04b83SRoger A. Faulkner return (s10_openat(rval, (int)arg1, 467*8fd04b83SRoger A. Faulkner (const char *)arg2, FXATTRDIROPEN, 0)); 468*8fd04b83SRoger A. Faulkner } 469*8fd04b83SRoger A. Faulkner return (EINVAL); 470*8fd04b83SRoger A. Faulkner } 471*8fd04b83SRoger A. Faulkner 472*8fd04b83SRoger A. Faulkner /* 473*8fd04b83SRoger A. Faulkner * Interposition upon SYS_umount 474*8fd04b83SRoger A. Faulkner */ 475*8fd04b83SRoger A. Faulkner int 476*8fd04b83SRoger A. Faulkner s10_umount(sysret_t *rval, const char *path) 477*8fd04b83SRoger A. Faulkner { 478*8fd04b83SRoger A. Faulkner return (__systemcall(rval, SYS_umount2 + 1024, path, 0)); 479*8fd04b83SRoger A. Faulkner } 480*8fd04b83SRoger A. Faulkner 481*8fd04b83SRoger A. Faulkner /* 482*8fd04b83SRoger A. Faulkner * Convert the siginfo_t code and status fields to an old style 483*8fd04b83SRoger A. Faulkner * wait status for s10_wait(), below. 484*8fd04b83SRoger A. Faulkner */ 485*8fd04b83SRoger A. Faulkner static int 486*8fd04b83SRoger A. Faulkner wstat(int code, int status) 487*8fd04b83SRoger A. Faulkner { 488*8fd04b83SRoger A. Faulkner int stat = (status & 0377); 489*8fd04b83SRoger A. Faulkner 490*8fd04b83SRoger A. Faulkner switch (code) { 491*8fd04b83SRoger A. Faulkner case CLD_EXITED: 492*8fd04b83SRoger A. Faulkner stat <<= 8; 493*8fd04b83SRoger A. Faulkner break; 494*8fd04b83SRoger A. Faulkner case CLD_DUMPED: 495*8fd04b83SRoger A. Faulkner stat |= WCOREFLG; 496*8fd04b83SRoger A. Faulkner break; 497*8fd04b83SRoger A. Faulkner case CLD_KILLED: 498*8fd04b83SRoger A. Faulkner break; 499*8fd04b83SRoger A. Faulkner case CLD_TRAPPED: 500*8fd04b83SRoger A. Faulkner case CLD_STOPPED: 501*8fd04b83SRoger A. Faulkner stat <<= 8; 502*8fd04b83SRoger A. Faulkner stat |= WSTOPFLG; 503*8fd04b83SRoger A. Faulkner break; 504*8fd04b83SRoger A. Faulkner case CLD_CONTINUED: 505*8fd04b83SRoger A. Faulkner stat = WCONTFLG; 506*8fd04b83SRoger A. Faulkner break; 507*8fd04b83SRoger A. Faulkner } 508*8fd04b83SRoger A. Faulkner return (stat); 509*8fd04b83SRoger A. Faulkner } 510*8fd04b83SRoger A. Faulkner 511*8fd04b83SRoger A. Faulkner /* 512*8fd04b83SRoger A. Faulkner * Interposition upon SYS_wait 513*8fd04b83SRoger A. Faulkner */ 514*8fd04b83SRoger A. Faulkner int 515*8fd04b83SRoger A. Faulkner s10_wait(sysret_t *rval) 516*8fd04b83SRoger A. Faulkner { 517*8fd04b83SRoger A. Faulkner int err; 518*8fd04b83SRoger A. Faulkner siginfo_t info; 519*8fd04b83SRoger A. Faulkner 520*8fd04b83SRoger A. Faulkner err = __systemcall(rval, SYS_waitid + 1024, 521*8fd04b83SRoger A. Faulkner P_ALL, 0, &info, WEXITED | WTRAPPED); 522*8fd04b83SRoger A. Faulkner if (err != 0) 523*8fd04b83SRoger A. Faulkner return (err); 524*8fd04b83SRoger A. Faulkner 525*8fd04b83SRoger A. Faulkner rval->sys_rval1 = info.si_pid; 526*8fd04b83SRoger A. Faulkner rval->sys_rval2 = wstat(info.si_code, info.si_status); 527*8fd04b83SRoger A. Faulkner 528*8fd04b83SRoger A. Faulkner return (0); 529*8fd04b83SRoger A. Faulkner } 530