Exemple #1
0
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);
}
Exemple #2
0
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;
}
Exemple #3
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);
}
Exemple #4
0
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);
}