Better error handling
authorGlenn L McGrath <bug1@ihug.co.nz>
Sat, 7 Jun 2003 17:38:33 +0000 (17:38 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sat, 7 Jun 2003 17:38:33 +0000 (17:38 -0000)
coreutils/sha1sum.c

index c6534b5cb60ba3b7ba37d89112e59f56e218961f..1c31e3c55ee761efb9336da4b06a9236efc65947 100644 (file)
@@ -112,7 +112,7 @@ static void sha_hash(unsigned int *data, int *hash)
        hash[4] += e;
 }
 
-static void sha1sum_stream(FILE *fd, unsigned int *hashval)
+static char sha1sum_stream(FILE *fd, unsigned int *hashval)
 {
        RESERVE_CONFIG_BUFFER(buffer, 64);
        int length = 0;
@@ -145,7 +145,7 @@ static void sha1sum_stream(FILE *fd, unsigned int *hashval)
 
        RELEASE_CONFIG_BUFFER(buffer);
 
-       return;
+       return(EXIT_SUCCESS);
 }
 
 static void print_hash(unsigned int *hash_value, unsigned char hash_length, unsigned char *filename)
@@ -167,11 +167,12 @@ static void print_hash(unsigned int *hash_value, unsigned char hash_length, unsi
 /* This should become a common function used by sha1sum and md5sum,
  * it needs extra functionality first
  */
-extern int authenticate(int argc, char **argv, void (*hash_ptr)(FILE *stream, unsigned int *hashval), const unsigned char hash_length)
+extern int authenticate(int argc, char **argv, char (*hash_ptr)(FILE *stream, unsigned int *hashval), const unsigned char hash_length)
 {
        unsigned int hash_value[hash_length];
        unsigned char flags = 0;
        int opt;
+       int return_value;
 
        while ((opt = getopt(argc, argv, "sc:w")) != -1) {
                switch (opt) {
@@ -193,31 +194,37 @@ extern int authenticate(int argc, char **argv, void (*hash_ptr)(FILE *stream, un
                argv[argc++] = "-";
        }
 
+       return_value = EXIT_SUCCESS;
        while (optind < argc) {
                FILE *stream;
                unsigned char *file_ptr = argv[optind];
 
+               optind++;
+
                if ((file_ptr[0] == '-') && (file_ptr[1] == '\0')) {
                        stream = stdin;
                } else {
                        stream = bb_wfopen(file_ptr, "r");
                        if (stream == NULL) {
-                               return(EXIT_FAILURE);
+                               return_value = EXIT_FAILURE;
+                               continue;
                        }
                }
-               hash_ptr(stream, hash_value);
-               if (!flags & FLAG_SILENT) {
+               if (hash_ptr(stream, hash_value) == EXIT_FAILURE) {
+                       return_value = EXIT_FAILURE;
+               }
+               else if (!flags & FLAG_SILENT) {
                        print_hash(hash_value, hash_length, file_ptr);
                }
 
                if (fclose(stream) == EOF) {
-                       bb_perror_msg_and_die("Couldnt close file %s", file_ptr);
+                       bb_perror_msg("Couldnt close file %s", file_ptr);
+                       return_value = EXIT_FAILURE;
                }
 
-               optind++;
        }
 
-       return(EXIT_SUCCESS);
+       return(return_value);
 }
 
 extern int sha1sum_main(int argc, char **argv)