11extern crate autotools;
22
3+ use SHA256Status :: { Mismatch , Unknown } ;
34use autotools:: Config ;
45use std:: env;
56use std:: io:: ErrorKind ;
67use std:: path:: { Path , PathBuf } ;
78use std:: process:: Command ;
8- use MD5Status :: { Mismatch , Unknown } ;
99
10- const PACKAGE_URL : & str = "https://github.com/ivmai/cudd/archive/refs/tags/cudd-3.0.0.tar.gz" ;
11- const PACKAGE_MD5 : & str = "edca9c69528256ca8ae37be9cedef73f" ;
10+ const PACKAGE_URL : & str =
11+ "https://github.com/cuddorg/cudd/releases/download/cudd-3.0.0/cudd-3.0.0.tar.gz" ;
12+ const PACKAGE_SHA256 : & str = "5fe145041c594689e6e7cf4cd623d5f2b7c36261708be8c9a72aed72cf67acce" ;
1213
1314#[ derive( Debug ) ]
15+ #[ allow( dead_code) ]
1416enum FetchError {
1517 CommandError ( std:: process:: ExitStatus ) ,
1618 IOError ( std:: io:: Error ) ,
1719 PathExists ,
1820}
1921
20- enum MD5Status {
22+ enum SHA256Status {
2123 Match ,
2224 Mismatch ,
2325 Unknown ,
@@ -33,19 +35,23 @@ impl From<std::io::Error> for FetchError {
3335fn run_command ( cmd : & mut Command ) -> Result < ( String , String ) , FetchError > {
3436 let output = cmd. output ( ) ?;
3537
36- return if output. status . success ( ) {
38+ if output. status . success ( ) {
3739 Ok ( (
3840 String :: from_utf8 ( output. stdout ) . unwrap ( ) ,
3941 String :: from_utf8 ( output. stderr ) . unwrap ( ) ,
4042 ) )
4143 } else {
4244 eprintln ! ( "Command {:?} exited with status {}" , cmd, output. status) ;
4345 Err ( FetchError :: CommandError ( output. status ) )
44- } ;
46+ }
4547}
4648
47- /// Fetch a file from a URL if it does not already exist in out_dir and verify its md5sum if possible.
48- fn fetch_package ( out_dir : & str , url : & str , md5 : & str ) -> Result < ( PathBuf , MD5Status ) , FetchError > {
49+ /// Fetch a file from a URL if it does not already exist in out_dir and verify its sha256sum if possible.
50+ fn fetch_package (
51+ out_dir : & str ,
52+ url : & str ,
53+ sha256 : & str ,
54+ ) -> Result < ( PathBuf , SHA256Status ) , FetchError > {
4955 let out_path = Path :: new ( & out_dir) ;
5056 let target_path = out_path. join ( Path :: new ( url) . file_name ( ) . unwrap ( ) ) ;
5157 let target_path_str = target_path. clone ( ) . into_os_string ( ) . into_string ( ) . unwrap ( ) ;
@@ -55,7 +61,7 @@ fn fetch_package(out_dir: &str, url: &str, md5: &str) -> Result<(PathBuf, MD5Sta
5561 // Path does not exist! Start download...
5662 println ! ( "Downloading {} to {}" , url, target_path_str) ;
5763 let mut command = Command :: new ( "curl" ) ;
58- command. args ( & [ "-L" , url, "-o" , target_path_str. as_str ( ) ] ) ;
64+ command. args ( [ "-L" , url, "-o" , target_path_str. as_str ( ) ] ) ;
5965 run_command ( & mut command) ?;
6066 }
6167 Ok ( data) if data. is_file ( ) => {
@@ -65,20 +71,20 @@ fn fetch_package(out_dir: &str, url: &str, md5: &str) -> Result<(PathBuf, MD5Sta
6571 Err ( error) => return Err ( FetchError :: from ( error) ) ,
6672 }
6773
68- // Now run md5 sum check:
69- let mut command_1 = Command :: new ( "md5sum " ) ;
74+ // Now run sha256 sum check:
75+ let mut command_1 = Command :: new ( "sha256sum " ) ;
7076 command_1. arg ( target_path. clone ( ) ) ;
71- let mut command_2 = Command :: new ( "md5 " ) ;
77+ let mut command_2 = Command :: new ( "shasum -a 256 " ) ;
7278 command_2. arg ( target_path. clone ( ) ) ;
73- let md5_result = run_command ( & mut command_1) . or_else ( |_| run_command ( & mut command_2) ) ;
79+ let sha256_result = run_command ( & mut command_1) . or_else ( |_| run_command ( & mut command_2) ) ;
7480
75- let md5_status = match md5_result {
76- Err ( _) => MD5Status :: Unknown ,
77- Ok ( ( output, _) ) if output. contains ( md5 ) => MD5Status :: Match ,
78- _ => MD5Status :: Mismatch ,
81+ let sha256_status = match sha256_result {
82+ Err ( _) => SHA256Status :: Unknown ,
83+ Ok ( ( output, _) ) if output. contains ( sha256 ) => SHA256Status :: Match ,
84+ _ => SHA256Status :: Mismatch ,
7985 } ;
8086
81- Ok ( ( target_path, md5_status ) )
87+ Ok ( ( target_path, sha256_status ) )
8288}
8389
8490fn main ( ) -> Result < ( ) , String > {
@@ -91,13 +97,13 @@ fn main() -> Result<(), String> {
9197 let out_dir = env:: var ( "OUT_DIR" )
9298 . map_err ( |_| "Environmental variable `OUT_DIR` not defined." . to_string ( ) ) ?;
9399
94- let ( tar_path, md5_status ) = fetch_package ( & out_dir, PACKAGE_URL , PACKAGE_MD5 )
100+ let ( tar_path, sha256_status ) = fetch_package ( & out_dir, PACKAGE_URL , PACKAGE_SHA256 )
95101 . map_err ( |e| format ! ( "Error downloading CUDD package: {:?}." , e) ) ?;
96102 let tar_path_str = tar_path. to_str ( ) . unwrap ( ) . to_string ( ) ;
97103
98- match md5_status {
99- Unknown => eprintln ! ( "WARNING: MD5 not computed. Package validation skipped." ) ,
100- Mismatch => return Err ( "CUDD package MD5 hash mismatch." . to_string ( ) ) ,
104+ match sha256_status {
105+ Unknown => eprintln ! ( "WARNING: SHA256 not computed. Package validation skipped." ) ,
106+ Mismatch => return Err ( "CUDD package SHA256 hash mismatch." . to_string ( ) ) ,
101107 _ => ( ) ,
102108 }
103109
@@ -113,7 +119,7 @@ fn main() -> Result<(), String> {
113119
114120 // un-tar package, ignoring the name of the top level folder, dumping into cudd_path instead.
115121 let mut tar_command = Command :: new ( "tar" ) ;
116- tar_command. args ( & [
122+ tar_command. args ( [
117123 "xf" ,
118124 & tar_path_str,
119125 "--strip-components=1" ,
0 commit comments