#! /usr/bin/ksh

# Original Author: Tim Mooney (mooney@plains.nodak.edu)
# $Id: osf.req,v 1.2 1998/05/26 13:28:48 ewt Exp $
#
# This file is distributed under the terms of the GNU Public License
#
# find-requires is part of RPM, the Red Hat Package Manager.  find-requires
# reads a list of full pathnames (in a package) on stdin, and outputs all
# shared libraries the package requires to execute.
#
# On Digital Unix (OSF1), use `odump -Dl' to find the library dependencies
# for an executable.  `odump -D' does most of what we need, but it doesn't
# give us library version information, so you must use `odump -Dl'
#
# Example `odump -Dl' output:
#
#$odump -Dl /usr/bin/X11/xterm
# 
#
#
#
#			***LIBRARY LIST SECTION***
#	Name             Time-Stamp        CheckSum   Flags Version
#/usr/bin/X11/xterm:
#	libXaw.so    Dec  9 00:15:35 1997 0x285006d0     0 6.0
#	libXmu.so    Dec  9 00:13:36 1997 0x3bf3a33d     0 
#	libXt.so     Dec  9 00:12:18 1997 0x10dd9a17     0 
#	libSM.so     Dec  9 00:08:11 1997 0xb64c7082     0 
#	libICE.so    Dec  9 00:07:52 1997 0x1199be32     0 
#	libXext.so   Dec  9 00:08:51 1997 0xafcb84d5     0 
#	libX11.so    Dec  9 00:06:05 1997 0xaa1bf091     0 
#	libc.so      Dec  8 18:41:11 1997 0x5e955f9b     0 osf.1

PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin
export PATH

filelist=`cat -`

#
# Handle shell scripts first
#
for f in `echo $filelist | xargs file | grep 'shell script' | cut -d: -f 2 \
	| awk '{ print $1 }'`
do
    print $f
done | sort -u

#
# TVM: it might be better to re-write this so that `file' isn't used, since
# it could all be done with `odump', but this works.
#

for f in `echo $filelist | xargs file | grep executable | cut -d: -f1`
do
	odump -Dl $f 2>/dev/null | awk '

		#
		# For you non-awk-ers, no single quotes in comments -- the shell
		# sees them and things get hosed.
		#

		BEGIN { 
			found_program_name = 0;
			FS = " ";
			RS = "\n";
			OFS="";
			#
			# what character should be used to separate the soname from any
			# version info?  Using a . is actually a bad idea, since some
			# free/3rd party libraries may be built so that the library
			# soname may have version info in it too.  If we use . as the
			# separator, it may not be possible to tell where the soname
			# ends and the internal version info begins.  It might be
			# better to use a - or a : here.  If you do so, be sure to
			# change this setting in find-provides, too.
			#
			soname_version_delimiter=".";
		}

		# uncomment the next line for debugging information
		#{ print "Saw input:", $0 }

		found_program_name == 1 && $0 !~ /^$/ {

			# uncomment for debugging information
			#print "found shared library: $0"
		
			# get the library name (field 1) and the library version (field 8)
			# if present.
			numfields = split($0,fields)
			if (numfields == 7) {
				print fields[1]
			} else if (numfields == 8) {
				#
				# Note that if a library contains a number as the last
				# part of the soname *and* it contains version information,
				# we have a problem because it is impossible to tell where
				# the soname ends and the version info begins.  Digital Unix
				# shared libraries should *not* be built with any version info
				# in the soname.  That info should be in the version field
				# only.
				#
				# If we used a separator character of a - or something else,
				# instead of a ., we would not have this problem.
				#
				print fields[1], soname_version_delimiter, fields[8]
			}
		}

		/^.*: *$/ {
			found_program_name = 1
			#
			# uncomment the next line for debugging information
			#print "found the program name: ", $1
		}

	' # end of awk
done | sort -u
# comment out the previous line and uncomment the next when debugging
# done
