aboutsummaryrefslogtreecommitdiff
path: root/contrib/ipfilter/lib/save_v1trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ipfilter/lib/save_v1trap.c')
-rw-r--r--contrib/ipfilter/lib/save_v1trap.c463
1 files changed, 0 insertions, 463 deletions
diff --git a/contrib/ipfilter/lib/save_v1trap.c b/contrib/ipfilter/lib/save_v1trap.c
deleted file mode 100644
index cca61ac600e5..000000000000
--- a/contrib/ipfilter/lib/save_v1trap.c
+++ /dev/null
@@ -1,463 +0,0 @@
-#include "ipf.h"
-#include "netinet/ipl.h"
-#include "ipmon.h"
-#include <ctype.h>
-
-#define IPF_ENTERPRISE 9932
-/*
- * Enterprise number OID:
- * 1.3.6.1.4.1.9932
- */
-static u_char ipf_enterprise[] = { 6, 7, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c };
-static u_char ipf_trap0_1[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 1 };
-static u_char ipf_trap0_2[] = { 6, 10, 0x2b, 6, 1, 4, 1, 0xcd, 0x4c, 1, 1, 2 };
-
-static int writeint(u_char *, int);
-static int writelength(u_char *, u_int);
-static int maketrap_v1(char *, u_char *, int, u_char *, int, u_32_t,
- time_t);
-static void snmpv1_destroy(void *);
-static void *snmpv1_dup(void *);
-static int snmpv1_match(void *, void *);
-static void *snmpv1_parse(char **);
-static void snmpv1_print(void *);
-static int snmpv1_send(void *, ipmon_msg_t *);
-
-typedef struct snmpv1_opts_s {
- char *community;
- int fd;
- int v6;
- int ref;
-#ifdef USE_INET6
- struct sockaddr_in6 sin6;
-#endif
- struct sockaddr_in sin;
-} snmpv1_opts_t;
-
-ipmon_saver_t snmpv1saver = {
- "snmpv1",
- snmpv1_destroy,
- snmpv1_dup, /* dup */
- snmpv1_match, /* match */
- snmpv1_parse,
- snmpv1_print,
- snmpv1_send
-};
-
-
-static int
-snmpv1_match(ctx1, ctx2)
- void *ctx1, *ctx2;
-{
- snmpv1_opts_t *s1 = ctx1, *s2 = ctx2;
-
- if (s1->v6 != s2->v6)
- return 1;
-
- if (strcmp(s1->community, s2->community))
- return 1;
-
-#ifdef USE_INET6
- if (s1->v6 == 1) {
- if (memcmp(&s1->sin6, &s2->sin6, sizeof(s1->sin6)))
- return 1;
- } else
-#endif
- {
- if (memcmp(&s1->sin, &s2->sin, sizeof(s1->sin)))
- return 1;
- }
-
- return 0;
-}
-
-
-static void *
-snmpv1_dup(ctx)
- void *ctx;
-{
- snmpv1_opts_t *s = ctx;
-
- s->ref++;
- return s;
-}
-
-
-static void
-snmpv1_print(ctx)
- void *ctx;
-{
- snmpv1_opts_t *snmpv1 = ctx;
-
- printf("%s ", snmpv1->community);
-#ifdef USE_INET6
- if (snmpv1->v6 == 1) {
- char buf[80];
-
- printf("%s", inet_ntop(AF_INET6, &snmpv1->sin6.sin6_addr, buf,
- sizeof(snmpv1->sin6.sin6_addr)));
- } else
-#endif
- {
- printf("%s", inet_ntoa(snmpv1->sin.sin_addr));
- }
-}
-
-
-static void *
-snmpv1_parse(char **strings)
-{
- snmpv1_opts_t *ctx;
- int result;
- char *str;
- char *s;
-
- if (strings[0] == NULL || strings[0][0] == '\0')
- return NULL;
-
- if (strchr(*strings, ' ') == NULL)
- return NULL;
-
- str = strdup(*strings);
-
- ctx = calloc(1, sizeof(*ctx));
- if (ctx == NULL)
- return NULL;
-
- ctx->fd = -1;
-
- s = strchr(str, ' ');
- *s++ = '\0';
- ctx->community = str;
-
- while (ISSPACE(*s))
- s++;
- if (!*s) {
- free(str);
- free(ctx);
- return NULL;
- }
-
-#ifdef USE_INET6
- if (strchr(s, ':') == NULL) {
- result = inet_pton(AF_INET, s, &ctx->sin.sin_addr);
- if (result == 1) {
- ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (ctx->fd >= 0) {
- ctx->sin.sin_family = AF_INET;
- ctx->sin.sin_port = htons(162);
- if (connect(ctx->fd,
- (struct sockaddr *)&ctx->sin,
- sizeof(ctx->sin)) != 0) {
- snmpv1_destroy(ctx);
- return NULL;
- }
- }
- }
- } else {
- result = inet_pton(AF_INET6, s, &ctx->sin6.sin6_addr);
- if (result == 1) {
- ctx->v6 = 1;
- ctx->fd = socket(AF_INET6, SOCK_DGRAM, 0);
- if (ctx->fd >= 0) {
- ctx->sin6.sin6_family = AF_INET6;
- ctx->sin6.sin6_port = htons(162);
- if (connect(ctx->fd,
- (struct sockaddr *)&ctx->sin6,
- sizeof(ctx->sin6)) != 0) {
- snmpv1_destroy(ctx);
- return NULL;
- }
- }
- }
- }
-#else
- result = inet_aton(s, &ctx->sin.sin_addr);
- if (result == 1) {
- ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (ctx->fd >= 0) {
- ctx->sin.sin_family = AF_INET;
- ctx->sin.sin_port = htons(162);
- if (connect(ctx->fd, (struct sockaddr *)&ctx->sin,
- sizeof(ctx->sin)) != 0) {
- snmpv1_destroy(ctx);
- return NULL;
- }
- }
- }
-#endif
-
- if (result != 1) {
- free(str);
- free(ctx);
- return NULL;
- }
-
- ctx->ref = 1;
-
- return ctx;
-}
-
-
-static void
-snmpv1_destroy(ctx)
- void *ctx;
-{
- snmpv1_opts_t *v1 = ctx;
-
- v1->ref--;
- if (v1->ref > 0)
- return;
-
- if (v1->community)
- free(v1->community);
- if (v1->fd >= 0)
- close(v1->fd);
- free(v1);
-}
-
-
-static int
-snmpv1_send(ctx, msg)
- void *ctx;
- ipmon_msg_t *msg;
-{
- snmpv1_opts_t *v1 = ctx;
-
- return sendtrap_v1_0(v1->fd, v1->community,
- msg->imm_msg, msg->imm_msglen, msg->imm_when);
-}
-
-static char def_community[] = "public"; /* ublic */
-
-static int
-writelength(buffer, value)
- u_char *buffer;
- u_int value;
-{
- u_int n = htonl(value);
- int len;
-
- if (value < 128) {
- *buffer = value;
- return 1;
- }
- if (value > 0xffffff)
- len = 4;
- else if (value > 0xffff)
- len = 3;
- else if (value > 0xff)
- len = 2;
- else
- len = 1;
-
- *buffer = 0x80 | len;
-
- bcopy((u_char *)&n + 4 - len, buffer + 1, len);
-
- return len + 1;
-}
-
-
-static int
-writeint(buffer, value)
- u_char *buffer;
- int value;
-{
- u_char *s = buffer;
- u_int n = value;
-
- if (value == 0) {
- *buffer = 0;
- return 1;
- }
-
- if (n > 4194304) {
- *s++ = 0x80 | (n / 4194304);
- n -= 4194304 * (n / 4194304);
- }
- if (n > 32768) {
- *s++ = 0x80 | (n / 32768);
- n -= 32768 * (n / 327678);
- }
- if (n > 128) {
- *s++ = 0x80 | (n / 128);
- n -= (n / 128) * 128;
- }
- *s++ = (u_char)n;
-
- return s - buffer;
-}
-
-
-
-/*
- * First style of traps is:
- * 1.3.6.1.4.1.9932.1.1
- */
-static int
-maketrap_v1(community, buffer, bufsize, msg, msglen, ipaddr, when)
- char *community;
- u_char *buffer;
- int bufsize;
- u_char *msg;
- int msglen;
- u_32_t ipaddr;
- time_t when;
-{
- u_char *s = buffer, *t, *pdulen, *varlen;
- int basesize = 73;
- u_short len;
- int trapmsglen;
- int pdulensz;
- int varlensz;
- int baselensz;
- int n;
-
- if (community == NULL || *community == '\0')
- community = def_community;
- basesize += strlen(community) + msglen;
-
- if (basesize + 8 > bufsize)
- return 0;
-
- memset(buffer, 0xff, bufsize);
- *s++ = 0x30; /* Sequence */
- if (basesize - 1 >= 128) {
- baselensz = 2;
- basesize++;
- } else {
- baselensz = 1;
- }
- s += baselensz;
- *s++ = 0x02; /* Integer32 */
- *s++ = 0x01; /* length 1 */
- *s++ = 0x00; /* version 1 */
- *s++ = 0x04; /* octet string */
- *s++ = strlen(community); /* length of "public" */
- bcopy(community, s, s[-1]);
- s += s[-1];
- *s++ = 0xA4; /* PDU(4) */
- pdulen = s++;
- if (basesize - (s - buffer) >= 128) {
- pdulensz = 2;
- basesize++;
- s++;
- } else {
- pdulensz = 1;
- }
-
- /* enterprise */
- bcopy(ipf_enterprise, s, sizeof(ipf_enterprise));
- s += sizeof(ipf_enterprise);
-
- /* Agent address */
- *s++ = 0x40;
- *s++ = 0x4;
- bcopy(&ipaddr, s, 4);
- s += 4;
-
- /* Generic Trap code */
- *s++ = 0x2;
- n = writeint(s + 1, 6);
- if (n == 0)
- return 0;
- *s = n;
- s += n + 1;
-
- /* Specific Trap code */
- *s++ = 0x2;
- n = writeint(s + 1, 0);
- if (n == 0)
- return 0;
- *s = n;
- s += n + 1;
-
- /* Time stamp */
- *s++ = 0x43; /* TimeTicks */
- *s++ = 0x04; /* TimeTicks */
- s[0] = when >> 24;
- s[1] = when >> 16;
- s[2] = when >> 8;
- s[3] = when & 0xff;
- s += 4;
-
- /*
- * The trap0 message is "ipfilter_version" followed by the message
- */
- *s++ = 0x30;
- varlen = s;
- if (basesize - (s - buffer) >= 128) {
- varlensz = 2;
- basesize++;
- } else {
- varlensz = 1;
- }
- s += varlensz;
-
- *s++ = 0x30;
- t = s + 1;
- bcopy(ipf_trap0_1, t, sizeof(ipf_trap0_1));
- t += sizeof(ipf_trap0_1);
-
- *t++ = 0x2; /* Integer */
- n = writeint(t + 1, IPFILTER_VERSION);
- *t = n;
- t += n + 1;
-
- len = t - s - 1;
- writelength(s, len);
-
- s = t;
- *s++ = 0x30;
- if (basesize - (s - buffer) >= 128) {
- trapmsglen = 2;
- basesize++;
- } else {
- trapmsglen = 1;
- }
- t = s + trapmsglen;
- bcopy(ipf_trap0_2, t, sizeof(ipf_trap0_2));
- t += sizeof(ipf_trap0_2);
-
- *t++ = 0x4; /* Octet string */
- n = writelength(t, msglen);
- t += n;
- bcopy(msg, t, msglen);
- t += msglen;
-
- len = t - s - trapmsglen;
- writelength(s, len);
-
- len = t - varlen - varlensz;
- writelength(varlen, len); /* pdu length */
-
- len = t - pdulen - pdulensz;
- writelength(pdulen, len); /* pdu length */
-
- len = t - buffer - baselensz - 1;
- writelength(buffer + 1, len); /* length of trap */
-
- return t - buffer;
-}
-
-
-int
-sendtrap_v1_0(fd, community, msg, msglen, when)
- int fd;
- char *community, *msg;
- int msglen;
- time_t when;
-{
-
- u_char buffer[1500];
- int n;
-
- n = maketrap_v1(community, buffer, sizeof(buffer),
- (u_char *)msg, msglen, 0, when);
- if (n > 0) {
- return send(fd, buffer, n, 0);
- }
-
- return 0;
-}