]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - bin/freebsd-version/freebsd-version.sh.in
sys/{x86,amd64}: remove one of doubled ;s
[FreeBSD/FreeBSD.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=${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         what -qs "$kernfile" | sed -n "s/$KERNEL_RE/\\1/p"
71 }
72
73 #
74 # Print the version of the currently running kernel.
75 #
76 running_version() {
77         sysctl -n kern.osrelease
78 }
79
80 #
81 # Print the hardcoded userland version.
82 #
83 userland_version() {
84         echo $USERLAND_VERSION
85 }
86
87 #
88 # Print a usage string and exit.
89 #
90 usage() {
91         echo "usage: $progname [-kru]" >&2
92         exit 1
93 }
94
95 #
96 # Main program.
97 #
98 main() {
99         # parse command-line arguments
100         while getopts "kru" option ; do
101                 case $option in
102                 k)
103                         opt_k=1
104                         ;;
105                 r)
106                         opt_r=1
107                         ;;
108                 u)
109                         opt_u=1
110                         ;;
111                 *)
112                         usage
113                         ;;
114                 esac
115         done
116         if [ $OPTIND -le $# ] ; then
117                 usage
118         fi
119
120         # default is -u
121         if [ $((opt_k + opt_r + opt_u)) -eq 0 ] ; then
122                 opt_u=1
123         fi
124
125         # print installed kernel version
126         if [ $opt_k ] ; then
127                 kernel_version
128         fi
129
130         # print running kernel version
131         if [ $opt_r ] ; then
132                 running_version
133         fi
134
135         # print userland version
136         if [ $opt_u ] ; then
137                 userland_version
138         fi
139 }
140
141 main "$@"