unsigned int last_return_code;
extern char **environ; /* This is in <unistd.h>, but protected with __USE_GNU */
-/* Variables we export */
-unsigned int shell_context; /* Used in cmdedit.c to reset the
- * context when someone hits ^C */
-
/* "globals" within this file */
static char *ifs;
static char map[256];
static char *get_local_var(const char *var);
static void unset_local_var(const char *name);
static int set_local_var(const char *s, int flg_export);
-static void sigchld_handler(int sig);
/* Table of built-in functions. They can be forked or not, depending on
* context: within pipes, they fork. As simple commands, they do not.
}
if (*child->argv[0] == 'f') {
- /* Make this job the foreground job */
- /* suppress messages when run from /linuxrc mag@sysgo.de */
- if (tcsetpgrp(shell_terminal, pi->pgrp) && errno != ENOTTY)
- perror_msg("tcsetpgrp-1");
+ /* Put the job into the foreground. */
+ tcsetpgrp(shell_terminal, pi->pgrp);
}
/* Restart the processes in the job */
for (i = 0; i < pi->num_progs; i++)
pi->progs[i].is_stopped = 0;
- kill(-pi->pgrp, SIGCONT);
+ if ( (i=kill(- pi->pgrp, SIGCONT)) < 0) {
+ if (i == ESRCH) {
+ remove_bg_job(pi);
+ } else {
+ perror_msg("kill (SIGCONT)");
+ }
+ }
pi->stopped_progs = 0;
return EXIT_SUCCESS;
*prompt_str = PS2;
}
#else
- *prompt_str = (promptmode==0)? PS1 : PS2;
+ *prompt_str = (promptmode==1)? PS1 : PS2;
#endif
debug_printf("result %s\n",*prompt_str);
}
** child processes (rob@sysgo.de)
*/
cmdedit_read_input(prompt_str, the_command);
- cmdedit_terminate();
#else
fputs(prompt_str, stdout);
fflush(stdout);
prev_pipe = prev_pipe->next;
prev_pipe->next = pi->next;
}
+ if (job_list)
+ last_jobid = job_list->jobid;
+ else
+ last_jobid = 0;
+
pi->stopped_progs = 0;
free_pipe(pi, 0);
free(pi);
perror_msg("waitpid");
/* move the shell to the foreground */
- if (interactive && tcsetpgrp(shell_terminal, getpgid(0)))
- perror_msg("tcsetpgrp-2");
+ //if (interactive && tcsetpgrp(shell_terminal, getpgid(0)))
+ // perror_msg("tcsetpgrp-2");
return -1;
}
/* Set the handling for job control signals back to the default. */
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
+ signal(SIGTERM, SIG_DFL);
signal(SIGTSTP, SIG_DFL);
signal(SIGTTIN, SIG_DFL);
signal(SIGTTOU, SIG_DFL);
if ( (rcode==EXIT_SUCCESS && pi->followup==PIPE_OR) ||
(rcode!=EXIT_SUCCESS && pi->followup==PIPE_AND) )
skip_more_in_this_rmode=rmode;
+ checkjobs(NULL);
}
- checkjobs(NULL);
return rcode;
}
return rcode;
}
-static void sigchld_handler(int sig)
-{
- checkjobs(NULL);
- signal(SIGCHLD, sigchld_handler);
-}
-
/* Make sure we have a controlling tty. If we get started under a job
* aware app (like bash for example), make sure we are now in charge so
* we don't fight over who gets the foreground */
/* Ignore interactive and job-control signals. */
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
+ signal(SIGTERM, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
- signal(SIGCHLD, sigchld_handler);
+ signal(SIGCHLD, SIG_IGN);
/* Put ourselves in our own process group. */
+ setsid();
shell_pgrp = getpid ();
- if (setpgid (shell_pgrp, shell_pgrp) < 0) {
- perror_msg_and_die("Couldn't put the shell in its own process group");
- }
+ setpgid (shell_pgrp, shell_pgrp);
/* Grab control of the terminal. */
tcsetpgrp(shell_terminal, shell_pgrp);
if (argv[0] && argv[0][0] == '-') {
debug_printf("\nsourcing /etc/profile\n");
- input = xfopen("/etc/profile", "r");
- mark_open(fileno(input));
- parse_file_outer(input);
- mark_closed(fileno(input));
- fclose(input);
+ if ((input = fopen("/etc/profile", "r")) != NULL) {
+ mark_open(fileno(input));
+ parse_file_outer(input);
+ mark_closed(fileno(input));
+ fclose(input);
+ }
}
input=stdin;