#! /usr/bin/ksh # Original Author: Tim Mooney (mooney@plains.nodak.edu) # $Id: hpux.prov,v 1.3 1998/06/14 16:03:14 ewt Exp $ # # This file is distributed under the terms of the GNU Public License # # find-provides is part of RPM, the Red Hat Package Manager. find-provides # reads a list of full pathnames (in a package) on stdin, and outputs all # shared libraries provided by (contained in) the package. # # # On HP-UX, use `chatr' to find what libraries a package provides # # Example chatr output: # #$chatr /usr/lib/libc.sl # #/usr/lib/libc.sl: # shared library # shared library dynamic path search: # SHLIB_PATH disabled second # embedded path disabled first Not Defined # internal name: # libc.1 # shared library list: # dynamic /usr/lib/libdld.1 # static branch prediction disabled # kernel assisted branch predictionenabled # lazy swap allocationdisabled # text segment lockingdisabled # data segment lockingdisabled # data page size: 4K # instruction page size: 4K # PATH=/usr/bin:/usr/sbin:/usr/ccs/bin export PATH for f in `cat -` do chatr $f 2>/dev/null | awk ' BEGIN { FS = " "; RS = "\n"; in_internal_name = 0; # # We have seen the internal name: section (yet)? # found_internal_name = 0; # # assume it is a shared library, until record 2 proves us wrong. # isa_shared_library = 1; } # Uncomment the next line for some debugging info. #{ print NR , ":", $0 } # # save the first line in case there is no internal name built # into this object. # NR == 1 { my_name = $0 opened_something = 1; } # # Check the second line (record). Clear the flag if it is not a # shared library. # NR == 2 && $0 !~ /^[ ]+shared library[ ]*$/ { # It is not a shared library. Bow out early isa_shared_library = 0; exit } # # If we see this, we know we have passed all the information we care # about, so exit. # /^ +shared library list: *$/ || /^ +static branch prediction/ { in_internal_name = 0 exit } in_internal_name == 1 { # We found the library internal name. If it does not contain # a path, print it. At least a couple of the system libraries # have a full path as the internal name (this is probably a bug). if ( $0 ~ /\// ) { numfields = split($0, internal_name, "/") print internal_name[numfields] } else { print $1 } # # Set a flag for the EXIT section, to indicate that we found # an internal name # found_internal_name = 1; } # # we have hit the internal name section. Set the flag # /^ +internal name: *$/ { in_internal_name = 1 } END { # Uncomment the next line for debugging info #{ print "END: NR: ", NR } if ( (isa_shared_library == 0) || (NR < 2) ) { # both of these indicate error conditions, for which we # should not generate any output. exit; } else { if (found_internal_name == 1) { exit; } else { # # chop the : off the end of the line # colon = index(my_name, ":") colon = colon - 1 temp = substr(my_name, 1, colon) # # get the basename # numfields = split(temp, basename, "/") # Uncomment the next line for debugging info #print "In END:", numfields, ":", temp print basename[numfields] exit } } } ' # end of awk done | sort -u #comment out the previous line and uncomment the next line when debugging #done