annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Here we implement the function that reads binary files
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * in our ad hoc format for TRAU testing.
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <sys/types.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <sys/file.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/stat.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdint.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdbool.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <stdio.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <stdlib.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <string.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <unistd.h>
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #include "read_file.h"
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 static int check_magic(const uint8_t *buf, unsigned nframes, bool *got_fr,
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 bool *got_efr)
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 unsigned n;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 for (n = 0; n < nframes; n++) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 switch (*buf & 0xF0) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 case 0xC0:
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *got_efr = true;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 break;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 case 0xD0:
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *got_fr = true;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 break;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 default:
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 buf += 34;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 return 0;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 int read_binary_file(const char *filename, bool is_efr, uint8_t **bufret,
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 unsigned *size_ret)
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 int fd, rc;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 struct stat st;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 uint8_t *buf;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 unsigned nframes;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 bool got_fr, got_efr;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 fd = open(filename, O_RDONLY);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 if (fd < 0) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 perror(filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 fstat(fd, &st);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 if (!S_ISREG(st.st_mode)) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 close(fd);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 fprintf(stderr, "error: %s is not a regular file\n", filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 if (!st.st_size) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 close(fd);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 fprintf(stderr, "error: %s is an empty file\n", filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 if (st.st_size % 34) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 close(fd);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 fprintf(stderr,
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 "error: size of %s is not a multiple of 34 bytes\n",
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 buf = malloc(st.st_size);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if (!buf) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 close(fd);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 fprintf(stderr, "unable to malloc buffer for %s\n", filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 read(fd, buf, st.st_size);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 close(fd);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 nframes = st.st_size / 34;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 got_fr = false;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 got_efr = false;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 rc = check_magic(buf, nframes, &got_fr, &got_efr);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 if (rc < 0 || got_fr && got_efr) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 free(buf);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 fprintf(stderr, "error: %s is not a valid TRAU-UL test file\n",
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 if (is_efr != got_efr) {
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 free(buf);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 fprintf(stderr, "error: %s is for the wrong codec\n", filename);
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 return -1;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 *bufret = buf;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 *size_ret = nframes;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 return 0;
5405c1573027 ater: implement file reading
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 }