summaryrefslogtreecommitdiff
path: root/usr/src/lib/libproc/common/pr_rename.c
diff options
context:
space:
mode:
authorRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-07-07 17:36:17 -0700
committerRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-07-07 17:36:17 -0700
commit794f0adb050e571bbfde4d2a19b9f88b852079dd (patch)
treec1735b3eda175e9096f5b062a73614e73aa5cd9a /usr/src/lib/libproc/common/pr_rename.c
parent07925104db56e5c3eacc4865b918bd16af5cec59 (diff)
downloadillumos-gate-794f0adb050e571bbfde4d2a19b9f88b852079dd.tar.gz
PSARC 2010/235 POSIX 1003.1-2008 *at(2) syscalls
6910251 need support for all POSIX.1-2008 *at(2) syscalls 6964835 mknod(2) auditing omits the pathname for invalid arguments
Diffstat (limited to 'usr/src/lib/libproc/common/pr_rename.c')
-rw-r--r--usr/src/lib/libproc/common/pr_rename.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/usr/src/lib/libproc/common/pr_rename.c b/usr/src/lib/libproc/common/pr_rename.c
index 7696188111..fe0a2847a4 100644
--- a/usr/src/lib/libproc/common/pr_rename.c
+++ b/usr/src/lib/libproc/common/pr_rename.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <stdlib.h>
@@ -88,20 +87,34 @@ int
pr_link(struct ps_prochandle *Pr, const char *existing, const char *new)
{
sysret_t rval;
- argdes_t argd[2];
+ argdes_t argd[5];
argdes_t *adp;
int error;
if (Pr == NULL)
return (link(existing, new));
- adp = &argd[0]; /* existing argument */
+ adp = &argd[0]; /* first directory fd argument */
+ adp->arg_value = AT_FDCWD;
+ adp->arg_object = NULL;
+ adp->arg_type = AT_BYVAL;
+ adp->arg_inout = AI_INPUT;
+ adp->arg_size = 0;
+
+ adp++; /* existing argument */
adp->arg_value = 0;
adp->arg_object = (void *)existing;
adp->arg_type = AT_BYREF;
adp->arg_inout = AI_INPUT;
adp->arg_size = strlen(existing) + 1;
+ adp++; /* second directory fd argument */
+ adp->arg_value = AT_FDCWD;
+ adp->arg_object = NULL;
+ adp->arg_type = AT_BYVAL;
+ adp->arg_inout = AI_INPUT;
+ adp->arg_size = 0;
+
adp++; /* new argument */
adp->arg_value = 0;
adp->arg_object = (void *)new;
@@ -109,7 +122,14 @@ pr_link(struct ps_prochandle *Pr, const char *existing, const char *new)
adp->arg_inout = AI_INPUT;
adp->arg_size = strlen(new) + 1;
- error = Psyscall(Pr, &rval, SYS_link, 2, &argd[0]);
+ adp++; /* flag argument */
+ adp->arg_value = 0;
+ adp->arg_object = NULL;
+ adp->arg_type = AT_BYVAL;
+ adp->arg_inout = AI_INPUT;
+ adp->arg_size = 0;
+
+ error = Psyscall(Pr, &rval, SYS_linkat, 5, &argd[0]);
if (error) {
errno = (error > 0) ? error : ENOSYS;