setpenv 子例程

用途

设置当前流程环境。

安全性库 (libc.a)

语法

#include < usersec.h >

int setpenv ( 用户 方式 环境,  命令) char *用户; int Mode; char **Environment; char *命令;

描述

setpenv 子例程首先根据其参数值设置当前进程的环境,然后设置工作目录并运行指定的命令。 如果指定了 User 参数,那么会将进程环境设置为指定用户的进程环境,设置用户的工作目录,并运行指定的命令。 如果未指定 User 参数,那么环境和工作目录将设置为当前进程的环境和工作目录,并从此进程运行命令。 环境由用户状态和系统状态环境变量组成。

注: setpenv 子例程要求 setpcred 子例程在它之前。

setpenv 子例程执行以下步骤:

描述
设置流程环境 第一步涉及更改用户状态和系统状态环境。 由于这取决于 ModeEnvironment 参数的值,请参阅 Mode 参数的描述以获取更多信息。
设置进程当前工作目录                         设置用户状态和系统状态环境后,可以设置进程的工作目录。 如果 Mode 参数包含 PENV_INIT 值, 当前工作目录将更改为用户的初始登录目录 (在 /etc/passwd 文件中定义)。 否则,当前工作目录保持不变。
执行初始程序 进程的工作目录复位后,执行初始程序 (通常是 shell 解释器)。 如果 Command 参数为空,那么将使用用户数据库中的 shell。 如果未定义该参数,那么将使用用户状态环境中的 shell ,并且 Command 参数缺省为 /usr/bin/sh 文件。 如果 Command 参数不为空,那么它指定要执行的命令。 如果 Mode 参数包含 PENV_ARGV 值, 假定 Command 参数在 argv 结构中,并传递给 execve 子例程。 包含在 Command 参数中的字符串用作 execve 子例程的 Path 参数。 如果 Mode 参数不包含 PENV_ARGV 值,那么会将 Command 参数解析为 argv 结构并执行。 如果 Command 参数包含 $SHELL 值,那么将在执行之前执行替换。
注: 如果 Command 参数包含 $SHELL 值,但用户状态环境不包含 SHELL 值,那么此步骤将失败。

参数

命令
指定要执行的命令。 如果 Mode 参数包含 PENV_ARGV 值, 那么假定 Command 参数是 execv 子例程的有效自变量向量。
环境
getpenv 子例程返回的相同格式指定用户状态和系统状态环境变量的值。 用户状态变量以关键字 USRENVIRON:作为前缀,系统状态变量以关键字 SYSENVIRON:作为前缀。 每个变量都由格式为 var=value的字符串定义,该字符串是以 null 结束的字符指针的数组。
方式
指定 setpenv 子例程如何设置环境并运行命令。 此参数是位掩码,必须仅包含下列其中一个值,这些值在 usersec.h 文件中定义:
PENV_INIT
按如下所示初始化用户状态环境:
授权状态
从当前环境保留。 如果 AUTHSTATE 值不存在,那么缺省为 compat 值。
KRB5CCNAME
从当前环境保留。 如果通过 Distributed Computing Environment (DCE) 进行认证,那么将定义此值。
USER
设置为 User 参数指定的名称或与当前实际用户标识对应的名称。 名称将缩短为最大 PW_USERNAME_LEN,包括尾部 NUL 字符。 PW_USERNAME_LEN 是正在运行的系统的最大值。 PW_USERNAME_LEN 的值最多可以为 MAXIMPL_LOGIN_NAME_MAX (或 256 个字符) ,并且必须至少为 9 个字符。
登录
设置为 User 参数指定的名称或与当前实际用户标识对应的名称。 如果由 User 参数设置,那么此值是完整登录名,其中可能包含 DCE 单元名称。
logname
设置为当前系统环境变量 LOGNAME
TERM
从当前环境保留。 如果 TERM 值不存在,那么缺省为 IBM6155
SHELL
从为当前进程的实际用户标识定义的初始程序设置。 如果未定义任何程序,那么将使用 /usr/bin/sh shell 作为缺省值。
HOME
从为当前进程的实际用户标识定义的主目录设置。 如果未定义主目录,那么缺省值为 /home/guest
路径
最初设置为 /etc/environment 文件中 PATH 值的值。 如果未设置,那么会以破坏性方式将其替换为缺省值 PATH=/usr/bin:$HOME:. (最后一个句点指定工作目录)。 如果//环境 文件中存在 路径 值,那么 路径 变量将以破坏性方式替换为 /etc/security/environ 文件中此用户的 乌斯伦夫 属性。

对于其他环境变量,将读取以下文件:

/etc/environment
此文件中定义的变量将添加到环境中。
/etc/security/environ
在此文件中为用户定义的环境变量将添加到用户状态环境中。

Environment 参数中的用户状态变量将添加到用户状态环境。 这些前面是 USRENVIRON: 关键字。

系统状态环境初始化如下:

logname
设置为受保护用户环境中的当前 LOGNAME 值。 login (tsm) 命令将此值传递到 setpenv 子例程以确保正确性。
名称
设置为与实际用户标识对应的登录名。
TTY
设置为与标准输入对应的 TTY 名称。

对于其他环境变量,将读取以下文件:

/etc/security/environ
在此文件中为用户定义的系统状态环境变量将添加到环境中。 Environment 参数中的系统状态变量将添加到环境中。 这些前面有 SYSENVIRON 关键字。
 
PENV_DELTA
将保留现有用户状态和系统状态环境变量,并添加 Environment 参数中定义的变量。
PENV_RESET
将清除现有环境,并将其完全替换为 Environment 参数的内容。
PENV_KLEEN
在执行命令之前,关闭所有打开的文件描述符 (0 , 1 和 2 除外)。 此值必须在逻辑上与 PENV_DELTAPENV_RESETPENV_INIT配合使用。 不能单独使用。
PENV_NOPROF
新 shell 将不会被视为登录 shell 程序。 仅当与 PENV_INIT 标志一起使用时才有效。
 

对于系统状态和用户状态环境,将执行变量替换。

Mode 参数还可以包含:

描述
PENV_ARGV 指定 Command 参数已采用 argv 格式,无需解析。 此值必须在逻辑上与 PENV_DELTAPENV_RESETPENV_INIT配合使用。 不能单独使用。
描述
用户 指定要设置其环境和工作目录并运行指定命令的用户名。 如果给定了空指针,那么将使用当前实际 uid 来确定用户的名称。

返回值

如果已成功建立环境,那么此函数不会返回。 如果setpenv子程序失败,则返回值为-1,并设置errno全局变量来指示错误。

错误代码

如果下列其中一个或多个为 true ,那么 setpenv 子例程将失败:

描述
EINVAL Mode 参数包含除 PENV_INITPENV_DELTAPENV_RESETPENV_ARGV以外的值。
EINVAL Mode 参数包含多个 PENV_INITPENV_DELTAPENV_RESET 值。
EINVAL Environment 参数既不为 null 也不为空,并且不包含有效的环境字符串。
描述
EPERM 调用者对为系统定义的环境没有读访问权,或者用户无权更改指定的属性。

其他错误可由 setpenv 子例程调用的子例程设置。