xref: /netbsd-src/external/bsd/ipf/dist/lib/save_v1trap.c (revision f44489f8dc8d71cd25a1bf30a50ca8ed13a40da3)
1*f44489f8Sprlw1 /*	$NetBSD: save_v1trap.c,v 1.2 2014/12/20 13:15:48 prlw1 Exp $	*/
2bc4097aaSchristos 
3bc4097aaSchristos #include "ipf.h"
4c9d5dc6cSdarrenr #include "netinet/ipl.h"
5bc4097aaSchristos #include "ipmon.h"
6bc4097aaSchristos #include <ctype.h>
7bc4097aaSchristos 
8bc4097aaSchristos #define	IPF_ENTERPRISE	9932
9bc4097aaSchristos /*
10bc4097aaSchristos  * Enterprise number OID:
11bc4097aaSchristos  * 1.3.6.1.4.1.9932
12bc4097aaSchristos  */
13bc4097aaSchristos static u_char ipf_enterprise[] = { 6, 7, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c };
14bc4097aaSchristos static u_char ipf_trap0_1[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 1 };
15bc4097aaSchristos static u_char ipf_trap0_2[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 2 };
16bc4097aaSchristos 
17bc4097aaSchristos static int writeint __P((u_char *, int));
18bc4097aaSchristos static int writelength __P((u_char *, u_int));
19bc4097aaSchristos static int maketrap_v1 __P((char *, u_char *, int, u_char *, int, u_32_t,
20c9d5dc6cSdarrenr 			    time_t));
21bc4097aaSchristos static void snmpv1_destroy __P((void *));
22bc4097aaSchristos static void *snmpv1_dup __P((void *));
23bc4097aaSchristos static int snmpv1_match __P((void *, void *));
24bc4097aaSchristos static void *snmpv1_parse __P((char **));
25bc4097aaSchristos static void snmpv1_print __P((void *));
26bc4097aaSchristos static int snmpv1_send __P((void *, ipmon_msg_t *));
27bc4097aaSchristos 
28bc4097aaSchristos typedef struct snmpv1_opts_s {
29bc4097aaSchristos 	char			*community;
30bc4097aaSchristos 	int			fd;
31bc4097aaSchristos 	int			v6;
32bc4097aaSchristos 	int			ref;
33bc4097aaSchristos #ifdef USE_INET6
34bc4097aaSchristos 	struct sockaddr_in6	sin6;
35bc4097aaSchristos #endif
36bc4097aaSchristos 	struct sockaddr_in	sin;
37bc4097aaSchristos } snmpv1_opts_t;
38bc4097aaSchristos 
39bc4097aaSchristos ipmon_saver_t snmpv1saver = {
40bc4097aaSchristos 	"snmpv1",
41bc4097aaSchristos 	snmpv1_destroy,
42bc4097aaSchristos 	snmpv1_dup,		/* dup */
43bc4097aaSchristos 	snmpv1_match,		/* match */
44bc4097aaSchristos 	snmpv1_parse,
45bc4097aaSchristos 	snmpv1_print,
46bc4097aaSchristos 	snmpv1_send
47bc4097aaSchristos };
48bc4097aaSchristos 
49bc4097aaSchristos 
50bc4097aaSchristos static int
snmpv1_match(ctx1,ctx2)51bc4097aaSchristos snmpv1_match(ctx1, ctx2)
52bc4097aaSchristos 	void *ctx1, *ctx2;
53bc4097aaSchristos {
54bc4097aaSchristos 	snmpv1_opts_t *s1 = ctx1, *s2 = ctx2;
55bc4097aaSchristos 
56bc4097aaSchristos 	if (s1->v6 != s2->v6)
57bc4097aaSchristos 		return 1;
58bc4097aaSchristos 
59bc4097aaSchristos 	if (strcmp(s1->community, s2->community))
60bc4097aaSchristos 		return 1;
61bc4097aaSchristos 
62bc4097aaSchristos #ifdef USE_INET6
63bc4097aaSchristos 	if (s1->v6 == 1) {
64bc4097aaSchristos 		if (memcmp(&s1->sin6, &s2->sin6, sizeof(s1->sin6)))
65bc4097aaSchristos 			return 1;
66bc4097aaSchristos 	} else
67bc4097aaSchristos #endif
68bc4097aaSchristos 	{
69bc4097aaSchristos 		if (memcmp(&s1->sin, &s2->sin, sizeof(s1->sin)))
70bc4097aaSchristos 			return 1;
71bc4097aaSchristos 	}
72bc4097aaSchristos 
73bc4097aaSchristos 	return 0;
74bc4097aaSchristos }
75bc4097aaSchristos 
76bc4097aaSchristos 
77bc4097aaSchristos static void *
snmpv1_dup(ctx)78bc4097aaSchristos snmpv1_dup(ctx)
79bc4097aaSchristos 	void *ctx;
80bc4097aaSchristos {
81bc4097aaSchristos 	snmpv1_opts_t *s = ctx;
82bc4097aaSchristos 
83bc4097aaSchristos 	s->ref++;
84bc4097aaSchristos 	return s;
85bc4097aaSchristos }
86bc4097aaSchristos 
87bc4097aaSchristos 
88bc4097aaSchristos static void
snmpv1_print(ctx)89bc4097aaSchristos snmpv1_print(ctx)
90bc4097aaSchristos 	void *ctx;
91bc4097aaSchristos {
92bc4097aaSchristos 	snmpv1_opts_t *snmpv1 = ctx;
93bc4097aaSchristos 
94bc4097aaSchristos 	printf("%s ", snmpv1->community);
95bc4097aaSchristos #ifdef USE_INET6
96bc4097aaSchristos 	if (snmpv1->v6 == 1) {
97bc4097aaSchristos 		char buf[80];
98bc4097aaSchristos 
99bc4097aaSchristos 		printf("%s", inet_ntop(AF_INET6, &snmpv1->sin6.sin6_addr, buf,
100bc4097aaSchristos 				       sizeof(snmpv1->sin6.sin6_addr)));
101bc4097aaSchristos 	} else
102bc4097aaSchristos #endif
103bc4097aaSchristos 	{
104bc4097aaSchristos 		printf("%s", inet_ntoa(snmpv1->sin.sin_addr));
105bc4097aaSchristos 	}
106bc4097aaSchristos }
107bc4097aaSchristos 
108bc4097aaSchristos 
109bc4097aaSchristos static void *
snmpv1_parse(char ** strings)110bc4097aaSchristos snmpv1_parse(char **strings)
111bc4097aaSchristos {
112bc4097aaSchristos 	snmpv1_opts_t *ctx;
113bc4097aaSchristos 	int result;
114bc4097aaSchristos 	char *str;
115bc4097aaSchristos 	char *s;
116bc4097aaSchristos 
117bc4097aaSchristos 	if (strings[0] == NULL || strings[0][0] == '\0')
118bc4097aaSchristos 		return NULL;
119bc4097aaSchristos 
120bc4097aaSchristos 	if (strchr(*strings, ' ') == NULL)
121bc4097aaSchristos 		return NULL;
122bc4097aaSchristos 
123bc4097aaSchristos 	str = strdup(*strings);
124bc4097aaSchristos 
125bc4097aaSchristos 	ctx = calloc(1, sizeof(*ctx));
126bc4097aaSchristos 	if (ctx == NULL)
127bc4097aaSchristos 		return NULL;
128bc4097aaSchristos 
129bc4097aaSchristos 	ctx->fd = -1;
130bc4097aaSchristos 
131bc4097aaSchristos 	s = strchr(str, ' ');
132bc4097aaSchristos 	*s++ = '\0';
133bc4097aaSchristos 	ctx->community = str;
134bc4097aaSchristos 
135bc4097aaSchristos 	while (ISSPACE(*s))
136bc4097aaSchristos 		s++;
137bc4097aaSchristos 	if (!*s) {
138bc4097aaSchristos 		free(str);
139bc4097aaSchristos 		free(ctx);
140bc4097aaSchristos 		return NULL;
141bc4097aaSchristos 	}
142bc4097aaSchristos 
143bc4097aaSchristos #ifdef USE_INET6
144bc4097aaSchristos 	if (strchr(s, ':') == NULL) {
145bc4097aaSchristos 		result = inet_pton(AF_INET, s, &ctx->sin.sin_addr);
146bc4097aaSchristos 		if (result == 1) {
147bc4097aaSchristos 			ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
148bc4097aaSchristos 			if (ctx->fd >= 0) {
149bc4097aaSchristos 				ctx->sin.sin_family = AF_INET;
150bc4097aaSchristos 				ctx->sin.sin_port = htons(162);
151bc4097aaSchristos 				if (connect(ctx->fd,
152bc4097aaSchristos 					    (struct sockaddr *)&ctx->sin,
153bc4097aaSchristos 					    sizeof(ctx->sin)) != 0) {
154bc4097aaSchristos 						snmpv1_destroy(ctx);
155bc4097aaSchristos 						return NULL;
156bc4097aaSchristos 				}
157bc4097aaSchristos 			}
158bc4097aaSchristos 		}
159bc4097aaSchristos 	} else {
160bc4097aaSchristos 		result = inet_pton(AF_INET6, s, &ctx->sin6.sin6_addr);
161bc4097aaSchristos 		if (result == 1) {
162bc4097aaSchristos 			ctx->v6 = 1;
163bc4097aaSchristos 			ctx->fd = socket(AF_INET6, SOCK_DGRAM, 0);
164bc4097aaSchristos 			if (ctx->fd >= 0) {
165bc4097aaSchristos 				ctx->sin6.sin6_family = AF_INET6;
166bc4097aaSchristos 				ctx->sin6.sin6_port = htons(162);
167bc4097aaSchristos 				if (connect(ctx->fd,
168bc4097aaSchristos 					    (struct sockaddr *)&ctx->sin6,
169bc4097aaSchristos 					    sizeof(ctx->sin6)) != 0) {
170bc4097aaSchristos 						snmpv1_destroy(ctx);
171bc4097aaSchristos 						return NULL;
172bc4097aaSchristos 				}
173bc4097aaSchristos 			}
174bc4097aaSchristos 		}
175bc4097aaSchristos 	}
176bc4097aaSchristos #else
177bc4097aaSchristos 	result = inet_aton(s, &ctx->sin.sin_addr);
178bc4097aaSchristos 	if (result == 1) {
179bc4097aaSchristos 		ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
180bc4097aaSchristos 		if (ctx->fd >= 0) {
181bc4097aaSchristos 			ctx->sin.sin_family = AF_INET;
182bc4097aaSchristos 			ctx->sin.sin_port = htons(162);
183*f44489f8Sprlw1 			if (connect(ctx->fd, (struct sockaddr *)&ctx->sin,
184bc4097aaSchristos 				    sizeof(ctx->sin)) != 0) {
185bc4097aaSchristos 					snmpv1_destroy(ctx);
186bc4097aaSchristos 					return NULL;
187bc4097aaSchristos 			}
188bc4097aaSchristos 		}
189bc4097aaSchristos 	}
190bc4097aaSchristos #endif
191bc4097aaSchristos 
192bc4097aaSchristos 	if (result != 1) {
193bc4097aaSchristos 		free(str);
194bc4097aaSchristos 		free(ctx);
195bc4097aaSchristos 		return NULL;
196bc4097aaSchristos 	}
197bc4097aaSchristos 
198bc4097aaSchristos 	ctx->ref = 1;
199bc4097aaSchristos 
200bc4097aaSchristos 	return ctx;
201bc4097aaSchristos }
202bc4097aaSchristos 
203bc4097aaSchristos 
204bc4097aaSchristos static void
snmpv1_destroy(ctx)205bc4097aaSchristos snmpv1_destroy(ctx)
206bc4097aaSchristos 	void *ctx;
207bc4097aaSchristos {
208bc4097aaSchristos 	snmpv1_opts_t *v1 = ctx;
209bc4097aaSchristos 
210bc4097aaSchristos 	v1->ref--;
211bc4097aaSchristos 	if (v1->ref > 0)
212bc4097aaSchristos 		return;
213bc4097aaSchristos 
214bc4097aaSchristos 	if (v1->community)
215bc4097aaSchristos 		free(v1->community);
216bc4097aaSchristos 	if (v1->fd >= 0)
217bc4097aaSchristos 		close(v1->fd);
218bc4097aaSchristos 	free(v1);
219bc4097aaSchristos }
220bc4097aaSchristos 
221bc4097aaSchristos 
222bc4097aaSchristos static int
snmpv1_send(ctx,msg)223bc4097aaSchristos snmpv1_send(ctx, msg)
224bc4097aaSchristos 	void *ctx;
225bc4097aaSchristos 	ipmon_msg_t *msg;
226bc4097aaSchristos {
227bc4097aaSchristos 	snmpv1_opts_t *v1 = ctx;
228bc4097aaSchristos 
229bc4097aaSchristos 	return sendtrap_v1_0(v1->fd, v1->community,
230bc4097aaSchristos 			     msg->imm_msg, msg->imm_msglen, msg->imm_when);
231bc4097aaSchristos }
232bc4097aaSchristos 
233bc4097aaSchristos static char def_community[] = "public";	/* ublic */
234bc4097aaSchristos 
235bc4097aaSchristos static int
writelength(buffer,value)236bc4097aaSchristos writelength(buffer, value)
237bc4097aaSchristos 	u_char *buffer;
238bc4097aaSchristos 	u_int value;
239bc4097aaSchristos {
240bc4097aaSchristos 	u_int n = htonl(value);
241bc4097aaSchristos 	int len;
242bc4097aaSchristos 
243bc4097aaSchristos 	if (value < 128) {
244bc4097aaSchristos 		*buffer = value;
245bc4097aaSchristos 		return 1;
246bc4097aaSchristos 	}
247bc4097aaSchristos 	if (value > 0xffffff)
248bc4097aaSchristos 		len = 4;
249bc4097aaSchristos 	else if (value > 0xffff)
250bc4097aaSchristos 		len = 3;
251bc4097aaSchristos 	else if (value > 0xff)
252bc4097aaSchristos 		len = 2;
253bc4097aaSchristos 	else
254bc4097aaSchristos 		len = 1;
255bc4097aaSchristos 
256bc4097aaSchristos 	*buffer = 0x80 | len;
257bc4097aaSchristos 
258bc4097aaSchristos 	bcopy((u_char *)&n + 4 - len, buffer + 1, len);
259bc4097aaSchristos 
260bc4097aaSchristos 	return len + 1;
261bc4097aaSchristos }
262bc4097aaSchristos 
263bc4097aaSchristos 
264bc4097aaSchristos static int
writeint(buffer,value)265bc4097aaSchristos writeint(buffer, value)
266bc4097aaSchristos 	u_char *buffer;
267bc4097aaSchristos 	int value;
268bc4097aaSchristos {
269bc4097aaSchristos 	u_char *s = buffer;
270bc4097aaSchristos 	u_int n = value;
271bc4097aaSchristos 
272bc4097aaSchristos 	if (value == 0) {
273bc4097aaSchristos 		*buffer = 0;
274bc4097aaSchristos 		return 1;
275bc4097aaSchristos 	}
276bc4097aaSchristos 
277bc4097aaSchristos 	if (n >  4194304) {
278bc4097aaSchristos 		*s++ = 0x80 | (n / 4194304);
279bc4097aaSchristos 		n -= 4194304 * (n / 4194304);
280bc4097aaSchristos 	}
281bc4097aaSchristos 	if (n >  32768) {
282bc4097aaSchristos 		*s++ = 0x80 | (n / 32768);
283bc4097aaSchristos 		n -= 32768 * (n / 327678);
284bc4097aaSchristos 	}
285bc4097aaSchristos 	if (n > 128) {
286bc4097aaSchristos 		*s++ = 0x80 | (n / 128);
287bc4097aaSchristos 		n -= (n / 128) * 128;
288bc4097aaSchristos 	}
289bc4097aaSchristos 	*s++ = (u_char)n;
290bc4097aaSchristos 
291bc4097aaSchristos 	return s - buffer;
292bc4097aaSchristos }
293bc4097aaSchristos 
294bc4097aaSchristos 
295bc4097aaSchristos 
296bc4097aaSchristos /*
297bc4097aaSchristos  * First style of traps is:
298bc4097aaSchristos  * 1.3.6.1.4.1.9932.1.1
299bc4097aaSchristos  */
300bc4097aaSchristos static int
maketrap_v1(community,buffer,bufsize,msg,msglen,ipaddr,when)301c9d5dc6cSdarrenr maketrap_v1(community, buffer, bufsize, msg, msglen, ipaddr, when)
302bc4097aaSchristos 	char *community;
303bc4097aaSchristos 	u_char *buffer;
304bc4097aaSchristos 	int bufsize;
305bc4097aaSchristos 	u_char *msg;
306bc4097aaSchristos 	int msglen;
307bc4097aaSchristos 	u_32_t ipaddr;
308bc4097aaSchristos 	time_t when;
309bc4097aaSchristos {
310bc4097aaSchristos 	u_char *s = buffer, *t, *pdulen, *varlen;
311bc4097aaSchristos 	int basesize = 73;
312bc4097aaSchristos 	u_short len;
313bc4097aaSchristos 	int trapmsglen;
314bc4097aaSchristos 	int pdulensz;
315bc4097aaSchristos 	int varlensz;
316bc4097aaSchristos 	int baselensz;
317bc4097aaSchristos 	int n;
318bc4097aaSchristos 
319bc4097aaSchristos 	if (community == NULL || *community == '\0')
320bc4097aaSchristos 		community = def_community;
321bc4097aaSchristos 	basesize += strlen(community) + msglen;
322bc4097aaSchristos 
323bc4097aaSchristos 	if (basesize + 8 > bufsize)
324bc4097aaSchristos 		return 0;
325bc4097aaSchristos 
326bc4097aaSchristos 	memset(buffer, 0xff, bufsize);
327bc4097aaSchristos 	*s++ = 0x30;		/* Sequence */
328bc4097aaSchristos 	if (basesize - 1 >= 128) {
329bc4097aaSchristos 		baselensz = 2;
330bc4097aaSchristos 		basesize++;
331bc4097aaSchristos 	} else {
332bc4097aaSchristos 		baselensz = 1;
333bc4097aaSchristos 	}
334bc4097aaSchristos 	s += baselensz;
335bc4097aaSchristos 	*s++ = 0x02;		/* Integer32 */
336bc4097aaSchristos 	*s++ = 0x01;		/* length 1 */
337bc4097aaSchristos 	*s++ = 0x00;		/* version 1 */
338bc4097aaSchristos 	*s++ = 0x04;		/* octet string */
339bc4097aaSchristos 	*s++ = strlen(community);		/* length of "public" */
340bc4097aaSchristos 	bcopy(community, s, s[-1]);
341bc4097aaSchristos 	s += s[-1];
342bc4097aaSchristos 	*s++ = 0xA4;		/* PDU(4) */
343bc4097aaSchristos 	pdulen = s++;
344bc4097aaSchristos 	if (basesize - (s - buffer) >= 128) {
345bc4097aaSchristos 		pdulensz = 2;
346bc4097aaSchristos 		basesize++;
347bc4097aaSchristos 		s++;
348bc4097aaSchristos 	} else {
349bc4097aaSchristos 		pdulensz = 1;
350bc4097aaSchristos 	}
351bc4097aaSchristos 
352bc4097aaSchristos 	/* enterprise */
353bc4097aaSchristos 	bcopy(ipf_enterprise, s, sizeof(ipf_enterprise));
354bc4097aaSchristos 	s += sizeof(ipf_enterprise);
355bc4097aaSchristos 
356bc4097aaSchristos 	/* Agent address */
357bc4097aaSchristos 	*s++ = 0x40;
358bc4097aaSchristos 	*s++ = 0x4;
359bc4097aaSchristos 	bcopy(&ipaddr, s, 4);
360bc4097aaSchristos 	s += 4;
361bc4097aaSchristos 
362bc4097aaSchristos 	/* Generic Trap code */
363bc4097aaSchristos 	*s++ = 0x2;
364bc4097aaSchristos 	n = writeint(s + 1, 6);
365bc4097aaSchristos 	if (n == 0)
366bc4097aaSchristos 		return 0;
367bc4097aaSchristos 	*s = n;
368bc4097aaSchristos 	s += n + 1;
369bc4097aaSchristos 
370bc4097aaSchristos 	/* Specific Trap code */
371bc4097aaSchristos 	*s++ = 0x2;
372bc4097aaSchristos 	n = writeint(s + 1, 0);
373bc4097aaSchristos 	if (n == 0)
374bc4097aaSchristos 		return 0;
375bc4097aaSchristos 	*s = n;
376bc4097aaSchristos 	s += n + 1;
377bc4097aaSchristos 
378bc4097aaSchristos 	/* Time stamp */
379bc4097aaSchristos 	*s++ = 0x43;			/* TimeTicks */
380bc4097aaSchristos 	*s++ = 0x04;			/* TimeTicks */
381bc4097aaSchristos 	s[0] = when >> 24;
382bc4097aaSchristos 	s[1] = when >> 16;
383bc4097aaSchristos 	s[2] = when >> 8;
384bc4097aaSchristos 	s[3] = when & 0xff;
385bc4097aaSchristos 	s += 4;
386bc4097aaSchristos 
387bc4097aaSchristos 	/*
388bc4097aaSchristos 	 * The trap0 message is "ipfilter_version" followed by the message
389bc4097aaSchristos 	 */
390bc4097aaSchristos 	*s++ = 0x30;
391bc4097aaSchristos 	varlen = s;
392bc4097aaSchristos 	if (basesize - (s - buffer) >= 128) {
393bc4097aaSchristos 		varlensz = 2;
394bc4097aaSchristos 		basesize++;
395bc4097aaSchristos 	} else {
396bc4097aaSchristos 		varlensz = 1;
397bc4097aaSchristos 	}
398bc4097aaSchristos 	s += varlensz;
399bc4097aaSchristos 
400bc4097aaSchristos 	*s++ = 0x30;
401bc4097aaSchristos 	t = s + 1;
402bc4097aaSchristos 	bcopy(ipf_trap0_1, t, sizeof(ipf_trap0_1));
403bc4097aaSchristos 	t += sizeof(ipf_trap0_1);
404bc4097aaSchristos 
405bc4097aaSchristos 	*t++ = 0x2;		/* Integer */
406bc4097aaSchristos 	n = writeint(t + 1, IPFILTER_VERSION);
407bc4097aaSchristos 	*t = n;
408bc4097aaSchristos 	t += n + 1;
409bc4097aaSchristos 
410bc4097aaSchristos 	len = t - s - 1;
411bc4097aaSchristos 	writelength(s, len);
412bc4097aaSchristos 
413bc4097aaSchristos 	s = t;
414bc4097aaSchristos 	*s++ = 0x30;
415bc4097aaSchristos 	if (basesize - (s - buffer) >= 128) {
416bc4097aaSchristos 		trapmsglen = 2;
417bc4097aaSchristos 		basesize++;
418bc4097aaSchristos 	} else {
419bc4097aaSchristos 		trapmsglen = 1;
420bc4097aaSchristos 	}
421bc4097aaSchristos 	t = s + trapmsglen;
422bc4097aaSchristos 	bcopy(ipf_trap0_2, t, sizeof(ipf_trap0_2));
423bc4097aaSchristos 	t += sizeof(ipf_trap0_2);
424bc4097aaSchristos 
425bc4097aaSchristos 	*t++ = 0x4;		/* Octet string */
426bc4097aaSchristos 	n = writelength(t, msglen);
427bc4097aaSchristos 	t += n;
428bc4097aaSchristos 	bcopy(msg, t, msglen);
429bc4097aaSchristos 	t += msglen;
430bc4097aaSchristos 
431bc4097aaSchristos 	len = t - s - trapmsglen;
432bc4097aaSchristos 	writelength(s, len);
433bc4097aaSchristos 
434bc4097aaSchristos 	len = t - varlen - varlensz;
435bc4097aaSchristos 	writelength(varlen, len);		/* pdu length */
436bc4097aaSchristos 
437bc4097aaSchristos 	len = t - pdulen - pdulensz;
438bc4097aaSchristos 	writelength(pdulen, len);		/* pdu length */
439bc4097aaSchristos 
440bc4097aaSchristos 	len = t - buffer - baselensz - 1;
441bc4097aaSchristos 	writelength(buffer + 1, len);	/* length of trap */
442bc4097aaSchristos 
443bc4097aaSchristos 	return t - buffer;
444bc4097aaSchristos }
445bc4097aaSchristos 
446bc4097aaSchristos 
447bc4097aaSchristos int
sendtrap_v1_0(fd,community,msg,msglen,when)448bc4097aaSchristos sendtrap_v1_0(fd, community, msg, msglen, when)
449bc4097aaSchristos 	int fd;
450bc4097aaSchristos 	char *community, *msg;
451bc4097aaSchristos 	int msglen;
452bc4097aaSchristos 	time_t when;
453bc4097aaSchristos {
454bc4097aaSchristos 
455bc4097aaSchristos 	u_char buffer[1500];
456bc4097aaSchristos 	int n;
457bc4097aaSchristos 
458bc4097aaSchristos 	n = maketrap_v1(community, buffer, sizeof(buffer),
459c9d5dc6cSdarrenr 			(u_char *)msg, msglen, 0, when);
460bc4097aaSchristos 	if (n > 0) {
461bc4097aaSchristos 		return send(fd, buffer, n, 0);
462bc4097aaSchristos 	}
463bc4097aaSchristos 
464bc4097aaSchristos 	return 0;
465bc4097aaSchristos }
466