
                                   SMB HOWTO

David Wood, dwood@plugged.net.au
Adaptation franaise par Mathieu Arnold 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._
     _________________________________________________________________

1. Introduction

   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. Pour plus d'informations

   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/
       NdT. : Vous pouvez rcuprer les sources de Samba sur ftp.ibp.fr
     * Le Printing-HOWTO.
     * Le Print2Win Mini-HOWTO.

3. Installation

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

   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.

   _smbd_
          Le daemon SMB ;

   _nmbd_
          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.

   _smbclient_
          Un client SMB pour machines Unix ;

   _smbprint_
          Un script pour imprimer sur l'imprimante d'un hte SMB ;

   _smbprint.sysv_
          Comme ci-dessus, mais pour des Unix SVR4 ;

   _smbstatus_
          Liste les connexions SMB prsentes sur localhost ;

   _smbrun_
          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 _man_ 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 _locks_ (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. Lancer les daemons

   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. Configuration gnrale (/etc/smb.conf)

   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 _home_ 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. Partager un lecteur Linux avec des machines Windows

   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. Partager un rpertoire Windows pour des machines Linux

   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
   _shell_), vous allez devoir redoubler les _backslashs_, 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. Partager une imprimante Linux pour des stations Windows

   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 _spool_ 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. Partager une imprimante Windows pour des clients Linux

   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 _spool_, 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 >> $log
file

   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);
}

10. Copyright

   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.

11. Remerciements

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