1 #!/bin/ksh -p
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 
  23 #
  24 # Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  25 # Use is subject to license terms.
  26 #
  27 
  28 #
  29 # Create a tarball with crypto binaries.
  30 #
  31 
  32 usage="cryptodrop [-n] result-path"
  33 
  34 isa=`uname -p`
  35 
  36 function fail {
  37         print -u2 "cryptodrop: $@"
  38         exit 1
  39 }
  40 
  41 [[ -n "$ROOT" ]] || fail "ROOT must be set."
  42 # Verify below (after adjusting for -n) that $ROOT exists, is a directory.
  43 [[ -n "$SRC" ]] || fail "SRC must be set."
  44 [[ -d "$SRC" ]] || fail "SRC ($SRC) is not a directory."
  45 [[ -n "$CODEMGR_WS" ]] || fail "CODEMGR_WS must be set."
  46 [[ -d "$CODEMGR_WS" ]] || fail "CODEMGR_WS ($CODEMGR_WS) is not a directory."
  47 
  48 #
  49 # Wrapper over cpio to filter out "NNN blocks" messages.
  50 #
  51 function cpio_filt {
  52         integer cpio_stat
  53 
  54         cpio "$@" > "$cpio_log" 2>&1
  55         cpio_stat=$?
  56         cat "$cpio_log" | awk '$0 !~ /[0-9]+ blocks/ { print }'
  57         return $cpio_stat
  58 }
  59 
  60 #
  61 # Create the README from boilerplate and the contents of the closed
  62 # binary tree.
  63 #
  64 # usage: mkreadme targetdir
  65 #
  66 function mkreadme {
  67         typeset targetdir="$1"
  68         typeset readme="README.CRYPTO-BINARIES.$isa"
  69 
  70         sed -e s/@ISA@/$isa/ -e s/@DELIVERY@/CRYPTO-BINARIES/ \
  71             "$SRC/tools/opensolaris/README.binaries.tmpl" > "$targetdir/$readme"
  72         (cd "$targetdir"; find "$rootdir" -type f -print | \
  73             sort >> "$targetdir/$readme")
  74 }
  75 
  76 nondebug=n
  77 while getopts n flag; do
  78         case $flag in
  79         n)
  80                 nondebug=y
  81                 if [ "$MULTI_PROTO" = yes ]; then
  82                         export ROOT="$ROOT-nd"
  83                 fi
  84                 ;;
  85         ?)
  86                 print -u2 "usage: $usage"
  87                 exit 1
  88                 ;;
  89         esac
  90 done
  91 shift $(($OPTIND - 1))
  92 
  93 if [[ $# -ne 1 ]]; then
  94         print -u2 "usage: $usage"
  95         exit 1
  96 fi
  97 [[ -d "$ROOT" ]] || fail "ROOT ($ROOT) is not a directory."
  98 
  99 tarfile="$1"
 100 
 101 if [[ "$nondebug" = n ]]; then
 102         rootdir="root_$isa"
 103 else
 104         rootdir="root_$isa-nd"
 105 fi
 106 
 107 tmpdir=$(mktemp -dt cryptodropXXXXX)
 108 [[ -n "$tmpdir" ]] || fail "could not create temporary directory."
 109 tmproot="$tmpdir/proto/$rootdir"
 110 mkdir -p "$tmproot" || exit 1
 111 cpio_log="$tmpdir/cpio.log"
 112 filelist="$tmpdir/files"
 113 
 114 #
 115 # Copy the crypto binaries into a temp directory.  This is a bit messy
 116 # because we want to preserve the permissions of intermediate
 117 # directories without including all the contents of those
 118 # directories.
 119 #
 120 
 121 # Echo all the parent directories of the given file.
 122 function alldirs {
 123         d=$(dirname "$1")
 124         while [ "$d" != . ]; do
 125                 echo $d
 126                 d=$(dirname "$d")
 127         done
 128 }
 129 
 130 findcrypto "$SRC/tools/codesign/creds" | awk '{ print $2 }' > "$filelist"
 131 #
 132 # Both alldirs and the cpio -p invocation assume that findcrypto only
 133 # produces relative paths.
 134 #
 135 for f in $(cat "$filelist"); do
 136         if [[ "$f" = /* ]]; then
 137                 fail "findcrypto produced absolute path ($f)"
 138         fi
 139 done
 140 for f in $(cat "$filelist"); do
 141         echo "$f"
 142         alldirs "$f"
 143 done | sort -u | (cd "$ROOT"; cpio_filt -pdm "$tmproot")
 144 [[ $? -eq 0 ]] || fail "could not copy crypto files."
 145 
 146 rm -f "$cpio_log" "$filelist"
 147 
 148 #
 149 # Insert binary license files.
 150 #
 151 cp -p "$SRC/tools/opensolaris/BINARYLICENSE.txt" "$tmpdir/proto" || \
 152     fail "could not add BINARYLICENSE.txt"
 153 mkreadme "$tmpdir/proto" || exit 1
 154 cp -p "$CODEMGR_WS/THIRDPARTYLICENSE.ON-CRYPTO" "$tmpdir/proto" || \
 155     fail "could not add THIRDPARTYLICENSE.ON-CRYPTO."
 156 
 157 (cd "$tmpdir"; tar cf "$tarfile" proto) || fail "could not create $tarfile."
 158 bzip2 -f "$tarfile" || fail "could not compress $tarfile".
 159 
 160 rm -rf "$tmpdir"
 161 
 162 exit 0