10Sstevel@tonic-gate /*
20Sstevel@tonic-gate * CDDL HEADER START
30Sstevel@tonic-gate *
40Sstevel@tonic-gate * The contents of this file are subject to the terms of the
511798SRoger.Faulkner@Sun.COM * Common Development and Distribution License (the "License").
611798SRoger.Faulkner@Sun.COM * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate *
80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate * See the License for the specific language governing permissions
110Sstevel@tonic-gate * and limitations under the License.
120Sstevel@tonic-gate *
130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate *
190Sstevel@tonic-gate * CDDL HEADER END
200Sstevel@tonic-gate */
2111798SRoger.Faulkner@Sun.COM
220Sstevel@tonic-gate /*
23*12789SRoger.Faulkner@Oracle.COM * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
240Sstevel@tonic-gate */
250Sstevel@tonic-gate
260Sstevel@tonic-gate #include <stdlib.h>
270Sstevel@tonic-gate #include <unistd.h>
280Sstevel@tonic-gate #include <string.h>
290Sstevel@tonic-gate #include <errno.h>
300Sstevel@tonic-gate #include "libproc.h"
310Sstevel@tonic-gate
320Sstevel@tonic-gate /*
330Sstevel@tonic-gate * rename() system call -- executed by subject process.
340Sstevel@tonic-gate */
350Sstevel@tonic-gate int
pr_rename(struct ps_prochandle * Pr,const char * old,const char * new)360Sstevel@tonic-gate pr_rename(struct ps_prochandle *Pr, const char *old, const char *new)
370Sstevel@tonic-gate {
380Sstevel@tonic-gate sysret_t rval;
3911798SRoger.Faulkner@Sun.COM argdes_t argd[4];
400Sstevel@tonic-gate argdes_t *adp;
410Sstevel@tonic-gate int error;
420Sstevel@tonic-gate
430Sstevel@tonic-gate if (Pr == NULL)
440Sstevel@tonic-gate return (rename(old, new));
450Sstevel@tonic-gate
4611798SRoger.Faulkner@Sun.COM adp = &argd[0]; /* old fd argument */
4711798SRoger.Faulkner@Sun.COM adp->arg_value = AT_FDCWD;
4811798SRoger.Faulkner@Sun.COM adp->arg_object = NULL;
4911798SRoger.Faulkner@Sun.COM adp->arg_type = AT_BYVAL;
5011798SRoger.Faulkner@Sun.COM adp->arg_inout = AI_INPUT;
5111798SRoger.Faulkner@Sun.COM adp->arg_size = 0;
5211798SRoger.Faulkner@Sun.COM
5311798SRoger.Faulkner@Sun.COM adp++; /* move to old argument */
540Sstevel@tonic-gate adp->arg_value = 0;
550Sstevel@tonic-gate adp->arg_object = (void *)old;
560Sstevel@tonic-gate adp->arg_type = AT_BYREF;
570Sstevel@tonic-gate adp->arg_inout = AI_INPUT;
580Sstevel@tonic-gate adp->arg_size = strlen(old) + 1;
590Sstevel@tonic-gate
6011798SRoger.Faulkner@Sun.COM adp++; /* move to new fd argument */
6111798SRoger.Faulkner@Sun.COM adp->arg_value = AT_FDCWD;
6211798SRoger.Faulkner@Sun.COM adp->arg_object = NULL;
6311798SRoger.Faulkner@Sun.COM adp->arg_type = AT_BYVAL;
6411798SRoger.Faulkner@Sun.COM adp->arg_inout = AI_INPUT;
6511798SRoger.Faulkner@Sun.COM adp->arg_size = 0;
6611798SRoger.Faulkner@Sun.COM
6711798SRoger.Faulkner@Sun.COM adp++; /* move to new argument */
680Sstevel@tonic-gate adp->arg_value = 0;
690Sstevel@tonic-gate adp->arg_object = (void *)new;
700Sstevel@tonic-gate adp->arg_type = AT_BYREF;
710Sstevel@tonic-gate adp->arg_inout = AI_INPUT;
720Sstevel@tonic-gate adp->arg_size = strlen(new) + 1;
730Sstevel@tonic-gate
7411798SRoger.Faulkner@Sun.COM error = Psyscall(Pr, &rval, SYS_renameat, 4, &argd[0]);
750Sstevel@tonic-gate
760Sstevel@tonic-gate if (error) {
770Sstevel@tonic-gate errno = (error > 0) ? error : ENOSYS;
780Sstevel@tonic-gate return (-1);
790Sstevel@tonic-gate }
800Sstevel@tonic-gate return (rval.sys_rval1);
810Sstevel@tonic-gate }
820Sstevel@tonic-gate
830Sstevel@tonic-gate /*
840Sstevel@tonic-gate * link() system call -- executed by subject process.
850Sstevel@tonic-gate */
860Sstevel@tonic-gate int
pr_link(struct ps_prochandle * Pr,const char * existing,const char * new)870Sstevel@tonic-gate pr_link(struct ps_prochandle *Pr, const char *existing, const char *new)
880Sstevel@tonic-gate {
890Sstevel@tonic-gate sysret_t rval;
90*12789SRoger.Faulkner@Oracle.COM argdes_t argd[5];
910Sstevel@tonic-gate argdes_t *adp;
920Sstevel@tonic-gate int error;
930Sstevel@tonic-gate
940Sstevel@tonic-gate if (Pr == NULL)
950Sstevel@tonic-gate return (link(existing, new));
960Sstevel@tonic-gate
97*12789SRoger.Faulkner@Oracle.COM adp = &argd[0]; /* first directory fd argument */
98*12789SRoger.Faulkner@Oracle.COM adp->arg_value = AT_FDCWD;
99*12789SRoger.Faulkner@Oracle.COM adp->arg_object = NULL;
100*12789SRoger.Faulkner@Oracle.COM adp->arg_type = AT_BYVAL;
101*12789SRoger.Faulkner@Oracle.COM adp->arg_inout = AI_INPUT;
102*12789SRoger.Faulkner@Oracle.COM adp->arg_size = 0;
103*12789SRoger.Faulkner@Oracle.COM
104*12789SRoger.Faulkner@Oracle.COM adp++; /* existing argument */
1050Sstevel@tonic-gate adp->arg_value = 0;
1060Sstevel@tonic-gate adp->arg_object = (void *)existing;
1070Sstevel@tonic-gate adp->arg_type = AT_BYREF;
1080Sstevel@tonic-gate adp->arg_inout = AI_INPUT;
1090Sstevel@tonic-gate adp->arg_size = strlen(existing) + 1;
1100Sstevel@tonic-gate
111*12789SRoger.Faulkner@Oracle.COM adp++; /* second directory fd argument */
112*12789SRoger.Faulkner@Oracle.COM adp->arg_value = AT_FDCWD;
113*12789SRoger.Faulkner@Oracle.COM adp->arg_object = NULL;
114*12789SRoger.Faulkner@Oracle.COM adp->arg_type = AT_BYVAL;
115*12789SRoger.Faulkner@Oracle.COM adp->arg_inout = AI_INPUT;
116*12789SRoger.Faulkner@Oracle.COM adp->arg_size = 0;
117*12789SRoger.Faulkner@Oracle.COM
1180Sstevel@tonic-gate adp++; /* new argument */
1190Sstevel@tonic-gate adp->arg_value = 0;
1200Sstevel@tonic-gate adp->arg_object = (void *)new;
1210Sstevel@tonic-gate adp->arg_type = AT_BYREF;
1220Sstevel@tonic-gate adp->arg_inout = AI_INPUT;
1230Sstevel@tonic-gate adp->arg_size = strlen(new) + 1;
1240Sstevel@tonic-gate
125*12789SRoger.Faulkner@Oracle.COM adp++; /* flag argument */
126*12789SRoger.Faulkner@Oracle.COM adp->arg_value = 0;
127*12789SRoger.Faulkner@Oracle.COM adp->arg_object = NULL;
128*12789SRoger.Faulkner@Oracle.COM adp->arg_type = AT_BYVAL;
129*12789SRoger.Faulkner@Oracle.COM adp->arg_inout = AI_INPUT;
130*12789SRoger.Faulkner@Oracle.COM adp->arg_size = 0;
131*12789SRoger.Faulkner@Oracle.COM
132*12789SRoger.Faulkner@Oracle.COM error = Psyscall(Pr, &rval, SYS_linkat, 5, &argd[0]);
1330Sstevel@tonic-gate
1340Sstevel@tonic-gate if (error) {
1350Sstevel@tonic-gate errno = (error > 0) ? error : ENOSYS;
1360Sstevel@tonic-gate return (-1);
1370Sstevel@tonic-gate }
1380Sstevel@tonic-gate return (rval.sys_rval1);
1390Sstevel@tonic-gate }
1400Sstevel@tonic-gate
1410Sstevel@tonic-gate /*
1420Sstevel@tonic-gate * unlink() system call -- executed by subject process.
1430Sstevel@tonic-gate */
1440Sstevel@tonic-gate int
pr_unlink(struct ps_prochandle * Pr,const char * path)1450Sstevel@tonic-gate pr_unlink(struct ps_prochandle *Pr, const char *path)
1460Sstevel@tonic-gate {
1470Sstevel@tonic-gate sysret_t rval;
14811798SRoger.Faulkner@Sun.COM argdes_t argd[3];
1490Sstevel@tonic-gate argdes_t *adp;
1500Sstevel@tonic-gate int error;
1510Sstevel@tonic-gate
1520Sstevel@tonic-gate if (Pr == NULL)
1530Sstevel@tonic-gate return (unlink(path));
1540Sstevel@tonic-gate
15511798SRoger.Faulkner@Sun.COM adp = &argd[0]; /* directory fd argument */
15611798SRoger.Faulkner@Sun.COM adp->arg_value = AT_FDCWD;
15711798SRoger.Faulkner@Sun.COM adp->arg_object = NULL;
15811798SRoger.Faulkner@Sun.COM adp->arg_type = AT_BYVAL;
15911798SRoger.Faulkner@Sun.COM adp->arg_inout = AI_INPUT;
16011798SRoger.Faulkner@Sun.COM adp->arg_size = 0;
16111798SRoger.Faulkner@Sun.COM adp++; /* move to path argument */
16211798SRoger.Faulkner@Sun.COM
1630Sstevel@tonic-gate adp->arg_value = 0;
1640Sstevel@tonic-gate adp->arg_object = (void *)path;
1650Sstevel@tonic-gate adp->arg_type = AT_BYREF;
1660Sstevel@tonic-gate adp->arg_inout = AI_INPUT;
1670Sstevel@tonic-gate adp->arg_size = strlen(path) + 1;
16811798SRoger.Faulkner@Sun.COM adp++; /* move to flags argument */
1690Sstevel@tonic-gate
17011798SRoger.Faulkner@Sun.COM adp->arg_value = 0;
17111798SRoger.Faulkner@Sun.COM adp->arg_object = NULL;
17211798SRoger.Faulkner@Sun.COM adp->arg_type = AT_BYVAL;
17311798SRoger.Faulkner@Sun.COM adp->arg_inout = AI_INPUT;
17411798SRoger.Faulkner@Sun.COM adp->arg_size = 0;
17511798SRoger.Faulkner@Sun.COM
17611798SRoger.Faulkner@Sun.COM error = Psyscall(Pr, &rval, SYS_unlinkat, 3, &argd[0]);
1770Sstevel@tonic-gate
1780Sstevel@tonic-gate if (error) {
1790Sstevel@tonic-gate errno = (error > 0) ? error : ENOSYS;
1800Sstevel@tonic-gate return (-1);
1810Sstevel@tonic-gate }
1820Sstevel@tonic-gate return (rval.sys_rval1);
1830Sstevel@tonic-gate }
184