示例#1
0
void rm_digest_free(RmDigest *digest) {
    switch(digest->type) {
    case RM_DIGEST_MD5:
    case RM_DIGEST_SHA512:
    case RM_DIGEST_SHA256:
    case RM_DIGEST_SHA1:
        g_checksum_free(digest->glib_checksum);
        digest->glib_checksum = NULL;
        break;
    case RM_DIGEST_PARANOID:
        if(digest->shadow_hash) {
            rm_digest_free(digest->shadow_hash);
        }
    case RM_DIGEST_CUMULATIVE:
    case RM_DIGEST_MURMUR512:
    case RM_DIGEST_CITY512:
    case RM_DIGEST_MURMUR256:
    case RM_DIGEST_CITY256:
    case RM_DIGEST_BASTARD:
    case RM_DIGEST_SPOOKY:
    case RM_DIGEST_SPOOKY32:
    case RM_DIGEST_SPOOKY64:
    case RM_DIGEST_MURMUR:
    case RM_DIGEST_CITY:
        if(digest->checksum) {
            g_slice_free1(digest->bytes, digest->checksum);
            digest->checksum = NULL;
        }
        break;
    default:
        g_assert_not_reached();
    }
    g_slice_free(RmDigest, digest);
}
示例#2
0
static int rm_hasher_callback(_U RmHasher *hasher,
                              RmDigest *digest,
                              RmHasherSession *session,
                              gpointer index_ptr) {
    gint index = GPOINTER_TO_INT(index_ptr);

    g_mutex_lock(&session->lock);
    {
        if(session->print_in_order && digest) {
            /* add digest in buffer array */
            session->completed_digests_buffer[index] = digest;
            /* check if the next due digest has been completed; if yes then print
             * it (and possibly any following digests) */
            while(session->completed_digests_buffer[session->path_index]) {
                if(session->paths[session->path_index]) {
                    rm_hasher_print(
                        session->completed_digests_buffer[session->path_index],
                        session->paths[session->path_index],
                        session->print_multihash);
                    rm_digest_free(
                        session->completed_digests_buffer[session->path_index]);
                }
                session->completed_digests_buffer[session->path_index] = NULL;
                session->path_index++;
            }
        } else if(digest) {
            rm_hasher_print(digest, session->paths[index], session->print_multihash);
        }
    }
    g_mutex_unlock(&session->lock);
    return 0;
}
示例#3
0
static void rm_directory_free(RmDirectory *self) {
    rm_digest_free(self->digest);
    g_hash_table_unref(self->hash_set);
    g_queue_clear(&self->known_files);
    g_queue_clear(&self->children);
    g_free(self->dirname);
    g_free(self);
}
示例#4
0
文件: checksum.c 项目: FihlaTV/rmlint
guint8 *rm_digest_steal(RmDigest *digest) {
    guint8 *result = g_slice_alloc0(digest->bytes);
    gsize buflen = digest->bytes;

    if(rm_digest_needs_steal(digest->type)) {
        /* reading the digest is destructive, so we need to take a copy */
        RmDigest *copy = rm_digest_copy(digest);
        g_checksum_get_digest(copy->glib_checksum, result, &buflen);
        rm_assert_gentle(buflen == digest->bytes);
        rm_digest_free(copy);
    } else {
        memcpy(result, digest->checksum, digest->bytes);
    }
    return result;
}
示例#5
0
RmDigest *rm_digest_copy(RmDigest *digest) {
    g_assert(digest);

    RmDigest *self = NULL;

    switch(digest->type) {
    case RM_DIGEST_MD5:
    case RM_DIGEST_SHA512:
    case RM_DIGEST_SHA256:
    case RM_DIGEST_SHA1:
        self = g_slice_new0(RmDigest);
        self->bytes = digest->bytes;
        self->type = digest->type;
        self->glib_checksum = g_checksum_copy(digest->glib_checksum);
        break;
    case RM_DIGEST_PARANOID:
    case RM_DIGEST_SPOOKY:
    case RM_DIGEST_SPOOKY32:
    case RM_DIGEST_SPOOKY64:
    case RM_DIGEST_MURMUR:
    case RM_DIGEST_CITY:
    case RM_DIGEST_CITY256:
    case RM_DIGEST_MURMUR256:
    case RM_DIGEST_CITY512:
    case RM_DIGEST_MURMUR512:
    case RM_DIGEST_BASTARD:
    case RM_DIGEST_CUMULATIVE:
        self = rm_digest_new(
                   digest->type, digest->initial_seed1, digest->initial_seed2, digest->bytes
               );

        if(self->type == RM_DIGEST_PARANOID) {
            self->paranoid_offset = digest->paranoid_offset;
            rm_digest_free(self->shadow_hash);
            self->shadow_hash = rm_digest_copy(digest->shadow_hash);
        }

        if(self->checksum && digest->checksum) {
            memcpy((char *)self->checksum, (char *)digest->checksum, self->bytes);
        }

        break;
    default:
        g_assert_not_reached();
    }

    return self;
}
示例#6
0
文件: checksum.c 项目: FihlaTV/rmlint
void rm_digest_free(RmDigest *digest) {
    switch(digest->type) {
    case RM_DIGEST_MD5:
    case RM_DIGEST_SHA512:
    case RM_DIGEST_SHA256:
    case RM_DIGEST_SHA1:
        g_checksum_free(digest->glib_checksum);
        digest->glib_checksum = NULL;
        break;
    case RM_DIGEST_PARANOID:
        if(digest->paranoid->shadow_hash) {
            rm_digest_free(digest->paranoid->shadow_hash);
        }
        rm_digest_release_buffers(digest);
        if(digest->paranoid->incoming_twin_candidates) {
            g_async_queue_unref(digest->paranoid->incoming_twin_candidates);
        }
        g_slist_free(digest->paranoid->rejects);
        g_slice_free(RmParanoid, digest->paranoid);
        break;
    case RM_DIGEST_EXT:
    case RM_DIGEST_CUMULATIVE:
    case RM_DIGEST_MURMUR512:
    case RM_DIGEST_XXHASH:
    case RM_DIGEST_CITY512:
    case RM_DIGEST_MURMUR256:
    case RM_DIGEST_CITY256:
    case RM_DIGEST_BASTARD:
    case RM_DIGEST_SPOOKY:
    case RM_DIGEST_SPOOKY32:
    case RM_DIGEST_SPOOKY64:
    case RM_DIGEST_FARMHASH:
    case RM_DIGEST_MURMUR:
    case RM_DIGEST_CITY:
        if(digest->checksum) {
            g_slice_free1(digest->bytes, digest->checksum);
            digest->checksum = NULL;
        }
        break;
    default:
        rm_assert_gentle_not_reached();
    }
    g_slice_free(RmDigest, digest);
}
示例#7
0
guint8 *rm_digest_steal_buffer(RmDigest *digest) {
    guint8 *result = g_slice_alloc0(digest->bytes);
    RmDigest *copy = NULL;
    gsize buflen = digest->bytes;

    switch(digest->type) {
    case RM_DIGEST_MD5:
    case RM_DIGEST_SHA512:
    case RM_DIGEST_SHA256:
    case RM_DIGEST_SHA1:
        /* for all of the above, reading the digest is destructive, so we
         * need to take a copy */
        copy = rm_digest_copy(digest);
        g_checksum_get_digest(copy->glib_checksum, result, &buflen);
        g_assert(buflen == digest->bytes);
        rm_digest_free(copy);
        break;
    case RM_DIGEST_SPOOKY32:
    case RM_DIGEST_SPOOKY64:
    case RM_DIGEST_SPOOKY:
    case RM_DIGEST_MURMUR:
    case RM_DIGEST_CITY:
    case RM_DIGEST_CITY256:
    case RM_DIGEST_MURMUR256:
    case RM_DIGEST_CITY512:
    case RM_DIGEST_MURMUR512:
    case RM_DIGEST_BASTARD:
    case RM_DIGEST_CUMULATIVE:
    case RM_DIGEST_PARANOID:
        memcpy(result, digest->checksum, digest->bytes);
        break;
    default:
        g_assert_not_reached();
    }

    return result;
}