checkoldver revision 1.4
1#!/bin/sh
2#	$NetBSD: checkoldver,v 1.4 2024/05/28 16:20:34 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	echo $PWD/$obsol
51}
52
53comparelib() {
54	local name="${1%.so.*}"
55	local version=${1#*.so.}
56	OIFS="$IFS"
57	IFS="$IFS."
58	set -- $version
59	IFS="$OIFS"
60
61	if [ -z "$libmajor" ]
62	then
63		libname="$name"
64		libmajor="$1"
65		libminor="$2"
66		libtiny="$3"
67		return
68	fi
69	if [ "$libmajor" -lt "$1" ]
70	then
71		delete "$libname" "$libmajor" "$libminor" "$libtiny"
72		libmajor="$1"
73		libminor="$2"
74		libtiny="$3"
75		return
76	elif [ "$1" -lt "$libmajor" ]
77	then
78		delete "$libname" "$1" "$2" "$3"
79		return
80	fi
81
82	if [ -z "$libminor" ]
83	then
84		return
85	fi
86	if [ "$libminor" -lt "$2" ]
87	then
88		delete "$libname" "$libmajor" "$libminor" "$libtiny"
89		libmajor="$1"
90		libminor="$2"
91		libtiny="$3"
92		return
93	elif [ "$2" -lt "$libminor" ]
94	then
95		delete "$libname" "$1" "$2" "$3"
96		return
97	fi
98
99	if [ -z "$libtiny" ]
100	then
101		return
102	fi
103	if [ "$libtiny" -lt "$3" ]
104	then
105		delete "$libname" "$libmajor" "$libminor" "$libtiny"
106		libmajor="$1"
107		libminor="$2"
108		libtiny="$3"
109		return
110	elif [ "$5" -lt "$libminor" ]
111	then
112		delete "$libname" "$1" "$2" "$3"
113		return
114	fi
115}
116
117processonedir() {
118	cd "$1"
119	for lib in lib*.so
120	do
121		lib="${lib#lib}"
122		lib="${lib%.so}"
123
124		libmajor=
125		libminor=
126		libtiny=
127		for link in lib$lib.so.[0-9]*.[0-9]*.[0-9]*
128		do
129			comparelib "$link"
130		done
131
132		libmajor=
133		libminor=
134		libtiny=
135		for link in lib$lib.so.[0-9]*.[0-9]*
136		do
137			comparelib "$link"
138		done
139
140		libmajor=
141		libminor=
142		libtiny=
143		for link in lib$lib.so.[0-9]*
144		do
145			comparelib "$link"
146		done
147	done
148}
149
150for i
151do
152	processonedir "$i"
153done
154