From 200f93ca4ea86f499ab5e82dee11b03f5602631d Mon Sep 17 00:00:00 2001 From: Derek Atkins Date: Mon, 26 Aug 2002 21:46:51 +0000 Subject: [PATCH] redhat-packagings-20020826 afsmodname actually from jhutz@cmu.edu but i don't feel like committing twice --- src/packaging/RedHat/afsmodname | 455 ++++++++++++ src/packaging/RedHat/openafs-1.2.6-rc.patch | 27 + src/packaging/RedHat/openafs-1.2.6.spec | 762 ++++++++++++++++++++ src/packaging/RedHat/openafs-README | 29 + src/packaging/RedHat/openafs-SuidCells | 5 + src/packaging/RedHat/openafs-ThisCell | 1 + src/packaging/RedHat/openafs-cacheinfo | 1 + 7 files changed, 1280 insertions(+) create mode 100755 src/packaging/RedHat/afsmodname create mode 100644 src/packaging/RedHat/openafs-1.2.6-rc.patch create mode 100644 src/packaging/RedHat/openafs-1.2.6.spec create mode 100644 src/packaging/RedHat/openafs-README create mode 100644 src/packaging/RedHat/openafs-SuidCells create mode 100644 src/packaging/RedHat/openafs-ThisCell create mode 100755 src/packaging/RedHat/openafs-cacheinfo diff --git a/src/packaging/RedHat/afsmodname b/src/packaging/RedHat/afsmodname new file mode 100755 index 000000000..227488acb --- /dev/null +++ b/src/packaging/RedHat/afsmodname @@ -0,0 +1,455 @@ +#!/usr/bin/perl +# afsmodname - return the name of the AFS module to load +# usage: afsmodname [path] +# THIS SCRIPT IS UNDER SOURCE CONTROL! +# The master copy is /afs/cs/misc/openafs/src/client-support/afsmodname + +use Getopt::Std; + +use strict; +use vars qw($modbase $VERSION @TrySyms @AddSyms $Prefix); +use vars qw($DEBUG $Mode $OutFile %SymCache); + +$VERSION = '$Revision$'; +$VERSION =~ s/^\$[a-z]*:?\s*(\S*)\s*\$$/$1/i; +$VERSION = 'testing' unless $VERSION; +$modbase = '/usr/vice/etc/modload'; +@TrySyms = qw(__iget iget __iget4 iget4); +@AddSyms = qw(sock_create); +$Prefix = 'libafs'; + + +sub vcmp { + my (@a, @b, @aa, @bb); + my ($i, $ii); + + @a = split /-/, $a; + @b = split /-/, $b; + foreach $i (0 .. ((@a > @b) ? $#b : $#a)) { + @aa = split /\./, $a[$i]; + @bb = split /\./, $b[$i]; + foreach $ii (0 .. ((@aa > @bb) ? $#bb : $#aa)) { + return $aa[$ii] <=> $bb[$ii] if $aa[$ii] <=> $bb[$ii] + && $aa[$ii] =~ /^\d+$/ + && $bb[$ii] =~ /^\d+$/; + return $aa[$ii] cmp $bb[$ii] if $aa[$ii] cmp $bb[$ii]; + } + return @aa <=> @bb if @aa <=> @bb; + } + return @a <=> @b; +} + + +sub parse_symbol ($) { + my($symbol) = @_; + + if ($symbol =~ /^(.*)_R((?:smp)?(?:2gig)?_?[0-9a-f]{8})$/) { + ($1, $2); + } else { + ($symbol, '--none--'); + } +} + + +sub get_ksym ($) { + my($req_sym) = @_; + my($addr, $symbol, $module, $version, @answer); + + + if (exists($SymCache{$req_sym})) { + print STDERR "get_ksym($req_sym) [cached]\n" if $DEBUG > 1; + return $SymCache{$req_sym}; + } + + print STDERR "get_ksym($req_sym)" if $DEBUG; + $SymCache{$req_sym} = undef; + open(KSYMS, '/proc/ksyms') or die "open /proc/ksyms: $!\n"; + while () { + if (/^(\w+)\s+(\w+)\s+\[(.*)\]/) { + ($addr, $symbol, $module) = ($1, $2, $3) + } elsif (/^(\w+)\s+(\w+)/) { + ($addr, $symbol, $module) = ($1, $2, 'KERNEL') + } else { next } + + ($symbol, $version) = parse_symbol($symbol); + + if ($symbol eq $req_sym) { + $SymCache{$req_sym} = [$addr, $version, $module]; + print STDERR " => [addr=$addr, vers=$version, mod=$module]\n" if $DEBUG; + last; + } + } + close(KSYMS); + + print STDERR " => not found\n" if $DEBUG && !defined($SymCache{$req_sym}); + $SymCache{$req_sym}; +} + + +sub get_modsyms ($) { + my($modpath) = @_; + my($symbol, $version, $V); + + $V = {}; + open(NM, "nm $modpath|") or die "nm $modpath: $!\n"; + while () { + chomp; + next unless /^\s+U\s+/; + ($symbol, $version) = parse_symbol($'); + $$V{$symbol} = $version unless $version eq '--none--'; + } + close(NM); + $V; +} + + +sub get_hdrsyms ($) { + my($srcpath) = @_; + my($moddir, @hdrs, $h); + my($symbol, $version, $V); + + + $moddir = "$srcpath/include/linux/modules"; + opendir(HDRS, $moddir) or die "$moddir: $!\n"; + @hdrs = readdir(HDRS); + closedir(HDRS); + + $V = {}; + foreach $h (@hdrs) { + next unless $h =~ /\.ver$/; + open(HDR, "$moddir/$h") or die "$moddir/$h: $!\n"; + while () { + chomp; + next unless /#define __ver_(\S+)\s+(\S+)/; + $$V{$1} = $2; + } + close(HDR); + } + $V; +} + + +sub get_cputype () { + my($cputype, $family, $vendor, $model); + + open(CPUINFO, '/proc/cpuinfo') or die "open /proc/cpuinfo: $!\n"; + while () { + if (/^cpu\s*\:\s*(\S+)/) { $cputype = $1 } + elsif (/^cpu family\s*:\s*(\S+)/) { $family = $1 } + elsif (/^vendor_id\s*:\s*(\S+)/) { $vendor = $1 } + elsif (/^model\s*:\s*(\S+)/) { $model = $1 } + } + close(CPUINFO); + if ($vendor eq 'GenuineIntel') { $vendor = 'intel' } + elsif ($vendor eq 'AuthenticAMD') { $vendor = 'amd' } + $cputype = "${family}86" if !defined($cputype); + [$cputype, $vendor, $model]; +} + + +sub table_lookup ($@) { + my($cpu, @paths) = @_; + my($path, $symbol, $version, $mincpu, @mincpu, $module, $info, @supp); + my($prev_module); # last module line we saw + my($match_module); # last matching module + my($prev_match); # true if last module matches so far + + foreach $path (@paths) { + next unless -f $path; + $prev_match = 0; + open(TABLE, $path) or die "open $path: $!\n"; + while () { + # Skip comments + next if (/^\#/ || /^\s*$/); + + # Check supplemental requirements + if (/^\s*\>/) { + @supp = split; + foreach (@supp) { + if (/([^=]*)=([^=]*)/) { + ($symbol, $version) = ($1, $2); + $info = get_ksym($symbol); + $prev_match = 0 if !$info || $version ne $$info[1]; + } + } + next; + } + + # This is a new module, so all supplemental requirements for the + # previous module have been processed. If they all passed, then + # the previous module is a matching module. + $match_module = $prev_module if $prev_match; + + # Parse the line and remember the module name + ($symbol, $version, $mincpu, $module) = split; + $prev_module = $module; + $prev_match = 0; + if ($DEBUG) { + print STDERR "Try $module ($symbol=$version)", + ($mincpu ne '-') ? " mincpu = $mincpu" : "", + "\n"; + } + + # Check mincpu requirement + if ($mincpu ne '-') { + @mincpu = split(/\./, $mincpu); + if ($mincpu[0] ne '' && $mincpu[0] > $$cpu[0]) { # min family + print STDERR " mincpu failed: $mincpu[0] > $$cpu[0]\n" if $DEBUG; + next; + } + if ($mincpu[1] ne '' && $mincpu[1] ne $$cpu[1]) { # exact vendor + print STDERR " mincpu failed: $mincpu[1] != $$cpu[1]\n" if $DEBUG; + next; + } + if ($mincpu[2] ne '' && $mincpu[2] > $$cpu[2]) { # min model + print STDERR " mincpu failed: $mincpu[2] > $$cpu[2]\n" if $DEBUG; + next; + } + } + + # Check primary symbol requirement + $info = get_ksym($symbol); + next unless $info; + next unless $version eq $$info[1]; + + # OK; it's a match so far. There may still be some supplemental + # requirements that we need to check. + $prev_match = 1; + } + close(TABLE); + $match_module = $prev_module if $prev_match; + } + $match_module; +} + + +sub dump_versions ($) { + my($cpu) = @_; + my($version); + + print STDERR "CPU Type: ", join('.', @$cpu), "\n"; + + chomp($version = `uname -rv`); + print STDERR "Linux version: $version\n"; + + if (open(RHR, "/etc/redhat-release")) { + chomp($version = ); + print STDERR "RedHat release: $version\n"; + } +} + + +sub dump_syms (@) { + my(@syms) = @_; + my($sym, $info); + + print STDERR "Symbol versions:\n"; + foreach $sym (@syms) { + $info = get_ksym($sym); + printf STDERR " %-10s %s\n", $sym, $$info[1] if $info; + } +} + + +sub gen_table (@) { + my(@modules) = @_; + my($module, $modname, $V, $sym, $count, @add); + + print <<'EOF'; +# This file describes the available AFS kernel modules and what kernel +# versions they work with. Each line matches against some kernel symbol +# version, and specifies a module which may be used with kernels containing +# that version of the specified symbol. Only lines which match the +# currently-running kernel are considered. +# +# In addition, each line may specify a minimum CPU model on which the module +# will work. If this value is present, the actual CPU model must be greater +# than or equal to the version specified; otherwise, the module is assumed +# to work on any CPU. +# +# The last match found will be used. +# +# Symbol Version MinCPU Module +#======= ============ ====== ==================== +EOF + foreach $module (sort vcmp @modules) { + ($modname = $module) =~ s/.*\///; + $modname =~ s/^$Prefix[-.](.*)\.o$/$1/; + $V = get_modsyms($module); + $count = 0; + foreach $sym (@TrySyms) { + next unless exists $$V{$sym}; + $count++; + printf "%-8s %-12s %-6s %s\n", $sym, $$V{$sym}, '-', $modname; + last; + } + if (!$count) { + print STDERR "Unable to find a suitable symbol reference in $modname!\n"; + next; + } + @add = (); + foreach $sym (@AddSyms) { + next unless exists $$V{$sym}; + push(@add, "$sym=$$V{$sym}"); + } + print "> ", join(' ', @add), "\n" if @add; + } +} + + +sub scan_kernels (@) { + my(@kernels) = @_; + my($kernel, $kpath, $kname, $V); + +eval <<"EOF"; +format = +@<<<<<<<<<<<<<<<<<<<<<<<< @{[' @<<<<<<<<<<<' x scalar(@TrySyms)]} +\$kname, @{[join(',', map(q/$$V{'/ . $_ . q/'}/, @TrySyms))]} +. +EOF + + $kname = 'Kernel'; + $V = { map(($_ => $_), @TrySyms) }; + write; + + $kname = '========================='; + $V = { map(($_ => '============'), @TrySyms) }; + write; + + foreach $kernel (@kernels) { + if (-d "$kernel/src/include/linux/modules") { $kpath = "$kernel/src" } + elsif (-d "$kernel/include/linux/modules") { $kpath = $kernel } + else { next } + ($kname = $kpath) =~ s#/src$##; + $kname =~ s/.*\///; + + $V = get_hdrsyms($kpath); + write; + } +} + + +sub symcompare ($$) { + my($module, $kernel) = @_; + my($ksyms, $msyms, $sym, $kvers, $mvers, $info); + +eval <<'EOF'; +format = +@<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<< @<<<<<<<<<<< +$sym, $kvers, $mvers +. +EOF + + if (defined($kernel)) { $ksyms = get_hdrsyms($kernel) } + $msyms = get_modsyms($module); + + print "Symbol Kernel Module\n"; + print "============================== ============ ============\n"; + foreach (keys %$msyms) { + $sym = $_; + $mvers = $$msyms{$sym}; + if (defined($kernel)) { + $kvers = $$ksyms{$sym}; + } else { + $info = get_ksym($sym); + $kvers = $$info[1]; + } + next if $kvers eq $mvers; + write; + } +} + + +sub usage (;@) { + + print STDERR "$00: ", @_, "\n" if @_; + print STDERR <<"EOF"; +usage: $00 [opts] [modbase] (find module) + $00 [opts] -g modules ... (make table) + $00 [opts] -k kernels ... (scan kernels) + $00 [opts] -c module [kernel] (check module) + $00 -h (print help) + $00 -v (print version) + +options: + -d enable debugging output + -f outfile set output file (default stdout) + -P prefix set module name prefix (default $Prefix) + -S syms... symbols to try for -x, -k (default @TrySyms) + -A syms... additional symbols to check for -x (default @AddSyms) + + Module lists for -S and -A may be space- or comma-separated. + For backward-compatibility, -g is a synonym for -x. +EOF + exit(0); +} + +sub parse_opts () { + my(%opts); + + ($00 = $0) =~ s/.*\///; + getopts('dckgxf:hvP:S:A:', \%opts) or usage('invalid option(s)'); + usage() if $opts{'h'}; + + if ($opts{'v'}) { + print "afsmodname $VERSION\n"; + exit(0); + } + + $opts{'g'} = 1 if $opts{'x'}; + if ($opts{'g'} + $opts{'k'} + $opts{'c'} > 1) { + usage("At most one of -g, -k, -c can be used\n"); + } + + $DEBUG++ if exists $opts{'d'}; + $Mode = 'g' if exists $opts{'g'}; + $Mode = 'k' if exists $opts{'k'}; + $Mode = 'c' if exists $opts{'c'}; + + usage("Too many arguments") if !$Mode && @ARGV > 1; + usage("Too many arguments") if $Mode eq 'c' && @ARGV > 2; + usage("Module name required") if $Mode eq 'c' && !@ARGV; + + $OutFile = $opts{'f'} if exists $opts{'f'}; + $Prefix = $opts{'p'} if exists $opts{'P'}; + @TrySyms = split(/[, ]+/, $opts{'S'}) if exists $opts{'S'}; + @AddSyms = split(/[, ]+/, $opts{'A'}) if exists $opts{'A'}; +} + + +## MAIN PROGRAM + +my($cpu, $module); + +parse_opts(); +if ($Mode) { + if ($OutFile) { + open(STDOUT, ">$OutFile") or die "$OutFile: $!\n"; + } + if ($Mode eq 'g') { gen_table(@ARGV) } + if ($Mode eq 'k') { scan_kernels(@ARGV) } + if ($Mode eq 'c') { symcompare($ARGV[0], $ARGV[1]) } + exit(0); +} + +$modbase = $ARGV[0] if @ARGV; + +$cpu = get_cputype(); + +$module = table_lookup($cpu, "$modbase/SymTable", "$modbase/SymTable.local"); + +if ($module) { + print "$Prefix-$module.o"; + exit(0); +} + +print STDERR <<'EOF'; +Hmm... I can't seem to find an AFS kernel module suitable for your Linux +kernel. That means you will need to build or obtain a suitable module. +The following information may be of some use in obtaining assistance: +EOF + +dump_versions($cpu); +dump_syms(sort (@TrySyms, keys %SymCache)); + +exit(1); diff --git a/src/packaging/RedHat/openafs-1.2.6-rc.patch b/src/packaging/RedHat/openafs-1.2.6-rc.patch new file mode 100644 index 000000000..6ed144a40 --- /dev/null +++ b/src/packaging/RedHat/openafs-1.2.6-rc.patch @@ -0,0 +1,27 @@ +Index: src/afsd/afs.rc.linux +=================================================================== +RCS file: /cvs/openafs/src/afsd/afs.rc.linux,v +retrieving revision 1.4 +diff -u -r1.4 afs.rc.linux +--- src/afsd/afs.rc.linux 2001/10/10 03:16:54 1.4 ++++ src/afsd/afs.rc.linux 2001/10/13 14:42:31 +@@ -92,6 +92,19 @@ + # LIBAFS manually. + choose_client() { + ++ # Use the associated script to determine the module name ++ if test -f /usr/vice/etc/afsmodname && \ ++ test -f /usr/vice/etc/modload/SymTable ; then ++ ++ LIBAFS=`/usr/vice/etc/afsmodname` ++ if test "x$LIBAFS" = "x" ; then ++ echo Did not find matching module in SymTable ++ else ++ echo Found $LIBAFS from SymTable... Loading... ++ return 0 ++ fi ++ fi ++ + # Use the second field of the uname -v output instead of just + # doing a match on the whole thing to protect against matching + # a timezone named SMP -- I don't know of one, but let's be diff --git a/src/packaging/RedHat/openafs-1.2.6.spec b/src/packaging/RedHat/openafs-1.2.6.spec new file mode 100644 index 000000000..aaad118d4 --- /dev/null +++ b/src/packaging/RedHat/openafs-1.2.6.spec @@ -0,0 +1,762 @@ +%define afsvers 1.2.6 +%define pkgrel 1 + +# Define your particular Red Hat and kernel versions: +# For Linux 2.2: 22 +# For Linux 2.4: 24 +# +%define osvers rh7.1 +%define kernvers 24 + +# This is where to look for kernel-build includes files. +# Most likely you don't want to change this, but +# depending on your situation you may want: +# Linux 2.2: +# kbase = /usr/src/linux- +# kend = "" +# Linux 2.4: +# kbase = /lib/modules/ +# kend = /build +# +%define kbase /usr/src/linux- +%define kend "" + +# Set 'debugspec' to 1 if you want to debug the spec file. This will +# not remove the installed tree as part of the %clean operation +%define debugspec 0 + +# Set 'enterprisekernelsupport' to 1 if you want to build the +# kernel module for the enterprise kernel +# Note: This will only work for kernvers == 24 on i686 +%define enterprisekernelsupport 1 + +# Set 'bigmemkernelsupport' to 1 if you want to build the +# kernel module for the bigmem kernel +# Note: This will only work for kernvers == 24 on i686 +%define bigmemkernelsupport 1 + +# Set 'krb5support' to 1 if you want to build the openafs-krb5 package +# to distribute aklog and asetkey +%define krb5support 1 + +# OpenAFS configuration options +%define enable_bitmap_later 0 +%define enable_bos_restricted_mode 0 +%define enable_fast_restart 0 + +####################################################################### +# You probably don't need to change anything beyond this line +# NOTE: If you do, please email me!!! + +Summary: OpenAFS distributed filesystem +Name: openafs +Version: %{afsvers} +Release: %{osvers}.%{pkgrel} +Copyright: IPL +BuildRoot: %{_tmppath}/%{name}-%{version}-root +Packager: Derek Atkins +Group: Networking/Filesystems +BuildRequires: kernel-source +%if "%{osvers}" != "rh6.2" +# Newer versions of Red Hat require pam-devel in order to build +BuildRequires: pam-devel +%endif + +Source0: http://www.openafs.org/dl/openafs/${afsvers}/openafs-%{afsvers}-src.tar.gz +Source1: http://www.openafs.org/dl/openafs/${afsvers}/openafs-%{afsvers}-doc.tar.gz +Source2: openafs-ThisCell +# http://grand.central.org/dl/cellservdb/CellServDB +Source3: openafs-CellServDB +Source4: openafs-SuidCells +Source5: openafs-cacheinfo +Source6: openafs-afsmodname +Source7: openafs-LICENSE.Sun +Source8: openafs-README +Source10: http://www.openafs.org/dl/openafs/${afsvers}/RELNOTES-%{afsvers} +Source11: http://www.openafs.org/dl/openafs/${afsvers}/ChangeLog + +Source20: openafs-krb5-1.3.tar.gz + +Patch0: openafs-%{afsvers}-rc.patch + +Patch20: openafs-krb5-1.3-1.2.1.diff.gz +Patch21: openafs-krb5-1.3-configure.patch + +%description +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides common files shared across all the various +OpenAFS packages but are not necessarily tied to a client or server. + +%package client +Requires: binutils, openafs-kernel, openafs = %{PACKAGE_VERSION} +Summary: OpenAFS Filesystem Client +Group: Networking/Filesystem + +%description client +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides basic client support to mount and manipulate +AFS. + +%package server +Requires: openafs-kernel, openafs = %{PACKAGE_VERSION} +Summary: OpenAFS Filesystem Server +Group: Networking/Filesystems + +%description server +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides basic server support to host files in an AFS +Cell. + +%package devel +Summary: OpenAFS Development Libraries and Headers +Group: Development/Filesystems + +%description devel +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides static development libraries and headers needed +to compile AFS applications. Note: AFS currently does not provide +shared libraries. + +%package kernel +Summary: OpenAFS Kernel Module(s) +Requires: openafs = %{PACKAGE_VERSION} +Group: Networking/Filesystems + +%description kernel +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides precompiled AFS kernel modules for various +kernels. + +%package kernel-source +Summary: OpenAFS Kernel Module source tree +Group: Networking/Filesystems + +%description kernel-source +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides the source code to build your own AFS kernel +module. + +%package compat +Summary: OpenAFS client compatibility symlinks +Requires: openafs = %{PACKAGE_VERSION}, openafs-client = %{PACKAGE_VERSION} +Group: Networking/Filesystems +Obsoletes: openafs-client-compat + +%description compat +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides compatibility symlinks in /usr/afsws. It is +completely optional, and is only necessary to support legacy +applications and scripts that hard-code the location of AFS client +programs. + +%package kpasswd +Summary: OpenAFS KA kpasswd support +Requires: openafs +Group: Networking/Filesystems + +%description kpasswd +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides the compatibility symlink for kpasswd, in case +you are using KAserver instead of Krb5. + +%if %{krb5support} +%package krb5 +Summary: OpenAFS programs to use with krb5 +Requires: openafs = %{PACKAGE_VERSION} +Group: Networking/Filesystems +BuildRequires: krb5-devel + +%description krb5 +The AFS distributed filesystem. AFS is a distributed filesystem +allowing cross-platform sharing of files among multiple computers. +Facilities are provided for access control, authentication, backup and +administrative management. + +This package provides compatibility programs so you can use krb5 +to authenticate to AFS services, instead of using AFS's homegrown +krb4 lookalike services. +%endif + +# +# PREP +# + +%prep +%setup -q -b 1 +%setup -q -T -D -a 20 + +%patch0 -p0 +%patch20 -p0 +%patch21 -p0 + +### +### build +### +%build + +%ifarch i386 i486 i586 i686 athlon +sysbase=i386 +sysname=${sysbase}_linux%{kernvers} +%else +sysbase=%{_arch} +sysname=${sysbase}_linux%{kernvers} +%endif + +if [ %{kernvers} = 22 ]; then + kv='2\.2\.' +elif [ %{kernvers} = 24 ]; then + kv='2\.4\.' +else + echo "I don't know how to build $sysname" + exit 1 +fi + +%ifarch i386 i486 i586 i686 athlon +archlist="i386 i586 i686 athlon" +%else +archlist=${sysbase} +%endif + +# +# PrintDefine var value statements file +# +PrintDefine() { + case $3 in + *ifn*) + echo "#ifndef $1" >> $4 + ;; + esac + case $3 in + *und*) + echo "#undef $1" >> $4 + ;; + esac + case $3 in + *def*) + echo "#define $1 $2" >> $4 + ;; + esac + case $3 in + *end*) + echo "#endif" >> $4 + ;; + esac + case $3 in + *inc*) + echo "#include $1" >> $4 + ;; + esac + + + case $3 in + *nl*) + echo "" >> $4 + ;; + esac +} + +# PrintRedhatKernelFix arch mp file +PrintRedhatKernelFix() { + arch="$1" + up=0 + smp=0 + ent=0 + bm=0 + if [ "$2" = "MP" ]; then + smp=1 + elif [ "$2" = "EP" ]; then + ent=1 + elif [ "$2" = "BM" ]; then + bm=1 + else + up=1 + fi + file="$3" + + # deal with the various boot kernels + boot=0 + bootsmp=0 + + # arch of 'BOOT' == 386 + if [ "$arch" = "BOOT" ]; then + if [ "$up" = 1 ]; then + boot=1 + up=0 + elif [ "$smp" = 1 ]; then + bootsmp=1 + smp=0 + fi + arch=i386 + fi + + rm -f $file + touch $file + + PrintDefine "REDHAT_FIX_H" "" ifn,def,nl $file + + PrintDefine "__BOOT_KERNEL_ENTERPRISE" $ent und,def,nl $file + PrintDefine "__BOOT_KERNEL_BIGMEM" $bm und,def,nl $file + PrintDefine "__BOOT_KERNEL_SMP" $smp und,def,nl $file + PrintDefine "__BOOT_KERNEL_UP" $up und,def,nl $file + PrintDefine "__BOOT_KERNEL_BOOT" $boot und,def,nl $file + PrintDefine "__BOOT_KERNEL_BOOTSMP" $bootsmp und,def,nl $file + + PrintDefine \"/boot/kernel.h\" "" inc,nl $file # include file + + for ar in $archlist ; do + if [ "$ar" = "$arch" ]; then + PrintDefine "__MODULE_KERNEL_$ar" "1" ifn,def,end $file + else + PrintDefine "__MODULE_KERNEL_$ar" "" und $file # undef + fi + done + echo "" >> $file + + PrintDefine "" "" end $file + + if [ %{debugspec} = 1 ] ; then + echo "Kernel Configuration File for Red Hat kernels:" + cat $file + fi +} + +# Pick up all the 'appropriate' kernels +kvers=`ls -d %{kbase}* | sed 's^%{kbase}^^g' | grep $kv` + +# Choose the last one for now.. It doesn't really matter, really. +hdrdir=`ls -d %{kbase}*%{kend} | grep $kv | tail -1` + +config_opts="--enable-redhat-buildsys \ +%if %{enable_bitmap_later} + --enable-bitmap-later \ +%endif +%if %{enable_bos_restricted_mode} + --enable-bos-restricted-mode \ +%endif +%if %{enable_fast_restart} + --enable-fast-restart \ +%endif + --enable-transarc-paths" + +# Configure AFS +./configure --with-afs-sysname=${sysname} \ + --with-linux-kernel-headers=$hdrdir $config_opts + +# Build the user-space AFS stuff +make dest_nolibafs + +# Build the libafs tree +make only_libafs_tree + +# Now build all the kernel modules +for vers in $kvers ; do + + # Reconfigure sources for this kernel version, to catch various + # kernel params in the configure script. Yes. this takes more time, + # but it's worth it in the long run.. But first remove config.cache + # to be sure we get a clean configuration. + rm -f config.cache + ./configure --with-afs-sysname=${sysname} \ + --with-linux-kernel-headers=%{kbase}$vers%{kend} \ + $config_opts + + KTL="SP MP" +%if %{enterprisekernelsupport} + # See if we should build EP support + if grep -q -r __BOOT_KERNEL_ENTERPRISE %{kbase}$vers%{kend}/include + then + KTL="${KTL} EP" + fi +%endif +%if %{bigmemkernelsupport} + # See if we should build BM support + if grep -q -r __BOOT_KERNEL_BIGMEM %{kbase}$vers%{kend}/include + then + KTL="${KTL} BM" + fi +%endif + + for mp in $KTL; do + # ... for all appropriate 'architectures'... + if [ %{kernvers} = 22 ]; then + # For 2.2 kernels, just do MP and SP kernels; force EP into i686 + + arch=${sysbase} + if [ $mp = EP -a ${sysbase} = i386 ]; then + arch=i686 + fi + + PrintRedhatKernelFix $arch $mp src/config/redhat-fix.h + make dest_only_libafs LOCAL_SMP_DEF=-DREDHAT_FIX MPS=$mp + + elif [ %{kernvers} = 24 ]; then + # For 2.4 kernels, need to build modules for each architecture! + + for arch in $archlist ; do + + # build SP and MP on all architectures. + # build EP and BM only on i686 + if [ $mp = SP -o $mp = MP -o \ + \( $mp = EP -a $arch = i686 \) -o \ + \( $mp = BM -a $arch = i686 \) ]; then + PrintRedhatKernelFix $arch $mp src/config/redhat-fix.h + make dest_only_libafs LOCAL_SMP_DEF=-DREDHAT_FIX \ + LINUX_MODULE_NAME="-$arch" MPS=$mp + fi + done + + else + echo "I don't know how to build $sysname" + exit 1 + fi + done +done + +rm -f src/config/redhat-fix.h + +%if %{krb5support} +# Now build aklog/asetkey +(cd openafs-krb5-1.3/src && + autoconf && + ./configure --prefix=/usr --with-krb5=/usr/kerberos \ + --with-afs=`pwd`/../../${sysname}/dest/ && \ + make all && \ + make install DESTDIR=`pwd`/../../${sysname}/dest/ INSTALL_BIN=/bin \ + INSTALL_SBIN=/etc) +%endif + +### +### install +### +%install +[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT + +%ifarch i386 i486 i586 i686 athlon +sysbase=i386 +sysname=${sysbase}_linux%{kernvers} +%else +sysbase=%{_arch} +sysname=${sysbase}_linux%{kernvers} +%endif + +# Build install tree +mkdir -p $RPM_BUILD_ROOT/usr/sbin +mkdir -p $RPM_BUILD_ROOT/etc/sysconfig +mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d +mkdir -p $RPM_BUILD_ROOT/etc/openafs +mkdir -p $RPM_BUILD_ROOT/lib/security +mkdir -p $RPM_BUILD_ROOT/usr/afs/logs +mkdir -p $RPM_BUILD_ROOT/usr/vice/etc +mkdir -p $RPM_BUILD_ROOT/usr/vice/cache +chmod 700 $RPM_BUILD_ROOT/usr/vice/cache + +# Copy files from dest to the appropriate places in BuildRoot +tar cf - -C ${sysname}/dest bin include lib | tar xf - -C $RPM_BUILD_ROOT/usr +tar cf - -C ${sysname}/dest/etc . | tar xf - -C $RPM_BUILD_ROOT/usr/sbin +tar cf - -C ${sysname}/dest/root.server/usr/afs bin | tar xf - -C $RPM_BUILD_ROOT/usr/afs +tar cf - -C ${sysname}/dest/root.client/usr/vice/etc afsd modload | tar xf - -C $RPM_BUILD_ROOT/usr/vice/etc + +# Link kpasswd to kapasswd +ln -f $RPM_BUILD_ROOT/usr/bin/kpasswd $RPM_BUILD_ROOT/usr/bin/kapasswd + +# Copy root.client config files +install -m 755 ${sysname}/dest/root.client/usr/vice/etc/afs.conf $RPM_BUILD_ROOT/etc/sysconfig/afs +install -m 755 ${sysname}/dest/root.client/usr/vice/etc/afs.rc $RPM_BUILD_ROOT/etc/rc.d/init.d/afs + +# Copy PAM modules +install -m 755 ${sysname}/dest/lib/pam* $RPM_BUILD_ROOT/lib/security + +# PAM symlinks +ln -sf pam_afs.so.1 $RPM_BUILD_ROOT/lib/security/pam_afs.so +ln -sf pam_afs.krb.so.1 $RPM_BUILD_ROOT/lib/security/pam_afs.krb.so + +# Populate /usr/vice/etc +uve=$RPM_BUILD_ROOT/usr/vice/etc +install -p -m 644 $RPM_SOURCE_DIR/openafs-CellServDB $uve/CellServDB +install -p -m 644 $RPM_SOURCE_DIR/openafs-SuidCells $uve/SuidCells +install -p -m 644 $RPM_SOURCE_DIR/openafs-ThisCell $uve/ThisCell +install -p -m 644 $RPM_SOURCE_DIR/openafs-cacheinfo $uve/cacheinfo +install -p -m 755 $RPM_SOURCE_DIR/openafs-afsmodname $uve/afsmodname + +# +# Build the SymTable +symtable=$RPM_BUILD_ROOT/usr/vice/etc/modload/SymTable +rm -f $symtable +echo "# SymTable, automatically generated" > $symtable +echo "# symbol version cpu module" >> $symtable +echo "" >> $symtable + +$RPM_BUILD_ROOT/usr/vice/etc/afsmodname -x -f $symtable \ + $RPM_BUILD_ROOT/usr/vice/etc/modload/libafs*.o + +# +# install kernel-source +# + +# Install the kernel module source tree +mkdir -p $RPM_BUILD_ROOT/usr/src/openafs-kernel-%{afsvers}/src +tar cf - -C libafs_tree . | \ + tar xf - -C $RPM_BUILD_ROOT/usr/src/openafs-kernel-%{afsvers}/src + +# Next, copy the LICENSE Files, README +install -m 644 src/LICENSE $RPM_BUILD_ROOT/usr/src/openafs-kernel-%{afsvers}/LICENSE.IBM +install -m 644 $RPM_SOURCE_DIR/openafs-LICENSE.Sun $RPM_BUILD_ROOT/usr/src/openafs-kernel-%{afsvers}/LICENSE.Sun +install -m 644 $RPM_SOURCE_DIR/openafs-README $RPM_BUILD_ROOT/usr/src/openafs-kernel-%{afsvers}/README + +# +# Install DOCUMENTATION +# + +# Build the DOC directory +mkdir -p $RPM_BUILD_ROOT/$RPM_DOC_DIR/openafs-%{afsvers} +tar cf - -C doc LICENSE html pdf | \ + tar xf - -C $RPM_BUILD_ROOT/$RPM_DOC_DIR/openafs-%{afsvers} +install -m 644 $RPM_SOURCE_DIR/RELNOTES-%{afsvers} $RPM_BUILD_ROOT/$RPM_DOC_DIR/openafs-%{afsvers} +install -m 644 $RPM_SOURCE_DIR/ChangeLog $RPM_BUILD_ROOT/$RPM_DOC_DIR/openafs-%{afsvers} + +# +# create filelist +# +grep -v "^#" >openafs-file-list <