void setup_io(void) { nmsg_output_t output_cb; nmsg_res res; io = nmsg_io_init(); assert(io != NULL); output_cb = nmsg_output_open_callback(nmsg_callback, NULL); if (output_cb == NULL) errx(EXIT_FAILURE, "nmsg_output_open_callback() failed"); res = nmsg_io_add_output(io, output_cb, NULL); if (res != nmsg_res_success) errx(EXIT_FAILURE, "nmsg_io_add_output() failed: %s", nmsg_res_lookup(res)); }
void add_sock_output(nmsgtool_ctx *c, const char *ss) { char *r, *t; int pa, pz, pn, pl; t = strchr(ss, '/'); r = strchr(ss, ','); if (t == NULL) usage("argument to -s needs a /"); if (sscanf(t + 1, "%d..%d", &pa, &pz) == 2) { if (pa > pz || pz - pa > 20) usage("bad port range in -s argument"); } else if (sscanf(t + 1, "%d", &pa) == 1) { pz = pa; } else { usage("need a port number or range after /"); } pl = t - ss; for (pn = pa; pn <= pz; pn++) { char *spec; int len, pf, s; nmsgtool_sockaddr su; nmsg_output_t output; nmsg_res res; unsigned rate = 0, freq = 0; nmsg_asprintf(&spec, "%*.*s/%d%s", pl, pl, ss, pn, r != NULL ? r : ""); pf = getsock(&su, spec, &rate, &freq); if (freq == 0) freq = DEFAULT_FREQ; if (c->debug >= 2) fprintf(stderr, "%s: nmsg socket output: %s\n", argv_program, spec); if (c->debug >= 2 && rate > 0) fprintf(stderr, "%s: nmsg socket rate: %u freq: %u\n", argv_program, rate, freq); free(spec); if (pf < 0) usage("bad -s socket"); s = socket(pf, SOCK_DGRAM, 0); if (s < 0) { perror("socket"); exit(1); } Setsockopt(s, SOL_SOCKET, SO_BROADCAST, on); len = 32 * 1024; Setsockopt(s, SOL_SOCKET, SO_SNDBUF, len); if (connect(s, &su.sa, NMSGTOOL_SA_LEN(su.sa)) < 0) { perror("connect"); exit(1); } output = nmsg_output_open_sock(s, c->mtu); if (output == NULL) { fprintf(stderr, "%s: nmsg_output_open_sock() failed\n", argv_program); exit(1); } setup_nmsg_output(c, output); if (rate > 0 && freq > 0) { nmsg_rate_t nr; nr = nmsg_rate_init(rate, freq); assert(nr != NULL); nmsg_output_set_rate(output, nr); } if (c->kicker != NULL) { res = nmsg_io_add_output(c->io, output, (void *) -1); } else { res = nmsg_io_add_output(c->io, output, NULL); } if (res != nmsg_res_success) { fprintf(stderr, "%s: nmsg_io_add_output() failed\n", argv_program); exit(1); } c->n_outputs += 1; } }