~ubuntu-branches/ubuntu/trusty/bash/trusty-security

« back to all changes in this revision

Viewing changes to builtins/exit.def

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2014-03-03 22:52:05 UTC
  • mfrom: (1.3.5) (2.2.6 experimental)
  • Revision ID: package-import@ubuntu.com-20140303225205-87ltrt5kspeq0g1b
Tags: 4.3-1ubuntu1
* Merge with Debian; remaining changes:
  - skel.bashrc:
    - Run lesspipe.
    - Enable ls aliases.
    - Set options in ll alias to -alF.
    - Define an alert alias.
    - Enabled colored grep aliases.
  - etc.bash.bashrc:
    - Add sudo hint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
This file is exit.def, from which is created exit.c.
 
2
It implements the builtins "exit", and "logout" in Bash.
 
3
 
 
4
Copyright (C) 1987-2009 Free Software Foundation, Inc.
 
5
 
 
6
This file is part of GNU Bash, the Bourne Again SHell.
 
7
 
 
8
Bash is free software: you can redistribute it and/or modify
 
9
it under the terms of the GNU General Public License as published by
 
10
the Free Software Foundation, either version 3 of the License, or
 
11
(at your option) any later version.
 
12
 
 
13
Bash is distributed in the hope that it will be useful,
 
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
GNU General Public License for more details.
 
17
 
 
18
You should have received a copy of the GNU General Public License
 
19
along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
20
 
 
21
$PRODUCES exit.c
 
22
 
 
23
$BUILTIN exit
 
24
$FUNCTION exit_builtin
 
25
$SHORT_DOC exit [n]
 
26
Exit the shell.
 
27
 
 
28
Exits the shell with a status of N.  If N is omitted, the exit status
 
29
is that of the last command executed.
 
30
$END
 
31
 
 
32
#include <config.h>
 
33
 
 
34
#include "../bashtypes.h"
 
35
#include <stdio.h>
 
36
 
 
37
#if defined (HAVE_UNISTD_H)
 
38
#  include <unistd.h>
 
39
#endif
 
40
 
 
41
#include "../bashintl.h"
 
42
 
 
43
#include "../shell.h"
 
44
#include "../jobs.h"
 
45
 
 
46
#include "common.h"
 
47
#include "builtext.h"   /* for jobs_builtin */
 
48
 
 
49
extern int check_jobs_at_exit;
 
50
extern int last_command_exit_value;
 
51
extern int running_trap, trap_saved_exit_value;
 
52
extern int subshell_environment;
 
53
extern sh_builtin_func_t *this_shell_builtin;
 
54
extern sh_builtin_func_t *last_shell_builtin;
 
55
 
 
56
static int exit_or_logout __P((WORD_LIST *));
 
57
static int sourced_logout;
 
58
 
 
59
int
 
60
exit_builtin (list)
 
61
     WORD_LIST *list;
 
62
{
 
63
  if (interactive)
 
64
    {
 
65
      fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
 
66
      fflush (stderr);
 
67
    }
 
68
 
 
69
  return (exit_or_logout (list));
 
70
}
 
71
 
 
72
$BUILTIN logout
 
73
$FUNCTION logout_builtin
 
74
$SHORT_DOC logout [n]
 
75
Exit a login shell.
 
76
 
 
77
Exits a login shell with exit status N.  Returns an error if not executed
 
78
in a login shell.
 
79
$END
 
80
 
 
81
/* How to logout. */
 
82
int
 
83
logout_builtin (list)
 
84
     WORD_LIST *list;
 
85
{
 
86
  if (login_shell == 0 /* && interactive */)
 
87
    {
 
88
      builtin_error (_("not login shell: use `exit'"));
 
89
      return (EXECUTION_FAILURE);
 
90
    }
 
91
  else
 
92
    return (exit_or_logout (list));
 
93
}
 
94
 
 
95
static int
 
96
exit_or_logout (list)
 
97
     WORD_LIST *list;
 
98
{
 
99
  int exit_value;
 
100
 
 
101
#if defined (JOB_CONTROL)
 
102
  int exit_immediate_okay, stopmsg;
 
103
 
 
104
  exit_immediate_okay = (interactive  == 0 ||
 
105
                         last_shell_builtin == exit_builtin ||
 
106
                         last_shell_builtin == logout_builtin ||
 
107
                         last_shell_builtin == jobs_builtin);
 
108
 
 
109
  /* Check for stopped jobs if the user wants to. */
 
110
  if (exit_immediate_okay == 0)
 
111
    {
 
112
      register int i;
 
113
      for (i = stopmsg = 0; i < js.j_jobslots; i++)
 
114
        if (jobs[i] && STOPPED (i))
 
115
          stopmsg = JSTOPPED;
 
116
        else if (check_jobs_at_exit && stopmsg == 0 && jobs[i] && RUNNING (i))
 
117
          stopmsg = JRUNNING;
 
118
 
 
119
      if (stopmsg == JSTOPPED)
 
120
        fprintf (stderr, _("There are stopped jobs.\n"));
 
121
      else if (stopmsg == JRUNNING)
 
122
        fprintf (stderr, _("There are running jobs.\n"));
 
123
 
 
124
      if (stopmsg && check_jobs_at_exit)
 
125
        list_all_jobs (JLIST_STANDARD);
 
126
 
 
127
      if (stopmsg)
 
128
        {
 
129
          /* This is NOT superfluous because EOF can get here without
 
130
             going through the command parser.  Set both last and this
 
131
             so that either `exit', `logout', or ^D will work to exit
 
132
             immediately if nothing intervenes. */
 
133
          this_shell_builtin = last_shell_builtin = exit_builtin;
 
134
          return (EXECUTION_FAILURE);
 
135
        }
 
136
    }
 
137
#endif /* JOB_CONTROL */
 
138
 
 
139
  /* Get return value if present.  This means that you can type
 
140
     `logout 5' to a shell, and it returns 5. */
 
141
 
 
142
  /* If we're running the exit trap (running_trap == 1, since running_trap
 
143
     gets set to SIG+1), and we don't have a argument given to `exit'
 
144
     (list == 0), use the exit status we saved before running the trap
 
145
     commands (trap_saved_exit_value). */
 
146
  exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list);
 
147
 
 
148
  bash_logout ();
 
149
 
 
150
  last_command_exit_value = exit_value;
 
151
 
 
152
  /* Exit the program. */
 
153
  jump_to_top_level (EXITPROG);
 
154
  /*NOTREACHED*/
 
155
}
 
156
 
 
157
void
 
158
bash_logout ()
 
159
{
 
160
  /* Run our `~/.bash_logout' file if it exists, and this is a login shell. */
 
161
  if (login_shell && sourced_logout++ == 0 && subshell_environment == 0)
 
162
    {
 
163
      maybe_execute_file ("~/.bash_logout", 1);
 
164
#ifdef SYS_BASH_LOGOUT
 
165
      maybe_execute_file (SYS_BASH_LOGOUT, 1);
 
166
#endif
 
167
    }
 
168
}