s

La commande cp(1) semble bien innocente. Nous allons voir qu'elle n'est pas si évidente à programmer en C.

Il s'agit du TP proposé l'année dernière par Antoine Miné. La correction est disponible sur la page d'Antoine.

Dans ce qui suit, la partie I est obligatoire et à réaliser en premier. Les parties II et III proposent des extensions indépendantes les unes des autres et de difficulté similaire. Vous pouvez les réaliser dans l'ordre qu'il vous plaît (et terminer chez vous celles que vous n'avez pas eu le temps de finir en TP).

Exercice 1 - Copie simple d'un fichier

  1. Écrivez un programme C qui copie un fichier grâce aux fonctions bas-niveau read(2) et write(2). Le programme prendra deux arguments sur sa ligne de commande: le nom d'un fichier source existant et un nom du fichier destination. On prendra en particulier soin à:

    • copier par morceaux ni trop gros (pour ne pas saturer la mémoire) ni trop petits (pour minimiser le nombre d'appels systèmes): 64 Ko semble un bon compromis,

    • gérer les erreurs fatales (fichier introuvable, erreur disque, etc.) qu'il faut rapporter à l'utilisateur (errno(3), strerror(3)),

    • gérer les erreurs transitoires (appel système interrompu EINTR, etc.) en recommençant l'opération jusqu'au ce qu'elle réussisse.

  2. Modifiez votre programme pour qu'il respecte les droits et le propriétaire (utilisateur et groupe) du fichier source (de manière similaire à cp -p). (Utile quand le programme est appelé par le super-utilisateur.)

  3. Que se passe-t-il si on essaye de copier un fichier sur lui-même? Modifiez votre programme pour interdire cela. (Attention aux liens symboliques et durs.)

top

Exercice 2 - Fichiers creux

  1. Certains systèmes de fichiers supportent les fichiers creux dans lesquels des plages de zéros ne sont pas stockées sur le disque. Modifiez votre programme pour que les trous du fichier source soient copiés comme des trous dans le fichier destination au lieu de zones pleines de zéros (voir lseek(2)).

    Note. Utilisez les commandes dd(1) et stat(1) pour créer des fichiers creux et vérifier le bon fonctionnement de votre programme.

top

Exercice 3 - Gestion des répertoires

  1. Modifiez votre programme pour que, si le fichier destination contient des noms de répertoires inexistants, ceux-ci soient automatiquement créés (comme avec mkdir -p).

  2. Faites un programme qui copie un répertoire complet, en copiant récursivement ses sous-répertoires (voir opendir(3), readdir(3) et closedir(3)).

top