  SMB HOWTO
  David Wood, dwood@plugged.net.au
  Adaptation  francaise  par Etienne Bernard eb@via.ecp.fr, 28
  Avril 1997.

  v1.0, 10 Aout 1996

  Voici le SMB-HOWTO, decrivant comment utiliser sous Linux le  protocol
  SMB  ("  Session Message Block ") egalement appele le protocol NetBIOS
  ou LanManager.

  11..

  IInnttrroodduuccttiioonn

  Voici le SMB-HOWTO, decrivant comment utiliser sous Linux le  protocol
  SMB  ("  Session Message Block ") egalement appele le protocol NetBIOS
  ou LanManager.

  Ce  document  est  maintenu  par  David  Wood  (dwood@plugged.net.au).
  Veuillez  envoyer  vos  ajouts,  modifications  ou corrections a cette
  adresse, pour qu'ils soient inclus dans la version suivante.

  Le protocol SMB est utilise par Microsoft Windows 3.11, NT et 95  pour
  partager des disques et des imprimantes. En utilisant les outils Samba
  d'Andrew Tridgell, les systemes Unix (Linux inclus) peuvent  egalement
  partager des disques et des imprimantes avec des hotes Windows.

  Vous pouvez faire quatre choses avec Samba :

  1. Partager un disque Linux pour des machines Windows ;

  2. Acceder a disque Windows depuis une machine Linux ;

  3. Partager une imprimante Linux pour des machines Windows ;

  4. Utiliser une imprimante Windows a partir d'un hote Linux.

  Tous ces points sont abordes dans ce document.

  Mise  en  garde  :  Les  procedures  decrites et les scripts presentes
  fonctionnent pour l'auteur ou les personnes qui les  ont  ecrits.  Les
  informations  donnees  dans ce document peuvent ne pas fonctionner sur
  une configuration differente. Si vous rencontrez un probleme,  ecrivez
  un  mail  a  l'auteur  avec  vos suggestions pour l'amelioration de ce
  document, mais l'auteur ne garantit rien.  Qu'attendiez-vous  ?  Apres
  tout, l'auteur n'est qu'un consultant...

  22..

  PPoouurr pplluuss dd''iinnffoorrmmaattiioonnss

  Cet  HOWTO tente d'expliquer comment configurer de maniere basique les
  services SMB de partage de fichier et d'imprimantes sous Linux.  Samba
  est un ensemble de programme tres complet, et tres complexe egalement.
  Cela ne servirait a rien de recopier la documentation de Samba dans ce
  document.

  Pour  de plus amples informations, veuillez vous referer aux documents
  suivants :

  +o  La documentation de Samba, disponible au sein de la distribution de
     Samba.     Cette     distribution     est     disponible     a    :
     ftp://nimbus.anu.edu.au/pub/tridge/samba/
     <ftp://nimbus.anu.edu.au/pub/tridge/samba/>
     N.d.T. : Vous pouvez recuperer les sources de Samba sur ftp.ibp.fr

  +o  Le Printing-HOWTO.

  +o  Le Print2Win Mini-HOWTO.

  33..

  IInnssttaallllaattiioonn

  Les sources de la derniere version de Samba sont disponibles sur :

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

  Cependant, si vous avez installe la distribution RedHat de Linux, vous
  pour  pouvez l'installer comme package. Certaines autres distributions
  proposent egalement un  package  Samba  (N.d.T  :  dont  Slackware  et
  Debian).

  Les  deux  "  daemons  " suivant sont necessaires pour Samba. Ils sont
  generalement installe dans le repertoire /usr/sbin et sont lances soit
  au demarrage soit par inetd. Des scripts d'exemple sont presentes dans
  la section ``Lancer les daemons''.

     ssmmbbdd
        Le daemon SMB ;

     nnmmbbdd
        Propose le support du serveur de nom NetBIOS aux clients.

  En general, les binaires Samba suivant sont installes  dans  /usr/bin,
  bien que leur emplacement soit variable.

     ssmmbbcclliieenntt
        Un client SMB pour machines Unix ;

     ssmmbbpprriinntt
        Un script pour imprimer sur l'imprimante d'un hote SMB ;

     ssmmbbpprriinntt..ssyyssvv
        Comme ci-dessus, mais pour des Unix SVR4 ;

     ssmmbbssttaattuuss
        Liste les connexions SMB presentes sur localhost ;

     ssmmbbrruunn
        Un  script  pour  faciliter  le lancement d'applications sur des
        hotes SMB.

  De plus, un script nomme " print " est inclus dans cet HOWTO. Il  sert
  d'interface au script smbprint.

  Le  package  Samba  est simple a installer. Il suffit de recuperer les
  sources depuis les sites mentionnes plus haut, et de lire les fichiers
  README  fournis  dans  la  distribution.  Le  fichier docs/INSTALL.txt
  fourni un ensemble d'instruction simple pour une configuration  pas  a
  pas.

  Installez  les  daemons  dans  /usr/sbin et les autres programmes dans
  /usr/bin. Installez les pages _m_a_n dans /usr/local/man.

  Lors de la compilation du package Samba, vous avez du  specifier  dans
  le Makefile l'emplacement du fichier de configuration, smb.conf. Il se
  trouve generalement dans /etc, mais vous pouvez le placer ou bon  vous
  semble.  Dans  la suite du document, nous considererons que ce fichier
  de  configuration  est  /etc/smb.conf,  que  le  fichier  de  log  est
  /var/log/samba.log.%m  (valeur de " logfile " dans le Makefile) et que
  le  repertoire  des  _l_o_c_k_s  (verrous)  est  /var/lock/samba  ("   lock
  directory " dans le Makefile).

  Installez  le  fichier  de  configuration,  smb.conf.   Allez  dans le
  repertoire dans lequel vous avez compile Samba. Consultez  le  fichier
  README  dans le repertoire examples/simple. Copiez le fichier smb.conf
  de ce  repertoire  vers  /etc.  ATTENTION  !   Si  vous  utilisez  une
  distribution  Linux et que vous avez deja installe Samba, il doit deja
  exister un  fichier  smb.conf  dans  /etc.  Vous  devriez  sans  doute
  commencer avec celui-la.

  Si  vous  ne  desirez  pas  placer votre fichier de configuration dans
  /etc, mettez le dans le repertoire que de votre choix,  et  faites  un
  lien symbolique dans /etc :

       ln -s /path/vers/smb.conf /etc/smb.conf

  44..

  LLaanncceerr lleess ddaaeemmoonnss

  Les deux daemons SMB sont /ust/sbin/smbd et /usr/sbin/nmb.

  Vous  pouvez  lancer  les  daemons Samba depuis l'inetd ou en tant que
  processus independants. Si vous etes en train de configurer un serveur
  de  fichier,  ils devraient etre lances depuis l'inetd afin de pouvoir
  etre redemarrez s'ils sont tues. Si vous comptez  simplement  utiliser
  les  services  SMB  occasionnellement, vous pouvez demarrer les demons
  depuis un script /etc/rc.d/init.d ou meme les lancer a la main lorsque
  vous en avez besoin.

  Pour  lancer  les  daemons depuis l'inetd, mettez les lignes suivantes
  dans le fichier de configuration d'inetd, /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

  Et relancez le daemon inetd avec la commande :

      killall -HUP inetd

  Pour lancer les daemons depuis les scripts  de  demarrage,  copier  le
  script  suivant  sous  le nom /etc/rc.d/init.d/smb et faites des liens
  depuis les fichiers specifies dans les commentaire sur ce script :

       #!/bin/sh

       #
       # /etc/rc.d/init.d/smb - demarre et stoppe les services SMB.
       #
       # Les fichiers suivants doivent etre des liens symboliques vers ce fichier_:
       #    /etc/rc.d/rc1.d/K35smb  (Kille les services SMB a l'extinction)
       #    /etc/rc.d/rc3.d/S91smb  (Demarre les services SMB en mode
       #                             multi-utilisateur)
       #    /etc/rc.d/rc6.d/K35smb  (Kille les services SMB au redemarrage)

       # Charge la librairie de fonctions
       \&. /etc/rc.d/init.d/functions

       # Charge la configuration reseau
       \&. /etc/sysconfig/network

       # Verifie que le reseau fonctionne
       [ ${NETWORKING} = "no" ] && exit 0

       # Traite les arguments
       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5..

  CCoonnffiigguurraattiioonn ggeenneerraallee ((//eettcc//ssmmbb..ccoonnff))

  La configuration de Samba sur une machine Linux (ou sur un autre Unix)
  est  controlee  par un seul fichier, /etc/smb.conf. Ce fichier indique
  quelle  ressources  systeme  vous  desirez  partager  avec  le   monde
  exterieur, et quelle restrictions vous voulez mettre dessus.

  Puisque  les  chapitres suivants vont traiter du partage de fichier et
  d'imprimantes avec des machines Windows, le fichier smb.conf  presente
  dans   ce   chapitre   est   aussi   simple  que  possible,  en  guise
  d'introduction.

  Ne vous inquietez pas pour les details, en tout cas  pas  encore.  Les
  chapitres suivants vont presenter les concepts fondamentaux.

  Chaque  partie  du  fichier commence par une entete, comme par exemple
  [global], [homes], [printers], etc...

  La section  [global]  definit  quelques  variables  communes  pour  le
  partage de toutes les ressources.

  La  section  [homes]  permet  a un utilisateur distant d'acceder a son
  repertoire d'accueil (et uniquement aux sien)  sur  la  machine  Linux
  locale.  C'est-a-dire  que  si  un  utilisateur  Windows  essaye de se
  connecter a ce repertoire partage depuis sa machine Windows,  il  sera
  connecte  sur  sa repertoire d'accueil personnel. Notez que pour cela,
  il doit posseder un compte sur l'hote Linux.

  Le fichier smb.conf suivant donne en exemple permet a des utilisateurs
  distants  d'acceder  a  leur  repertoire  _h_o_m_e sur la machine local et
  d'ecrire dans un repertoire temporaire. Pour qu'un utilisateur Windows
  puisse  voir ces partages, il faut que l'hote Linux soit sur le reseau
  local. Ainsi  l'utilisateur  connecte  un  lecteur  reseau  depuis  le
  gestionnaire de fichiers Windows ou l'Explorateur.

  Veuillez  noter  que  dans  les  chapitres suivants, des champs seront
  ajoutes a ce fichier  pour  permettre  a  plus  de  ressources  d'etre
  partagees.

       ; /etc/smb.conf
       ;
       ; Assurez vous de relancer le serveur apres avoir fait des changement
       , dans ce fichier. Par exemple_:
       ; /etc/rc.d/init.d/smb stop
       ; /etc/rc.d/init.d/smb start

       [global]
       ; decommentez cette ligne si vous desirez autoriser les invites
       ; (comptes "guest") a se connecter
       ; guest account = nobody
          log file = /var/log/samba-log.%m
          lock directory = /var/lock/samba
          share modes = yes

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

       [tmp]
          comment = Espace disque temporaire
          path = /tmp
          read only = no
          public = yes

  66..

  PPaarrttaaggeerr uunn lleecctteeuurr LLiinnuuxx aavveecc ddeess mmaacchhiinneess WWiinnddoowwss

  Comme  vous  pouvez  le  constater avec le fichier smb.conf ci-dessus,
  partager  des  disques  Linux  avec  des  utilisateurs   est   simple.
  Neanmoins,  comme  pour  tout  avec Samba, vous pouvoez tout controler
  finement. Voici quelques exemples :

  Pour partager un repertoire public, creez un clone de la section [tmp]
  ci-dessus en ajoutant le code suivant dans le smb.conf :

       [public]
          comment = Partage public
          path = /home/public
          public = yes
          writable = yes
          printable = yes

  Pour  que  le  repertoire ci-dessus soit en lecture pour tout le monde
  mais uniquement en  ecriture  pour  les  personnes  du  groupe  staff,
  modifiez l'entree comme ci-dessous :

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

  Pour d'autres trucs et astuces concernant les partages de repertoires,
  conferez vous a la documentation de Samba ou aux pages de manuel.

  77..

  PPaarrttaaggeerr uunn rreeppeerrttooiirree WWiinnddoowwss ppoouurr ddeess mmaacchhiinneess LLiinnuuxx

  Un client SMB pour un hote Unix est inclus  dans  la  distribution  de
  Samba.  Il  fournit  une  interface  semblable  au  ftp,  en  ligne de
  commande. Vous pouvez utiliser cette utilitaire  pour  transferer  des
  fichiers entre un " serveur " Windows et un client Linux.

  Pour voir ce que partage une machine donnee, utilisez :

  /usr/sbin/smbclient -L hote

  ou " hote " est le nom NetBIOS de la machine dont vous voulez voir les
  partages. Vous obtiendrez une liste  des  "  services  "  en  partage,
  c'est-a-dire le nom des repertoires ou des machines qu'il partage pour
  vous. A moins que le serveur SMB n'aient aucune protection, vous allez
  devoir saisir un mot de passe. Utilisez le mot de passe pour le compte
  d'invite ou pour votre compte personnel sur cette machine.

  Par exemple :

      smbclient -L zimmerman

  Ce qui devrait donner quelque chose comme cela :

       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

  La " browse list " (liste des machines) montre quels sont  les  autres
  serveurs SMB partageant des ressources sur le reseau.

  Pour utiliser le client, lancez :

  /usr/sbin/smbclient service <mot de passe>

  ou  "  service " est une machine et un nom de partage. Par exemple, si
  vous essayez d'acceder a un repertoire en acces public sur une machine
  appelee   zimmerman,   le   service   sera  nomme  \\zimmerman\public.
  Neanmoins, a cause des restrictions de l'interpreteur de commandes (le
  _s_h_e_l_l),  vous  allez  devoir redoubler les _b_a_c_k_s_l_a_s_h_s, pour obtenir la
  ligne suivante :

  /usr/sbin/smbclient \\\\zimmerman\\public mon_mot_de_passe

  ou " mon_mot_de_passe " est votre mot de passe ecrit tel quel.

  Vous allez obtenir la ligne de commande suivante :

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

  Tapez " h " pour obtenir de l'aide sur 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: \>

  Si vous savez utiliser ftp, vous ne devriez pas avoir besoin  de  lire
  la page de manuel de smbclient.

  88..

  PPaarrttaaggeerr uunnee iimmpprriimmaannttee LLiinnuuxx ppoouurr ddeess ssttaattiioonnss WWiinnddoowwss

  Pour  partager  une  imprimante  Linux pour des stations Windows, vous
  devez etre sur que votre imprimante est  configuree  pour  fonctionner
  sous Linux. Si vous savez imprimer depuis Linux, la mise en place d'un
  partage de l'imprimante par SMB est quasi-automatique.

  Veuillez vous referer au  Printing  HOWTO  pour  la  configuration  de
  l'imprimante.

  Puisque  l'auteur  utilise une imprimante connectee a une machine sous
  Windows NT, cette section ne doit pas etre prise  a  la  lettre,  mais
  simplement  comme  une  suggestion. Quiconque ayant des details sur ce
  point est invite a les envoyer  a  dwood@plugged.net.au  afin  que  ce
  chapitre puisse etre complete.

  Ajoutez la configuration d'impression a votre 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 = Toutes les imprimantes
     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

  Assurez  vous  que  le " path " (dans cet exemple, a l'interieur de la
  section  [ljet])  corresponde  au  repertoire  de  _s_p_o_o_l  defini  dans
  /etc/printcap !

  NB  :  On constate quelques problemes pour le partage d'imprimante sur
  des des serveurs Unix, utilisant Samba, pour des clients sous  Windows
  NT.  Un  des  problemes  est  que NT ne voit pas l'imprimante partagee
  correctement. Pour resoudre ce probleme, lisez les remarques  dans  le
  fichier  docs/WinNT.txt de la distribution de Samba. Un autre probleme
  existe avec les mots de passe. Voyez egalement dans ce fichier comment
  resoudre le probleme.

  99..

  PPaarrttaaggeerr uunnee iimmpprriimmaannttee WWiinnddoowwss ppoouurr ddeess cclliieennttss LLiinnuuxx

  Pour  partager  une  imprimante  sur  une  machine Windows, vous devez
  suivre les points suivants :

  1. Vous devez avoir les entrees correspondantes  a  l'imprimante  dans
     /etc/printcap  et  elles doivent correspondre a la structure locale
     des repertoires (pour le repertoire de _s_p_o_o_l, etc...).

  2. Vous devez avoir le script /usr/bin/smbprint. Il est  fournit  avec
     les  sources  de  Samba,  mais  pas  avec  toutes les distributions
     binaires.  Une  version  legerement  modifiee  de  ce  script   est
     presentee plus loin.

  3. Si  vous  voulez  convertir  des fichiers ASCII en Postscript, vous
     devez  avoir   nenscript,   ou   equivalent.   nenscript   est   un
     convertisseur Postscript et se trouve generalement dans /usr/bin.

  4. Vous voudrez peut-etre simplifier l'impression a l'aide de Samba en
     utilisant une interface simple d'emploi. Un script simple, ecrit en
     perl,  pour gerer l'ASCII ou le PostScript est presente ci-dessous.
  L'entree dans /etc/printcap est pour une imprimante HP 5  MP  sur  une
  machine utilisant Windows NT. Les entrees sont comme suit :

  cm - commentaire
  lp - nom du peripherique a ouvrir en ecriture
  sd - le repertoire de spool de l'imprimante (sur la machine locale)
  af - le fichier d'accounting
  mx - la taille maximum de fichier (zero pour aucune limite)
  if - le nom du filtre en entree (un script)

  Pour  plus  ample  information,  lisez le Printing HOWTO ou la page de
  manuel de printcap.

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

  Assurez que le repertoire de spool et celui d'accounting  existent  et
  son  accessibles  en  ecriture,  que  le chemin correct vers le script
  smbprint (donne ci-dessous) est indique par la ligne "  if  "  et  que
  vous avez selectionne le bon device (le fichier special dans /dev).

  Vient  ensuite  le  script  smbprint.  Il est generalement mis dans le
  repertoire /usr/bin et a ete cree par Andre Tridgell, le  createur  de
  Samba  pour  autant  que  je sache. Il est fourni avec la distribution
  sous forme de code source de  Samba,  mais  est  absent  de  certaines
  distribution binaires. Je l'ai donc recopie ici.

  Examinez  le  avec  attention. Certains changement fait a ce script se
  sont averees etre utiles.

  #!/bin/sh -x

  # Ce script est un filtre d'entree sur l'impression avec printcap sur
  # une machine Linux. Il utilise le programme smbclient pour imprimer
  # le fichier au serveur et service specifie.
  # Par exemple, vous pouvez avoir une entree printcap comme celle-ci_:
  #
  # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
  #
  # qui creerai une imprimante unix appelee "smb" qui imprimerait par
  # l'intermediaire de ce script. Vous devrez creer le repertoire de
  # spool, /usr/spool/smb avec les permissions qui conviennent et le bon
  # proprietaire, pour votre systeme.

  # Mettez les valeurs pour le serveur et le service sur lequel vous
  # voulez imprimer.
  # Dans cet exemple, j'utilise un PC sous Windows pour Workgroups nomme
  # "laplan" ayant une imprimante appelee "printer" sans mot de passe.

  #
  # Script modifie par hamiltom@ecnz.co.nz (Michael Hamilton)
  # afin que le serveur, le service et le mot de passe puissent etre lus
  # depuis un fichier /usr/var/spool/lpd/PRINTNAME/.config
  #
  # Pour que ceci puisse fonctionner, l'entree du /etc/printcap doit
  # inclure un fichier d'accounting (af=...)_:
  #
  #   cdcolour:\
  #       :cm=CD IBM Colorjet au 6eme etage:\
  #       :sd=/var/spool/lpd/cdcolour:\
  #       :af=/var/spool/lpd/cdcolour/acct:\
  #       :if=/usr/local/etc/smbprint:\
  #       :mx=0:\
  #       :lp=/dev/null:
  #
  # Le fichier /usr/var/spool/lpd/PRINTNAME/.config devrait contenir_:
  #   server=SERVEUR_PC
  #   service=NOM_IMPRIMANTE
  #   password="mot_de_passe"
  #
  # Pas exemple_:
  #   server=MON_BO_PC
  #   service=CJET_371
  #   password=""

  #
  # Fichier de log pour debuggage, changez le a /dev/null si vous le
  # voulez
  #
  logfile=/tmp/smb-print.log
  # logfile=/dev/null

  #
  # Le dernier parametre du filtre est le nom du fichier d'accounting
  #
  spool_dir=/var/spool/lpd/lp
  config_file=$spool_dir/.config

  # Les variables suivantes devraient etre lues depuis le fichier de
  # configuration_:
  #   server
  #   service
  #   password
  #   user
  eval `cat $config_file`
  #
  # Des informations de debuggage, changez le >> en > si vous voulez
  # economiser de la place.
  #
  echo "server $server, service $service" >> $logfile

  (
  # NOTE Vous voudrez peut etre ajouter la ligne "echo translate" si
  # vous voulez une conversion automatiques des CR/LF lors de l'impression
          echo translate
          echo "print -"
          cat
  ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile

  La plupart des distributions Linux sont fournies avec  nenscript  pour
  convertir  des  documents ASCII en Postscript. Le script perl qui suit
  simplifie la vie en fournissant une interface simple a  smbprint  pour
  l'impression sous Linux.

  Usage: print [-a|c|p] <fichier>
         -a imprime <fichier> comme un fichier ASCII
         -c imprime <fichier> formatte en code source
         -p imprime <fichier> en tant que fichier Postscript
         Si aucun parametre n'est donne, print tente de
         deviner le type de fichier et imprime en consequence.

  smbprint a tendance a tronquer les longues lignes lors de l'impression
  de fichiers ASCII. Ce script coupe les longues lignes sur les  espaces
  (plutot qu'au milieu d'un mot), si possible.

  Le  formatage  en  code  source  est realise par nenscript.Il prend en
  entree un fichier ASCII et le formatte  sur  deux  colonnes  avec  une
  entete  (date,  nom  du  fichier,  etc...).  Il numerote egalement les
  lignes. En prenant ce script comme exemple,  on  peut  faire  d'autres
  types de formatage.

  Les  documents  sont  deja  correctement  formates,  donc  ils passent
  directement a travers le filtre.

  #!/usr/bin/perl

  # Script:   print
  # Auteurs:  Brad Marshall, David Wood
  #           Plugged In Communications
  # Date:     960808
  #
  # Script pour imprimer sur oreilly qui est pour l'instant connectee sur
  # zimmerman.
  # But:      Prendre differentes sortes de fichier en argument et les
  #  traiter pour les injecter dans le script d'impression de Samba.
  #
  # Types de fichier supportes pour l'instant_:
  #
  # ASCII      - verifie que les lignes plus longues que $line_length
  #              caracteres sont coupes sur un espace.
  # Postscript - Aucune action.
  # Code       - Formatte en Postscript (a l'aide de nenscript) pour un
  #              affichage correct (orientation, fonte, etc...).
  #

  # Fixe la longueur maximale d'une ligne de texte ASCII
  $line_length = 76;

  # Le chemin d'acces vers le script d'impression de Samba
  $print_prog = "/usr/bin/smbprint";

  # Le chemin vers le programme nenscript (le convertisseur
  # ASCII->Postscript)
  $nenscript = "/usr/bin/nenscript";

  unless ( -f $print_prog ) {
          die "Je ne peux pas trouver $print_prog!";
  }
  unless ( -f $nenscript ) {
          die "Je ne peux pas trouver $nenscript!";
  }

  &ParseCmdLine(@ARGV);

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

  if ($filetype eq "ASCII") {
          &wrap($line_length);
  } elsif ($filetype eq "code") {
          &codeformat;
  } elsif ($filetype eq "ps") {
          &createarray;
  } else {
          print "Desole, ce n'est pas un type de fichier que je connais";
          exit 0;
  }
  # Envoie le tableau a smbprint
  open(PRINTER, "|$print_prog")
           || die "Je ne peux pas ouvrir $print_prog: $!\n";

  foreach $line (@newlines) {
          print PRINTER $line;
  }
  # Envoie un retour a la ligne supplementaire si jamais le fichier a sa
  # derniere ligne incomplete
  print PRINTER "\n";
  close(PRINTER);
  print "Acheve\n";
  exit 0;
  # --------------------------------------------------- #
  #       Tout ce qui suit est un sous programme        #
  # --------------------------------------------------- #

  sub ParseCmdLine {
          # Traite la ligne de commande, determine le type de fichier

          # $arg et $file sont respectivement les arguments (s'ils
          # existent) et le nom de fichier
          if ($#_ < 0) {
                  &usage;
          }
          # Debug
  #       foreach $element (@_) {
  #               print "*$element* \n";
  #       }

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

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

          # Definition du type de fichier
          unless ($cmd) {
                  # Aucun argument

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

                  # Traite $file selon le type de fichier et retourne
                  # le type de fichier ($filetype)
          } else {
                  # Nous utilisons ltype de fichier decrit dans $arg
                  if ($cmd =~ /^-p$/) {
                          $filetype = "ps";
                  } elsif ($cmd =~ /^-c$/) {
                          $filetype = "code";
                  } elsif ($cmd =~ /^-a$/) {
                          $filetype = "ASCII"
                  }
          }
  }

  sub usage {
          print "
  Usage: print [-a|c|p] <fichier>
         -a imprime <fichier> comme un fichier ASCII
         -c imprime <fichier> formatte en code source
         -p imprime <fichier> en tant que fichier Postscript
         Si aucun parametre n'est donne, print tente de
         deviner le type de fichier et imprime en consequence.\n
  ";
          exit(0);
  }

  sub wrap {
          # Cree un table contenant les lignes du fichier, avec chaque
          # ligne ayant une longueur < au nombre de caracteres
          # specifies, et coupee uniquement sur un espace.

          # Recupere la longueur maximum d'une ligne
          $limit = pop(@_);

          # Debug
          #print "Entree dans la procedure wrap\n";
          #print "La longueur maximum d'une ligne est $limit\n";

          # Lit le fichier, le traite et le stocke dans le tableau
          open(FILE, "<$file") || die "Impossible d'ouvrir $file: $!\n";
          while(<FILE>) {
                  $line = $_;

                  # Debug
                  #print "La ligne est_:\n$line\n";

                  # Coupe la ligne si celle-ci depasse la limite
                  while ( length($line) > $limit ) {

                          # Debug
                          #print "Je coupe...";

                          # Prend les premiers $limit +1 caracteres.
                          $part = substr($line,0,$limit +1);

                          # Debug
                          #print "La ligne partielle est_:\n$part\n";

                          # Verifie si le dernier caractere est un
                          # espace
                          $last_char = substr($part,-1, 1);
                          if ( " " eq $last_char ) {
                              # Oui, on imprime le reste

                              # Debug
                              #print "Le dernier caractere etait un espace\n";

                              substr($line,0,$limit + 1) = "";
                              substr($part,-1,1) = "";
                              push(@newlines,"$part\n");
                          } else {
                              # Non, on cherche le dernier espace de la
                              # ligne et on imprime jusqu'a lui

                              # Debug
                              #print "Le dernier caractere n'etait pas un espace\n";

                              # Supprime le caractere apres $limit
                              substr($part,-1,1) = "";
                              # Inverse la ligne pour trouver plus
                              # facilement l'espace
                              $revpart = reverse($part);
                              $index = index($revpart," ");
                              if ( $index > 0 ) {
                                substr($line,0,$limit-$index) = "";
                                push(@newlines,substr($part,0,$limit-$index)
                                    . "\n");
                              } else {
                                 # Aucun espace dans la ligne
                                 # Imprime jusqu'a $limit
                                 substr($line,0,$limit) = "";
                                 push(@newlines,substr($part,0,$limit)
                                     . "\n");
                               }
                          }
                  }
                  push(@newlines,$line);
          }
          close(FILE);
  }

  sub codeformat {
          # Appelle la procedure wrap et filtre par nenscript
          &wrap($line_length);

          # Envoie le resultat a nenscript pour creer un fichier
          # Postscript qui respecte un format decent d'impression pour
          # du code source (orientation paysage, font Courier,
          # numerotation des lignes).
          # Imprime d'abord dans un fichier temporaire.
          $tmpfile = "/tmp/nenscript$$";
          open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
                  die "Je ne peux pas ouvrir nenscript_: $!\n";
          foreach $line (@newlines) {
                  print FILE $line;
          }
          close(FILE);

          # Relis le fichier temporaire dans un tableau pour pouvoir
          # etre passe au script smbprint de Samba.
          @newlines = ("");
          open(FILE, "<$tmpfile") || die "Je ne peux pas ouvrir $file_: $!\n";
          while(<FILE>) {
                  push(@newlines,$_);
          }
          close(FILE);
          system("rm $tmpfile");
  }

  sub createarray {
          # Cree le tableau pour un fichier postscript
          open(FILE, "<$file") || die "Can't open $file: $!\n";
          while(<FILE>) {
                  push(@newlines,$_);
          }
          close(FILE);
  }

  1100..

  CCooppyyrriigghhtt

  Cet HOWTO est  copyright  (c)  1996  par  David  Wood.  Il  peut  etre
  reproduit   sous   quelque   forme  que  ce  soit  et  etre  distribue
  gratuitement aussi longtemps que le fichier reste intact, cette notice
  y compris.

  1111..

  RReemmeerrcciieemmeennttss

  Des  que vous m'enverrez des suggestions, je vous remercierai ici dans
  la prochaine version du document.

