[net.sources.mac] xmac -- xbin's before macput'ing; works direct from news reader

ehl@Navajo.ARPA (08/11/85)

I've written a shell script (xmac) that will take a list of files, check
whether they're BinHex files, and then macput them.  If a file is a BinHex
file, it will be xbin'd before the transfer -- this eliminates the need to
use BinHex on your Macintosh.  All temporary files (including the .info,
.data, and .rsrc files produced by xbin) are removed automatically.

If a file is not a BinHex file, it is assumed to be a text file and is
transferred via macput -u.

An initial -n switch is passed on to macput to set the Macintosh filename.
Unfortunately, macput does not seem to pay any attention to this switch
when transferring the .info, .data, and .rsrc files, so it is currently
only useful in transferring text files.

One very nice feature is that if no files are given to it, it will
take input from stdin.  This allows you to transfer files without leaving
your news reader.  The invocation is "| xmac" from rn and "s |xmac" from
readnews/vnews.  One caveat, though.  If your version of SH does not redirect
stdin to the terminal after the pipe is closed, you will need to change
macput.c to use /dev/tty for i/o rather than stdin/stdout.

			Elgin Lee
			UUCP:  ..decvax!decwrl!glacier!navajo!ehl
			ARPA:  ehl@su-navajo.arpa
----------

Diff of the changes required to macput.c:

----------------Cut Here------------
*** macput.c.old	Tue Nov 27 01:30:47 1984
--- macput.c	Sat Aug 10 13:28:26 1985
***************
*** 24,29
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/timeb.h>
  
  /* Mac time of 00:00:00 GMT, Jan 1, 1970 */
  #define TIMEDIFF 0x7c25b080

--- 24,30 -----
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/timeb.h>
+ #include <sys/file.h>
  
  /* Mac time of 00:00:00 GMT, Jan 1, 1970 */
  #define TIMEDIFF 0x7c25b080
***************
*** 438,445
  	int cleanup();
  	int timedout();
  
! 	ttyf = stdin;
! 	ttyfd = fileno(stdout);
  	ioctl(ttyfd, TIOCGETP, &otty);
  	signal(SIGHUP, cleanup);
  	signal(SIGINT, cleanup);

--- 439,448 -----
  	int cleanup();
  	int timedout();
  
! /* 	ttyf = stdin;  */
! 	ttyf = fopen("/dev/tty", "r");
! /* 	ttyfd = fileno(stdout); */
! 	ttyfd = open("/dev/tty", O_WRONLY, 0600);
  	ioctl(ttyfd, TIOCGETP, &otty);
  	signal(SIGHUP, cleanup);
  	signal(SIGINT, cleanup);

----------------

... and here's xmac itself:

---------------Cut Here--------------
: This is a SH script.  The first line should not begin with a '#'.
#
# Yet another shell script for transmitting groups of files to a Macintosh
# via macput and xbin.
#
# Usage: xmac [-n macname] [file] ...
#
# xmac transfers the indicated files to a Macintosh via macput.  Each such
# file is checked to see whether it is a BinHex (.hex, .hcx, or .hqx format)
# file; if so, the file is xbin'd before the transfer.  Files that are not
# BinHex format will be sent as text files via macput -u.
#
# If no file is specified, the standard input is used.  This allows you
# to transfer files from net.sources.mac without leaving your news reader.
# Use "| xmac" from rn or "s |xmac" from readnews/vnews.
#
# If the -n switch is specified, it (and the following argument) is passed
# on to macput to set the Mac filename.  Macput does not appear to use
# the switch when transfering the .info, .data, and .rsrc files, however.
#
# To install, you will need to change the values of XBIN and MACPUT (below)
# to reflect the locations of xbin and macput on your system.
#
# For the piping feature to work, you either need a version of the SH that
# redirects stdin to the terminal after the pipe closes (at Stanford, the
# version at Shasta seems to do this, but the version on Navajo doesn't),
# or you need to change macput to use /dev/tty for i/o rather than stdin and
# stdout.
#
# Written August 9, 1985 by
# 
# Elgin Lee
# Stanford University
# ..decvax!decwrl!glacier!navajo!ehl
# ehl@su-navajo.arpa
#

XBIN=/user/ehl/bin/xbin
MACPUT=/user/ehl/bin/newmacput
hexfile=#xmac$$

mesg n

# cleanup if interrupted

trap 'rm -f $hexfile; if test $f; then rm -f $f.info $f.rsrc $f.data; mesg y; \
	exit' 1 2 3 15

if test $# -ge 2; then
  case $1 in
    -n)		transfername=$2; shift; shift
    ;;
  esac
fi

if test $# -eq 0; then
  if cat > $hexfile; then
    if
      macname=`$XBIN -l $hexfile 2> /dev/null \
	| sed -n -e 's/^macname: //p' | sed -e 's/ /_/g'`
      test $macname
    then
      if $XBIN $hexfile; then
	if test $transfername; then
	  $MACPUT $macname -n $transfername
	else
	  $MACPUT $macname
	fi
      else 
	$MACPUT -u $hexfile -n ${transfername-stdin} 
      fi
      rm -f $macname.info $macname.data $macname.rsrc
    else
      $MACPUT -u $hexfile -n ${transfername-stdin} 
    fi
    rm -f $hexfile
  else
    echo Can\'t create temporary file $hexfile
  fi
else
  for f in $*; do
    if test -r $f -a ! -d $f; then
      if
	macname=`$XBIN -l $f 2> /dev/null \
	  | sed -n -e 's/^macname: //p' | sed -e 's/ /_/g'`
	test $macname
      then
	if $XBIN $f; then
	  if test $transfername; then
	    $MACPUT $macname -n $transfername
	  else
	    $MACPUT $macname
	  fi
	elif test $transfername; then
	  $MACPUT -u $f -n $transfername
	else
	  $MACPUT -u $f
	fi
	rm -f $macname.info $macname.data $macname.rsrc
      elif test $transfername; then
	$MACPUT -u $f -n $transfername
      else
	$MACPUT -u $f
      fi
    else
      echo "$f: does not exist or is a directory."
    fi
  done
fi
echo -n " "
echo "Downloads done!"
echo -n 
echo -n 
echo -n 
mesg y
-- 
Elgin Lee

UUCP:  ..decvax!decwrl!glacier!navajo!ehl
ARPA:  ehl@su-navajo.ARPA, ehl@su-score.ARPA