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

« back to all changes in this revision

Viewing changes to builtins/gen-helpfiles.c

  • 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
/* gen-helpfiles - create files containing builtin help text */
 
2
 
 
3
/* Copyright (C) 2012 Free Software Foundation, Inc.
 
4
 
 
5
   This file is part of GNU Bash, the Bourne Again SHell.
 
6
 
 
7
   Bash is free software: you can redistribute it and/or modify
 
8
   it under the terms of the GNU General Public License as published by
 
9
   the Free Software Foundation, either version 3 of the License, or
 
10
   (at your option) any later version.
 
11
 
 
12
   Bash is distributed in the hope that it will be useful,
 
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
   GNU General Public License for more details.
 
16
 
 
17
   You should have received a copy of the GNU General Public License
 
18
   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
19
*/
 
20
 
 
21
/* This links with a specially-generated version of builtins.c and takes
 
22
   the long_doc members of each struct builtin element and writes those to
 
23
   the file named by the `handle' member of the struct builtin element. */
 
24
 
 
25
#if !defined (CROSS_COMPILING) 
 
26
#  include <config.h>
 
27
#else   /* CROSS_COMPILING */
 
28
/* A conservative set of defines based on POSIX/SUS3/XPG6 */
 
29
#  define HAVE_UNISTD_H
 
30
#  define HAVE_STRING_H
 
31
#  define HAVE_STDLIB_H
 
32
 
 
33
#  define HAVE_RENAME
 
34
#endif /* CROSS_COMPILING */
 
35
 
 
36
#if defined (HAVE_UNISTD_H)
 
37
#  ifdef _MINIX
 
38
#    include <sys/types.h>
 
39
#  endif
 
40
#  include <unistd.h>
 
41
#endif
 
42
 
 
43
#ifndef _MINIX
 
44
#  include "../bashtypes.h"
 
45
#  if defined (HAVE_SYS_FILE_H)
 
46
#    include <sys/file.h>
 
47
#  endif
 
48
#endif
 
49
 
 
50
#include "posixstat.h"
 
51
#include "filecntl.h"
 
52
 
 
53
#include "../bashansi.h"
 
54
#include <stdio.h>
 
55
#include <errno.h>
 
56
 
 
57
#include "stdc.h"
 
58
 
 
59
#include "../builtins.h"
 
60
#include "tmpbuiltins.h"
 
61
 
 
62
#if defined (USING_BASH_MALLOC)
 
63
#undef xmalloc
 
64
#undef xrealloc
 
65
#undef xfree
 
66
 
 
67
#undef free             /* defined in xmalloc.h */
 
68
#endif
 
69
 
 
70
#ifndef errno
 
71
extern int errno;
 
72
#endif
 
73
 
 
74
#if !defined (__STDC__) && !defined (strcpy)
 
75
extern char *strcpy ();
 
76
#endif /* !__STDC__ && !strcpy */
 
77
 
 
78
#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
 
79
 
 
80
/* Flag values that builtins can have. */
 
81
#define BUILTIN_FLAG_SPECIAL    0x01
 
82
#define BUILTIN_FLAG_ASSIGNMENT 0x02
 
83
#define BUILTIN_FLAG_POSIX_BUILTIN 0x04
 
84
 
 
85
#define BASE_INDENT     4
 
86
 
 
87
/* Non-zero means to produce separate help files for each builtin, named by
 
88
   the builtin name, in `./helpfiles'. */
 
89
int separate_helpfiles = 0;
 
90
 
 
91
/* Non-zero means to create single C strings for each `longdoc', with
 
92
   embedded newlines, for ease of translation. */
 
93
int single_longdoc_strings = 1;
 
94
 
 
95
/* The name of a directory into which the separate external help files will
 
96
   eventually be installed. */
 
97
char *helpfile_directory;
 
98
 
 
99
/* Forward declarations. */
 
100
 
 
101
int write_helpfiles __P((struct builtin *));
 
102
 
 
103
/* For each file mentioned on the command line, process it and
 
104
   write the information to STRUCTFILE and EXTERNFILE, while
 
105
   creating the production file if neccessary. */
 
106
int
 
107
main (argc, argv)
 
108
     int argc;
 
109
     char **argv;
 
110
{
 
111
  int arg_index = 1;
 
112
 
 
113
  while (arg_index < argc && argv[arg_index][0] == '-')
 
114
    {
 
115
      char *arg = argv[arg_index++];
 
116
 
 
117
      if (strcmp (arg, "-noproduction") == 0)
 
118
        ;
 
119
      else if (strcmp (arg, "-H") == 0)
 
120
        helpfile_directory = argv[arg_index++];
 
121
      else if (strcmp (arg, "-S") == 0)
 
122
        single_longdoc_strings = 0;
 
123
      else
 
124
        {
 
125
          fprintf (stderr, "%s: Unknown flag %s.\n", argv[0], arg);
 
126
          exit (2);
 
127
        }
 
128
    }
 
129
 
 
130
  write_helpfiles(shell_builtins);
 
131
 
 
132
  exit (0);
 
133
}
 
134
 
 
135
/* Write DOCUMENTATION to STREAM, perhaps surrounding it with double-quotes
 
136
   and quoting special characters in the string.  Handle special things for
 
137
   internationalization (gettext) and the single-string vs. multiple-strings
 
138
   issues. */
 
139
void
 
140
write_documentation (stream, documentation, indentation)
 
141
     FILE *stream;
 
142
     char *documentation;
 
143
     int indentation;
 
144
{
 
145
  if (stream == 0)
 
146
    return;
 
147
 
 
148
  if (documentation)
 
149
    fprintf (stream, "%*s%s\n", indentation, " ", documentation);
 
150
}
 
151
 
 
152
int
 
153
write_helpfiles (builtins)
 
154
     struct builtin *builtins;
 
155
{
 
156
  char *helpfile, *bname, *fname;
 
157
  FILE *helpfp;
 
158
  int i, hdlen;
 
159
  struct builtin b;
 
160
 
 
161
  i = mkdir ("helpfiles", 0777);
 
162
  if (i < 0 && errno != EEXIST)
 
163
    {
 
164
      fprintf (stderr, "write_helpfiles: helpfiles: cannot create directory\n");
 
165
      return -1;
 
166
    }
 
167
 
 
168
  hdlen = strlen ("helpfiles/");
 
169
  for (i = 0; i < num_shell_builtins; i++)
 
170
    {
 
171
      b = builtins[i];
 
172
 
 
173
      fname = (char *)b.handle;
 
174
      helpfile = (char *)malloc (hdlen + strlen (fname) + 1);
 
175
      if (helpfile == 0)
 
176
        {
 
177
          fprintf (stderr, "gen-helpfiles: cannot allocate memory\n");
 
178
          exit (1);
 
179
        }
 
180
      sprintf (helpfile, "helpfiles/%s", fname);
 
181
 
 
182
      helpfp = fopen (helpfile, "w");
 
183
      if (helpfp == 0)
 
184
        {
 
185
          fprintf (stderr, "write_helpfiles: cannot open %s\n", helpfile);
 
186
          free (helpfile);
 
187
          continue;
 
188
        }
 
189
 
 
190
      write_documentation (helpfp, b.long_doc[0], 4);
 
191
 
 
192
      fflush (helpfp);
 
193
      fclose (helpfp);
 
194
      free (helpfile);
 
195
    }
 
196
  return 0;
 
197
}