Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #include <dirent.h>
- #include <sys/stat.h>
- #include <errno.h>
- int main(int argc, char *argv[]){
- char dir_sym[] = "/";
- char source_dir[255], destination_dir[255], temp_dir[255], t_dest_dir[255], t_dest_file[255];
- if (argc < 3){
- printf("need more arguments\n");
- exit(1);
- }
- sprintf(source_dir, "%s%s", argv[1], dir_sym);
- sprintf(destination_dir, "%s%s", argv[2], dir_sym);
- if ( opendir(source_dir) == NULL ){
- printf("error opening source dir\n");
- exit(1);
- }
- if ( opendir(destination_dir) == NULL ){
- printf("error opening destination dir\n");
- exit(1);
- }
- struct dirent **current_dir;
- int number_of_dir_entries;
- number_of_dir_entries = scandir(source_dir, ¤t_dir, 0, alphasort);
- if (number_of_dir_entries < 0){
- perror("scandir");
- exit(1);
- }
- struct stat dir_entry_stat, dest_file_stat;
- int i, pid, int_for_open;
- int dest_file;
- char shell_cmd[255];
- for (i=0; i<number_of_dir_entries; i++){
- strcpy(temp_dir, source_dir);
- strcat(temp_dir, current_dir[i]->d_name);
- stat(temp_dir, &dir_entry_stat);
- /*****************************************
- if (S_IRUSR&&(dir_entry_stat.st_mode)){
- printf("can't read file\n");
- exit(1);
- }
- ****************************************************/
- if(S_ISDIR(dir_entry_stat.st_mode)){
- strcpy(t_dest_dir, destination_dir);
- strcat(t_dest_dir, current_dir[i]->d_name);
- free(current_dir[i]);
- if ( opendir(t_dest_dir) == NULL){
- if ( mkdir(t_dest_dir, 0666) !=0){
- printf("error creating destination directory\n");
- }
- }
- pid=fork();
- if (pid == 0){
- execlp(argv[0], argv[0], temp_dir, t_dest_dir);
- printf("error in execlp\n");
- exit(1);
- }
- }
- if(S_ISREG(dir_entry_stat.st_mode)){
- sprintf(t_dest_file, "%s%s%s", destination_dir, current_dir[i]->d_name, ".gz");
- free(current_dir[i]);
- if ( stat(t_dest_file, &dest_file_stat) == 0 ){
- if (dir_entry_stat.st_mtime > dest_file_stat.st_mtime){
- sprintf(shell_cmd, "%s%s%s%s", "cp -f ", temp_dir, " ", t_dest_file);
- system(shell_cmd);
- sprintf(shell_cmd, "%s%s", "gzip ", t_dest_file);
- system(shell_cmd);
- }
- }
- else {//если не удалось получить информацию о целевом файле (отсутствует), тогда просто копируем
- sprintf(shell_cmd, "%s%s%s%s", "cp -f ", temp_dir, " ", t_dest_file);
- system(shell_cmd);
- sprintf(shell_cmd, "%s%s", "gzip ", t_dest_file);
- system(shell_cmd);
- }
- }
- }
- free(current_dir);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement