diff --git a/examples/repl/stress.rs b/examples/repl/stress.rs index 738690708..95639e401 100644 --- a/examples/repl/stress.rs +++ b/examples/repl/stress.rs @@ -1,5 +1,7 @@ //! Stress some functions for testing; if used as a lib, this file is obsolete. +use std::ffi::CStr; + use deltachat::dc_aheader::*; use deltachat::dc_apeerstate::*; use deltachat::dc_array::*; @@ -56,7 +58,7 @@ static mut s_em_setupfile: *const libc::c_char = b"-----BEGIN PGP MESSAGE-----\nPassphrase-Format: numeric9x4\nPassphrase-Begin: 17\n\n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\nmngm1QCMMw2v/j8=\n=9sJE\n-----END PGP MESSAGE-----\n\x00" as *const u8 as *const libc::c_char; #[no_mangle] -pub unsafe extern "C" fn stress_functions(mut context: &dc_context_t) { +pub unsafe extern "C" fn stress_functions(context: &dc_context_t) { let mut saxparser: dc_saxparser_t = dc_saxparser_t { starttag_cb: None, endtag_cb: None, @@ -442,50 +444,25 @@ pub unsafe extern "C" fn stress_functions(mut context: &dc_context_t) { ); } else { }; + let mut buf: *mut libc::c_void = 0 as *mut libc::c_void; let mut buf_bytes: size_t = 0; - if 0 != (0 - == dc_read_file( + + assert_eq!( + dc_read_file( context, b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, &mut buf, &mut buf_bytes, - )) as libc::c_int as libc::c_long - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 253i32, - b"dc_read_file(context, \"$BLOBDIR/dada\", &buf, &buf_bytes)\x00" as *const u8 - as *const libc::c_char, - ); - } else { - }; - if 0 != !(buf_bytes == 7) as libc::c_int as libc::c_long { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 254i32, - b"buf_bytes==7\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - if 0 != !(strcmp( - buf as *const libc::c_char, - b"content\x00" as *const u8 as *const libc::c_char, - ) == 0i32) as libc::c_int as libc::c_long - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 255i32, - b"strcmp(buf, \"content\")==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; + ), + 1 + ); + assert_eq!(buf_bytes, 7); + assert_eq!( + CStr::from_ptr(buf as *const libc::c_char).to_str().unwrap(), + "content" + ); + free(buf); if 0 != (0 == dc_delete_file( diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 2a9f29fc2..a9dd8596b 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1,3 +1,5 @@ +use std::fs; + use libc; use rand::{thread_rng, Rng}; @@ -1303,6 +1305,10 @@ pub unsafe fn dc_file_exist( mut pathNfilename: *const libc::c_char, ) -> libc::c_int { let pathNfilename_abs = dc_get_abs_path(context, pathNfilename); + if pathNfilename_abs.is_null() { + return 0; + } + let exist = { let p = std::path::Path::new( std::ffi::CStr::from_ptr(pathNfilename_abs) @@ -1322,12 +1328,15 @@ pub unsafe fn dc_get_filebytes( mut pathNfilename: *const libc::c_char, ) -> uint64_t { let pathNfilename_abs = dc_get_abs_path(context, pathNfilename); + if pathNfilename_abs.is_null() { + return 0; + } let filebytes = { let p = std::ffi::CStr::from_ptr(pathNfilename_abs) .to_str() .unwrap(); - std::fs::metadata(p).unwrap().len() + fs::metadata(p).unwrap().len() }; free(pathNfilename_abs as *mut libc::c_void); @@ -1339,119 +1348,69 @@ pub unsafe fn dc_delete_file( mut pathNfilename: *const libc::c_char, ) -> libc::c_int { let mut success: libc::c_int = 0i32; - let mut pathNfilename_abs: *mut libc::c_char = 0 as *mut libc::c_char; - pathNfilename_abs = dc_get_abs_path(context, pathNfilename); - if !pathNfilename_abs.is_null() { - if remove(pathNfilename_abs) != 0i32 { + let pathNfilename_abs = dc_get_abs_path(context, pathNfilename); + if pathNfilename_abs.is_null() { + return 0; + } + let p = std::ffi::CStr::from_ptr(pathNfilename_abs) + .to_str() + .unwrap(); + + match fs::remove_file(p) { + Ok(_) => { + success = 1; + } + Err(_err) => { dc_log_warning( context, 0i32, b"Cannot delete \"%s\".\x00" as *const u8 as *const libc::c_char, pathNfilename, ); - } else { - success = 1i32 } } + free(pathNfilename_abs as *mut libc::c_void); - return success; + success } + pub unsafe fn dc_copy_file( - mut context: &dc_context_t, - mut src: *const libc::c_char, - mut dest: *const libc::c_char, + context: &dc_context_t, + src: *const libc::c_char, + dest: *const libc::c_char, ) -> libc::c_int { - let mut current_block: u64; - let mut success: libc::c_int = 0i32; - let mut src_abs: *mut libc::c_char = 0 as *mut libc::c_char; - let mut dest_abs: *mut libc::c_char = 0 as *mut libc::c_char; - let mut fd_src: libc::c_int = -1i32; - let mut fd_dest: libc::c_int = -1i32; - let mut buf: [libc::c_char; 4096] = [0; 4096]; - let mut bytes_read = 0; - let mut anything_copied: libc::c_int = 0i32; - src_abs = dc_get_abs_path(context, src); - if !(src_abs.is_null() || { - dest_abs = dc_get_abs_path(context, dest); - dest_abs.is_null() - }) { - fd_src = open(src_abs, 0i32); - if fd_src < 0i32 { + let mut success = 0; + + let src_abs = dc_get_abs_path(context, src); + let dest_abs = dc_get_abs_path(context, dest); + + if src_abs.is_null() || dest_abs.is_null() { + return 0; + } + + let src_p = std::ffi::CStr::from_ptr(src_abs).to_str().unwrap(); + let dest_p = std::ffi::CStr::from_ptr(dest_abs).to_str().unwrap(); + + match fs::copy(src_p, dest_p) { + Ok(_) => { + success = 1; + } + Err(_) => { dc_log_error( context, - 0i32, - b"Cannot open source file \"%s\".\x00" as *const u8 as *const libc::c_char, + 0, + b"Cannot copy \"%s\" to \"%s\".\x00" as *const u8 as *const libc::c_char, src, + dest, ); - } else { - fd_dest = open(dest_abs, 0x1i32 | 0x200i32 | 0x800i32, 0o666i32); - if fd_dest < 0i32 { - dc_log_error( - context, - 0i32, - b"Cannot open destination file \"%s\".\x00" as *const u8 as *const libc::c_char, - dest, - ); - } else { - loop { - bytes_read = read( - fd_src, - buf.as_mut_ptr() as *mut libc::c_void, - 4096i32 as size_t, - ) as size_t; - if !(bytes_read > 0) { - break; - } - if write(fd_dest, buf.as_mut_ptr() as *const libc::c_void, bytes_read) - != bytes_read as isize - { - dc_log_error( - context, - 0i32, - b"Cannot write %i bytes to \"%s\".\x00" as *const u8 - as *const libc::c_char, - bytes_read, - dest, - ); - } - anything_copied = 1i32 - } - if 0 == anything_copied { - close(fd_src); - fd_src = -1i32; - if dc_get_filebytes(context, src) != 0 { - dc_log_error( - context, - 0i32, - b"Different size information for \"%s\".\x00" as *const u8 - as *const libc::c_char, - bytes_read, - dest, - ); - current_block = 610040589300051390; - } else { - current_block = 5634871135123216486; - } - } else { - current_block = 5634871135123216486; - } - match current_block { - 610040589300051390 => {} - _ => success = 1i32, - } - } } } - if fd_src >= 0i32 { - close(fd_src); - } - if fd_dest >= 0i32 { - close(fd_dest); - } + free(src_abs as *mut libc::c_void); free(dest_abs as *mut libc::c_void); - return success; + success } + pub unsafe fn dc_create_folder( mut context: &dc_context_t, mut pathNfilename: *const libc::c_char, @@ -1485,97 +1444,86 @@ pub unsafe fn dc_create_folder( } pub unsafe fn dc_write_file( - mut context: &dc_context_t, - mut pathNfilename: *const libc::c_char, - mut buf: *const libc::c_void, - mut buf_bytes: size_t, + context: &dc_context_t, + pathNfilename: *const libc::c_char, + buf: *const libc::c_void, + buf_bytes: size_t, ) -> libc::c_int { - let mut f: *mut libc::FILE = 0 as *mut libc::FILE; - let mut success: libc::c_int = 0i32; - let mut pathNfilename_abs: *mut libc::c_char = 0 as *mut libc::c_char; - pathNfilename_abs = dc_get_abs_path(context, pathNfilename); - if !pathNfilename_abs.is_null() { - f = fopen( - pathNfilename_abs, - b"wb\x00" as *const u8 as *const libc::c_char, - ); - if !f.is_null() { - if fwrite(buf, 1, buf_bytes, f) == buf_bytes { - success = 1i32 - } else { - dc_log_warning( - context, - 0i32, - b"Cannot write %lu bytes to \"%s\".\x00" as *const u8 as *const libc::c_char, - buf_bytes as libc::c_ulong, - pathNfilename, - ); - } - fclose(f); - } else { + let mut success = 0; + let pathNfilename_abs = dc_get_abs_path(context, pathNfilename); + if pathNfilename_abs.is_null() { + return 0; + } + + let p = std::ffi::CStr::from_ptr(pathNfilename_abs) + .to_str() + .unwrap(); + + let bytes = std::slice::from_raw_parts(buf as *const u8, buf_bytes); + + match fs::write(p, bytes) { + Ok(_) => { + success = 1; + } + Err(_err) => { dc_log_warning( context, 0i32, - b"Cannot open \"%s\" for writing.\x00" as *const u8 as *const libc::c_char, + b"Cannot write %lu bytes to \"%s\".\x00" as *const u8 as *const libc::c_char, + buf_bytes as libc::c_ulong, pathNfilename, ); } } + free(pathNfilename_abs as *mut libc::c_void); - return success; + success } + pub unsafe fn dc_read_file( - mut context: &dc_context_t, - mut pathNfilename: *const libc::c_char, - mut buf: *mut *mut libc::c_void, - mut buf_bytes: *mut size_t, + context: &dc_context_t, + pathNfilename: *const libc::c_char, + buf: *mut *mut libc::c_void, + buf_bytes: *mut size_t, ) -> libc::c_int { - let mut success: libc::c_int = 0i32; - let mut pathNfilename_abs: *mut libc::c_char = 0 as *mut libc::c_char; - let mut f: *mut libc::FILE = 0 as *mut libc::FILE; + let mut success = 0; + if pathNfilename.is_null() || buf.is_null() || buf_bytes.is_null() { - return 0i32; + return 0; } + *buf = 0 as *mut libc::c_void; *buf_bytes = 0i32 as size_t; - pathNfilename_abs = dc_get_abs_path(context, pathNfilename); - if !pathNfilename_abs.is_null() { - f = fopen( - pathNfilename_abs, - b"rb\x00" as *const u8 as *const libc::c_char, - ); - if !f.is_null() { - fseek(f, 0, 2i32); - *buf_bytes = ftell(f) as size_t; - fseek(f, 0, 0i32); - if !(*buf_bytes <= 0) { - *buf = malloc((*buf_bytes).wrapping_add(1)); - if !(*buf).is_null() { - *(*buf as *mut libc::c_char).offset(*buf_bytes as isize) = 0i32 as libc::c_char; - if !(fread(*buf, 1, *buf_bytes, f) != *buf_bytes) { - success = 1i32 - } - } - } + + let pathNfilename_abs = dc_get_abs_path(context, pathNfilename); + if pathNfilename_abs.is_null() { + return 0; + } + + let p = std::ffi::CStr::from_ptr(pathNfilename_abs) + .to_str() + .unwrap(); + + match fs::read(p) { + Ok(mut bytes) => { + *buf = bytes.as_mut_ptr() as *mut libc::c_void; + *buf_bytes = bytes.len(); + success = 1; + } + Err(_err) => { + dc_log_warning( + context, + 0, + b"Cannot read \"%s\" or file is empty.\x00" as *const u8 as *const libc::c_char, + pathNfilename, + ); } } - if !f.is_null() { - fclose(f); - } - if success == 0i32 { - free(*buf); - *buf = 0 as *mut libc::c_void; - *buf_bytes = 0i32 as size_t; - dc_log_warning( - context, - 0i32, - b"Cannot read \"%s\" or file is empty.\x00" as *const u8 as *const libc::c_char, - pathNfilename, - ); - } + free(pathNfilename_abs as *mut libc::c_void); - return success; + success } + pub unsafe fn dc_get_fine_pathNfilename( mut context: &dc_context_t, mut pathNfolder: *const libc::c_char, @@ -1632,6 +1580,7 @@ pub unsafe fn dc_get_fine_pathNfilename( free(pathNfolder_wo_slash as *mut libc::c_void); return ret; } + pub unsafe fn dc_is_blobdir_path( mut context: &dc_context_t, mut path: *const libc::c_char, @@ -1643,6 +1592,7 @@ pub unsafe fn dc_is_blobdir_path( } return 0i32; } + pub unsafe fn dc_make_rel_path(mut context: &dc_context_t, mut path: *mut *mut libc::c_char) { if path.is_null() || (*path).is_null() { return; @@ -1655,6 +1605,7 @@ pub unsafe fn dc_make_rel_path(mut context: &dc_context_t, mut path: *mut *mut l ); }; } + pub unsafe fn dc_make_rel_and_copy( mut context: &dc_context_t, mut path: *mut *mut libc::c_char,