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

  Questo  lo SMB HOWTO.  Il documento descrive come usare con Linux il
  protocollo Session Message Block (SMB), chiamato anche protocollo Net
  BIOS o LanManager.  Traduzione: Andrea Girotto
  (andrea.girotto@usa.net)

  1.  Introduzione

  Questo  lo SMB HOWTO.  Il documento descrive come usare con Linux il
  protocollo Session Message Block (SMB), chiamato anche protocollo
  NetBIOS o LanManager.  Traduzione: Andrea Girotto
  (andrea.girotto@usa.net)

  Questo documento  gestito da David Wood (dwood@plugged.net.au).
  Aggiunte, modifiche o correzioni per la versione successiva di questo
  documento, possono essere spedite all'indirizzo indicato.

  Il pacchetto Samba sostanzialmente consente di:

  1. Condividere un drive Linux con macchine Windows.

  2. Condividere un drive Windows con macchine Linux.

  3. Condividere una stampante Linux con macchine Windows.

  4. Condividere una stampante Windows con macchine Linux.

  Tutte queste possibilit sono discusse in questo documento.

  Attenzione: Le procedure, i programmi e gli script riportati, o si
  sono dimostrati operanti per l'autore, o sono stati riportati esserlo
  dalle persone che li hanno forniti; con configurazioni differenti
  potrebbero non funzionare; se ci si trova in tale situazione, 
  possibile spedire un email all'autore con i suggerimenti per
  migliorare questo documento. In ogni caso l'autore non garantisce
  nulla.

  2.  Altre Informazioni

  Questo HOWTO spiega come configurare servizi minimi di file e di
  stampa per SMB su una macchina Linux.  Samba  un pacchetto piuttosto
  completo e complesso.  Non viene fatto alcun tentativo di duplicare
  tutta la documentazione Samba.

  Per maggiori informazioni, consultare i seguenti documenti:

    La documentazione Samba, disponibile come parte del pacchetto
     Samba.  La distribuzione  disponibile:
     ftp://nimbus.anu.edu.au/pub/tridge/samba/
     <ftp://nimbus.anu.edu.au/pub/tridge/samba/>

    Il Printing HOWTO di Linux.

    Il Print2Win Mini-HOWTO.

  3.  Installazione

  L'ultima versione di Samba  disponibile da:

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

  La distribuzione Redhat di Linux, fornisce l'opportunit di
  installarlo come pacchetto.  Altre distribuzioni includono il codice
  binario di Samba.

  Due sono i demoni richiesti per il pacchetto Samba.  Tipicamente sono
  installati in /usr/sbin ed eseguiti o in fase di boot dagli script di
  startup del sistema o da inetd.  Script di esempio sono elencati in
  ``Eseguire i demoni''.

  ______________________________________________________________________
      smbd (Il demone SMB)
      nmbd (Fornisce supporto di NetBIOS nameserver per i client)
  ______________________________________________________________________

  Di solito (la posizione  opzionale) i seguenti programmi di Samba
  sono installati in /usr/bin:

  ______________________________________________________________________
      smbclient   (Client SMB per macchine UNIX)
      smbprint    (Script per usare la stampante di un SMB host)
      smbprint.sysv   (Come smbprint per macchine con UNIX SVR4)
      smbstatus   (Elenca le connessioni SMB correnti per il computer locale)
      smbrun      (Facilita l'esecuzioni di applicazioni su un SMB host)
  ______________________________________________________________________

  Inoltre, incluso in questo HOWTO, c'  uno script chiamato
  ``'print''', da usare come front end per smbprint.

  Il pacchetto Samba  semplice da installare.  Per prima cosa 
  necessario recuperare il sorgente dal sito elencato precedentemente e
  leggere il file README della distribuzione.  C' anche un file
  chiamato docs/INSTALL.txt che fornisce istruzioni passo-a-passo.

  Seguendo l'installazione, si pongono i demoni in /usr/sbin ed i
  programmi in /usr/bin. Le pagine del manuale in /usr/local/man.

  Compilando il pacchetto Samba, si specifica nel Makefile la locazione
  del file di configurazione smb.conf, generalmente /etc, ma pu essere
  una qualsiasi.  Per questo documento si suppone che il file di
  configurazione sia /etc/smb.conf; altri file di configurazione:
  /var/log/samba-log.%m e lock directory /var/lock/samba.  NdT:
  attenzione dalla versione 1.9.16p11 di Samba le impostazioni
  predefinite sono piuttosto diverse.

  Se non si desidera avere il file di configurazione in /etc, pu essere
  messo in una posizione qualsiasi e magari collegato con un link
  simbolico in /etc:

  ______________________________________________________________________
      ln -s /percorso/di/smb.conf /etc/smb.conf
  ______________________________________________________________________

  4.  Eseguire I Demoni

  I due demoni SMB sono: /usr/sbin/smbd e /usr/sbin/nmbd.

  I demoni Samba possono essere eseguiti da inetd o come processi a s
  stanti.  Configurando un file server permanente, conviene siano
  eseguiti da inetd cos da farli ripartire automaticamente, se
  dovessero terminare; invece se si desidera usare i servizi SMB
  occasionalmente o per assistenza nell'amministrazione di sistema, 
  possibile eseguirli con uno script /etc/rc.d/init.d o perfino, quanto
  necessario, dalla linea di comando.

  Per eseguire i demoni da inetd, si deve aggiungere nel file di
  configurazione di inetd, /etc/inetd.conf:

       ______________________________________________________________________
           # Servizi NetBIOS SAMBA (per condivisione di file e stampanti con PC)
           netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
           netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
       ______________________________________________________________________

  Quindi far ripartire il demone di inetd con il comando:

  ______________________________________________________________________
      kill -HUP 1
  ______________________________________________________________________

  Per eseguire i demoni dagli script di startup del sistema, si possono
  mettere i seguenti script in un file chiamato /etc/rc.d/init.d/smd e
  fare collegamenti simbolici a file indicati nei commenti:

  ______________________________________________________________________
      #!/bin/sh

      #
      # /etc/rc.d/init.d/smb - inizia e termina i servizi SMB.
      #
      # file che seguono devono essere link simbolici a questo file:
      # symlinks: /etc/rc.d/rc1.d/K35smb  (termina i servizi SMB durante shutdown)
      #           /etc/rc.d/rc3.d/S91smb  (inizia i servizi SMB in multiuser mode)
      #           /etc/rc.d/rc6.d/K35smb  (Termina i servizi SMB prima di reboot)
      #

      # Sorgente per funzioni di libreria.
      . /etc/rc.d/init.d/functions

      # Sorgente per la configurazione di rete.
      . /etc/sysconfig/network

      # Verifica che la rete sia configurata.
      [ ${NETWORKING} = "no" ] && exit 0

      # Controlla il tipo di chiamata.
      case "$1" in
        start)
          echo -n "Attivati servizi SMB: "
          daemon smbd -D
          daemon nmbd -D
          echo
          touch /var/lock/subsys/smb
          ;;
       stop)
          echo -n "Terminati servizi SMB: "
          killproc smbd
          killproc nmbd
          rm -f /var/lock/subsys/smb
          echo ""
          ;;
       *)
          echo "Uso: smb {start|stop}"
          exit 1
      esac
  ______________________________________________________________________

  5.  Configurazione Generale (/etc/smb.conf)

  La configurazione di Samba su Linux (o su altre macchine UNIX) 
  controllata da un singolo file, /etc/smb.conf, che determina quali
  risorse di sistema si desidera condividere con il mondo esterno e
  quali restrizioni attivare.

  Ai fini di introduzione il file smb.conf mostrato in questa sezione
  sar il pi semplice possibile per concentrare l'attenzione su come
  condividere dischi e stampanti Linux con macchine Windows.

  Le sezioni successive introdurranno altri concetti.

  Ciascuna sezione del file inizia con un'intestazione come global,
  homes, printers, ecc.

  La sezione global definisce variabili usate da Samba per definire la
  condivisione di tutte le risorse.
  La sezione homes consente ad un utente remoto accesso alla propria (e
  solo quella) home directory sulla macchina locale (Linux).  Quindi se
  un utente Windows cerca di connettersi a questa condivisione da una
  macchina Windows, verr connesso alla propria home directory.  Notare
  che per poter accedere alla condivisione  necessario avere un account
  sulla macchina Linux.

  Il file di esempio smb.conf fornito, consente ad utenti remoti di
  accedere al proprio home directory dalla macchina locale e di scrivere
  in un directory temporaneo.  Affinch un utente Windows veda queste
  condivisioni,  necessario che la macchina Linux sia sulla rete
  locale.  Quindi l'utente semplicemente connette un disco di rete dal
  File Manager di Windows oppure da Windows Explorer.

  Nelle sezioni che seguono saranno fornite specificazioni aggiuntive
  per la configurazione al fine di condividere maggiori risorse.

       ______________________________________________________________________
       ; /etc/smb.conf
       ;
       ; Dopo aver modificato questo file assicurarsi di far ripartire il server,
       ; esempio:
       ; /etc/rc.d/init.d/smb stop
       ; /etc/rc.d/init.d/smb start

       [global]
       ; Attivare questa linea se si desidera un account generico
       ; guest account = nobody
          log file = /var/log/samba-log.%m
          lock directory = /var/lock/samba
          share modes = yes

       [homes]
          comment = Directory Personali
          browseable = no
          read only = no
          create mode = 0750

       [tmp]
          comment =  Spazio per file temporanei.
          path = /tmp
          read only = no
          public = yes
       ______________________________________________________________________

  6.  Condividere Un Disco Linux Con Macchine Windows

  Come dimostrato nel precedente smb.conf,  alquanto semplice
  condividere dischi Linux con utenti Windows.  Come ogni altra cosa in
  Samba, si pu controllare il comportamento con notevole precisione.
  Ecco alcuni esempi:

  Per condividere pubblicamente un directory, si pu creare una copia
  della sezione tmp aggiungendo al smb.conf qualcosa come:

  ______________________________________________________________________
  [public]
     comment = Pubblicamente Accessibile
     path = /home/public
     public = yes
     writable = yes
     printable = yes
  ______________________________________________________________________

  Le seguenti modifiche rendono il directory precedente pubblicamente
  leggibile e scrivibile solo dalle persone del gruppo staff:

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

  Consultare la documentazione Samba o le pagine del manuale per altre
  configurazioni particolari di condivisione.

  7.  Condividere Un Disco Windows Con Macchine Linux

  Con la distribuzione Samba,  incluso un programma client del
  protocollo SMB per macchine UNIX .  Dispone di un'interfaccia a linea
  di comando simile ad ftp.  Si pu usare questo programma per
  trasferire file tra un server Windows ed un client Linux.

  Per elencare le condivisioni disponibili su un dato host, 
  sufficiente eseguire:

  ______________________________________________________________________
      /usr/sbin/smbclient -L host
  ______________________________________________________________________

  dove 'host'  il nome della macchina che si desidera interrogare.
  Questo comando ritorna una lista di nomi di 'servizi', cio nomi di
  dischi o stampanti che si possono condividere.  A meno che il server
  SMB non sia configurato per nessuna sicurezza, richieder un password.
  Potrebbe essere essere il password per l'account 'guest' di quella
  macchina o il proprio personale.

  Per esempio:

  ______________________________________________________________________
      smbclient -L zimmerman
  ______________________________________________________________________

  L'output di questo comando dovrebbe somigliare a qualcosa del tipo:

       ______________________________________________________________________
       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
       ______________________________________________________________________

  Il "browse list" elenca altri server SMB sulla rete con risorse da
  condividere.

  Per eeguire il client:

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

  dove 'servizio'  il nome di macchina e servizio.  Per esempio se si
  desidera raggiungere un directory condiviso come 'public' su una
  macchina chiamata zimmerman, il servizio dovrebbe essere chiamato:
  \\zimmerman\public.  Per le restrizioni dello shell ci sar bisogno di
  raddoppiare le barre inverse, qualcosa come:

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

  dove 'passwd'  la propria password.

  A questo punto smbclient dovrebbe presentare la propria richiesta
  comandi:

       ______________________________________________________________________
       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: \>
       ______________________________________________________________________

  Scrivendo 'h' si ottiene aiuto per usare 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: \>
       ______________________________________________________________________

  Per chi conosce ftp, non dovrebbe essere necessario consultare le
  pagine del manuale di smbclient.

  8.  Condividere Una Stampante Linux Con Macchine Windows

  Per condividere una stampante Linux con macchine Windows,  necessario
  accertarsi che la propria stampante sia correttamente configurata e
  funzioni con Linux.  Se  possibile stampare da Linux, configurarla
  come condivisione SMB  abbastanza semplice.

  Consultare il Printing HOWTO per configurare la stampa locale.

  Dal momento che l'autore usa una stampante connessa con una macchina
  Windows NT, questa sezione non dovrebbe essere presa come definitiva,
  ma come semplici suggerimenti.  Chiunque abbia modifiche o aggiunte da
  fare, contatti per favore: dwood@plugged.net.au in modo da completare
  questa sezione.

  Aggiungere la configurazione di stampa al proprio 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
  ______________________________________________________________________

  Accertarsi che il percorso della stampante (in questo caso ljet)
  corrisponda al directory di spool in /etc/printcap!

  NOTA: ci sono alcuni problemi per condividere stampanti di macchine
  UNIX con macchine Windows NT usando Samba.  Un problema  che NT non
  vede correttamente la stampante condivisa.  Per rimediare consultare
  le note nella distribuzione Samba nel file docs/WinNT.txt.  Altri
  problemi hanno a che fare con i password.  Vedere i commenti nello
  stesso file per una maggiore comprensione o in caso di problemi nella
  configurazione.

  9.  Condividere Una Stampante Windows Con Macchine Linux

  Per condividere una stampante su una macchina Windows,  necessario:

  1. Avere una configurazione corretta in /etc/printcap che corrisponda
     alla struttura dei directory locali (per il directory di spool,
     ecc.)

  2. Usare lo script /usr/bin/smbprint.  Questo script  disponibile con
     il sorgente di Samba, purtroppo non con tutte le distribuzioni in
     formato binario.  Pi avanti verr presentata una versione
     leggermente diversa di ``smbprint''.

  3. Se si desidera convertire file ASCII a Postscript,  necessario
     avere nenscript, o qualcosa di equivalente. nenscript  un
     convertitore Postscript generalmente installato in /usr/bin.

  4. Si potrebbe desiderare rendere la stampa con Samba pi semplice
     tramite un semplice front-end. Un semplice script (``'print''') in
     Perl per manipolare ASCII, Postscript  dato oltre.

  La configurazione sotto di /etc/printcap  valida per una stampante HP
  5MP su un host Windows NT.  Le linee hanno il seguente significato:

  ______________________________________________________________________
      cm - commento
      lp - dispositivo da aprire per output
      sd - il directory di spool della stampante sulla macchina locale
      af - file per registrare le transazioni
      mx - massima grandezza per un file (zero significa nessun limite)
      if - nome del filtro di output (script)
  ______________________________________________________________________

  Per maggiori informazioni consultare il Printing HOWTO o le pagine del
  manuale per la voce 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:
       ______________________________________________________________________

  E' necessario accertarsi che i directory di spool e per la
  registrazione delle transazioni esistano e siano scrivibili.
  Assicurarsi che la linea 'if' contenga un percorso corretto allo
  script di smbprint (dato oltre) ed inoltre che il dispositivo puntato
  sia corretto (il file speciale /dev).

  Di seguito lo script smbprint.  Di solito  piazzato in /usr/bin ed 
  attribuibile ad Andrew Tridgell, per quanto ne so, la persona che ha
  creato Samba.  Viene fornito con la distribuzione in formato sorgente
  di Samba ma lo riporto, essendo assente in certe distribuzioni in
  formato binario.

  Potrebbe essere utile studiarlo attentamente, ci sono alcune piccole
  modifiche che hanno dimostrato essere utili.

  ______________________________________________________________________
  #!/bin/sh -x

  # Questo script  un filtro di input per la stampa via printcap da una
  # macchina UNIX. Usa il programma smbclient per stampare il file sul
  # server e servizio specificati usando il protocollo smb.
  # Per esempio  ossibile avere una linea del printcap del tipo:
  #
  # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
  #
  # Che dovrebbe creare una stampante UNIX chiamata "smb" che stamper
  # attraverso questo script. E' necessario creare il directory di spool
  # /usr/spool/smb con permessi, proprietario e gruppo appropriati per il
  # sistema.

  # Assegnare i valori che seguono in modo da accordarsi al server e
  # e servizio su cui si desidera stampare. In questo esempio si suppone
  # di avere un PC con WfWg chiamato "lapland" che ha una stampante
  # esportata chiamata "printer" senza password.
  #
  # Script modificato da hamiltom@ecnz.co.nz (Michael Hamilton)
  # in modo da poter leggere server, servizio e password dal file
  # /usr/var/spool/lpd/PRINTNAME/.config
  #
  # Affinch tutto funzioni  necessario che esista una linea in
  # /etc/printcap che includa il file di accounting (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:
  #
  # Il file /usr/var/spool/lpd/PRINTNAME/.config dovrebbe contenere:
  #   server=PC_SERVER
  #   service=PR_SHARENAME
  #   password="password"
  #
  # Esempio:
  #   server=PAULS_PC
  #   service=CJET_371
  #   password=""

  #
  # File per i messaggi di debug, cambiare in /dev/null se si preferisce.
  #
  logfile=/tmp/smb-print.log
  # logfile=/dev/null

  #
  # L'ultimo parametro del filtro  il file per la registrazione delle
  # transazioni.
  #
  spool_dir=/var/spool/lpd/lp
  config_file=$spool_dir/.config

  # Le seguenti variabili dovrebbero essere assegnate nel file di
  # configurazione:
  #   server
  #   service
  #   password
  #   user
  eval `cat $config_file`
  #
  # Supporto per il debugging si pu cambiare >> con > per risparmiare
  # spazio.
  #
  echo "server $server, service $service" >> $logfile

  (
  # NOTA Si potrebbe desiderare di aggiungere la linea `echo translate'
  # per avere la conversione automatica CR/LF quando si stampa.
      echo translate
      echo "print -"
      cat
  ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile
  ______________________________________________________________________

  La maggior parte delle distribuzioni Linux arriva con nenscript per
  convertire documenti ASCII a Postscript.  Lo script Perl che segue
  rende la vita pi semplice agendo da semplice interfaccia per la
  stampa di Linux attraverso 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.
  ______________________________________________________________________

  Usare smbprint per stampare file ASCII comporta a volte il troncare le
  linee lunghe.  Lo script che segue, se possibile, interrompe le linee
  lunghe su uno spazio (invece che in mezzo ad una parola).

  La formattazione del codice sorgente  fatta con nenscript.  Il file
  ASCII viene formattato su 2 colonne con un'intestazione (data, nome
  del file, ecc.) inoltre numera le linee.  Usandolo come esempio, 
  possibile realizzare altri tipi di formattazione.

  I documenti Postscript sono gi correttamente formattati, quindi
  passano senza essere modificati.

  ______________________________________________________________________
  #!/usr/bin/perl

  # Script:   print
  # Autore:   Brad Marshall, David Wood
  #           Plugged In Communications
  # Data:     960808
  #
  # Script per stampare su oreilly che  attualmente connessa a zimmerman
  # Scopo:  Dati diversi tipi di file come argomenti, li elabora
  # correttamente per mandarli in pipe ad uno script di stampa Samba.
  #
  # Tipi di file correntemente supportati:
  #
  # ASCII      - Verifica che le linee pi lunghe di $line_length caratteri
  #              si interrompano su spazio.
  # Postscript - Intrapresa nessuna azione.
  # Codice     - Formatta in Postscript (usando nenscript) per rendere al
  #              al meglio (in orizzontale, font, ecc.)
  #

  # Lunghezza massima concessa per ciascuna linea di testo ASCII.
  $line_length = 76;

  # Nome e percorso dello script di stampa Samba
  $print_prog = "/usr/bin/smbprint";

  # Nome e percorso di nenscript (converte ASCII-->Postscript)
  $nenscript = "/usr/bin/nenscript";

  unless ( -f $print_prog ) {
      die "Non trovo: $print_prog!";
  }
  unless ( -f $nenscript ) {
      die "Non trovo: $nenscript!";
  }

  &ParseCmdLine(@ARGV);

  # DBG
  print "Il file e' di tipo: $filetype\n";

  if ($filetype eq "ASCII") {
      &wrap($line_length);
  } elsif ($filetype eq "code") {
      &codeformat;
  } elsif ($filetype eq "ps") {
      &createarray;
  } else {
      print "Spiacente...file di tipo sconosciuto.\n";
      exit 0;
  }
  # Pipe the array to smbprint
  open(PRINTER, "|$print_prog") || die "Impossibile aprire $print_prog: $!\n";
  foreach $line (@newlines) {
      print PRINTER $line;
  }
  # Spedisce un linefeed extra nel caso in cui il file abbia l'ultima linea
  # incompleta.
  print PRINTER "\n";
  close(PRINTER);
  print "Finito.\n";
  exit 0;

  # --------------------------------------------------- #
  #   Da questo punto in poi ci sono solo subroutine    #
  # --------------------------------------------------- #

  sub ParseCmdLine {
      # Analizza la linea di comand, cercando di riconoscere il tipo di
      # file.

          # Se esistono imposta $arg e $file agli argomenti.
      if ($#_ < 0) {
          &usage;
      }
      # DBG
  #   foreach $element (@_) {
  #       print "*$element* \n";
  #   }

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

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

      # Definisce il tipo di file
      unless ($cmd) {
          # Nessun argomento

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

          # Elabora $file in base al suo tipo e ritorna $filetype
      } else {
          # Il tipo che e' viene restituito in $arg
          if ($cmd =~ /^-p$/) {
              $filetype = "ps";
          } elsif ($cmd =~ /^-c$/) {
              $filetype = "code";
          } elsif ($cmd =~ /^-a$/) {
              $filetype = "ASCII"
          }
      }
  }

  sub usage {
      print "
  Uso: print [-a|c|p] <nomefile>
         -a stampa <nomefile> come ASCII
         -c stampa <nomefile> formattato come codice sorgente
         -p stampa <nomefile> come Postscript
          Se non viene fornito alcun parametro, cerca di
          indovinare il tipo e stamparlo adeguatamente.\n
  ";
      exit(0);
  }

  sub wrap {
          # Crea un array di linee del file, dove ciascuna linea e' <
          # del numero di caratteri specificato, e termina solo su spazi.
          # Recupera il numero di caratteri a cui limitare la linea.
      $limit = pop(@_);

      # DBG
      #print "Entra subroutine wrap\n";
      #print "La lunghezza limite per la linea e' $limit\n";

      # Leggi il file, analizzalo e mettilo nell'array.
      open(FILE, "<$file") || die "Impossibile aprire: $file: $!\n";
      while(<FILE>) {
          $line = $_;

          # DBG
          #print "La linea e':\n$line\n";

          # Se la linea e' oltre il limite vai a capo.
          while ( length($line) > $limit ) {

              # DBG
              #print "Limita...";

              # Prendi i primi $limit +1 caratteri.
              $part = substr($line,0,$limit +1);

              # DBG
              #print "La linea parziale e':\n$part\n";

                          # verifica se l'ultimo carattere e' spazio
              $last_char = substr($part,-1, 1);
              if ( " " eq $last_char ) {
                  # Se lo e' stampa il resto.

                  # DBG
                  #print "L'ultimo carattere era spazio\n";

                  substr($line,0,$limit + 1) = "";
                  substr($part,-1,1) = "";
                  push(@newlines,"$part\n");
              } else {
                   # se non lo e', cerca l'ultimo spazio nella
                   # sottolinea e stampa fino a li'.

                  # DBG
                  #print "L'ultimo carattere non era spazio\n";

                   # RImuove i caratteri oltre $limit
                   substr($part,-1,1) = "";
                   # Rovescia la linea per rendere semplice da trovare
                   # l'ultimo carattere.
                   $revpart = reverse($part);
                   $index = index($revpart," ");
                   if ( $index > 0 ) {
                     substr($line,0,$limit-$index) = "";
                     push(@newlines,substr($part,0,$limit-$index)
                         . "\n");
                   } else {
                     # Non c'erano spazi cosi' stampa fino a $limit
                     substr($line,0,$limit) = "";
                     push(@newlines,substr($part,0,$limit)
                         . "\n");
                   }
              }
          }
          push(@newlines,$line);
      }
      close(FILE);
  }

  sub codeformat {
      # Chiama la funzione wrap e poi filtra il risultato attraverso
      # nenscript
      &wrap($line_length);

      # Manda il risultato attraverso nenscript per creare un file
      # Postscript che abbia un formato accettabile di stampa per
      # il codice sorgente (stile orizzontale, font Courier, numeri
      # di linea)
      # Per prima cosa stampa su un file temporaneo.
      $tmpfile = "/tmp/nenscript$$";
      open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
          die "Non posso aprire nenscript: $!\n";
      foreach $line (@newlines) {
          print FILE $line;
      }
      close(FILE);

      # Legge il file temporaneo inun array per passarlo allo script di
      # stampa di Samba
      @newlines = ("");
      open(FILE, "<$tmpfile") || die "Impossibile aprire $file: $!\n";
      while(<FILE>) {
          push(@newlines,$_);
      }
      close(FILE);
      system("rm $tmpfile");
  }

  sub createarray {
      # Crea l'array per Postscript
      open(FILE, "<$file") || die "Impossibile aprire $file: $!\n";
      while(<FILE>) {
          push(@newlines,$_);
      }
      close(FILE);
  }
  ______________________________________________________________________

  10.  Copyright

  Questo HOWTO  copyright 1996 di David Wood.  Pu essere riprodotto in
  qualsiasi forma e liberamente distribuito fintanto che il file resta
  intatto, compresa questa affermazione.

  11.  Riconoscimenti

  Non appena mi scriverete con suggerimenti, comparir il vostro nome
  nella versione immediatamente successiva.

