diff options
Diffstat (limited to 'usr/src/lib/libproc/common/pr_open.c')
-rw-r--r-- | usr/src/lib/libproc/common/pr_open.c | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/usr/src/lib/libproc/common/pr_open.c b/usr/src/lib/libproc/common/pr_open.c index 5ea4ea1393..9c6d463c95 100644 --- a/usr/src/lib/libproc/common/pr_open.c +++ b/usr/src/lib/libproc/common/pr_open.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,13 +18,12 @@ * * CDDL HEADER END */ + /* - * Copyright (c) 1997-2001 by Sun Microsystems, Inc. - * All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdlib.h> #include <unistd.h> #include <string.h> @@ -39,15 +37,22 @@ int pr_open(struct ps_prochandle *Pr, const char *filename, int flags, mode_t mode) { - sysret_t rval; /* return value from open() */ - argdes_t argd[3]; /* arg descriptors for open() */ + sysret_t rval; /* return value from openat() */ + argdes_t argd[4]; /* arg descriptors for openat() */ argdes_t *adp; int error; if (Pr == NULL) /* no subject process */ return (open(filename, flags, mode)); - adp = &argd[0]; /* filename argument */ + adp = &argd[0]; /* AT_FDCWD 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++; /* filename argument */ adp->arg_value = 0; adp->arg_object = (void *)filename; adp->arg_type = AT_BYREF; @@ -68,7 +73,7 @@ pr_open(struct ps_prochandle *Pr, const char *filename, int flags, mode_t mode) adp->arg_inout = AI_INPUT; adp->arg_size = 0; - error = Psyscall(Pr, &rval, SYS_open, 3, &argd[0]); + error = Psyscall(Pr, &rval, SYS_openat, 4, &argd[0]); if (error) { errno = (error > 0)? error : ENOSYS; @@ -83,21 +88,35 @@ pr_open(struct ps_prochandle *Pr, const char *filename, int flags, mode_t mode) int pr_creat(struct ps_prochandle *Pr, const char *filename, mode_t mode) { - sysret_t rval; /* return value from creat() */ - argdes_t argd[2]; /* arg descriptors for creat() */ + sysret_t rval; /* return value from openat() */ + argdes_t argd[4]; /* arg descriptors for openat() */ argdes_t *adp; int error; if (Pr == NULL) /* no subject process */ return (creat(filename, mode)); - adp = &argd[0]; /* filename argument */ + adp = &argd[0]; /* AT_FDCWD 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++; /* filename argument */ adp->arg_value = 0; adp->arg_object = (void *)filename; adp->arg_type = AT_BYREF; adp->arg_inout = AI_INPUT; adp->arg_size = strlen(filename)+1; + adp++; /* flags argument */ + adp->arg_value = (O_WRONLY | O_CREAT | O_TRUNC); + adp->arg_object = NULL; + adp->arg_type = AT_BYVAL; + adp->arg_inout = AI_INPUT; + adp->arg_size = 0; + adp++; /* mode argument */ adp->arg_value = (long)mode; adp->arg_object = NULL; @@ -105,7 +124,7 @@ pr_creat(struct ps_prochandle *Pr, const char *filename, mode_t mode) adp->arg_inout = AI_INPUT; adp->arg_size = 0; - error = Psyscall(Pr, &rval, SYS_creat, 2, &argd[0]); + error = Psyscall(Pr, &rval, SYS_openat, 4, &argd[0]); if (error) { errno = (error > 0)? error : ENOSYS; @@ -151,14 +170,21 @@ int pr_access(struct ps_prochandle *Pr, const char *path, int amode) { sysret_t rval; /* return from access() */ - argdes_t argd[2]; /* arg descriptors for access() */ + argdes_t argd[4]; /* arg descriptors for access() */ argdes_t *adp; int err; if (Pr == NULL) /* no subject process */ return (access(path, amode)); - adp = &argd[0]; /* path argument */ + adp = &argd[0]; /* 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++; /* path argument */ adp->arg_value = 0; adp->arg_object = (void *)path; adp->arg_type = AT_BYREF; @@ -172,7 +198,14 @@ pr_access(struct ps_prochandle *Pr, const char *path, int amode) adp->arg_inout = AI_INPUT; adp->arg_size = 0; - err = Psyscall(Pr, &rval, SYS_access, 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; + + err = Psyscall(Pr, &rval, SYS_faccessat, 4, &argd[0]); if (err) { errno = (err > 0) ? err : ENOSYS; |