L3

Sujet

Écrire un programme en C qui prend en paramètre deux fichiers et copie le contenu du premier vers le deuxième avec les mêmes droits d'accès.


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAX 1024

int main(int argc, char **argv) { int des1, des2, n; char tampon[MAX]; struct stat s1;

if (argc == 3) { des1 = open(argv[1], O_RDONLY);

<span class="k">if</span> <span class="p">(</span><span class="n">des1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">perror</span><span class="p">(</span><span class="s">"Fichier inexistant"</span><span class="p">);</span>
  <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">fstat</span><span class="p">(</span><span class="n">des1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s1</span><span class="p">);</span>

<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">S_ISREG</span><span class="p">(</span><span class="n">s1</span><span class="p">.</span><span class="n">st_mode</span><span class="p">))</span> <span class="p">{</span>
  <span class="n">perror</span><span class="p">(</span><span class="s">"Fichier non regulier"</span><span class="p">);</span>
  <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">des2</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">O_WRONLY</span><span class="o">|</span><span class="n">O_CREAT</span><span class="o">|</span><span class="n">O_EXCL</span><span class="p">,</span> <span class="n">s1</span><span class="p">.</span><span class="n">st_mode</span><span class="p">);</span>

<span class="k">while</span> <span class="p">((</span><span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">des1</span><span class="p">,</span> <span class="n">tampon</span><span class="p">,</span> <span class="n">MAX</span><span class="p">)))</span> <span class="p">{</span>
  <span class="n">write</span><span class="p">(</span><span class="n">des2</span><span class="p">,</span> <span class="n">tampon</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">close</span><span class="p">(</span><span class="n">des1</span><span class="p">);</span>
<span class="n">close</span><span class="p">(</span><span class="n">des2</span><span class="p">);</span>

} else { perror("Nombre d'arguments incorrect"); exit(1); } }