| 1 |
--- coreutils-6.7/src/su.c.setsid 2007-01-09 17:26:26.000000000 +0000
|
| 2 |
+++ coreutils-6.7/src/su.c 2007-01-09 17:26:57.000000000 +0000
|
| 3 |
@@ -176,9 +176,13 @@
|
| 4 |
/* If true, change some environment vars to indicate the user su'd to. */
|
| 5 |
static bool change_environment;
|
| 6 |
|
| 7 |
+/* If true, then don't call setsid() with a command. */
|
| 8 |
+int same_session = 0;
|
| 9 |
+
|
| 10 |
static struct option const longopts[] =
|
| 11 |
{
|
| 12 |
{"command", required_argument, NULL, 'c'},
|
| 13 |
+ {"session-command", required_argument, NULL, 'C'},
|
| 14 |
{"fast", no_argument, NULL, 'f'},
|
| 15 |
{"login", no_argument, NULL, 'l'},
|
| 16 |
{"preserve-environment", no_argument, NULL, 'p'},
|
| 17 |
@@ -478,6 +482,8 @@
|
| 18 |
if (child == 0) { /* child shell */
|
| 19 |
change_identity (pw);
|
| 20 |
pam_end(pamh, 0);
|
| 21 |
+ if (!same_session)
|
| 22 |
+ setsid ();
|
| 23 |
#endif
|
| 24 |
|
| 25 |
if (simulate_login)
|
| 26 |
@@ -532,13 +538,27 @@
|
| 27 |
sigemptyset(&action.sa_mask);
|
| 28 |
action.sa_flags = 0;
|
| 29 |
sigemptyset(&ourset);
|
| 30 |
- if (sigaddset(&ourset, SIGTERM)
|
| 31 |
- || sigaddset(&ourset, SIGALRM)
|
| 32 |
- || sigaction(SIGTERM, &action, NULL)
|
| 33 |
- || sigprocmask(SIG_UNBLOCK, &ourset, NULL)) {
|
| 34 |
+ if (!same_session)
|
| 35 |
+ {
|
| 36 |
+ if (sigaddset(&ourset, SIGINT) || sigaddset(&ourset, SIGQUIT))
|
| 37 |
+ {
|
| 38 |
+ fprintf(stderr, "%s: signal masking malfunction\n", PROGRAM_NAME);
|
| 39 |
+ caught = 1;
|
| 40 |
+ }
|
| 41 |
+ }
|
| 42 |
+ if (!caught && (sigaddset(&ourset, SIGTERM)
|
| 43 |
+ || sigaddset(&ourset, SIGALRM)
|
| 44 |
+ || sigaction(SIGTERM, &action, NULL)
|
| 45 |
+ || sigprocmask(SIG_UNBLOCK, &ourset, NULL))) {
|
| 46 |
fprintf(stderr, "%s: signal masking malfunction\n", PROGRAM_NAME);
|
| 47 |
caught = 1;
|
| 48 |
}
|
| 49 |
+ if (!caught && !same_session && (sigaction(SIGINT, &action, NULL)
|
| 50 |
+ || sigaction(SIGQUIT, &action, NULL)))
|
| 51 |
+ {
|
| 52 |
+ fprintf(stderr, "%s: signal masking malfunction\n", PROGRAM_NAME);
|
| 53 |
+ caught = 1;
|
| 54 |
+ }
|
| 55 |
}
|
| 56 |
if (!caught) {
|
| 57 |
do {
|
| 58 |
@@ -609,6 +629,8 @@
|
| 59 |
\n\
|
| 60 |
-, -l, --login make the shell a login shell\n\
|
| 61 |
-c, --command=COMMAND pass a single COMMAND to the shell with -c\n\
|
| 62 |
+ --session-command=COMMAND pass a single COMMAND to the shell with -c\n\
|
| 63 |
+ and do not create a new session\n\
|
| 64 |
-f, --fast pass -f to the shell (for csh or tcsh)\n\
|
| 65 |
-m, --preserve-environment do not reset environment variables\n\
|
| 66 |
-p same as -m\n\
|
| 67 |
@@ -631,6 +653,7 @@
|
| 68 |
int optc;
|
| 69 |
const char *new_user = DEFAULT_USER;
|
| 70 |
char *command = NULL;
|
| 71 |
+ int request_same_session = 0;
|
| 72 |
char *shell = NULL;
|
| 73 |
struct passwd *pw;
|
| 74 |
struct passwd pw_copy;
|
| 75 |
@@ -656,6 +679,11 @@
|
| 76 |
command = optarg;
|
| 77 |
break;
|
| 78 |
|
| 79 |
+ case 'C':
|
| 80 |
+ command = optarg;
|
| 81 |
+ request_same_session = 1;
|
| 82 |
+ break;
|
| 83 |
+
|
| 84 |
case 'f':
|
| 85 |
fast_startup = true;
|
| 86 |
break;
|
| 87 |
@@ -725,6 +753,9 @@
|
| 88 |
}
|
| 89 |
#endif
|
| 90 |
|
| 91 |
+ if (request_same_session || !command || !pw->pw_uid)
|
| 92 |
+ same_session = 1;
|
| 93 |
+
|
| 94 |
if (!shell && !change_environment)
|
| 95 |
shell = getenv ("SHELL");
|
| 96 |
if (shell && getuid () != 0 && restricted_shell (pw->pw_shell))
|