int main( int argc, char **argv ) { blake2fn blake2_stream = blake2b_stream; size_t outlen = BLAKE2B_OUTBYTES; unsigned char hash[BLAKE2B_OUTBYTES] = {0}; int c; opterr = 1; if ( argc == 1 ) usage( argv ); /* show usage upon no-argument */ while( ( c = getopt( argc, argv, "a:" ) ) != -1 ) { switch( c ) { case 'a': if( 0 == strcmp( optarg, "blake2b" ) ) { blake2_stream = blake2b_stream; outlen = BLAKE2B_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2s" ) ) { blake2_stream = blake2s_stream; outlen = BLAKE2S_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2bp" ) ) { blake2_stream = blake2bp_stream; outlen = BLAKE2B_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2sp" ) ) { blake2_stream = blake2sp_stream; outlen = BLAKE2S_OUTBYTES; } else { printf( "Invalid function name: `%s'\n", optarg ); usage( argv ); } break; } } int i = 0 ; for( i = optind; i < argc; ++i ) { FILE *f = NULL; f = fopen( argv[i], "rb" ); if( !f ) { fprintf( stderr, "Could not open `%s': %s\n", argv[i], strerror( errno ) ); goto end0; } if( blake2_stream( f, hash ) < 0 ) { fprintf( stderr, "Failed to hash `%s'\n", argv[i] ); goto end1; } int j = 0 ; for(j = 0; j < outlen; ++j ) printf( "%02x", hash[j] ); printf( " %s\n", argv[i] ); end1: fclose( f ); end0: ; } return 0; }
int main( int argc, char **argv ) { blake2fn blake2_stream = blake2b_stream; size_t outlen = BLAKE2B_OUTBYTES; unsigned char hash[BLAKE2B_OUTBYTES] = {0}; bool bsdstyle = false; int c; opterr = 1; while( 1 ) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { { "help", no_argument, 0, 0 }, { "tag", no_argument, 0, 0 }, { NULL, 0, NULL, 0 } }; c = getopt_long( argc, argv, "a:", long_options, &option_index ); if( c == -1 ) break; switch( c ) { case 'a': if( 0 == strcmp( optarg, "blake2b" ) ) { blake2_stream = blake2b_stream; outlen = BLAKE2B_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2s" ) ) { blake2_stream = blake2s_stream; outlen = BLAKE2S_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2bp" ) ) { blake2_stream = blake2bp_stream; outlen = BLAKE2B_OUTBYTES; } else if ( 0 == strcmp( optarg, "blake2sp" ) ) { blake2_stream = blake2sp_stream; outlen = BLAKE2S_OUTBYTES; } else { printf( "Invalid function name: `%s'\n", optarg ); usage( argv, 111 ); } break; case 0: if( 0 == strcmp( "help", long_options[option_index].name ) ) usage( argv, 0 ); else if( 0 == strcmp( "tag", long_options[option_index].name ) ) bsdstyle = true; break; case '?': usage( argv, 1 ); break; } } if( optind == argc ) argv[argc++] = (char *) "-"; for( int i = optind; i < argc; ++i ) { FILE *f = NULL; if( argv[i][0] == '-' && argv[i][1] == '\0' ) f = stdin; else f = fopen( argv[i], "rb" ); if( !f ) { fprintf( stderr, "Could not open `%s': %s\n", argv[i], strerror( errno ) ); continue; } if( blake2_stream( f, hash ) < 0 ) { fprintf( stderr, "Failed to hash `%s'\n", argv[i] ); } else { if( bsdstyle ) { if( blake2_stream == blake2b_stream ) printf( "BLAKE2b" ); else if( blake2_stream == blake2bp_stream ) printf( "BLAKE2bp" ); else if( blake2_stream == blake2s_stream ) printf( "BLAKE2s" ); else if( blake2_stream == blake2sp_stream ) printf( "BLAKE2sp" ); printf( " (%s) = ", argv[i] ); } for( size_t j = 0; j < outlen; ++j ) printf( "%02x", hash[j] ); if( bsdstyle ) printf( "\n" ); else printf( " %s\n", argv[i] ); } if( f != stdin ) fclose( f ); } return 0; }