| 524 | } |
| 525 | |
| 526 | int main(int argc, char *argv[]) |
| 527 | { |
| 528 | int outfd; |
| 529 | const struct pubkey **node_ids; |
| 530 | bool print_nodes = false; |
| 531 | |
| 532 | common_setup(argv[0]); |
| 533 | setup_locale(); |
| 534 | |
| 535 | node_ids = tal_arr(tmpctx, const struct pubkey *, 0); |
| 536 | opt_register_noarg("--verbose|-v", opt_add_one, &verbose, |
| 537 | "Print details (each additional gives more!)."); |
| 538 | opt_register_arg("--node-map=num=<nodeid>", opt_node, NULL, &node_ids, |
| 539 | "Map node num to <nodeid> (decompress only)"); |
| 540 | opt_register_noarg("--output-node-map", opt_set_bool, &print_nodes, |
| 541 | "Output nodenumber:nodeid:alias for each node (compress only)"); |
| 542 | opt_register_noarg("--help|-h", opt_usage_and_exit, |
| 543 | "[decompress|compress] infile outfile\n" |
| 544 | "Compress or decompress a gossmap file", |
| 545 | "Print this message."); |
| 546 | |
| 547 | opt_parse(&argc, argv, opt_log_stderr_exit); |
| 548 | if (argc != 4) |
| 549 | opt_usage_exit_fail("Needs 4 arguments"); |
| 550 | |
| 551 | outfd = open(argv[3], O_WRONLY|O_CREAT|O_TRUNC, 0666); |
| 552 | if (outfd < 0) |
| 553 | opt_usage_exit_fail(tal_fmt(tmpctx, "Cannot open %s for writing: %s", |
| 554 | argv[3], strerror(errno))); |
| 555 | |
| 556 | if (streq(argv[1], "compress")) { |
| 557 | struct gossmap_node **nodes, *n; |
| 558 | size_t *node_to_compr_idx; |
| 559 | size_t node_count, channel_count; |
| 560 | struct gossmap_chan **chans, *c; |
| 561 | bool *dirs; |
| 562 | gzFile outf = gzdopen(outfd, "wb9"); |
| 563 | |
| 564 | struct gossmap *gossmap = gossmap_load(tmpctx, argv[2], NULL, NULL); |
| 565 | if (!gossmap) |
| 566 | opt_usage_exit_fail(tal_fmt(tmpctx, "Cannot open %s for reading: %s", |
| 567 | argv[2], strerror(errno))); |
| 568 | |
| 569 | nodes = tal_arr(gossmap, struct gossmap_node *, gossmap_max_node_idx(gossmap)); |
| 570 | for (node_count = 0, n = gossmap_first_node(gossmap); |
| 571 | n; |
| 572 | n = gossmap_next_node(gossmap, n), node_count++) { |
| 573 | nodes[node_count] = n; |
| 574 | } |
| 575 | tal_resize(&nodes, node_count); |
| 576 | if (verbose) |
| 577 | printf("%zu nodes\n", node_count); |
| 578 | |
| 579 | /* nodes with most channels go first */ |
| 580 | asort(nodes, tal_count(nodes), cmp_node_num_chans, NULL); |
| 581 | |
| 582 | /* Create map of gossmap index to compression index */ |
| 583 | node_to_compr_idx = tal_arr(nodes, size_t, gossmap_max_node_idx(gossmap)); |
nothing calls this directly
no test coverage detected