in lang/c/src/datafile.c [241:326]
static int file_read_header(avro_reader_t reader,
avro_schema_t * writers_schema, avro_codec_t codec,
char *sync, int synclen)
{
int rval;
avro_schema_t meta_schema;
avro_schema_t meta_values_schema;
avro_value_iface_t *meta_iface;
avro_value_t meta;
char magic[4];
avro_value_t codec_val;
avro_value_t schema_bytes;
const void *p;
size_t len;
check(rval, avro_read(reader, magic, sizeof(magic)));
if (magic[0] != 'O' || magic[1] != 'b' || magic[2] != 'j'
|| magic[3] != 1) {
avro_set_error("Incorrect Avro container file magic number");
return EILSEQ;
}
meta_values_schema = avro_schema_bytes();
meta_schema = avro_schema_map(meta_values_schema);
meta_iface = avro_generic_class_from_schema(meta_schema);
if (meta_iface == NULL) {
return EILSEQ;
}
check(rval, avro_generic_value_new(meta_iface, &meta));
rval = avro_value_read(reader, &meta);
if (rval) {
avro_prefix_error("Cannot read file header: ");
return EILSEQ;
}
avro_schema_decref(meta_schema);
rval = avro_value_get_by_name(&meta, "avro.codec", &codec_val, NULL);
if (rval) {
if (avro_codec(codec, NULL) != 0) {
avro_set_error("Codec not specified in header and unable to set 'null' codec");
avro_value_decref(&meta);
return EILSEQ;
}
} else {
const void *buf;
size_t size;
char codec_name[11];
avro_type_t type = avro_value_get_type(&codec_val);
if (type != AVRO_BYTES) {
avro_set_error("Value type of codec is unexpected");
avro_value_decref(&meta);
return EILSEQ;
}
avro_value_get_bytes(&codec_val, &buf, &size);
memset(codec_name, 0, sizeof(codec_name));
strncpy(codec_name, (const char *) buf, size < 10 ? size : 10);
if (avro_codec(codec, codec_name) != 0) {
avro_set_error("File header contains an unknown codec");
avro_value_decref(&meta);
return EILSEQ;
}
}
rval = avro_value_get_by_name(&meta, "avro.schema", &schema_bytes, NULL);
if (rval) {
avro_set_error("File header doesn't contain a schema");
avro_value_decref(&meta);
return EILSEQ;
}
avro_value_get_bytes(&schema_bytes, &p, &len);
rval = avro_schema_from_json_length((const char *) p, len, writers_schema);
if (rval) {
avro_prefix_error("Cannot parse file header: ");
avro_value_decref(&meta);
return rval;
}
avro_value_decref(&meta);
avro_value_iface_decref(meta_iface);
return avro_read(reader, sync, synclen);
}