8 #include <arpa/inet.h> /* ntohl */
12 static void *get_file_ptr(__u8 *db, int dblen, int structlen, __be32 ptr)
16 if (p > dblen - structlen) {
17 fprintf(stderr, "Invalid database file, bad pointer!\n");
21 return (void *)(db + p);
24 static void print_reg_rule(__u8 *db, int dblen, __be32 ruleptr)
26 struct regdb_file_reg_rule *rule;
27 struct regdb_file_freq_range *freq;
28 struct regdb_file_power_rule *power;
30 rule = get_file_ptr(db, dblen, sizeof(*rule), ruleptr);
31 freq = get_file_ptr(db, dblen, sizeof(*freq), rule->freq_range_ptr);
32 power = get_file_ptr(db, dblen, sizeof(*power), rule->power_rule_ptr);
34 printf("\t%d..%d kHz (maxbw: %d kHz, mod: 0x%x, restrict: 0x%x)\n",
35 ntohl(freq->start_freq),
36 ntohl(freq->end_freq),
37 ntohl(freq->max_bandwidth),
38 ntohl(freq->modulation_cap),
39 ntohl(freq->misc_restrictions));
41 printf("\t -> env: '%.1s', ag: %d, ir_ptmp: %d, ir_ptp: %d, eirp_pmtp: %d, eirp_ptp: %d\n",
42 &power->environment_cap,
43 ntohl(power->max_antenna_gain),
44 ntohl(power->max_ir_ptmp),
45 ntohl(power->max_ir_ptp),
46 ntohl(power->max_eirp_pmtp),
47 ntohl(power->max_eirp_ptp));
50 int main(int argc, char **argv)
55 struct regdb_file_header *header;
56 struct regdb_file_reg_country *countries;
57 int dblen, num_countries, i, j;
60 fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
64 fd = open(argv[1], O_RDONLY);
66 perror("failed to open db file");
70 if (fstat(fd, &stat)) {
71 perror("failed to fstat db file");
77 db = mmap(NULL, dblen, PROT_READ, MAP_SHARED, fd, 0);
78 if (db == MAP_FAILED) {
79 perror("failed to mmap db file");
83 header = get_file_ptr(db, dblen, sizeof(*header), 0);
85 if (ntohl(header->magic) != REGDB_MAGIC) {
86 fprintf(stderr, "Invalid database magic\n");
90 if (ntohl(header->version) != REGDB_VERSION) {
91 fprintf(stderr, "Invalid database version\n");
95 num_countries = ntohl(header->reg_country_num);
96 countries = get_file_ptr(db, dblen,
97 sizeof(struct regdb_file_reg_country) * num_countries,
98 header->reg_country_ptr);
100 for (i = 0; i < num_countries; i++) {
101 struct regdb_file_reg_rules_collection *rcoll;
102 struct regdb_file_reg_country *country = countries + i;
105 printf("Country %.2s\n", country->alpha2);
106 rcoll = get_file_ptr(db, dblen, sizeof(*rcoll), country->reg_collection_ptr);
107 num_rules = ntohl(rcoll->reg_rule_num);
108 /* re-get pointer with sanity checking for num_rules */
109 rcoll = get_file_ptr(db, dblen,
110 sizeof(*rcoll) + num_rules * sizeof(__be32),
111 country->reg_collection_ptr);
112 for (j = 0; j < num_rules; j++)
113 print_reg_rule(db, dblen, rcoll->reg_rule_ptrs[j]);