Advertisement
Guest User

Untitled

a guest
May 28th, 2015
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. /*
  2.     Remarque:
  3.         Les deux derniers write ne sont pas vraiment faux.
  4.         En fait, write renvoie le nombre d'octets écrits
  5.         et -1 en cas d'erreur. Il est cependant préférable
  6.         de faire write(fd, buf, size) < size dans le cas où
  7.         write écrirait une taille inférieure à size sans générer
  8.         d'erreur
  9.        
  10.         NB: Le premier write est bien faux par contre:  
  11.             1 au lieu de logsize et &argv[i] au lieu de argv[i]
  12. */
  13.  
  14. #include ...
  15. #include<string.h> // manque un espace
  16.  
  17. int write_log(int fd, int len, char **argv){
  18.     int i;
  19.     char newline = '\n';
  20.    
  21.     for( i = 0 ; i < len ; i++){
  22.         // on doit commencer par i = 2 car
  23.         // le format des commandes est le suivant:
  24.         // NOM DE FICHIER + CHAINES A ECRIRE
  25.         // argv[0] contient le nom du programme
  26.         // et argv[1], celui du fichier à écrire
  27.    
  28.         int logsize = strlen(argv[i]);
  29.         int j;  // variable inutile
  30.         char space = ' ';
  31.        
  32.         if(write(fd, &argv[i], 1) < 0){
  33.             // if(write(fd, argv[i], logsize)) < logsize
  34.             return -1;
  35.         }
  36.        
  37.         if(write(fd, &space, 1) < 0){
  38.             // write(fd, &space, 1) < 1
  39.             return -1;
  40.         }
  41.     }
  42.    
  43.     if(write(fd, &newline, 1) < 0){
  44.         // write(fd, &newline, 1) < 0
  45.         return -1;
  46.     }
  47.    
  48.     return 0;
  49. }
  50.  
  51. int main(int argc, char **argv){
  52.     int fd;
  53.     struct stat *filestat; // doit etre malloc pour utiliser fstat
  54.    
  55.     fd = open(argv[1], O_CREAT | O_RDONLY, 0644);
  56.         // pas sur que argv[1] existe -> risque de segfault
  57.         // on ouvre en read only or, on ne fait que écrire.
  58.         // il fallait utiliser O_WONLY
  59.        
  60.     if(lseek(fd, filestat->st_size, SEEK_SET) < 0){
  61.         // on peut s'interroger sur l'utilité de ce bloc de code
  62.         // vu que l'ouverture du fichier se fait toujours en partant
  63.         // du début je pense en mode O_CREAT
  64.         perror("Error with lseek: ");
  65.         close(fd);
  66.         exit(EXIT_FAILURE);
  67.     }  
  68.    
  69.    
  70.     if(write_log(fd, argc, argv)){
  71.         // il n'est pas logique de faire if(a) pour vérifier
  72.         // si a a échoué.
  73.         // if(write_log(fd, argc, argv)) == -1 aurait été
  74.         // plus logique à utiliser bien que le code actuel fonctionne ..
  75.         close(fd);
  76.         perror("write_log failed: ");
  77.         exit(EXIT_FAILURE);
  78.     }  
  79.    
  80.     close(fd);
  81.     return EXIT_SUCCESS;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement