view ater/read_file.c @ 37:26c9535df39e

rm abis subdir: moved to e1-fake-trau repository The present code repository is meant to contain code for talking to a TRAU DUT, hence the name ice1-trau-tester. The different and separate function of talking to an E1 BTS (Abis instead of Ater, and in the opposite role) was never in scope for this project, but that code got added here in a haste when the InSite BTS arrived while the TRAU bring-up was still blocked. Now that we have our Nokia TCSM2 system working and are doing TRAU experiments, let's keep the code clean.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 29 Aug 2024 19:02:02 +0000
parents 5405c1573027
children db39e8855f3d
line wrap: on
line source

/*
 * Here we implement the function that reads binary files
 * in our ad hoc format for TRAU testing.
 */

#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "read_file.h"

static int check_magic(const uint8_t *buf, unsigned nframes, bool *got_fr,
			bool *got_efr)
{
	unsigned n;

	for (n = 0; n < nframes; n++) {
		switch (*buf & 0xF0) {
		case 0xC0:
			*got_efr = true;
			break;
		case 0xD0:
			*got_fr = true;
			break;
		default:
			return -1;
		}
		buf += 34;
	}
	return 0;
}

int read_binary_file(const char *filename, bool is_efr, uint8_t **bufret,
		     unsigned *size_ret)
{
	int fd, rc;
	struct stat st;
	uint8_t *buf;
	unsigned nframes;
	bool got_fr, got_efr;

	fd = open(filename, O_RDONLY);
	if (fd < 0) {
		perror(filename);
		return -1;
	}
	fstat(fd, &st);
	if (!S_ISREG(st.st_mode)) {
		close(fd);
		fprintf(stderr, "error: %s is not a regular file\n", filename);
		return -1;
	}
	if (!st.st_size) {
		close(fd);
		fprintf(stderr, "error: %s is an empty file\n", filename);
		return -1;
	}
	if (st.st_size % 34) {
		close(fd);
		fprintf(stderr,
			"error: size of %s is not a multiple of 34 bytes\n",
			filename);
		return -1;
	}
	buf = malloc(st.st_size);
	if (!buf) {
		close(fd);
		fprintf(stderr, "unable to malloc buffer for %s\n", filename);
		return -1;
	}
	read(fd, buf, st.st_size);
	close(fd);
	nframes = st.st_size / 34;

	got_fr = false;
	got_efr = false;
	rc = check_magic(buf, nframes, &got_fr, &got_efr);
	if (rc < 0 || got_fr && got_efr) {
		free(buf);
		fprintf(stderr, "error: %s is not a valid TRAU-UL test file\n",
			filename);
		return -1;
	}
	if (is_efr != got_efr) {
		free(buf);
		fprintf(stderr, "error: %s is for the wrong codec\n", filename);
		return -1;
	}
	*bufret = buf;
	*size_ret = nframes;
	return 0;
}