Updated the TODO file.
[mmh] / etc / sendfiles
index d53ed82..99c170e 100755 (executable)
 #!/bin/sh
 #
-# $Id$
-#
-# Send multiples files and/or directories as a tar/compressed
-# image, in a MIME message.
+# Sends multiple files and/or directories in a MIME message.
+# Requires tar and any specified compression program.
 #
+# This code is Copyright (c) 2012, by the authors of nmh.  See the
+# COPYRIGHT file in the root directory of the nmh distribution for
+# complete copyright information.
 
-DELAY=0
-FROM=
+usage='Usage: sendfiles [switches] -to recipient -subject subject '"\
+"'file1 [file2 ...]
+  or
+       sendfiles [switches] recipient subject file1 [file2 ...]
+  switches are:
+  -compress [bzip2 | compress | gzip | lzma | none]
+  -from <sender>
+  -[delay] <delay> (expressed in seconds)
+  -version
+  -help
+  Can use PERSON environment variable instead of -from switch.'
 
-case "$1" in
-    -*)        DELAY="`echo $1 | sed -e 's%-%%'`"
-       shift
-       ;;
-esac
 
-if [ ! -z "$PERSON" ]; then
-    FROM="-from $PERSON"
+#### Find location of a program.  Bourne shell just puts the name in
+#### $0 if it's found from the PATH, so search that if necessary.
+finddir() {
+  case $1 in
+    */*) dirname "$1" ;;
+    *  ) IFS=:
+         for d in $PATH; do
+           [ -f "${d:=.}/$1"  -a  -x "$d/$1" ]  &&  printf %s "$d"  &&  break
+         done ;;
+  esac
+}
+
+die() {
+  printf '%s\n' "$usage"; exit ${1:-1}
+}
+
+bindir=`finddir $0`
+nmhbindir=`cd "$bindir" && pwd`
+nmhlibdir=`$nmhbindir/mhparam libdir`
+
+
+#### Process switches.
+compress=                   ## compress method
+compressarg=0               ## whether currently handling -compress
+delay=                      ## delay value
+delayarg=0                  ## whether currently handling -delay
+from=                       ## From: contents
+fromarg=0                   ## whether currently handling -from
+subject=                    ## Subject: contents
+subjectarg=0                ## whether currently handling -subject
+to=                         ## To: address
+toarg=0                     ## whether currently handling -to
+for arg in "$@"; do
+  case $arg in
+    -c|-co|-com|-comp|-compr|-compre|-compres|-compress) compressarg=1 ;;
+    -d|-de|-del|-dela|-delay) delayarg=1 ;;
+    -[0-9]|-[0-9][0-9]|-[0-9][0-9][0-9]|-[0-9][0-9][0-9][0-9])
+      delay=`printf '%s\n' "$arg" | sed -e 's%-%%'` ;;
+    -f|-fr|-fro|-from) fromarg=1 ;;
+    #### Support -gzip for backward compatibility.
+    -gzip) compress=gzip ;;
+    -h|-he|-hel|-help) die 0 ;;
+    #### Support -none for backward compatibility.
+    -none) compress=none ;;
+    -s|-su|-sub|-subj|-subje|-subjec|-subject) subjectarg=1 ;;
+    -t|-to) toarg=1 ;;
+    -v|-ve|-ver|-vers|-versi|-versio|-version)
+       "$nmhlibdir/viamail" -version | sed 's/viamail/sendfiles/'; exit ;;
+    -*) die ;;
+    *) if [ $compressarg -eq 1 ]; then
+         compress="$arg"
+         compressarg=0
+       elif [ $delayarg -eq 1 ]; then
+         delay="$arg"
+         delayarg=0
+       elif [ $fromarg -eq 1 ]; then
+         from="$arg"
+         fromarg=0
+       elif [ $subjectarg -eq 1 ]; then
+         subject="$arg"
+         subjectarg=0
+       elif [ $toarg -eq 1 ]; then
+         to="$arg"
+         toarg=0
+       else
+         #### Argument doesn't apply to a switch, so we're done with switches.
+         break
+       fi ;;
+  esac
+  shift
+done
+
+#### Check for switch after non-switch argument.
+for arg in "$@"; do
+  case $arg in
+    -*) die ;;
+  esac
+done
+
+#### Check for required arguments (to, subject, file(s)).
+if [ x"$to" = x ]; then
+  if [ x"$subject" = x ]; then
+    if [ $# -ge 3 ]; then
+      to="$1"; shift
+      subject="$1"; shift
+    else
+      die
+    fi
+  else
+    die
+  fi
+else
+  [ x"$subject" = x  -o  $# -lt 1 ]  &&  die
 fi
 
-if [ $# -lt 3 ]; then
-    echo 'usage: sendfiles: "mailpath" "subject-string" directory-or-file ...' 1>&2
-    exit 1;
+#### Check for missing mandatory arguments.
+checkforargs() {
+  if [ $compressarg -eq 1 ]; then
+    printf 'sendfiles: missing argument to -compress\n' >&2; exit 1
+  elif [ $delayarg -eq 1 ]; then
+    printf 'sendfiles: missing argument to -delay\n' >&2; exit 1
+  elif [ $fromarg -eq 1 ]; then
+    printf 'sendfiles: missing argument to -from\n' >&2; exit 1
+  elif [ $subjectarg -eq 1 ]; then
+    printf 'sendfiles: missing argument to -subject\n' >&2; exit 1
+  elif [ $toarg -eq 1 ]; then
+    printf 'sendfiles: missing argument to -to\n' >&2; exit 1
+  fi
+}
+
+checkforargs
+[ $# -eq 0 ]  &&  die
+
+
+if [ x"$from" = x ]; then
+  if [ x"$PERSON" = x ]; then
+    from=`"$nmhlibdir/ap" -format '%(localmbox)' 0`
+  else
+    from="$PERSON"
+  fi
 fi
 
-mailpath="$1"
-echo "mailpath = $mailpath" 1>&2
-shift
 
-subject="$1"
-echo "subject-string = $subject" 1>&2
-shift
+#### Determine compression method and descriptive info.
+if [ x"$compress" = x ]; then
+  for compressor in gzip bzip2 lzma compress none; do
+    if [ x"`finddir $compressor`" = x ]; then :; else
+      compress="$compressor"
+      break
+    fi
+  done
+fi
+
+case $compress in
+  bzip2)    uncompress=bzcat; conversion='; x-conversions=bzip2' ;;
+  compress) compress='compress -c'; uncompress='uncompress -c';
+            conversion='; x-conversions=compress' ;;
+  gzip)     compress='gzip -c'; uncompress='gzip -cd'
+            conversion='; x-conversions=gzip' ;;
+  lzma)     compress='lzma -c'; uncompress='lzma -cd'
+            conversion='; x-conversions=lzma' ;;
+  none)     compress=cat uncompress=cat; conversion= ;;
+  *)        printf 'sendfiles: unknown compression method "%s"\n' \
+                   "$compress" >&2
+            die ;;
+esac
 
-echo "files = $*" 1>&2
 
-tar cvf - "$@" | compress | \
-    viamail -to "$mailpath" -subject "$subject" \
-       -parameters "type=tar; x-conversions=compress" \
-       -comment "extract with uncompress | tar xvpf -" \
-       -delay "$DELAY" \
-       -verbose $FROM
+#### Send using viamail.
+tar cvf - "$@" | $compress | \
+    "$nmhlibdir/viamail" -to "$to" -subject "$subject" \
+        -from "$from" -parameters "type=tar$conversion" \
+        -comment "extract with $uncompress | tar xvpf -" \
+        -delay "$delay" -verbose