1#! /bin/sh
2# follows symbolic links.  to do otherwise is painful.
3
4usage() {
5  echo "usage: $0 [ -o owner] [ -g group ] [ -m mode ] -d dir ..."
6  echo "       $0 [ -o owner] [ -g group ] [ -m mode ] file destfile"
7  echo "       $0 [ -o owner] [ -g group ] [ -m mode ] file file ... destdir"
8  exit 1
9}
10
11installone() {
12  cp -f -p $1 $2
13  if [ "$owner" != "" ] ; then chown $owner $2; fi
14  if [ "$group" != "" ] ; then chgrp $group $2; fi
15  if [ "$mode" != "" ] ; then chmod $mode $2; fi
16}
17
18mkdir=0
19
20while [ $# -ge 0 ] ; do
21  case $1 in
22    -d) mkdir=1 ;;
23    -o) shift; owner=$1 ;;
24    -g) shift; group=$1 ;;
25    -m) shift; mode=$1 ;;
26    -*) usage ;;
27    *) break ;;
28  esac
29  shift
30done
31
32if [ $mkdir -eq 1 ] ; then
33  dirs=$*
34
35  for dir in $dirs ; do
36    case $dir in
37      /*) ;;
38      *) echo "directory name must begin with /; $dir does not" ; exit 1 ;;
39    esac
40
41    stack="$dir"
42    while [ "$dir" != "/" ] ; do
43      stack="$dir $stack"
44      dir=`dirname $dir`
45    done
46
47    for dir in $stack ; do
48      if [ ! -e $dir ] ; then
49        mkdir $dir
50        if [ "$owner" != "" ] ; then chown $owner $dir ; fi
51        if [ "$group" != "" ] ; then chgrp $group $dir ; fi
52        if [ "$mode" != "" ] ; then chmod $mode $dir ; fi
53      fi
54    done
55  done
56elif [ $# -eq 2 -a ! -d $2 ] ; then
57  installone $1 $2
58elif [ $# -ge 2 ] ; then
59  files=""
60  while [ $# -ne 1 ] ; do
61    files="$files $1"
62    shift
63  done
64  dest=$1
65
66  if [ ! -d $dest ]; then usage; fi
67
68  for file in $files ; do
69    installone $file $dest/`basename $file`
70  done
71else
72  usage
73fi
74