int main(void) { int nmsg_sock; nmsg_message_t msg; nmsg_msgmod_t mod; nmsg_output_t output; nmsg_res res; struct sockaddr_in nmsg_sockaddr; void *clos; /* initialize libnmsg */ res = nmsg_init(); if (res != nmsg_res_success) fail("unable to initialize libnmsg\n"); /* set dst address / port */ if (inet_pton(AF_INET, DST_ADDRESS, &nmsg_sockaddr.sin_addr)) { nmsg_sockaddr.sin_family = AF_INET; nmsg_sockaddr.sin_port = htons(DST_PORT); } else { perror("inet_pton"); exit(1); } /* open socket */ nmsg_sock = socket(PF_INET, SOCK_DGRAM, 0); if (nmsg_sock < 0) { perror("socket"); exit(1); } /* connect socket */ if (connect(nmsg_sock, (struct sockaddr *) &nmsg_sockaddr, sizeof(nmsg_sockaddr)) < 0) { perror("connect"); exit(1); } /* create nmsg output */ output = nmsg_output_open_sock(nmsg_sock, DST_MTU); if (output == NULL) fail("unable to nmsg_output_open_sock()"); /* open handle to the email module */ mod = nmsg_msgmod_lookup(NMSG_VENDOR_BASE_ID, NMSG_VENDOR_BASE_EMAIL_ID); if (mod == NULL) fail("unable to acquire module handle"); /* initialize module */ res = nmsg_msgmod_init(mod, &clos); if (res != nmsg_res_success) exit(res); /* create and send pbuf */ char srcip[] = "127.0.0.1"; char srchost[] = "localhost.localdomain"; char helo[] = "helo"; char from[] = "*****@*****.**"; char rcpt0[] = "*****@*****.**"; char rcpt1[] = "*****@*****.**"; uint32_t ip; unsigned type; msg = nmsg_message_init(mod); assert(msg != NULL); res = nmsg_message_enum_name_to_value(msg, "type", "spamtrap", &type); assert(res == nmsg_res_success); nmsf(msg, "type", 0, &type, sizeof(type)); inet_pton(AF_INET, srcip, &ip); nmsf(msg, "srcip", 0, &ip, sizeof(ip)); nmsf(msg, "srchost", 0, srchost, sizeof(srchost)); nmsf(msg, "helo", 0, helo, sizeof(helo)); nmsf(msg, "from", 0, from, sizeof(from)); nmsf(msg, "rcpt", 0, rcpt0, sizeof(rcpt0)); nmsf(msg, "rcpt", 1, rcpt1, sizeof(rcpt1)); nmsg_output_write(output, msg); nmsg_message_destroy(&msg); /* finalize module */ nmsg_msgmod_fini(mod, &clos); /* close nmsg output */ nmsg_output_close(&output); return (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; } }
int main(void) { int nmsg_sock; nmsg_message_t msg; nmsg_msgmod_t mod; nmsg_output_t output; nmsg_res res; struct sockaddr_in nmsg_sockaddr; void *clos; /* initialize libnmsg */ res = nmsg_init(); if (res != nmsg_res_success) fail("unable to initialize libnmsg\n"); /* set dst address / port */ if (inet_pton(AF_INET, DST_ADDRESS, &nmsg_sockaddr.sin_addr)) { nmsg_sockaddr.sin_family = AF_INET; nmsg_sockaddr.sin_port = htons(DST_PORT); } else { perror("inet_pton"); exit(1); } /* open socket */ nmsg_sock = socket(PF_INET, SOCK_DGRAM, 0); if (nmsg_sock < 0) { perror("socket"); exit(1); } /* connect socket */ if (connect(nmsg_sock, (struct sockaddr *) &nmsg_sockaddr, sizeof(nmsg_sockaddr)) < 0) { perror("connect"); exit(1); } /* create nmsg output */ output = nmsg_output_open_sock(nmsg_sock, DST_MTU); if (output == NULL) fail("unable to nmsg_output_open_sock()"); /* open handle to the http module */ mod = nmsg_msgmod_lookup(NMSG_VENDOR_BASE_ID, NMSG_VENDOR_BASE_HTTP_ID); if (mod == NULL) fail("unable to acquire module handle"); /* initialize module */ res = nmsg_msgmod_init(mod, &clos); if (res != nmsg_res_success) exit(res); /* initialize message */ msg = nmsg_message_init(mod); assert(msg != NULL); nmsg_message_set_time(msg, NULL); /* create and send pbuf */ uint32_t srcport = 49152; uint32_t dstport = 8080; char request[] = "GET / HTTP/1.0\n"; char srcip[] = "127.0.0.1"; char dstip[] = "192.0.2.1"; char srchost[] = "localhost.localdomain"; uint32_t ip; inet_pton(AF_INET, srcip, &ip); nmsf(msg, "srcip", 0, (uint8_t *) &ip, sizeof(ip)); inet_pton(AF_INET, dstip, &ip); nmsf(msg, "dstip", 0, (uint8_t *) &ip, sizeof(ip)); nmsf(msg, "srchost", 0, (uint8_t *) srchost, sizeof(srchost)); nmsf(msg, "srcport", 0, (uint8_t *) &srcport, sizeof(srcport)); nmsf(msg, "dstport", 0, (uint8_t *) &dstport, sizeof(dstport)); nmsf(msg, "request", 0, (uint8_t *) request, sizeof(request)); nmsg_output_write(output, msg); nmsg_message_destroy(&msg); /* finalize module */ nmsg_msgmod_fini(mod, &clos); /* close nmsg output */ nmsg_output_close(&output); return (res); }