Blame perl/ASN/ASN.xs

Packit fcad23
/* -*- C -*- */
Packit fcad23
#if defined(_WIN32) && !defined(_WIN32_WINNT)
Packit fcad23
#define _WIN32_WINNT 0x501
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include "EXTERN.h"
Packit fcad23
#include "perl.h"
Packit fcad23
#include "XSUB.h"
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
#include <net-snmp/library/asn1.h>
Packit fcad23
#include <net-snmp/library/snmp_impl.h>
Packit fcad23
Packit fcad23
#define TEST_CONSTANT(value, name, C)           \
Packit fcad23
    if (strEQ(name, #C)) {                      \
Packit fcad23
        *value = C;                             \
Packit fcad23
        return 0;                               \
Packit fcad23
    }
Packit fcad23
Packit fcad23
static int constant_ASN_O(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 5 ? name[5] : -1) {
Packit fcad23
    case 'B':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_OBJECT_ID);
Packit fcad23
        break;
Packit fcad23
    case 'C':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_OCTET_STR);
Packit fcad23
        break;
Packit fcad23
    case 'P':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_OPAQUE);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_B(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 5 ? name[5] : -1) {
Packit fcad23
    case 'I':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_BIT_STR);
Packit fcad23
        break;
Packit fcad23
    case 'O':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_BOOLEAN);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_S(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 6 ? name[6] : -1) {
Packit fcad23
    case 'Q':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_SEQUENCE);
Packit fcad23
        break;
Packit fcad23
    case 'T':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_SET);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_C(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 11 ? name[11] : -1) {
Packit fcad23
    case '\0':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_COUNTER);
Packit fcad23
        break;
Packit fcad23
    case '6':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_COUNTER64);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_U(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 12 ? name[12] : -1) {
Packit fcad23
    case '\0':
Packit fcad23
	TEST_CONSTANT(value, name, ASN_UNSIGNED);
Packit fcad23
        break;
Packit fcad23
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
Packit fcad23
    case '6':
Packit fcad23
	TEST_CONSTANT(value, name, ASN_UNSIGNED64);
Packit fcad23
        break;
Packit fcad23
#endif
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_IN(double *value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 11 ? name[11] : -1) {
Packit fcad23
    case '\0':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_INTEGER);
Packit fcad23
        break;
Packit fcad23
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
Packit fcad23
    case '6':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_INTEGER64);
Packit fcad23
        break;
Packit fcad23
#endif
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant_ASN_I(double* value, const char *name, const int len)
Packit fcad23
{
Packit fcad23
    switch (len >= 5 ? name[5] : -1) {
Packit fcad23
    case 'N':
Packit fcad23
	return constant_ASN_IN(value, name, len);
Packit fcad23
    case 'P':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_IPADDRESS);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int constant(double *value, const char *const name, const int len)
Packit fcad23
{
Packit fcad23
    if (!strnEQ(name, "ASN_", 4))
Packit fcad23
        return EINVAL;
Packit fcad23
Packit fcad23
    switch (name[4]) {
Packit fcad23
    case 'A':
Packit fcad23
	TEST_CONSTANT(value, name, ASN_APPLICATION);
Packit fcad23
        break;
Packit fcad23
    case 'B':
Packit fcad23
	return constant_ASN_B(value, name, len);
Packit fcad23
    case 'C':
Packit fcad23
	return constant_ASN_C(value, name, len);
Packit fcad23
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
Packit fcad23
    case 'D':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_DOUBLE);
Packit fcad23
        break;
Packit fcad23
    case 'F':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_FLOAT);
Packit fcad23
        break;
Packit fcad23
#endif
Packit fcad23
    case 'G':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_GAUGE);
Packit fcad23
        break;
Packit fcad23
    case 'I':
Packit fcad23
	return constant_ASN_I(value, name, len);
Packit fcad23
    case 'N':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_NULL);
Packit fcad23
        break;
Packit fcad23
    case 'O':
Packit fcad23
	return constant_ASN_O(value, name, len);
Packit fcad23
    case 'S':
Packit fcad23
	return constant_ASN_S(value, name, len);
Packit fcad23
    case 'T':
Packit fcad23
        TEST_CONSTANT(value, name, ASN_TIMETICKS);
Packit fcad23
        break;
Packit fcad23
    case 'U':
Packit fcad23
	return constant_ASN_U(value, name, len);
Packit fcad23
    }
Packit fcad23
    return EINVAL;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
MODULE = NetSNMP::ASN		PACKAGE = NetSNMP::ASN		
Packit fcad23
Packit fcad23
Packit fcad23
void
Packit fcad23
constant(sv)
Packit fcad23
    PREINIT:
Packit fcad23
	STRLEN		len;
Packit fcad23
    INPUT:
Packit fcad23
	SV *		sv
Packit fcad23
	char *		s = SvPV(sv, len);
Packit fcad23
    INIT:
Packit fcad23
        int status;
Packit fcad23
        double value;
Packit fcad23
    PPCODE:
Packit fcad23
        value = 0;
Packit fcad23
        status = constant(&value, s, len);
Packit fcad23
        XPUSHs(sv_2mortal(newSVuv(status)));
Packit fcad23
        XPUSHs(sv_2mortal(newSVnv(value)));