Exemplo n.º 1
0
void
kickfile_rotate(struct kickfile *kf) {
	char *kt;
	char *dup_for_basename, *s_basename;
	char *dup_for_dirname, *s_dirname;

	kt = kickfile_time();
	dup_for_basename = strdup(kf->basename);
	dup_for_dirname = strdup(kf->basename);
	s_basename = basename(dup_for_basename);
	s_dirname = dirname(dup_for_dirname);
	assert(s_basename != NULL);
	assert(s_dirname != NULL);

	free(kf->tmpname);
	free(kf->curname);
	nmsg_asprintf(&kf->tmpname, "%s/.%s.%s.part", s_dirname, s_basename, kt);
	nmsg_asprintf(&kf->curname, "%s/%s.%s%s", s_dirname, s_basename, kt,
		      kf->suffix != NULL ? kf->suffix : "");
	free(kt);
	free(dup_for_basename);
	free(dup_for_dirname);
}
Exemplo n.º 2
0
char *
kickfile_time(void) {
	char *kt;
	char when[32];
	struct timespec ts;
	struct tm tm;
	time_t t;

	nmsg_timespec_get(&ts);
	t = (time_t) ts.tv_sec;
	gmtime_r(&t, &tm);
	strftime(when, sizeof(when), "%Y%m%d.%H%M.%s", &tm);
	nmsg_asprintf(&kt, "%s.%09ld", when, ts.tv_nsec);
	assert(kt != NULL);

	return (kt);
}
Exemplo n.º 3
0
void
kickfile_exec(struct kickfile *kf) {
	char *cmd;

	if (kf != NULL && kf->tmpname != NULL && kf->curname != NULL) {
		if (rename(kf->tmpname, kf->curname) < 0) {
			perror("rename");
			unlink(kf->tmpname);
		} else if (kf->cmd != NULL && *kf->cmd != '\0') {
			int rc;

			nmsg_asprintf(&cmd, "%s %s &", kf->cmd, kf->curname);
			rc = system(cmd);
			if (rc != 0)
				fprintf(stderr, "WARNING: system() failed\n");
			free(cmd);
		}
	}
}
Exemplo n.º 4
0
nmsg_res
nmsg_pcap_input_setfilter(nmsg_pcap_t pcap, const char *userbpft) {
	static const char *bpf_ipv4_frags = "(ip[6:2] & 0x3fff != 0)";
	static const char *bpf_ip = "(ip)";
	static const char *bpf_ip6 = "(ip6)";

	bool need_ip6 = true;
	bool need_ipv4_frags = true;
	bool need_vlan = false;
	bool userbpf_ip_only = true;
	char *tmp, *bpfstr;
	int res;
	struct bpf_program bpf;

	/* open a dummy pcap_t for the user bpf */
	if (pcap->user == NULL) {
		pcap->user = pcap_open_dead(DLT_RAW, 1500);
		if (pcap->user == NULL)
			return (nmsg_res_memfail);
	}

	/* free an old filter set by a previous call */
	free(pcap->userbpft);
	pcap_freecode(&pcap->userbpf);

	/* compile the user's bpf and save it */
	res = pcap_compile(pcap->user, &pcap->userbpf, (char *) userbpft, 1, 0);
	if (res != 0) {
		_nmsg_dprintf(1, "%s: unable to compile bpf '%s': %s\n", __func__,
			      userbpft, pcap_geterr(pcap->handle));
		return (nmsg_res_failure);
	}
	pcap->userbpft = strdup(userbpft);

	/* test if we can skip ip6 */
	res = nmsg_asprintf(&tmp, "(%s) and %s", userbpft, bpf_ip6);
	if (res == -1)
		return (nmsg_res_memfail);
	res = pcap_compile(pcap->handle, &bpf, tmp, 1, 0);
	free(tmp);
	if (res != 0)
		need_ip6 = false;
	else
		pcap_freecode(&bpf);

	_nmsg_dprintf(5, "%s: need_ip6=%u\n", __func__, need_ip6);

	/* test if we can skip ipv4 frags */
	res = nmsg_asprintf(&tmp, "(%s) and %s", userbpft, bpf_ipv4_frags);
	if (res == -1)
		return (nmsg_res_memfail);
	res = pcap_compile(pcap->handle, &bpf, tmp, 1, 0);
	free(tmp);
	if (res != 0)
		need_ipv4_frags = false;
	else
		pcap_freecode(&bpf);

	_nmsg_dprintf(5, "%s: need_ipv4_frags=%u\n", __func__, need_ipv4_frags);

	/* test if we can skip vlan tags */
	res = pcap_compile(pcap->handle, &bpf, "vlan and ip", 1, 0);
	if (res == 0) {
		pcap_freecode(&bpf);
		need_vlan = true;
	}
	_nmsg_dprintf(5, "%s: need_vlan=%u\n", __func__, need_vlan);

	/* test if we can limit the userbpf to ip packets only */
	res = nmsg_asprintf(&tmp, "%s and (%s)", bpf_ip, userbpft);
	if (res == -1)
		return (nmsg_res_memfail);
	res = pcap_compile(pcap->handle, &bpf, tmp, 1, 0);
	free(tmp);
	if (res != 0)
		userbpf_ip_only = false;
	else
		pcap_freecode(&bpf);

	_nmsg_dprintf(5, "%s: userbpf_ip_only=%u\n", __func__, userbpf_ip_only);

	/* construct and compile the final bpf */
	res = nmsg_asprintf(&tmp, "((%s%s(%s))%s%s%s%s)",
			    userbpf_ip_only ?	bpf_ip		: "",
			    userbpf_ip_only ?	" and "		: "",
			    userbpft,
			    need_ipv4_frags ?	" or "		: "",
			    need_ipv4_frags ?	bpf_ipv4_frags	: "",
			    need_ip6 ?		" or "		: "",
			    need_ip6 ?		bpf_ip6		: "");
	if (res == -1)
		return (nmsg_res_memfail);

	if (need_vlan) {
		res = nmsg_asprintf(&bpfstr, "%s or (vlan and %s)", tmp, tmp);
		if (res == -1) {
			free(tmp);
			return (nmsg_res_memfail);
		}
	} else {
		bpfstr = tmp;
		tmp = NULL;
	}

	_nmsg_dprintf(3, "%s: using bpf '%s'\n", __func__, bpfstr);
	res = pcap_compile(pcap->handle, &bpf, bpfstr, 1, 0);
	if (res != 0) {
		_nmsg_dprintf(1, "%s: pcap_compile() failed: %s\n", __func__,
			      pcap_geterr(pcap->handle));
		free(tmp);
		free(bpfstr);
		return (nmsg_res_failure);
	}

	/* load the constructed bpf */
	if (pcap_setfilter(pcap->handle, &bpf) != 0) {
		_nmsg_dprintf(1, "%s: pcap_setfilter() failed: %s\n", __func__,
			      pcap_geterr(pcap->handle));
		return (nmsg_res_failure);
	}

	/* cleanup */
	free(tmp);
	free(bpfstr);
	pcap_freecode(&bpf);

	return (nmsg_res_success);
}
Exemplo n.º 5
0
nmsg_res
nmsg_pcap_input_setfilter_raw(nmsg_pcap_t pcap, const char *userbpft) {
	bool need_vlan = false;
	char *tmp, *bpfstr;
	int res;
	struct bpf_program bpf;

	tmp = strdup(userbpft);
	assert(tmp != NULL);

	/* open a dummy pcap_t for the user bpf */
	if (pcap->user == NULL) {
		pcap->user = pcap_open_dead(DLT_RAW, 1500);
		if (pcap->user == NULL) {
			free(tmp);
			return (nmsg_res_memfail);
		}
	}

	/* free an old filter set by a previous call */
	free(pcap->userbpft);
	pcap_freecode(&pcap->userbpf);

	/* compile the user's bpf and save it */
	res = pcap_compile(pcap->user, &pcap->userbpf, (char *) userbpft, 1, 0);
	if (res != 0) {
		_nmsg_dprintf(1, "%s: unable to compile bpf '%s': %s\n", __func__,
			      userbpft, pcap_geterr(pcap->handle));
		free(tmp);
		return (nmsg_res_failure);
	}
	pcap->userbpft = strdup(userbpft);

	/* test if we can skip vlan tags */
	res = pcap_compile(pcap->handle, &bpf, "vlan and ip", 1, 0);
	if (res == 0) {
		pcap_freecode(&bpf);
		need_vlan = true;
	}
	_nmsg_dprintf(5, "%s: need_vlan=%u\n", __func__, need_vlan);

	/* construct and compile the final bpf */
	if (need_vlan) {
		res = nmsg_asprintf(&bpfstr, "(%s) or (vlan and (%s))", tmp, tmp);
		if (res == -1) {
			free(tmp);
			return (nmsg_res_memfail);
		}
	} else {
		bpfstr = tmp;
		tmp = NULL;
	}

	_nmsg_dprintf(3, "%s: using bpf '%s'\n", __func__, bpfstr);
	res = pcap_compile(pcap->handle, &bpf, bpfstr, 1, 0);
	if (res != 0) {
		_nmsg_dprintf(1, "%s: pcap_compile() failed: %s\n", __func__,
			      pcap_geterr(pcap->handle));
		free(tmp);
		free(bpfstr);
		return (nmsg_res_failure);
	}

	/* load the constructed bpf */
	if (pcap_setfilter(pcap->handle, &bpf) != 0) {
		_nmsg_dprintf(1, "%s: pcap_setfilter() failed: %s\n", __func__,
			      pcap_geterr(pcap->handle));
		free(tmp);
		free(bpfstr);
		return (nmsg_res_failure);
	}

	/* cleanup */
	free(tmp);
	free(bpfstr);
	pcap_freecode(&bpf);

	return (nmsg_res_success);
}
Exemplo n.º 6
0
Arquivo: io.c Projeto: d4s/nmsg
void
add_sock_input(nmsgtool_ctx *c, const char *ss) {
	char *t;
	int pa, pz, pn, pl;

	t = strchr(ss, '/');
	if (t == NULL)
		usage("argument to -l needs a /");
	if (sscanf(t + 1, "%d..%d", &pa, &pz) == 2) {
		if (pa > pz || pz - pa > 20)
			usage("bad port range in -l 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 pf, s;
		nmsgtool_sockaddr su;
		nmsg_input_t input;
		nmsg_res res;

		nmsg_asprintf(&spec, "%*.*s/%d", pl, pl, ss, pn);
		pf = getsock(&su, spec, NULL, NULL);
		if (c->debug >= 2)
			fprintf(stderr, "%s: nmsg socket input: %s\n",
				argv_program, spec);
		free(spec);
		if (pf < 0)
			usage("bad -l socket");
		s = socket(pf, SOCK_DGRAM, 0);
		if (s < 0) {
			perror("socket");
			exit(1);
		}
		Setsockopt(s, SOL_SOCKET, SO_REUSEADDR, on);
#ifdef SO_REUSEPORT
		Setsockopt(s, SOL_SOCKET, SO_REUSEPORT, on);
#endif

#ifdef __linux__
# ifdef SO_RCVBUFFORCE
		if (geteuid() == 0) {
			int rcvbuf = 16777216;
			if (setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE,
				       &rcvbuf, sizeof(rcvbuf)) < 0)
			{
				if (c->debug >= 2) {
					fprintf(stderr,
						"%s: setsockopt(SO_RCVBUFFORCE) failed: %s\n",
						argv_program, strerror(errno));
				}
			}
		}
# endif
#endif

		if (bind(s, &su.sa, NMSGTOOL_SA_LEN(su.sa)) < 0) {
			perror("bind");
			exit(1);
		}
		input = nmsg_input_open_sock(s);
		if (input == NULL) {
			fprintf(stderr, "%s: nmsg_input_open_sock() failed\n",
				argv_program);
			exit(1);
		}
		setup_nmsg_input(c, input);
		res = nmsg_io_add_input(c->io, input, NULL);
		if (res != nmsg_res_success) {
			fprintf(stderr, "%s: nmsg_io_add_input() failed\n",
				argv_program);
			exit(1);
		}
		c->n_inputs += 1;
	}
}
Exemplo n.º 7
0
Arquivo: io.c Projeto: d4s/nmsg
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;
	}
}