runit/chpst: "change process state" utility
It's "nice" on steroids - can set uid/gid, mem/cpu limits etc. +3.5k
This commit is contained in:
@@ -42,15 +42,9 @@
|
||||
#define DEFAULT_LOGIN_PATH "/bin:/usr/bin"
|
||||
#define DEFAULT_ROOT_LOGIN_PATH "/usr/sbin:/bin:/usr/bin:/sbin"
|
||||
|
||||
static void xsetenv ( const char *key, const char *value )
|
||||
void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw)
|
||||
{
|
||||
if ( setenv ( key, value, 1 ))
|
||||
bb_error_msg_and_die (bb_msg_memory_exhausted);
|
||||
}
|
||||
|
||||
void setup_environment ( const char *shell, int loginshell, int changeenv, const struct passwd *pw )
|
||||
{
|
||||
if ( loginshell ) {
|
||||
if (loginshell) {
|
||||
const char *term;
|
||||
|
||||
/* Change the current working directory to be the home directory
|
||||
@@ -59,32 +53,31 @@ void setup_environment ( const char *shell, int loginshell, int changeenv, const
|
||||
* directory.
|
||||
* Some systems default to HOME=/
|
||||
*/
|
||||
if ( chdir ( pw-> pw_dir )) {
|
||||
xchdir ( "/" );
|
||||
fputs ( "warning: cannot change to home directory\n", stderr );
|
||||
if (chdir(pw->pw_dir)) {
|
||||
xchdir("/");
|
||||
fputs("warning: cannot change to home directory\n", stderr);
|
||||
}
|
||||
|
||||
/* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH.
|
||||
Unset all other environment variables. */
|
||||
term = getenv ("TERM");
|
||||
clearenv ( );
|
||||
if ( term )
|
||||
xsetenv ( "TERM", term );
|
||||
xsetenv ( "HOME", pw-> pw_dir );
|
||||
xsetenv ( "SHELL", shell );
|
||||
xsetenv ( "USER", pw-> pw_name );
|
||||
xsetenv ( "LOGNAME", pw-> pw_name );
|
||||
xsetenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ));
|
||||
term = getenv("TERM");
|
||||
clearenv();
|
||||
if (term)
|
||||
xsetenv("TERM", term);
|
||||
xsetenv("HOME", pw->pw_dir);
|
||||
xsetenv("SHELL", shell);
|
||||
xsetenv("USER", pw->pw_name);
|
||||
xsetenv("LOGNAME", pw->pw_name);
|
||||
xsetenv("PATH", (pw->pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH));
|
||||
}
|
||||
else if ( changeenv ) {
|
||||
else if (changeenv) {
|
||||
/* Set HOME, SHELL, and if not becoming a super-user,
|
||||
USER and LOGNAME. */
|
||||
xsetenv ( "HOME", pw-> pw_dir );
|
||||
xsetenv ( "SHELL", shell );
|
||||
if ( pw-> pw_uid ) {
|
||||
xsetenv ( "USER", pw-> pw_name );
|
||||
xsetenv ( "LOGNAME", pw-> pw_name );
|
||||
xsetenv("HOME", pw->pw_dir);
|
||||
xsetenv("SHELL", shell);
|
||||
if (pw->pw_uid) {
|
||||
xsetenv("USER", pw->pw_name);
|
||||
xsetenv("LOGNAME", pw->pw_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -255,6 +255,14 @@ int wait4pid(int pid)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_xsetenv
|
||||
void xsetenv(const char *key, const char *value)
|
||||
{
|
||||
if(setenv(key, value, 1))
|
||||
bb_error_msg_and_die(bb_msg_memory_exhausted);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_itoa
|
||||
// Convert unsigned integer to ascii, writing into supplied buffer. A
|
||||
// truncated result is always null terminated (unless buflen is 0), and
|
||||
|
Reference in New Issue
Block a user