  SMB HOWTO
  David Wood, dwood@plugged.net.au
  arn@multimania.com, 28 Avril 1997.
  v1.0, 10 Aot 1996

  Voici le SMB-HOWTO, dcrivant comment utiliser sous Linux le protocole
  SMB ( Session Message Block ) galement appel le protocole NetBIOS
  ou LanManager.
  ______________________________________________________________________

  Table des matires


  1. Introduction

  2. Pour plus d'informations

  3. Installation

  4. Lancer les daemons

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

  6. Partager un lecteur Linux avec des machines Windows

  7. Partager un rpertoire Windows pour des machines Linux

  8. Partager une imprimante Linux pour des stations Windows

  9. Partager une imprimante Windows pour des clients Linux

  10. Copyright

  11. Remerciements



  ______________________________________________________________________

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

  Voici le SMB-HOWTO, dcrivant comment utiliser sous Linux le protocole
  SMB ( Session Message Block ) galement appel le protocole NetBIOS
  ou LanManager.

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

  Le protocole SMB est utilis par Microsoft Windows 3.11, NT et 95 pour
  partager des disques et des imprimantes. En utilisant les outils Samba
  d'Andrew Tridgell, les systmes Unix (Linux inclus) peuvent galement
  partager des disques et des imprimantes avec des htes Windows.

  Vous pouvez faire quatre choses avec Samba :


  1. Partager un disque Linux pour des machines Windows ;

  2. Accder  disque Windows depuis une machine Linux ;

  3. Partager une imprimante Linux pour des machines Windows ;

  4. Utiliser une imprimante Windows  partir d'un hte Linux.


  Tous ces points sont abords dans ce document.

  Mise en garde : Les procdures dcrites et les scripts prsents
  fonctionnent pour l'auteur ou les personnes qui les ont crits. Les
  informations donnes dans ce document peuvent ne pas fonctionner sur
  une configuration diffrente. Si vous rencontrez un problme, crivez
  un mail  l'auteur avec vos suggestions pour l'amlioration de ce
  document, mais l'auteur ne garantit rien. Qu'attendiez-vous ? Aprs
  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 manire basique les
  services SMB de partage de fichier et d'imprimantes sous Linux. Samba
  est un ensemble de programme trs complet, et trs complexe galement.
  Cela ne servirait  rien de recopier la documentation de Samba dans ce
  document.

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


    La documentation de Samba, disponible au sein de la distribution de
     Samba. Cette distribution est disponible  :
     ftp://nimbus.anu.edu.au/pub/tridge/samba/
     <ftp://nimbus.anu.edu.au/pub/tridge/samba/>
     rcuprer les sources de Samba sur ftp.ibp.fr

    Le Printing-HOWTO.

    Le Print2Win Mini-HOWTO.



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

  Les sources de la dernire 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 install la distribution RedHat de Linux, vous
  pour pouvez l'installer comme paquetage. Certaines autres
  distributions proposent galement un paquetage Samba (NdT : dont
  Slackware et Debian).

  Les deux  daemons  suivant sont ncessaires pour Samba. Ils sont
  gnralement install dans le rpertoire /usr/sbin et sont lancs soit
  au dmarrage soit par inetd. Des scripts d'exemple sont prsents 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 gnral, les binaires Samba suivant sont installs 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 hte 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 prsentes sur localhost ;


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

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

  Le paquetage Samba est simple  installer. Il suffit de rcuprer les
  sources depuis les sites mentionns 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 
  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 paquetage Samba, vous avez d spcifier dans
  le Makefile l'emplacement du fichier de configuration, smb.conf. Il se
  trouve gnralement dans /etc, mais vous pouvez le placer o bon vous
  semble. Dans la suite du document, nous considrerons 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 rpertoire 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
  rpertoire dans lequel vous avez compil Samba. Consultez le fichier
  README dans le rpertoire examples/simple. Copiez le fichier smb.conf
  de ce rpertoire vers /etc. ATTENTION !  Si vous utilisez une
  distribution Linux et que vous avez dj install Samba, il doit dj
  exister un fichier smb.conf dans /etc. Vous devriez sans doute
  commencer avec celui-l.

  Si vous ne dsirez pas placer votre fichier de configuration dans
  /etc, mettez le dans le rpertoire 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 indpendants. Si vous tes en train de configurer un serveur
  de fichier, ils devraient tre lancs depuis l'inetd afin de pouvoir
  tre redmarrez s'ils sont tus. Si vous comptez simplement utiliser
  les services SMB occasionnellement, vous pouvez dmarrer les dmons
  depuis un script /etc/rc.d/init.d ou mme les lancer  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 dmarrage, copier le
  script suivant sous le nom /etc/rc.d/init.d/smb et faites des liens
  depuis les fichiers spcifis dans les commentaire sur ce script :









































  #!/bin/sh

  #
  # /etc/rc.d/init.d/smb - dmarre et stoppe les services SMB.
  #
  # Les fichiers suivants doivent tre des liens symboliques vers ce fichier~:
  #    /etc/rc.d/rc1.d/K35smb  (Kille les services SMB  l'extinction)
  #    /etc/rc.d/rc3.d/S91smb  (Dmarre les services SMB en mode
  #                             multi-utilisateur)
  #    /etc/rc.d/rc6.d/K35smb  (Kille les services SMB au redmarrage)

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

  # Charge la configuration rseau
  . /etc/sysconfig/network

  # Vrifie que le rseau 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gnnr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 contrle par un seul fichier, /etc/smb.conf. Ce fichier indique
  quelle ressources systme vous dsirez partager avec le monde
  extrieur, 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 prsent
  dans ce chapitre est aussi simple que possible, en guise
  d'introduction.

  Ne vous inquitez pas pour les dtails, en tout cas pas encore. Les
  chapitres suivants vont prsenter les concepts fondamentaux.

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

  La section [global] dfinit quelques variables communes pour le
  partage de toutes les ressources.
  La section [homes] permet  un utilisateur distant d'accder  son
  rpertoire d'accueil (et uniquement aux sien) sur la machine Linux
  locale. C'est--dire que si un utilisateur Windows essaye de se
  connecter  ce rpertoire partag depuis sa machine Windows, il sera
  connect sur sa rpertoire d'accueil personnel. Notez que pour cela,
  il doit possder un compte sur l'hte Linux.

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

  Veuillez noter que dans les chapitres suivants, des champs seront
  ajouts  ce fichier pour permettre  plus de ressources d'tre
  partages.



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

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

       [homes]
          comment = Rpertoire 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.
  Nanmoins, comme pour tout avec Samba, vous pouvez tout contrler
  finement. Voici quelques exemples :

  Pour partager un rpertoire public, crez 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 rpertoire ci-dessus soit en lecture pour tout le monde
  mais uniquement en criture pour les personnes du groupe staff,
  modifiez l'entre 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 rpertoires,
  confrez vous  la documentation de Samba ou aux pages de manuel.


  77..  PPaarrttaaggeerr uunn rrp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 hte 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 transfrer des
  fichiers entre un  serveur  Windows et un client Linux.

  Pour voir ce que partage une machine donne, utilisez :


  /usr/sbin/smbclient -L hte



  o  hte  est le nom NetBIOS de la machine dont vous voulez voir les
  partages. Vous obtiendrez une liste des  services  en partage,
  c'est--dire le nom des rpertoires 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'invit 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 rseau.

  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'accder  un rpertoire en accs public sur une machine
  appele zimmerman, le service sera nomm \\zimmerman\public.
  Nanmoins,  cause des restrictions de l'interprteur 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



  o  mon_mot_de_passe  est votre mot de passe crit 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 tre sr que votre imprimante est configure 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 rfrer au Printing HOWTO pour la configuration de
  l'imprimante.

  Puisque l'auteur utilise une imprimante connecte  une machine sous
  Windows NT, cette section ne doit pas tre prise  la lettre, mais
  simplement comme une suggestion. Quiconque ayant des dtails sur ce
  point est invit  les envoyer  dwood@plugged.net.au afin que ce
  chapitre puisse tre complt.

  Ajoutez la configuration d'impression  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,  l'intrieur de la
  section [ljet]) corresponde au rpertoire de _s_p_o_o_l dfini dans
  /etc/printcap !

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


  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 entres correspondantes  l'imprimante dans
     /etc/printcap et elles doivent correspondre  la structure locale
     des rpertoires (pour le rpertoire 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 lgrement modifie de ce script est
     prsente plus loin.

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

  4. Vous voudrez peut-tre simplifier l'impression  l'aide de Samba en
     utilisant une interface simple d'emploi. Un script simple, crit en
     perl, pour grer l'ASCII ou le PostScript est prsent ci-dessous.


  L'entre dans /etc/printcap est pour une imprimante HP 5 MP sur une
  machine utilisant Windows NT. Les entres sont comme suit :


  cm - commentaire
  lp - nom du priphrique  ouvrir en criture
  sd - le rpertoire de spool de l'imprimante (sur la machine locale)
  af - le fichier d'accounting
  mx - la taille maximum de fichier (zro pour aucune limite)
  if - le nom du filtre en entre (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 rpertoire de spool et celui d'accounting existent et
  son accessibles en criture, que le chemin correct vers le script
  smbprint (donn ci-dessous) est indiqu par la ligne  if  et que
  vous avez slectionn le bon fichier de priphrique (le fichier
  spcial dans /dev).

  Vient ensuite le script smbprint. Il est gnralement mis dans le
  rpertoire /usr/bin et a t cr par Andre Tridgell, le crateur 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 recopi ici.

  Examinez le avec attention. Certains changement fait  ce script se
  sont avres tre utiles.



















  #!/bin/sh -x

  # Ce script est un filtre d'entre sur l'impression avec printcap sur une
  # machine Linux. Il utilise le programme smbclient pour imprimer le fichier au
  # serveur et service spcifi.
  # Par exemple, vous pouvez avoir une entre printcap comme celle-ci~:
  #
  # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
  #
  # qui crerai une imprimante Unix appele "smb" qui imprimerait par
  # l'intermdiaire de ce script. Vous devrez crer le rpertoire de spool,
  # /usr/spool/smb avec les permissions qui conviennent et le bon propritaire,
  # pour votre systme.

  # 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
  # nomm "laplan" ayant une imprimante appele "printer" sans mot de passe.

  #
  # Script modifi par hamiltom@ecnz.co.nz (Michael Hamilton) afin que le
  # serveur, le service et le mot de passe puissent tre lus depuis un fichier
  # /usr/var/spool/lpd/PRINTNAME/.config
  #
  # Pour que ceci puisse fonctionner, l'entre 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  /dev/null si vous le voulez
  #
  logfile=/tmp/smb-print.log
  # logfile=/dev/null


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

  # Les variables suivantes devraient tre lues depuis le fichier de
  # configuration~:
  #   server
  #   service
  #   password
  #   user
  eval `cat $config_file`

  #
  # Des informations de dbogage, changez le >> en > si vous voulez conomiser
  # de la place.
  #
  echo "server $server, service $service" >> $logfile

  (
  # NOTE Vous voudrez peut tre 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  smbprint pour
  l'impression sous Linux.


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



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

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

  Les documents sont dj correctement formats, donc ils passent
  directement  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 connecte sur
  # zimmerman.
  # But:      Prendre diffrentes sortes de fichier en argument et les
  #  traiter pour les injecter dans le script d'impression de Samba.
  #
  # Types de fichier supports pour l'instant~:
  #
  # ASCII      - vrifie que les lignes plus longues que $line_length
  #              caractres sont coups sur un espace.
  # Postscript - Aucune action.
  # Code       - Formatte en Postscript ( 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'accs 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);

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

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

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

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

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

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

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

          # Dfinition 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 dcrit 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> format en code source
         -p imprime <fichier> en tant que fichier Postscript
         Si aucun paramtre n'est donn, print tente de
         deviner le type de fichier et imprime en consquence.\n
  ";
          exit(0);
  }

  sub wrap {
          # Cre un table contenant les lignes du fichier, avec chaque
          # ligne ayant une longueur < au nombre de caractres
          # spcifis, et coupe uniquement sur un espace.

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

          # Dbug
          #print "Entre dans la procdure 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 = $_;

                  # Dbug
                  #print "La ligne est~:\n$line\n";

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

                          # Dbug
                          #print "Je coupe...";

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

                          # Dbug
                          #print "La ligne partielle est~:\n$part\n";

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

                              # Dbug
                              #print "Le dernier caractre tait 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' lui

                              # Dbug
                              #print "Le dernier caractre n'tait pas un espace\n";

                              # Supprime le caractre aprs $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' $limit
                                 substr($line,0,$limit) = "";
                                 push(@newlines,substr($part,0,$limit)
                                     . "\n");
                               }
                          }
                  }
                  push(@newlines,$line);
          }
          close(FILE);
  }

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

          # Envoie le rsultat  nenscript pour crer un fichier
          # Postscript qui respecte un format dcent d'impression pour
          # du code source (orientation paysage, font Courier,
          # numrotation 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
          # tre pass 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 {
          # Cre 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  1996 par David Wood. Il peut tre reproduit
  sous quelque forme que ce soit et tre distribu 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

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




