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, &ltimes, 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