Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <dirent.h>
  7. #include <sys/stat.h>
  8.  
  9. #include <errno.h>
  10.  
  11. int main(int argc, char *argv[]){
  12.     char dir_sym[] = "/";
  13.     char source_dir[255], destination_dir[255], temp_dir[255], t_dest_dir[255], t_dest_file[255];
  14.    
  15.     if (argc < 3){
  16.         printf("need more arguments\n");
  17.         exit(1);
  18.         }
  19.    
  20.     sprintf(source_dir, "%s%s", argv[1], dir_sym);
  21.     sprintf(destination_dir, "%s%s", argv[2], dir_sym);
  22.  
  23.     if ( opendir(source_dir) == NULL ){
  24.         printf("error opening source dir\n");
  25.         exit(1);
  26.     }
  27.     if ( opendir(destination_dir) == NULL ){
  28.         printf("error opening destination dir\n");
  29.         exit(1);
  30.     }
  31.  
  32.     struct dirent **current_dir;
  33.     int number_of_dir_entries;
  34.     number_of_dir_entries = scandir(source_dir, &current_dir, 0, alphasort);
  35.     if (number_of_dir_entries < 0){
  36.         perror("scandir");
  37.         exit(1);
  38.     }
  39.    
  40.     struct stat dir_entry_stat, dest_file_stat;
  41.     int i, pid, int_for_open;
  42.     int dest_file;
  43.     char shell_cmd[255];
  44.     for (i=0; i<number_of_dir_entries; i++){
  45.  
  46.         strcpy(temp_dir, source_dir);
  47.         strcat(temp_dir, current_dir[i]->d_name);
  48.         stat(temp_dir, &dir_entry_stat);
  49.         /*****************************************
  50.         if (S_IRUSR&&(dir_entry_stat.st_mode)){
  51.                 printf("can't read file\n");
  52.                 exit(1);
  53.         }
  54. ****************************************************/
  55.         if(S_ISDIR(dir_entry_stat.st_mode)){
  56.             strcpy(t_dest_dir, destination_dir);
  57.             strcat(t_dest_dir, current_dir[i]->d_name);
  58.             free(current_dir[i]);
  59.            
  60.             if ( opendir(t_dest_dir) == NULL){
  61.                 if ( mkdir(t_dest_dir, 0666) !=0){
  62.                     printf("error creating destination directory\n");
  63.                 }
  64.             }
  65.             pid=fork();
  66.             if (pid == 0){
  67.                 execlp(argv[0], argv[0], temp_dir, t_dest_dir);
  68.                 printf("error in execlp\n");
  69.                 exit(1);
  70.             }
  71.         }
  72.         if(S_ISREG(dir_entry_stat.st_mode)){
  73.  
  74.             sprintf(t_dest_file, "%s%s%s", destination_dir, current_dir[i]->d_name, ".gz");
  75.            
  76.             free(current_dir[i]);
  77.            
  78.             if ( stat(t_dest_file, &dest_file_stat) == 0 ){
  79.                 if (dir_entry_stat.st_mtime > dest_file_stat.st_mtime){
  80.                     sprintf(shell_cmd, "%s%s%s%s", "cp -f ", temp_dir, " ", t_dest_file);
  81.                     system(shell_cmd);
  82.                     sprintf(shell_cmd, "%s%s", "gzip ", t_dest_file);
  83.                     system(shell_cmd);
  84.                 }
  85.             }
  86.             else {//если не удалось получить информацию о целевом файле (отсутствует), тогда просто копируем
  87.                 sprintf(shell_cmd, "%s%s%s%s", "cp -f ", temp_dir, " ", t_dest_file);
  88.                 system(shell_cmd);
  89.                 sprintf(shell_cmd, "%s%s", "gzip ", t_dest_file);
  90.                 system(shell_cmd);
  91.             }
  92.         }
  93.     }
  94.     free(current_dir);
  95.    
  96.     return 0;
  97.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement