1/* bashversion.c -- Display bash version information. */
2
3/* Copyright (C) 2001 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#include "config.h"
22
23#include "stdc.h"
24
25#include <stdio.h>
26
27#if defined (HAVE_UNISTD_H)
28#  include <unistd.h>
29#endif
30
31#include "bashansi.h"
32
33#include "version.h"
34#include "conftypes.h"
35
36#define RFLAG	0x0001
37#define VFLAG	0x0002
38#define MFLAG	0x0004
39#define PFLAG	0x0008
40#define SFLAG	0x0010
41#define LFLAG	0x0020
42#define XFLAG	0x0040
43
44extern int optind;
45extern char *optarg;
46
47extern char *dist_version;
48extern int patch_level;
49
50extern char *shell_version_string __P((void));
51extern void show_shell_version __P((int));
52
53char *shell_name = "bash";
54char *progname;
55
56static void
57usage()
58{
59  fprintf(stderr, "%s: usage: %s [-hrvpmlsx]\n", progname, progname);
60}
61
62int
63main (argc, argv)
64     int argc;
65     char **argv;
66{
67  int opt, oflags;
68  char dv[128], *rv;
69
70  if (progname = strrchr (argv[0], '/'))
71    progname++;
72  else
73    progname = argv[0];
74
75  oflags = 0;
76  while ((opt = getopt(argc, argv, "hrvmpslx")) != EOF)
77    {
78      switch (opt)
79	{
80	case 'h':
81	  usage ();
82	  exit (0);
83	case 'r':
84	  oflags |= RFLAG;	/* release */
85	  break;
86	case 'v':
87	  oflags |= VFLAG;	/* version */
88	  break;
89	case 'm':
90	  oflags |= MFLAG;	/* machtype */
91	  break;
92	case 'p':
93	  oflags |= PFLAG;	/* patchlevel */
94	  break;
95	case 's':		/* short version string */
96	  oflags |= SFLAG;
97	  break;
98	case 'l':		/* long version string */
99	  oflags |= LFLAG;
100	  break;
101	case 'x':		/* extended version information */
102	  oflags |= XFLAG;
103	  break;
104	default:
105	  usage ();
106	  exit (2);
107	}
108    }
109
110  argc -= optind;
111  argv += optind;
112
113  if (argc > 0)
114    {
115      usage ();
116      exit (2);
117    }
118
119  /* default behavior */
120  if (oflags == 0)
121    oflags = SFLAG;
122
123  if (oflags & (RFLAG|VFLAG))
124    {
125      strcpy (dv, dist_version);
126      rv = strchr (dv, '.');
127      if (rv)
128        *rv++ = '\0';
129      else
130        rv = "00";
131    }
132  if (oflags & RFLAG)
133    printf ("%s\n", dv);
134  else if (oflags & VFLAG)
135    printf ("%s\n", rv);
136  else if (oflags & MFLAG)
137    printf ("%s\n", MACHTYPE);
138  else if (oflags & PFLAG)
139    printf ("%d\n", patch_level);
140  else if (oflags & SFLAG)
141    printf ("%s\n", shell_version_string ());
142  else if (oflags & LFLAG)
143    show_shell_version (0);
144  else if (oflags & XFLAG)
145    show_shell_version (1);
146
147  exit (0);
148}
149