diff --git a/src/context.rs b/src/context.rs index 619d26355..a645bd7b2 100644 --- a/src/context.rs +++ b/src/context.rs @@ -306,9 +306,9 @@ pub unsafe fn dc_open(context: &Context, dbfile: &str, blobdir: Option<&str>) -> let dir = dc_ensure_no_slash_safe(blobdir.unwrap()).strdup(); *context.blobdir.write().unwrap() = dir; } else { - let dir = (dbfile.to_string() + "-blobs").strdup(); - dc_create_folder(context, dir); - *context.blobdir.write().unwrap() = dir; + let dir = dbfile.to_string() + "-blobs"; + dc_create_folder(context, &dir); + *context.blobdir.write().unwrap() = dir.strdup(); } // Create/open sqlite database, this may already use the blobdir let dbfile_path = std::path::Path::new(dbfile); diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 2e767a5ce..5cb407b49 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -516,7 +516,8 @@ pub unsafe fn dc_job_do_DC_JOB_IMEX_IMAP(context: &Context, job: *mut dc_job_t) if !(0 == dc_alloc_ongoing(context)) { ongoing_allocated_here = 1; what = (*job).param.get_int(Param::Cmd).unwrap_or_default(); - let param1 = CString::yolo((*job).param.get(Param::Arg).unwrap_or_default()); + let param1_s = (*job).param.get(Param::Arg).unwrap_or_default(); + let param1 = CString::yolo(param1_s); let _param2 = CString::yolo((*job).param.get(Param::Arg2).unwrap_or_default()); if strlen(param1.as_ptr()) == 0 { @@ -537,7 +538,7 @@ pub unsafe fn dc_job_do_DC_JOB_IMEX_IMAP(context: &Context, job: *mut dc_job_t) ); current_block = 3568988166330621280; } else { - dc_create_folder(context, param1.as_ptr()); + dc_create_folder(context, ¶m1_s); current_block = 4495394744059808450; } } else { @@ -743,8 +744,8 @@ unsafe fn import_backup(context: &Context, backup_to_import: *const libc::c_char return 0; } &context.sql.close(&context); - dc_delete_file(context, context.get_dbfile()); - if 0 != dc_file_exist(context, context.get_dbfile()) { + dc_delete_file(context, as_path(context.get_dbfile())); + if dc_file_exist(context, as_path(context.get_dbfile())) { error!( context, 0, "Cannot import backups: Cannot delete the old file.", @@ -752,7 +753,11 @@ unsafe fn import_backup(context: &Context, backup_to_import: *const libc::c_char return 0; } - if 0 == dc_copy_file(context, backup_to_import, context.get_dbfile()) { + if !dc_copy_file( + context, + as_path(backup_to_import), + as_path(context.get_dbfile()), + ) { return 0; } /* error already logged */ @@ -879,7 +884,11 @@ unsafe fn export_backup(context: &Context, dir: *const libc::c_char) -> libc::c_ as_str(context.get_dbfile()), as_str(dest_pathNfilename), ); - if !(0 == dc_copy_file(context, context.get_dbfile(), dest_pathNfilename)) { + if dc_copy_file( + context, + as_path(context.get_dbfile()), + as_path(dest_pathNfilename), + ) { context.sql.open(&context, as_path(context.get_dbfile()), 0); closed = false; /* add all files as blobs to the database copy (this does not require the source to be locked, neigher the destination as it is used only here) */ @@ -1039,7 +1048,7 @@ unsafe fn export_backup(context: &Context, dir: *const libc::c_char) -> libc::c_ context.sql.open(&context, as_path(context.get_dbfile()), 0); } if 0 != delete_dest_file { - dc_delete_file(context, dest_pathNfilename); + dc_delete_file(context, as_path(dest_pathNfilename)); } free(dest_pathNfilename as *mut libc::c_void); @@ -1259,7 +1268,7 @@ unsafe fn export_key_to_asc_file( ) } info!(context, 0, "Exporting key {}", as_str(file_name),); - dc_delete_file(context, file_name); + dc_delete_file(context, as_path(file_name)); if !key.write_asc_to_file(file_name, context) { error!(context, 0, "Cannot write key to {}", as_str(file_name),); } else { diff --git a/src/dc_job.rs b/src/dc_job.rs index eb9476ef5..894f7a2d7 100644 --- a/src/dc_job.rs +++ b/src/dc_job.rs @@ -313,7 +313,8 @@ unsafe fn dc_job_do_DC_JOB_SEND(context: &Context, job: &mut dc_job_t) { } match current_block { 13109137661213826276 => { - filename = job.param.get(Param::File).unwrap_or_default().strdup(); + let filename_s = job.param.get(Param::File).unwrap_or_default(); + filename = filename_s.strdup(); if strlen(filename) == 0 { warn!(context, 0, "Missing file name for job {}", job.job_id,); } else if !(0 == dc_read_file(context, filename, &mut buf, &mut buf_bytes)) { @@ -369,7 +370,7 @@ unsafe fn dc_job_do_DC_JOB_SEND(context: &Context, job: &mut dc_job_t) { (*&mut context.smtp.clone().lock().unwrap()).error, ); } else { - dc_delete_file(context, filename); + dc_delete_file(context, filename_s); if 0 != job.foreign_id { dc_update_msg_state( context, diff --git a/src/dc_mimefactory.rs b/src/dc_mimefactory.rs index dfbb84f86..e4f22e6de 100644 --- a/src/dc_mimefactory.rs +++ b/src/dc_mimefactory.rs @@ -1311,16 +1311,14 @@ unsafe fn build_body_file( /******************************************************************************* * Render ******************************************************************************/ -#[allow(non_snake_case)] unsafe fn is_file_size_okay(msg: *const dc_msg_t) -> bool { let mut file_size_okay = true; - let pathNfilename = (*msg).param.get(Param::File).unwrap_or_default().strdup(); - let bytes = dc_get_filebytes((*msg).context, pathNfilename); + let path = (*msg).param.get(Param::File).unwrap_or_default(); + let bytes = dc_get_filebytes((*msg).context, &path); if bytes > (49 * 1024 * 1024 / 4 * 3) { file_size_okay = false; } - free(pathNfilename as *mut _); file_size_okay } diff --git a/src/dc_msg.rs b/src/dc_msg.rs index 9ac49869f..c900796ef 100644 --- a/src/dc_msg.rs +++ b/src/dc_msg.rs @@ -168,7 +168,7 @@ pub unsafe fn dc_get_msg_info(context: &Context, msg_id: u32) -> *mut libc::c_ch ret += &format!( "\nFile: {}, {}, bytes\n", as_str(p), - dc_get_filebytes(context, p) as libc::c_int, + dc_get_filebytes(context, as_path(p)) as libc::c_int, ); } free(p as *mut libc::c_void); @@ -725,16 +725,13 @@ pub unsafe fn dc_msg_get_filename(msg: *const dc_msg_t) -> *mut libc::c_char { } pub unsafe fn dc_msg_get_filebytes(msg: *const dc_msg_t) -> uint64_t { - let mut ret = 0; - if !(msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint) { if let Some(file) = (*msg).param.get(Param::File) { - let file_c = CString::yolo(file); - ret = dc_get_filebytes((*msg).context, file_c.as_ptr()); + return dc_get_filebytes((*msg).context, &file); } } - ret + 0 } pub unsafe fn dc_msg_get_width(msg: *const dc_msg_t) -> libc::c_int { diff --git a/src/dc_tools.rs b/src/dc_tools.rs index fb30358b9..cf73c2823 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1077,21 +1077,20 @@ pub unsafe fn dc_get_abs_path( pathNfilename_abs } -pub fn dc_file_exist(context: &Context, path: *const libc::c_char) -> libc::c_int { - dc_get_abs_path_safe(context, as_path(path)).exists() as libc::c_int +pub fn dc_file_exist(context: &Context, path: impl AsRef) -> bool { + dc_get_abs_path_safe(context, &path).exists() } -pub fn dc_get_filebytes(context: &Context, path: *const libc::c_char) -> uint64_t { - let path_abs = dc_get_abs_path_safe(context, as_path(path)); +pub fn dc_get_filebytes(context: &Context, path: impl AsRef) -> uint64_t { + let path_abs = dc_get_abs_path_safe(context, &path); match fs::metadata(&path_abs) { Ok(meta) => meta.len() as uint64_t, Err(_err) => 0, } } -pub fn dc_delete_file(context: &Context, path: *const libc::c_char) -> libc::c_int { - let path = as_path(path); - let path_abs = dc_get_abs_path_safe(context, path); +pub fn dc_delete_file(context: &Context, path: impl AsRef) -> bool { + let path_abs = dc_get_abs_path_safe(context, &path); let res = if path_abs.is_file() { fs::remove_file(path_abs) } else { @@ -1099,56 +1098,53 @@ pub fn dc_delete_file(context: &Context, path: *const libc::c_char) -> libc::c_i }; match res { - Ok(_) => 1, + Ok(_) => true, Err(_err) => { - warn!(context, 0, "Cannot delete \"{}\".", path.display()); - 0 + warn!(context, 0, "Cannot delete \"{}\".", path.as_ref().display()); + false } } } pub fn dc_copy_file( context: &Context, - src: *const libc::c_char, - dest: *const libc::c_char, -) -> libc::c_int { - let src = as_path(src); - let dest = as_path(dest); - let src_abs = dc_get_abs_path_safe(context, src); - let dest_abs = dc_get_abs_path_safe(context, dest); + src: impl AsRef, + dest: impl AsRef, +) -> bool { + let src_abs = dc_get_abs_path_safe(context, &src); + let dest_abs = dc_get_abs_path_safe(context, &dest); match fs::copy(&src_abs, &dest_abs) { - Ok(_) => 1, + Ok(_) => true, Err(_) => { error!( context, 0, "Cannot copy \"{}\" to \"{}\".", - src.display(), - dest.display(), + src.as_ref().display(), + dest.as_ref().display(), ); - 0 + false } } } -pub fn dc_create_folder(context: &Context, path: *const libc::c_char) -> libc::c_int { - let path = as_path(path); - let path_abs = dc_get_abs_path_safe(context, path); +pub fn dc_create_folder(context: &Context, path: impl AsRef) -> bool { + let path_abs = dc_get_abs_path_safe(context, &path); if !path_abs.exists() { match fs::create_dir_all(path_abs) { - Ok(_) => 1, + Ok(_) => true, Err(_err) => { warn!( context, 0, "Cannot create directory \"{}\".", - path.display(), + path.as_ref().display(), ); - 0 + false } } } else { - 1 + true } } @@ -1257,7 +1253,7 @@ pub unsafe fn dc_get_fine_pathNfilename( dotNSuffix, ) } - if 0 == dc_file_exist(context, ret) { + if !dc_file_exist(context, as_path(ret)) { /* fine filename found */ break; } else { @@ -1311,7 +1307,7 @@ pub unsafe fn dc_make_rel_and_copy(context: &Context, path: *mut *mut libc::c_ch ); blobdir_path.is_null() } - || 0 == dc_copy_file(context, *path, blobdir_path)) + || !dc_copy_file(context, as_path(*path), as_path(blobdir_path))) { free(*path as *mut libc::c_void); *path = blobdir_path; diff --git a/src/sql.rs b/src/sql.rs index 8fd639330..53deb9e82 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -1042,8 +1042,8 @@ pub fn housekeeping(context: &Context) { unreferenced_count, entry.file_name() ); - let path = entry.path().to_c_string().unwrap(); - dc_delete_file(context, path.as_ptr()); + let path = entry.path(); + dc_delete_file(context, path); } } Err(err) => { diff --git a/tests/stress.rs b/tests/stress.rs index 46176a418..be662d8cb 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -57,39 +57,15 @@ unsafe fn stress_functions(context: &Context) { ); if 0 != dc_is_open(context) { - if 0 != dc_file_exist( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - ) || 0 - != dc_file_exist( - context, - b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, - ) - || 0 != dc_file_exist( - context, - b"$BLOBDIR/foobar.dadada\x00" as *const u8 as *const libc::c_char, - ) - || 0 != dc_file_exist( - context, - b"$BLOBDIR/foobar-folder\x00" as *const u8 as *const libc::c_char, - ) + if dc_file_exist(context, "$BLOBDIR/foobar") + || dc_file_exist(context, "$BLOBDIR/dada") + || dc_file_exist(context, "$BLOBDIR/foobar.dadada") + || dc_file_exist(context, "$BLOBDIR/foobar-folder") { - dc_delete_file( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - ); - dc_delete_file( - context, - b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, - ); - dc_delete_file( - context, - b"$BLOBDIR/foobar.dadada\x00" as *const u8 as *const libc::c_char, - ); - dc_delete_file( - context, - b"$BLOBDIR/foobar-folder\x00" as *const u8 as *const libc::c_char, - ); + dc_delete_file(context, "$BLOBDIR/foobar"); + dc_delete_file(context, "$BLOBDIR/dada"); + dc_delete_file(context, "$BLOBDIR/foobar.dadada"); + dc_delete_file(context, "$BLOBDIR/foobar-folder"); } dc_write_file( context, @@ -97,25 +73,10 @@ unsafe fn stress_functions(context: &Context) { b"content\x00" as *const u8 as *const libc::c_char as *const libc::c_void, 7i32 as size_t, ); - assert_ne!( - 0, - dc_file_exist( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - ) - ); + assert!(dc_file_exist(context, "$BLOBDIR/foobar",)); + assert!(!dc_file_exist(context, "$BLOBDIR/foobarx")); assert_eq!( - 0, - dc_file_exist( - context, - b"$BLOBDIR/foobarx\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_eq!( - dc_get_filebytes( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - ), + dc_get_filebytes(context, "$BLOBDIR/foobar",), 7i32 as libc::c_ulonglong ); @@ -133,23 +94,10 @@ unsafe fn stress_functions(context: &Context) { context, b"/BLOBDIR/fofo\x00" as *const u8 as *const libc::c_char, )); - assert_ne!(0, dc_file_exist(context, abs_path)); + assert!(dc_file_exist(context, as_path(abs_path))); free(abs_path as *mut libc::c_void); - assert_ne!( - 0, - dc_copy_file( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_eq!( - dc_get_filebytes( - context, - b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, - ), - 7 - ); + assert!(dc_copy_file(context, "$BLOBDIR/foobar", "$BLOBDIR/dada",)); + assert_eq!(dc_get_filebytes(context, "$BLOBDIR/dada",), 7); let mut buf: *mut libc::c_void = 0 as *mut libc::c_void; let mut buf_bytes: size_t = 0; @@ -170,41 +118,11 @@ unsafe fn stress_functions(context: &Context) { ); free(buf as *mut _); - assert_ne!( - 0, - dc_delete_file( - context, - b"$BLOBDIR/foobar\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_ne!( - 0, - dc_delete_file( - context, - b"$BLOBDIR/dada\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_ne!( - 0, - dc_create_folder( - context, - b"$BLOBDIR/foobar-folder\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_ne!( - 0, - dc_file_exist( - context, - b"$BLOBDIR/foobar-folder\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_ne!( - 0, - dc_delete_file( - context, - b"$BLOBDIR/foobar-folder\x00" as *const u8 as *const libc::c_char, - ) - ); + assert!(dc_delete_file(context, "$BLOBDIR/foobar")); + assert!(dc_delete_file(context, "$BLOBDIR/dada")); + assert!(dc_create_folder(context, "$BLOBDIR/foobar-folder")); + assert!(dc_file_exist(context, "$BLOBDIR/foobar-folder",)); + assert!(dc_delete_file(context, "$BLOBDIR/foobar-folder")); let fn0: *mut libc::c_char = dc_get_fine_pathNfilename( context, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, @@ -237,7 +155,7 @@ unsafe fn stress_functions(context: &Context) { ), 0 ); - assert_ne!(0, dc_delete_file(context, fn0)); + assert!(dc_delete_file(context, as_path(fn0))); free(fn0 as *mut libc::c_void); free(fn1 as *mut libc::c_void); }