/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to you under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ #include "avro.h" #include "avro_private.h" #include #include #include int should_test(char *d_name) { // check filename extension char *ext_pos = strrchr(d_name, '.'); if (ext_pos == NULL) { return 0; } ptrdiff_t diff = d_name + strlen(d_name) - ext_pos; char *substr = malloc(sizeof(char) * diff); strncpy(substr, ext_pos + 1, diff - 1); *(substr + diff - 1) = '\0'; if (strcmp(substr, "avro") != 0) { free(substr); return 0; } free(substr); // check compression codec char *codec_pos = strrchr(d_name, '_'); if (codec_pos == NULL) { return 1; } if (ext_pos < codec_pos) { return 0; } diff = ext_pos - codec_pos; substr = malloc(sizeof(char) * diff); strncpy(substr, codec_pos + 1, diff - 1); *(substr + diff - 1) = '\0'; if (strcmp(substr, "deflate") == 0 || strcmp(substr, "snappy") == 0) { free(substr); return 1; } free(substr); return 0; } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "%s accepts just one input file\n", argv[0]); return EXIT_FAILURE; } DIR *dir; if ((dir = opendir(argv[1])) == NULL) { fprintf(stderr, "The specified path is not a directory: %s\n", argv[1]); return EXIT_FAILURE; } struct dirent *ent; while ((ent = readdir(dir)) != NULL) { avro_file_reader_t reader; avro_value_t value; if (ent->d_type != DT_REG) continue; char *d_name = ent->d_name; size_t d_name_len = strlen(d_name); size_t size = strlen(argv[1]) + d_name_len + 2; char* path = malloc(sizeof(char) * size); sprintf(path, "%s/%s", argv[1], d_name); if (!should_test(d_name)) { printf("Skipping file: %s\n", path); free(path); continue; } printf("Checking file: %s\n", path); if (avro_file_reader(path, &reader)) { fprintf(stderr, "Failed to read from a file: %s\n", path); free(path); return EXIT_FAILURE; } avro_schema_t schema = avro_file_reader_get_writer_schema(reader); avro_value_iface_t *iface = avro_generic_class_from_schema(schema); avro_generic_value_new(iface, &value); int i, rval; for (i = 0; (rval = avro_file_reader_read_value(reader, &value)) == 0; i++, avro_value_reset(&value)); if (rval != EOF) { fprintf(stderr, "Error(%d) occurred while reading file: %s\n", rval, path); free(path); return EXIT_FAILURE; } if (i == 0) { fprintf(stderr, "Input file %s is supposed to be non-empty\n", path); free(path); return EXIT_FAILURE; } free(path); avro_value_decref(&value); avro_value_iface_decref(iface); avro_schema_decref(schema); avro_file_reader_close(reader); } closedir(dir); return EXIT_SUCCESS; }