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

« back to all changes in this revision

Viewing changes to builtins/caller.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 caller.def, from which is created caller.c.  It implements the
 
2
builtin "caller" in Bash.
 
3
 
 
4
Copyright (C) 2002-2008 Rocky Bernstein for Free Software Foundation, Inc.
 
5
Copyright (C) 2008-2013 Free Software Foundation, Inc.
 
6
 
 
7
This file is part of GNU Bash, the Bourne Again SHell.
 
8
 
 
9
Bash is free software: you can redistribute it and/or modify
 
10
it under the terms of the GNU General Public License as published by
 
11
the Free Software Foundation, either version 3 of the License, or
 
12
(at your option) any later version.
 
13
 
 
14
Bash is distributed in the hope that it will be useful,
 
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
GNU General Public License for more details.
 
18
 
 
19
You should have received a copy of the GNU General Public License
 
20
along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
21
 
 
22
$PRODUCES caller.c
 
23
 
 
24
$BUILTIN caller
 
25
$FUNCTION caller_builtin
 
26
$DEPENDS_ON DEBUGGER
 
27
$SHORT_DOC caller [expr]
 
28
Return the context of the current subroutine call.
 
29
 
 
30
Without EXPR, returns "$line $filename".  With EXPR, returns
 
31
"$line $subroutine $filename"; this extra information can be used to
 
32
provide a stack trace.
 
33
 
 
34
The value of EXPR indicates how many call frames to go back before the
 
35
current one; the top frame is frame 0.
 
36
 
 
37
Exit Status:
 
38
Returns 0 unless the shell is not executing a shell function or EXPR
 
39
is invalid.
 
40
$END
 
41
 
 
42
#include <config.h>
 
43
#include <stdio.h>
 
44
#include "chartypes.h"
 
45
#include "bashtypes.h"
 
46
 
 
47
#if defined (HAVE_UNISTD_H)
 
48
#  ifdef _MINIX
 
49
#    include <sys/types.h>
 
50
#  endif
 
51
#  include <unistd.h>
 
52
#endif
 
53
 
 
54
#include <errno.h>
 
55
 
 
56
#include "../bashintl.h"
 
57
 
 
58
#include "../shell.h"
 
59
#include "common.h"
 
60
#include "builtext.h"
 
61
#include "bashgetopt.h"
 
62
 
 
63
#ifdef LOADABLE_BUILTIN
 
64
#  include "builtins.h"
 
65
#endif
 
66
 
 
67
#if !defined (errno)
 
68
extern int errno;
 
69
#endif /* !errno */
 
70
 
 
71
int
 
72
caller_builtin (list)
 
73
     WORD_LIST *list;
 
74
{
 
75
#if !defined (ARRAY_VARS)
 
76
  printf ("1 NULL\n");
 
77
  return (EXECUTION_FAILURE);
 
78
#else
 
79
  SHELL_VAR *funcname_v, *bash_source_v, *bash_lineno_v;
 
80
  ARRAY *funcname_a, *bash_source_a, *bash_lineno_a;
 
81
  char *funcname_s, *source_s, *lineno_s;
 
82
  intmax_t num;
 
83
 
 
84
  GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
 
85
  GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
 
86
  GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);
 
87
 
 
88
  if (bash_lineno_a == 0 || array_empty (bash_lineno_a))
 
89
    return (EXECUTION_FAILURE);
 
90
 
 
91
  if (bash_source_a == 0 || array_empty (bash_source_a))
 
92
    return (EXECUTION_FAILURE);
 
93
 
 
94
 if (no_options (list))
 
95
    return (EX_USAGE);
 
96
  list = loptend;       /* skip over possible `--' */
 
97
 
 
98
  /* If there is no argument list, then give short form: line filename. */
 
99
  if (list == 0)
 
100
    {
 
101
      lineno_s = array_reference (bash_lineno_a, 0);
 
102
      source_s = array_reference (bash_source_a, 1);
 
103
      printf("%s %s\n", lineno_s ? lineno_s : "NULL", source_s ? source_s : "NULL");
 
104
      return (EXECUTION_SUCCESS);
 
105
    }
 
106
  
 
107
  if (funcname_a == 0 || array_empty (funcname_a))
 
108
    return (EXECUTION_FAILURE);
 
109
 
 
110
  if (legal_number (list->word->word, &num))
 
111
    {
 
112
      lineno_s = array_reference (bash_lineno_a, num);
 
113
      source_s = array_reference (bash_source_a, num+1);
 
114
      funcname_s = array_reference (funcname_a, num+1);
 
115
 
 
116
      if (lineno_s == NULL|| source_s == NULL || funcname_s == NULL)
 
117
        return (EXECUTION_FAILURE);
 
118
 
 
119
      printf("%s %s %s\n", lineno_s, funcname_s, source_s);
 
120
    }
 
121
  else
 
122
    {
 
123
      sh_invalidnum (list->word->word);
 
124
      builtin_usage ();
 
125
      return (EX_USAGE);
 
126
    }
 
127
 
 
128
  return (EXECUTION_SUCCESS);
 
129
#endif
 
130
}
 
131
 
 
132
#ifdef LOADABLE_BUILTIN
 
133
static char *caller_doc[] = {
 
134
N_("Returns the context of the current subroutine call.\n\
 
135
    \n\
 
136
    Without EXPR, returns "$line $filename".  With EXPR, returns\n\
 
137
    "$line $subroutine $filename"; this extra information can be used to\n\
 
138
    provide a stack trace.\n\
 
139
    \n\
 
140
    The value of EXPR indicates how many call frames to go back before the\n\
 
141
    current one; the top frame is frame 0."),
 
142
  (char *)NULL
 
143
};
 
144
 
 
145
struct builtin caller_struct = {
 
146
        "caller",
 
147
        caller_builtin,
 
148
        BUILTIN_ENABLED,
 
149
        caller_doc,
 
150
        "caller [EXPR]",
 
151
        0
 
152
};
 
153
 
 
154
#endif /* LOADABLE_BUILTIN */