xref: /netbsd-src/lib/checkoldver (revision 2e795eb86e72b08afba092c8519d8fcb4e63a8cb)
1#!/bin/sh
2#	$NetBSD: checkoldver,v 1.5 2024/05/29 13:35:12 christos Exp $
3#
4# Copyright (c) 2002 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# This code is derived from software contributed to The NetBSD Foundation
8# by Christos Zoulas.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18#
19# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29# POSSIBILITY OF SUCH DAMAGE.
30#
31# checkoldver [dir ...]
32#
33# Looks in the given directories for old shared libraries and lists them
34# Useful for: 'checkoldver /usr/lib | xargs rm -f'
35
36delete() {
37	obsol="$1.so"
38	if [ ! -z "$2" ]
39	then
40		obsol="$obsol.$2"
41	fi
42	if [ ! -z "$3" ]
43	then
44		obsol="$obsol.$3"
45	fi
46	if [ ! -z "$4" ]
47	then
48		obsol="$obsol.$4"
49	fi
50	printf "${PWD}/${obsol}\n"
51}
52
53comparelib() {
54	local name="${1%.so.*}"
55	local version="${1#"${name}"*.so.}"
56	local IFS=.
57	set -- $version
58
59	if [ -z "$libmajor" ]
60	then
61		libname="$name"
62		libmajor="$1"
63		libminor="$2"
64		libtiny="$3"
65		return
66	fi
67	if [ "$libmajor" -lt "$1" ]
68	then
69		delete "$libname" "$libmajor" "$libminor" "$libtiny"
70		libmajor="$1"
71		libminor="$2"
72		libtiny="$3"
73		return
74	elif [ "$1" -lt "$libmajor" ]
75	then
76		delete "$libname" "$1" "$2" "$3"
77		return
78	fi
79
80	if [ -z "$libminor" ]
81	then
82		return
83	fi
84	if [ "$libminor" -lt "$2" ]
85	then
86		delete "$libname" "$libmajor" "$libminor" "$libtiny"
87		libmajor="$1"
88		libminor="$2"
89		libtiny="$3"
90		return
91	elif [ "$2" -lt "$libminor" ]
92	then
93		delete "$libname" "$1" "$2" "$3"
94		return
95	fi
96
97	if [ -z "$libtiny" ]
98	then
99		return
100	fi
101	if [ "$libtiny" -lt "$3" ]
102	then
103		delete "$libname" "$libmajor" "$libminor" "$libtiny"
104		libmajor="$1"
105		libminor="$2"
106		libtiny="$3"
107		return
108	elif [ "$5" -lt "$libminor" ]
109	then
110		delete "$libname" "$1" "$2" "$3"
111		return
112	fi
113}
114
115processonedir() {
116	cd "$1"
117	for lib in lib*.so
118	do
119		lib="${lib#lib}"
120		lib="${lib%.so}"
121
122		libmajor=
123		libminor=
124		libtiny=
125		for link in lib$lib.so.[0-9]*.[0-9]*.[0-9]*
126		do
127			comparelib "$link"
128		done
129
130		libmajor=
131		libminor=
132		libtiny=
133		for link in lib$lib.so.[0-9]*.[0-9]*
134		do
135			comparelib "$link"
136		done
137
138		libmajor=
139		libminor=
140		libtiny=
141		for link in lib$lib.so.[0-9]*
142		do
143			comparelib "$link"
144		done
145	done
146}
147
148for i
149do
150	processonedir "$i"
151done
152