static void rm_hasher_print(RmDigest *digest, char *path, bool print_multihash) { gsize size = rm_digest_get_bytes(digest) * 2 + 1; char checksum_str[size]; memset(checksum_str, '0', size); checksum_str[size - 1] = 0; rm_digest_hexstring(digest, checksum_str); if(print_multihash) { g_print("%02x%02x@", rm_digest_type_to_multihash_id(digest->type), rm_digest_get_bytes(digest)); } g_print("%s %s\n", checksum_str, path); }
int rm_xattr_write_hash(RmSession *session, RmFile *file) { g_assert(file); g_assert(file->digest); g_assert(session); #if HAVE_XATTR if(file->has_ext_cksum || session->cfg->write_cksum_to_xattr == false) { return EINVAL; } char cksum_key[64], mtime_key[64], cksum_hex_str[rm_digest_get_bytes(file->digest) * 2 + 1], timestamp[64] = {0}; int timestamp_bytes = 0; double actual_time_sec = difftime(file->mtime, 0); if(0 || rm_xattr_build_key(session, "cksum", cksum_key, sizeof(cksum_key)) || rm_xattr_build_key(session, "mtime", mtime_key, sizeof(mtime_key)) || rm_xattr_build_cksum(file, cksum_hex_str, sizeof(cksum_hex_str)) <= 0 || rm_xattr_set(file, cksum_key, cksum_hex_str, sizeof(cksum_hex_str)) || (timestamp_bytes = snprintf( timestamp, sizeof(timestamp), "%lld", (long long)actual_time_sec)) == -1 || rm_xattr_set(file, mtime_key, timestamp, timestamp_bytes)) { return errno; } #endif return 0; }
static void rm_fmt_elem(_UNUSED RmSession *session, _UNUSED RmFmtHandler *parent, FILE *out, RmFile *file) { if (file->lint_type == RM_LINT_TYPE_UNIQUE_FILE && (!file->digest || !session->cfg->write_unfinished)) { /* unique file with no partial checksum */ return; /* TODO: add option to output all unique files */ } char checksum_str[rm_digest_get_bytes(file->digest) * 2 + 1]; memset(checksum_str, '0', sizeof(checksum_str)); checksum_str[sizeof(checksum_str) - 1] = 0; if(file->digest) { rm_digest_hexstring(file->digest, checksum_str); } /* Escape quotes in the path (refer http://tools.ietf.org/html/rfc4180, item 6)*/ RM_DEFINE_PATH(file); char *clean_path = rm_util_strsub(file_path, CSV_QUOTE, CSV_QUOTE "" CSV_QUOTE); fprintf(out, CSV_FORMAT, rm_file_lint_type_to_string(file->lint_type), clean_path, file->file_size, checksum_str); g_free(clean_path); }
static void rm_fmt_elem(RmSession *session, _UNUSED RmFmtHandler *parent, FILE *out, RmFile *file) { if(rm_fmt_get_config_value(session->formats, "json", "no_body")) { return; } if(file->lint_type == RM_LINT_TYPE_UNIQUE_FILE && (!file->digest || !session->cfg->write_unfinished)) { /* unique file with no partial checksum */ return; } char checksum_str[rm_digest_get_bytes(file->digest) * 2 + 1]; rm_fmt_json_cksum(file, checksum_str, sizeof(checksum_str)); RmFmtHandlerJSON *self = (RmFmtHandlerJSON *)parent; /* Make it look like a json element */ rm_fmt_json_open(self, out); { RM_DEFINE_PATH(file); rm_fmt_json_key_int(out, "id", rm_fmt_json_generate_id(self, file, file_path, checksum_str)); rm_fmt_json_sep(self, out); rm_fmt_json_key(out, "type", rm_file_lint_type_to_string(file->lint_type)); rm_fmt_json_sep(self, out); gdouble progress = 0; if(session->shred_bytes_after_preprocess) { progress = CLAMP(100 - 100 * ((gdouble)session->shred_bytes_remaining / (gdouble)session->shred_bytes_after_preprocess), 0, 100); } rm_fmt_json_key_int(out, "progress", progress); rm_fmt_json_sep(self, out); if(file->digest) { rm_fmt_json_key(out, "checksum", checksum_str); rm_fmt_json_sep(self, out); } rm_fmt_json_key_unsafe(out, "path", file_path); rm_fmt_json_sep(self, out); if(file->lint_type != RM_LINT_TYPE_UNIQUE_FILE) { rm_fmt_json_key_int(out, "size", file->actual_file_size); rm_fmt_json_sep(self, out); if(file->twin_count >= 0) { rm_fmt_json_key_int(out, "twins", file->twin_count); rm_fmt_json_sep(self, out); } rm_fmt_json_key_int(out, "depth", file->depth); rm_fmt_json_sep(self, out); rm_fmt_json_key_int(out, "inode", file->inode); rm_fmt_json_sep(self, out); rm_fmt_json_key_int(out, "disk_id", file->dev); rm_fmt_json_sep(self, out); rm_fmt_json_key_bool(out, "is_original", file->is_original); rm_fmt_json_sep(self, out); if(session->cfg->find_hardlinked_dupes) { RmFile *hardlink_head = RM_FILE_HARDLINK_HEAD(file); if(hardlink_head && hardlink_head != file) { char orig_checksum_str[rm_digest_get_bytes(file->digest) * 2 + 1]; rm_fmt_json_cksum(hardlink_head, orig_checksum_str, sizeof(orig_checksum_str)); RM_DEFINE_PATH(hardlink_head); guint32 orig_id = rm_fmt_json_generate_id( self, hardlink_head, hardlink_head_path, orig_checksum_str); rm_fmt_json_key_int(out, "hardlink_of", orig_id); rm_fmt_json_sep(self, out); } } } rm_fmt_json_key_float(out, "mtime", file->mtime); } rm_fmt_json_close(self, out); }