]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - bin/freebsd-version/freebsd-version.sh.in
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / bin / freebsd-version / freebsd-version.sh.in
1 #!/bin/sh
2 #-
3 # Copyright (c) 2013 Dag-Erling Smørgrav
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 # SUCH DAMAGE.
26 #
27 # $FreeBSD$
28 #
29
30 set -e
31
32 USERLAND_VERSION="@@REVISION@@-@@BRANCH@@"
33
34 : ${ROOT:=}
35 : ${LOADER_DIR:=$ROOT/boot}
36 : ${LOADER_CONF_FILES:=$LOADER_DIR/defaults/loader.conf $LOADER_DIR/loader.conf $LOADER_DIR/loader.conf.local}
37 LOADER_RE1='^\([A-Z_a-z][0-9A-Z_a-z]*=[-./0-9A-Z_a-z]\{1,\}\).*$'
38 LOADER_RE2='^\([A-Z_a-z][0-9A-Z_a-z]*="[-./0-9A-Z_a-z]\{1,\}"\).*$'
39 KERNEL_RE='^@(#)@@TYPE@@ \([-.0-9A-Za-z]\{1,\}\) .*$'
40
41 progname=$(basename $0)
42
43 #
44 # Print an error message and exit.
45 #
46 error() {
47         echo "$progname: $*" >&2
48         exit 1
49 }
50
51 #
52 # Try to get the name of the installed kernel from loader.conf and
53 # return the full path.  If loader.conf does not exist or we could not
54 # read it, return the path to the default kernel.
55 #
56 kernel_file() {
57         eval $(sed -n "s/$LOADER_RE1/\\1;/p; s/$LOADER_RE2/\\1;/p" \
58             $LOADER_CONF_FILES 2>/dev/null)
59         echo "$LOADER_DIR/${kernel:-kernel}/${bootfile:-kernel}"
60 }
61
62 #
63 # Extract the kernel version from the installed kernel.
64 #
65 kernel_version() {
66         kernfile=$(kernel_file)
67         if [ ! -f "$kernfile" -o ! -r "$kernfile" ] ; then
68                 error "unable to locate kernel"
69         fi
70         strings "$kernfile" | sed -n "s/$KERNEL_RE/\\1/p"
71 }
72
73 #
74 # Print the hardcoded userland version.
75 #
76 userland_version() {
77         echo $USERLAND_VERSION
78 }
79
80 #
81 # Print a usage string and exit.
82 #
83 usage() {
84         echo "usage: $progname [-ku]\n" >&2
85         exit 1
86 }
87
88 #
89 # Main program.
90 #
91 main() {
92         # parse command-line arguments
93         while getopts "ku" option ; do
94                 case $option in
95                 k)
96                         opt_k=1
97                         ;;
98                 u)
99                         opt_u=1
100                         ;;
101                 *)
102                         usage
103                         ;;
104                 esac
105         done
106         if [ $OPTIND -le $# ] ; then
107                 usage
108         fi
109
110         # default is -u
111         if [ $((opt_k + opt_u)) -eq 0 ] ; then
112                 opt_u=1
113         fi
114
115         # print kernel version
116         if [ $opt_k ] ; then
117                 kernel_version
118         fi
119
120         # print userland version
121         if [ $opt_u ] ; then
122                 userland_version
123         fi
124 }
125
126 main "$@"