diff options
author | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-07-07 17:36:17 -0700 |
---|---|---|
committer | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-07-07 17:36:17 -0700 |
commit | 794f0adb050e571bbfde4d2a19b9f88b852079dd (patch) | |
tree | c1735b3eda175e9096f5b062a73614e73aa5cd9a /usr/src/lib/libproc/common/pr_rename.c | |
parent | 07925104db56e5c3eacc4865b918bd16af5cec59 (diff) | |
download | illumos-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.c | 30 |
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; |