diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b474c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +dircomp diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..4e35ab6 --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +#! /bin/bash +gcc dircomp.c -lssl -lcrypto -o dircomp \ No newline at end of file diff --git a/dircomp.c b/dircomp.c index 96ece13..41384c1 100644 --- a/dircomp.c +++ b/dircomp.c @@ -11,6 +11,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. #include #include #include +#include +#include struct arguments{ char* directory1; @@ -24,7 +26,7 @@ struct arguments{ struct arguments get_arguments(int, char**); void print_help(void); -void print_files_in_directory(struct arguments); +void print_files_in_directory(char*, char*, struct arguments*); int main(int argc, char* argv[]){ struct arguments arguments = get_arguments(argc, argv); @@ -34,9 +36,7 @@ int main(int argc, char* argv[]){ return 0; } - arguments.directory1 = "/home/user"; - arguments.directory2 = "/home/user"; - print_files_in_directory(arguments); + print_files_in_directory(arguments.directory1, "", &arguments); // pass pointer to reduce memory usage return 0; } @@ -63,9 +63,66 @@ struct arguments get_arguments(int argc, char** argv){ break; } } + + // Get directories + if( (argc - optind) < 2){ + fprintf (stderr, "Not enough directories.\n"); + exit(-1); + } + else if( (argc - optind) > 2){ + fprintf (stderr, "Too many directories.\n"); + exit(-1); + } + provided_arguments.directory1 = malloc( (strlen(argv[optind]) * sizeof(char)) + 1); + strcpy(provided_arguments.directory1, argv[optind]); + provided_arguments.directory2 = malloc( (strlen(argv[optind + 1]) * sizeof(char)) + 1); + strcpy(provided_arguments.directory2, argv[optind + 1]); + return provided_arguments; } +/* +* References: +* https://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html +*/ +void print_files_in_directory(char* directory1, char* directory2, struct arguments* arguments){ // testing only + printf("\nAnalyzing directory %s\n", directory1); + DIR *d; + struct dirent *dir; + d = opendir(directory1); + if (d) { + while ((dir = readdir(d)) != NULL) { + + // is file + if (dir -> d_type == DT_REG) + { + if(arguments -> v == true) + printf("Analyzing file: %s\n", dir -> d_name); + } + + // is directory + if (dir -> d_type == DT_DIR) + { + if(arguments -> r == true) + print_files_in_directory(dir -> d_name, "", arguments); + } + + } + closedir(d); + } +} + +void sha1(char* string){ + unsigned char hash[SHA_DIGEST_LENGTH]; + SHA1(string, strlen(string), hash); + + int i; + for (i = 0; i < SHA_DIGEST_LENGTH; ++i) + printf("%02x", hash[i]); + + putchar('\n'); +} + void print_help(void){ printf("Usage: dircomp directory1 directory2 [-r] [-n] [-s] [-v] [-h]\n\n"); printf(" -r \t\t Recursive\n"); @@ -74,34 +131,3 @@ void print_help(void){ printf(" -v \t\t Verbose\n"); printf(" -h \t\t Print this help and quit\n\n"); } - -/* -* References: -* https://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html -*/ -void print_files_in_directory(struct arguments arguments){ // testing only - printf("\nAnalyzing directory %s\n", arguments.directory1); - DIR *d; - struct dirent *dir; - d = opendir(arguments.directory1); - if (d) { - while ((dir = readdir(d)) != NULL) { - - // is file - if (dir -> d_type == DT_REG) - { - if(arguments.v == true) - printf("Analyzing file: %s\n", dir -> d_name); - } - - // is directory - if (dir -> d_type == DT_DIR) - { - if(arguments.r == true) - print_files_in_directory(dir -> d_name, arguments); // todo, pass the pointer to reduce memory usage - } - - } - closedir(d); - } -}