SMB HOWTO
  David Wood, dwood@plugged.net.au
  v1.0, 10 August 1996

  This is the SMB HOWTO.  This document describes how to use the Session
  Message Block (SMB) protocol, also called the NetBIOS or LanManager
  protocol, with Linux.

  1.  Introduction

  This is the SMB HOWTO.  This document describes how to use the Session
  Message Block (SMB) protocol, also called the NetBIOS or LanManager
  protocol, with Linux.

  This document is maintained by David Wood (dwood@plugged.net.au).
  Additions, modifications or corrections may be mailed there for
  inclusion in the next release.

  The SMB protocol is used by Microsoft Windows 3.11, NT and 95 to share
  disks and printers.  Using the Samba suite of tools by Andrew
  Tridgell, UNIX (including Linux) machines can share disk and printers
  with Windows hosts.

  There are four things that one can do with Samba:

  1. Share a linux drive with Windows machines.

  2. Share a Windows drive with linux machines.

  3. Share a linux printer with Windows machines.

  4. Share a Windows printer with linux machines.

  All of these are covered in this document.

  Disclaimer: The procedures and scripts either work for the author or
  have been reported to work by the people that provided them.
  Different configurations may not work with the information given here.
  If you encounter such a situation, you may e-mail the author with
  suggestions for improvement in this document, but the author
  guarantees nothing.  What did you expect?  The author is, after all, a
  consultant...

  2.  Further Information

  This HOWTO attempts to explain how to configure basic SMB file and
  print services on a linux machine.  Samba is a very complex and
  complete package.  There would be no point in attempting to duplicate
  all of the documentation for Samba here.

  For further information, please see the following documents:

  �  The Samba documentation, available as part of the Samba
     distribution.  The distribution is available at:
     ftp://nimbus.anu.edu.au/pub/tridge/samba/
     <ftp://nimbus.anu.edu.au/pub/tridge/samba/>

  �  The linux Printing HOWTO.

  �  The Print2Win Mini-HOWTO.

  3.  Installation

  The latest source version of Samba is available from:

  ftp://nimbus.anu.edu.au/pub/tridge/samba/
  <ftp://nimbus.anu.edu.au/pub/tridge/samba/>

  However, if you have installed the Redhat distribution of linux, you
  have the option of installing it as a package.  Some other
  distributions also include the Samba binaries.

  The following two daemons are required for the Samba package.  They
  are typically installed in /usr/sbin and run either on boot from the
  systems startup scripts or from inetd.  Example scripts are shown in
  ``Running the Daemons''.

  ______________________________________________________________________
          smbd (The SMB daemon)
          nmbd (Provides NetBIOS nameserver support to clients)
  ______________________________________________________________________

  Typically, the following Samba binaries are installed in /usr/bin,
  although the location is optional.

  ______________________________________________________________________
          smbclient       (An SMB client for UNIX machines)
          smbprint        (A script to print to a printer on an SMB host)
          smbprint.sysv   (As above, but for SVR4 UNIX machines)
          smbstatus       (Lists the cuurent SMB connections for the local host)
          smbrun          (A 'glue' script to facilitate runnning applciations
                           on SMB hosts)
  ______________________________________________________________________

  Additionally, a script called 'print' is included with this HOWTO,
  which serves as a usefull front end to the smbprint script.

  The Samba package is simple to install.  Simply retrieve the source
  from the location mentioned above, and read the file README in the
  distribution.  There is also a file called docs/INSTALL.txt in the
  distribution that provides a simple step-by-step set of instructions.

  Following installation, place the daemons in /usr/sbin and the
  binaries in /usr/bin.  Install the man pages in /usr/local/man.

  When you made the Samba package, you would have specified in the
  Makefile the location for the configuration file, smb.conf.  This is
  generally in /etc, but you can put it anywhere you like.  For these
  directions, we will presume that you specified the location of the
  configuration file as /etc/smb.conf, the log file location as log file
  = /var/log/samba-log.%m and the lock directory as lock directory =
  /var/lock/samba.

  Install the configuration file, smb.conf.  Go to the directory where
  Samba was built.  Look in the subdirectory examples/simple and read
  the file README.  Copy the file smb.conf found in that directory to
  /etc.  BE CAREFUL!  If you have a linux distribution that already has
  Samba installed, you may already have a Samba configuration file in
  /etc.  You should probably start with that one.

  If you don't want to have your configuration file in /etc, put it
  wherever you want to, then put a symlink in /etc:

  ______________________________________________________________________
          ln -s /path/to/smb.conf /etc/smb.conf
  ______________________________________________________________________

  4.  Running The Daemons

  The two SMB daemons are /usr/sbin/smbd and /usr/sbin/nmbd.

  You can run the Samba daemons from inetd or as stand-alone processes.
  If you are configuring a permanent file server, they should be run
  from inetd so that they will be restarted if they die.  If you just
  want to use SMB services occasionally or to assist with systems
  administration, you can start them with an /etc/rc.d/init.d script or
  even by hand when you need them.

  To run the daemons from inetd, place the following lines in the inetd
  configuration file, /etc/inetd.conf:

       ______________________________________________________________________
           # SAMBA NetBIOS services (for PC file and print sharing)
           netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
           netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
       ______________________________________________________________________

  Then restart the inetd daemon by running the command:

  ______________________________________________________________________
      kill -HUP 1
  ______________________________________________________________________

  To run the daemons from the system startup scripts, put the following
  script in file called /etc/rc.d/init.d/smb and symbolically link it to
  the files specified in the comments:

  ______________________________________________________________________
      #!/bin/sh

      #
      # /etc/rc.d/init.d/smb - starts and stops SMB services.
      #
      # The following files should be synbolic links to this file:
      # symlinks: /etc/rc.d/rc1.d/K35smb  (Kills SMB services on shutdown)
      #           /etc/rc.d/rc3.d/S91smb  (Starts SMB services in multiuser mode)
      #           /etc/rc.d/rc6.d/K35smb  (Kills SMB services on reboot)
      #

      # Source function library.
      . /etc/rc.d/init.d/functions

      # Source networking configuration.
      . /etc/sysconfig/network

      # Check that networking is up.
      [ ${NETWORKING} = "no" ] && exit 0

      # See how we were called.
      case "$1" in
        start)
          echo -n "Starting SMB services: "
          daemon smbd -D
          daemon nmbd -D
          echo
          touch /var/lock/subsys/smb
          ;;
        stop)
          echo -n "Shutting down SMB services: "
          killproc smbd
          killproc nmbd
          rm -f /var/lock/subsys/smb
          echo ""
          ;;
        *)
          echo "Usage: smb {start|stop}"
          exit 1
      esac
  ______________________________________________________________________

  5.  General Configuration (/etc/smb.conf)

  Samba configuration on a linux (or other UNIX machine) is controlled
  by a single file, /etc/smb.conf.  This file determines which system
  resources you want to share with the outside world and what
  restrictions you wish to place on them.

  Since the following sections will address sharing linux drives and
  printers with Windows machines, the smb.conf file shown in this
  section is as simple as you can get, just for introductory purposes.

  Don't worry about the details, yet.  Later sections will introduce the
  major concepts.

  Each section of the file starts with a section header such as global,
  homes, printers, etc.

  The global section defines a few variables that Samba will use to
  define sharing for all resources.

  The homes section allows a remote users to access their (and only
  their) home directory on the local (linux) machine).  That is, if a
  Windows user trys to connect to this share from their Windows
  machines, they will be connected to their personal home directory.
  Note that to do this, they must have an account on the linux box.

  The sample smb.conf file below allows remote users to get to their
  home directories on the local machine and to write to a temporary
  directory.  For a Windows user to see these shares, the linux box has
  to be on the local network.  Then the user simply connects a network
  drive from the Windows File Manager or Windows Explorer.

  Note that in the following sections, additional entries for this file
  will be given to allow more resources to be shared.

       ______________________________________________________________________
       ; /etc/smb.conf
       ;
       ; Make sure and restart the server after making changes to this file, ex:
       ; /etc/rc.d/init.d/smb stop
       ; /etc/rc.d/init.d/smb start

       [global]
       ; Uncomment this if you want a guest account
       ; guest account = nobody
          log file = /var/log/samba-log.%m
          lock directory = /var/lock/samba
          share modes = yes

       [homes]
          comment = Home Directories
          browseable = no
          read only = no
          create mode = 0750

       [tmp]
          comment = Temporary file space
          path = /tmp
          read only = no
          public = yes
       ______________________________________________________________________

  6.  Sharing A Linux Drive With Windows Machines

  As shown in the simple smb.conf above, sharing linux drives with
  Windows users is easy.  However, like everything else with Samba, you
  can control things to a large degree.  Here are some examples:

  To share a directory with the public, create a clone of the tmp
  section above by adding something like this to smb.conf:

  ______________________________________________________________________
  [public]
     comment = Public Stuff
     path = /home/public
     public = yes
     writable = yes
     printable = yes
  ______________________________________________________________________

  To make the above directory readable by the public, but only writable
  by people in group staff, modify the entry like this:

       ______________________________________________________________________
       [public]
          comment = Public Stuff
          path = /home/public
          public = yes
          writable = yes
          printable = no
          write list = @staff
       ______________________________________________________________________

  For other tricks to play with drive shares, see the Samba
  documentation or man pages.

  7.  Sharing A Windows Drive With Linux Machines

  An SMB client program for UNIX machines is included with the Samba
  distribution.  It provides an ftp-like interface on the command line.
  You can uyse this utility to transfer files between a Windows 'server'
  and a linux client.

  To see which shares are available on a given host, run:

  ______________________________________________________________________
      /usr/sbin/smbclient -L host
  ______________________________________________________________________

  where 'host' is the name of the machine that you wish to view.  this
  will return a list of 'service' names - that is, names of drives or
  printers that it can share with you.  Unless the SMB server has no
  security configured, it will ask you for a password.  Get it the
  password for the 'guest' account or for your personal account on that
  machine.

  For example:

  ______________________________________________________________________
      smbclient -L zimmerman
  ______________________________________________________________________

  The output of this command should look something like this:

       ______________________________________________________________________
       Server time is Sat Aug 10 15:58:27 1996
       Timezone is UTC+10.0
       Password:
       Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]

       Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]

               Sharename      Type      Comment
               ---------      ----      -------
               ADMIN$         Disk      Remote Admin
               public         Disk      Public
               C$             Disk      Default share
               IPC$           IPC       Remote IPC
               OReilly        Printer   OReilly
               print$         Disk      Printer Drivers

       This machine has a browse list:

               Server               Comment
               ---------            -------
               HOPPER               Samba 1.9.15p8
               KERNIGAN             Samba 1.9.15p8
               LOVELACE             Samba 1.9.15p8
               RITCHIE              Samba 1.9.15p8
               ZIMMERMAN
       ______________________________________________________________________

  The browse list shows other SMB servers with resources to share on the
  network.

  To use the client, run:

  ______________________________________________________________________
      /usr/sbin/smbclient service <password>
  ______________________________________________________________________

  where 'service' is a machine and share name.  For example, if you are
  trying to reach a directory that has been shared as 'public' on a
  machine called zimmerman, the service would be called
  \\zimmerman\public.  However, due to shell restrictions, you will need
  to escape the backslashes, so you end up with something like this:

  ______________________________________________________________________
      /usr/sbin/smbclient \\\\zimmerman\\public mypasswd
  ______________________________________________________________________

  where 'mypasswd' is the literal string of your password.

  You will get the smbclient prompt:

       ______________________________________________________________________
       Server time is Sat Aug 10 15:58:44 1996
       Timezone is UTC+10.0
       Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
       smb: \>
       ______________________________________________________________________

  Type 'h' to get help using smbclient:

       ______________________________________________________________________
       smb: \> h
       ls             dir            lcd            cd             pwd
       get            mget           put            mput           rename
       more           mask           del            rm             mkdir
       md             rmdir          rd             prompt         recurse
       translate      lowercase      print          printmode      queue
       cancel         stat           quit           q              exit
       newer          archive        tar            blocksize      tarmode
       setmode        help           ?              !
       smb: \>
       ______________________________________________________________________

  If you can use ftp, you shouldn't need the man pages for smbclient.

  8.  Sharing A Linux Printer With Windows Machines

  To share a linux printer with Windows machines, you need to make
  certain that your printer is set up to work under linux.  If you can
  print from linux, setting up an SMB share of the printer is stright
  forward.

  See the Printing HOWTO to set up local printing.

  Since the author uses a printer connected to a Windows NT machine,
  this section should not be taken as definitive, but merely a
  suggestion.  Anyone with details to share, please send them to
  dwood@plugged.net.au so this section can be completed.

  Add printing configuration to your smb.conf:

  ______________________________________________________________________
  [global]
     printing = bsd
     printcap name = /etc/printcap
     load printers = yes
     log file = /var/log/samba-log.%m
     lock directory = /var/lock/samba

  [printers]
     comment = All Printers
     security = server
     path = /var/spool/lpd/lp
     browseable = no
     printable = yes
     public = yes
     writable = no
     create mode = 0700

  [ljet]
     security = server
     path = /var/spool/lpd/lp
     printer name = lp
     writable = yes
     public = yes
     printable = yes
     print command = lpr -r -h -P %p %s
  ______________________________________________________________________

  Make certain that the printer path (in this case under ljet) matches
  the spool directory in /etc/printcap!

  NOTE:  There are some problems sharing printers on UNIX boxes with
  Windows NT machines using Samba.  One problem is with NT seeing the
  shared printer properly.  To fix this, see the notes in the Samba
  distribution in the file docs/WinNT.txt.  The other deals with
  password problems.  See the comments in the same file for an annoying
  gain of understanding and failure to fix the problem.

  9.  Sharing A Windows Printer With Linux Machines

  To share a printer on a Windows machine, you must do the following:

  a) You must have the proper entries in /etc/printcap and they must
  correspond to the local directory structure (for the spool directory,
  etc)

  b) You must have the script /usr/bin/smbprint.  This comes with the
  Samba source, but not with all Samba binary distributions.  A slightly
  modifed copy is discussed below.

  c) If you want to convert ASCII files to Postscript, you must have
  nenscript, or its equivalent.  nenscript is a Postscript converter and
  is generally installed in /usr/bin.

  d)  you may wish to make Samba printing easier by having an easy-to-
  use front end.  A simple perl script to handle ASCII, Postscript or
  created Postscript is given below.

  The /etc/printcap entry below is for an HP 5MP printer on a Windows NT
  host.  The entries are as follows:

  ______________________________________________________________________
          cm - comment
          lp - device name to open for output
          sd - the printer's spool directory (on the local machine)
          af - the accounting file
          mx - the maximum file size (zero is unlimited)
          if - name of the input filter (script)
  ______________________________________________________________________

  For more information, see the Printing HOWTO or the man page for
  printcap.

       ______________________________________________________________________
       # /etc/printcap
       #
       # //zimmerman/oreilly via smbprint
       #
       lp:\
               :cm=HP 5MP Postscript OReilly on zimmerman:\
               :lp=/dev/lp1:\
               :sd=/var/spool/lpd/lp:\
               :af=/var/spool/lpd/lp/acct:\
               :mx#0:\
               :if=/usr/bin/smbprint:
       ______________________________________________________________________

  Make certain that the spool and accounting directories exist and are
  writable.  Ensure that the 'if' line holds the proper path to the
  smbprint script (given below) and make sure that the proper device is
  pointed to (the /dev speical file).

  Next is the smbprint script itself.  It is usually placed in /usr/bin
  and is attributable to Andrew Tridgell, the person who created Samba
  as far as I know.  It comes with the Samba source distribution, but is
  absent from some binary distributions, so I have recreated it here.

  You may wish to look at this carefully.  There are some minor
  alterations that have shown themselves to be useful.

  ______________________________________________________________________
  #!/bin/sh -x

  # This script is an input filter for printcap printing on a unix machine. It
  # uses the smbclient program to print the file to the specified smb-based
  # server and service.
  # For example you could have a printcap entry like this
  #
  # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
  #
  # which would create a unix printer called "smb" that will print via this
  # script. You will need to create the spool directory /usr/spool/smb with
  # appropriate permissions and ownerships for your system.

  # Set these to the server and service you wish to print to
  # In this example I have a WfWg PC called "lapland" that has a printer
  # exported called "printer" with no password.

  #
  # Script further altered by hamiltom@ecnz.co.nz (Michael Hamilton)
  # so that the server, service, and password can be read from
  # a /usr/var/spool/lpd/PRINTNAME/.config file.
  #
  # In order for this to work the /etc/printcap entry must include an
  # accounting file (af=...):
  #
  #   cdcolour:\
  #       :cm=CD IBM Colorjet on 6th:\
  #       :sd=/var/spool/lpd/cdcolour:\
  #       :af=/var/spool/lpd/cdcolour/acct:\
  #       :if=/usr/local/etc/smbprint:\
  #       :mx=0:\
  #       :lp=/dev/null:
  #
  # The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
  #   server=PC_SERVER
  #   service=PR_SHARENAME
  #   password="password"
  #
  # E.g.
  #   server=PAULS_PC
  #   service=CJET_371
  #   password=""

  #
  # Debugging log file, change to /dev/null if you like.
  #
  logfile=/tmp/smb-print.log
  # logfile=/dev/null

  #
  # The last parameter to the filter is the accounting file name.
  #
  spool_dir=/var/spool/lpd/lp
  config_file=$spool_dir/.config

  # Should read the following variables set in the config file:
  #   server
  #   service
  #   password
  #   user
  eval `cat $config_file`

  #
  # Some debugging help, change the >> to > if you want to same space.
  #
  echo "server $server, service $service" >> $logfile

  (
  # NOTE You may wish to add the line `echo translate' if you want automatic
  # CR/LF translation when printing.
          echo translate
          echo "print -"
          cat
  ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile
  ______________________________________________________________________

  Most linux distributions come with nenscript for converting ASCII
  documents to Postscript.  The following perl script makes life easier
  be providing a simple interface to linux printing via smbprint.

  ______________________________________________________________________
  Usage: print [-a|c|p] <filename>
         -a prints <filename> as ASCII
         -c prints <filename> formatted as source code
         -p prints <filename> as Postscript
          If no switch is given, print attempts to
          guess the file type and print appropriately.
  ______________________________________________________________________

  Using smbprint to print ASCII files tends to truncate long lines.
  This script breaks long lines on whitespace (instead of in the middle
  of a word), if possible.

  The source code formatting is done with nenscript.  It takes an ASCII
  file and foramts it in 2 columns with a fancy header (date, filename,
  etc).  It also numbers the lines.  Using this as an example, other
  types of formatting can be accomplished.

  Postscript documents are already properly formatted, so they pass
  through directly.

  ______________________________________________________________________
  #!/usr/bin/perl

  # Script:   print
  # Authors:  Brad Marshall, David Wood
  #           Plugged In Communications
  # Date:     960808
  #
  # Script to print to oreilly which is currently on zimmerman
  # Purpose:  Takes files of various types as arguments and
  # processes them appropriately for piping to a Samba print script.
  #
  # Currently supported file types:
  #
  # ASCII      - ensures that lines longer than $line_length characters wrap on
  #              whitespace.
  # Postscript - Takes no action.
  # Code       - Formats in Postscript (using nenscript) to display
  #              properly (landscape, font, etc).
  #

  # Set the maximum allowable length for each line of ASCII text.
  $line_length = 76;

  # Set the path and name of the Samba print script
  $print_prog = "/usr/bin/smbprint";

  # Set the path and name to nenscript (the ASCII-->Postscript converter)
  $nenscript = "/usr/bin/nenscript";

  unless ( -f $print_prog ) {
          die "Can't find $print_prog!";
  }
  unless ( -f $nenscript ) {
          die "Can't find $nenscript!";
  }

  &ParseCmdLine(@ARGV);

  # DBG
  print "filetype is $filetype\n";

  if ($filetype eq "ASCII") {
          &wrap($line_length);
  } elsif ($filetype eq "code") {
          &codeformat;
  } elsif ($filetype eq "ps") {
          &createarray;
  } else {
          print "Sorry..no known file type.\n";
          exit 0;
  }
  # Pipe the array to smbprint
  open(PRINTER, "|$print_prog") || die "Can't open $print_prog: $!\n";
  foreach $line (@newlines) {
          print PRINTER $line;
  }
  # Send an extra linefeed in case a file has an incomplete last line.
  print PRINTER "\n";
  close(PRINTER);
  print "Completed\n";
  exit 0;

  # --------------------------------------------------- #
  #        Everything below here is a subroutine        #
  # --------------------------------------------------- #
  sub ParseCmdLine {
          # Parses the command line, finding out what file type the file is

          # Gets $arg and $file to be the arguments (if the exists)
          # and the filename
          if ($#_ < 0) {
                  &usage;
          }
          # DBG
  #       foreach $element (@_) {
  #               print "*$element* \n";
  #       }

          $arg = shift(@_);
          if ($arg =~ /\-./) {
                  $cmd = $arg;
          # DBG
  #       print "\$cmd found.\n";

                  $file = shift(@_);
          } else {
                  $file = $arg;
          }

          # Defining the file type
          unless ($cmd) {
                  # We have no arguments

                  if ($file =~ /\.ps$/) {
                          $filetype = "ps";
                  } elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {
                          $filetype = "code";
                  } else {
                          $filetype = "ASCII";
                  }

                  # Process $file for what type is it and return $filetype
          } else {
                  # We have what type it is in $arg
                  if ($cmd =~ /^-p$/) {
                          $filetype = "ps";
                  } elsif ($cmd =~ /^-c$/) {
                          $filetype = "code";
                  } elsif ($cmd =~ /^-a$/) {
                          $filetype = "ASCII"
                  }
          }
  }

  sub usage {
          print "
  Usage: print [-a|c|p] <filename>
         -a prints <filename> as ASCII
         -c prints <filename> formatted as source code
         -p prints <filename> as Postscript
          If no switch is given, print attempts to
          guess the file type and print appropriately.\n
  ";
          exit(0);
  }

  sub wrap {
          # Create an array of file lines, where each line is < the
          # number of characters specified, and wrapped only on whitespace

          # Get the number of characters to limit the line to.
          $limit = pop(@_);

          # DBG
          #print "Entering subroutine wrap\n";
          #print "The line length limit is $limit\n";

          # Read in the file, parse and put into an array.
          open(FILE, "<$file") || die "Can't open $file: $!\n";
          while(<FILE>) {
                  $line = $_;

                  # DBG
                  #print "The line is:\n$line\n";

                  # Wrap the line if it is over the limit.
                  while ( length($line) > $limit ) {

                          # DBG
                          #print "Wrapping...";

                          # Get the first $limit +1 characters.
                          $part = substr($line,0,$limit +1);

                          # DBG
                          #print "The partial line is:\n$part\n";

                          # Check to see if the last character is a space.
                          $last_char = substr($part,-1, 1);
                          if ( " " eq $last_char ) {
                              # If it is, print the rest.

                              # DBG
                              #print "The last character was a space\n";

                              substr($line,0,$limit + 1) = "";
                              substr($part,-1,1) = "";
                              push(@newlines,"$part\n");
                          } else {
                               # If it is not, find the last space in the
                               # sub-line and print up to there.

                              # DBG
                              #print "The last character was not a space\n";

                               # Remove the character past $limit
                               substr($part,-1,1) = "";
                               # Reverse the line to make it easy to find
                               # the last space.
                               $revpart = reverse($part);
                               $index = index($revpart," ");
                               if ( $index > 0 ) {
                                 substr($line,0,$limit-$index) = "";
                                 push(@newlines,substr($part,0,$limit-$index)
                                     . "\n");
                               } else {
                                 # There was no space in the line, so
                                 # print it up to $limit.
                                 substr($line,0,$limit) = "";
                                 push(@newlines,substr($part,0,$limit)
                                     . "\n");
                               }
                          }
                  }
                  push(@newlines,$line);
          }
          close(FILE);
  }

  sub codeformat {
          # Call subroutine wrap then filter through nenscript
          &wrap($line_length);

          # Pipe the results through nenscript to create a Postscript
          # file that adheres to some decent format for printing
          # source code (landscape, Courier font, line numbers).
          # Print this to a temporary file first.
          $tmpfile = "/tmp/nenscript$$";
          open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
                  die "Can't open nenscript: $!\n";
          foreach $line (@newlines) {
                  print FILE $line;
          }
          close(FILE);

          # Read the temporary file back into an array so it can be
          # passed to the Samba print script.
          @newlines = ("");
          open(FILE, "<$tmpfile") || die "Can't open $file: $!\n";
          while(<FILE>) {
                  push(@newlines,$_);
          }
          close(FILE);
          system("rm $tmpfile");
  }

  sub createarray {
          # Create the array for postscript
          open(FILE, "<$file") || die "Can't open $file: $!\n";
          while(<FILE>) {
                  push(@newlines,$_);
          }
          close(FILE);
  }
  ______________________________________________________________________

  10.  Copyright

  This HOWTO is copyright 1996 by David Wood.  It may be reproduced in
  any form and freely distributed as long as the file stays intact,
  including this statement.

  11.  Acknowledgements

  As soon as you mail me with suggestions, I'll acknowledge you here in
  the next release.