- meta = g_hash_table_new(NULL, NULL);
- for (m = 0; m < sizeof(imod->metadata); m++) {
- mitem = imod->metadata[m] & ~SR_INPUT_META_REQUIRED;
- if (!mitem)
- /* Metadata list is 0-terminated. */
- break;
- if (mitem == SR_INPUT_META_FILENAME) {
- g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
- (gpointer)filename);
- } else if (mitem == SR_INPUT_META_FILESIZE) {
- g_hash_table_insert(meta, GINT_TO_POINTER(mitem),
- GINT_TO_POINTER(st.st_size));
- } else if (mitem == SR_INPUT_META_HEADER) {
- if ((fd = open(filename, O_RDONLY)) < 0) {
- sr_err("%s", strerror(errno));
- return SR_ERR;
- }
- size = read(fd, header_buf->str, 128);
- header_buf->len = size;
- close(fd);
- if (size <= 0) {
- g_string_free(header_buf, TRUE);
- sr_err("%s", strerror(errno));
- return SR_ERR;
- }
- g_hash_table_insert(meta, GINT_TO_POINTER(mitem), header_buf);
- }
- }
- if (g_hash_table_size(meta) == 0) {
- /* No metadata for this module, so there's no way it
- * can match. */
- g_hash_table_destroy(meta);
- continue;
- }
- sr_spew("Trying module %s.", imod->id);
- ret = imod->format_match(meta);
- g_hash_table_destroy(meta);
- if (ret == SR_ERR_DATA) {
- /* Module recognized this buffer, but cannot handle it. */
- break;
- } else if (ret == SR_ERR) {