/***********************************************************************\
*                                 snmp.d                                *
*                                                                       *
*                       Windows API header module                       *
*                                                                       *
*                 Translated from MinGW Windows headers                 *
*                           by Stewart Gordon                           *
*                                                                       *
*                       Placed into public domain                       *
\***********************************************************************/
module win32.snmp;

private import win32.windows;

// These are not documented on MSDN
enum {
	DEFAULT_SNMP_PORT_UDP     =   161,
	DEFAULT_SNMP_PORT_IPX     = 36879,
	DEFAULT_SNMPTRAP_PORT_UDP =   162,
	DEFAULT_SNMPTRAP_PORT_IPX = 36880
}

enum : BYTE {
	ASN_UNIVERSAL                 = 0x00,
	ASN_PRIMITIVE                 = 0x00,
	ASN_CONSTRUCTOR               = 0x20,
	ASN_APPLICATION               = 0x40,
	ASN_CONTEXT                   = 0x80,
	ASN_PRIVATE                   = 0xC0,

	SNMP_PDU_GET                  = ASN_CONTEXT | ASN_CONSTRUCTOR,
	SNMP_PDU_GETNEXT,
	SNMP_PDU_RESPONSE,
	SNMP_PDU_SET,
	SNMP_PDU_GETBULK,          // = ASN_CONTEXT | ASN_CONSTRUCTOR | 4
	SNMP_PDU_V1TRAP               = ASN_CONTEXT | ASN_CONSTRUCTOR | 4,
	SNMP_PDU_INFORM               = ASN_CONTEXT | ASN_CONSTRUCTOR | 6,
	SNMP_PDU_TRAP,
	SNMP_PDU_REPORT,
	ASN_INTEGER                   = ASN_UNIVERSAL | ASN_PRIMITIVE | 2,
	ASN_BITS,
	ASN_OCTETSTRING,
	ASN_NULL,
	ASN_OBJECTIDENTIFIER,      // = ASN_UNIVERSAL | ASN_PRIMITIVE | 6
	ASN_INTEGER32                 = ASN_INTEGER,
	ASN_SEQUENCE                  = ASN_UNIVERSAL | ASN_CONSTRUCTOR | 0x10,
	ASN_SEQUENCEOF                = ASN_SEQUENCE,
	ASN_IPADDRESS                 = ASN_APPLICATION | ASN_PRIMITIVE,
	ASN_COUNTER32,
	ASN_GAUGE32,
	ASN_TIMETICKS,
	ASN_OPAQUE,                // = ASN_APPLICATION | ASN_PRIMITIVE | 4
	ASN_COUNTER64                 = ASN_APPLICATION | ASN_PRIMITIVE | 6,
	ASN_UNSIGNED32,            // = ASN_APPLICATION | ASN_PRIMITIVE | 7
	SNMP_EXCEPTION_NOSUCHOBJECT   = ASN_CONTEXT | ASN_PRIMITIVE,
	SNMP_EXCEPTION_NOSUCHINSTANCE,
	SNMP_EXCEPTION_ENDOFMIBVIEW,
	SNMP_EXTENSION_GET            = SNMP_PDU_GET,
	SNMP_EXTENSION_GET_NEXT       = SNMP_PDU_GETNEXT,
	SNMP_EXTENSION_GET_BULK       = SNMP_PDU_GETBULK,
	SNMP_EXTENSION_SET_TEST       = ASN_PRIVATE | ASN_CONSTRUCTOR,
	SNMP_EXTENSION_SET_COMMIT     = SNMP_PDU_SET,
	SNMP_EXTENSION_SET_UNDO       = ASN_PRIVATE | ASN_CONSTRUCTOR | 1,
	SNMP_EXTENSION_SET_CLEANUP
}


enum : AsnInteger {
	SNMP_ERRORSTATUS_NOERROR,
	SNMP_ERRORSTATUS_TOOBIG,
	SNMP_ERRORSTATUS_NOSUCHNAME,
	SNMP_ERRORSTATUS_BADVALUE,
	SNMP_ERRORSTATUS_READONLY,
	SNMP_ERRORSTATUS_GENERR,
	SNMP_ERRORSTATUS_NOACCESS,
	SNMP_ERRORSTATUS_WRONGTYPE,
	SNMP_ERRORSTATUS_WRONGLENGTH,
	SNMP_ERRORSTATUS_WRONGENCODING,
	SNMP_ERRORSTATUS_WRONGVALUE,
	SNMP_ERRORSTATUS_NOCREATION,
	SNMP_ERRORSTATUS_INCONSISTENTVALUE,
	SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE,
	SNMP_ERRORSTATUS_COMMITFAILED,
	SNMP_ERRORSTATUS_UNDOFAILED,
	SNMP_ERRORSTATUS_AUTHORIZATIONERROR,
	SNMP_ERRORSTATUS_NOTWRITABLE,
	SNMP_ERRORSTATUS_INCONSISTENTNAME
}

enum : AsnInteger {
	SNMP_GENERICTRAP_COLDSTART,
	SNMP_GENERICTRAP_WARMSTART,
	SNMP_GENERICTRAP_LINKDOWN,
	SNMP_GENERICTRAP_LINKUP,
	SNMP_GENERICTRAP_AUTHFAILURE,
	SNMP_GENERICTRAP_EGPNEIGHLOSS,
	SNMP_GENERICTRAP_ENTERSPECIFIC
}

// These are not documented on MSDN
enum {
	SNMP_ACCESS_NONE,
	SNMP_ACCESS_NOTIFY,
	SNMP_ACCESS_READ_ONLY,
	SNMP_ACCESS_READ_WRITE,
	SNMP_ACCESS_READ_CREATE
}

enum : BOOL {
	SNMPAPI_ERROR   = false,
	SNMPAPI_NOERROR = true
}

enum : INT {
	SNMP_LOG_SILENT,
	SNMP_LOG_FATAL,
	SNMP_LOG_ERROR,
	SNMP_LOG_WARNING,
	SNMP_LOG_TRACE,
	SNMP_LOG_VERBOSE
}

const INT
	SNMP_OUTPUT_TO_CONSOLE  = 1,
	SNMP_OUTPUT_TO_LOGFILE  = 2,
	SNMP_OUTPUT_TO_EVENTLOG = 4,
	SNMP_OUTPUT_TO_DEBUGGER = 8;

const size_t SNMP_MAX_OID_LEN = 128;

enum : DWORD {
	SNMP_MEM_ALLOC_ERROR          =  1,
	SNMP_BERAPI_INVALID_LENGTH    = 10,
	SNMP_BERAPI_INVALID_TAG,
	SNMP_BERAPI_OVERFLOW,
	SNMP_BERAPI_SHORT_BUFFER,
	SNMP_BERAPI_INVALID_OBJELEM,
	SNMP_PDUAPI_UNRECOGNIZED_PDU  = 20,
	SNMP_PDUAPI_INVALID_ES,
	SNMP_PDUAPI_INVALID_GT,
	SNMP_AUTHAPI_INVALID_VERSION  = 30,
	SNMP_AUTHAPI_INVALID_MSG_TYPE,
	SNMP_AUTHAPI_TRIV_AUTH_FAILED,
}

alias INT SNMPAPI;
alias LONG AsnInteger32;
alias ULONG AsnUnsigned32, AsnCounter32, AsnGauge32, AsnTimeticks;
alias ULARGE_INTEGER AsnCounter64;

align (4):

struct AsnOctetString {
	BYTE* stream;
	UINT  length;
	BOOL  dynamic;
}
alias AsnOctetString AsnBits, AsnSequence, AsnImplicitSequence,
  AsnIPAddress, AsnNetworkAddress, AsnDisplayString, AsnOpaque;

struct AsnObjectIdentifier {
	UINT  idLength;
	UINT* ids;
}
alias AsnObjectIdentifier AsnObjectName;

struct AsnAny {
	BYTE      asnType;
	union _asnValue {
		AsnInteger32        number;
		AsnUnsigned32       unsigned32;
		AsnCounter64        counter64;
		AsnOctetString      string;
		AsnBits             bits;
		AsnObjectIdentifier object;
		AsnSequence         sequence;
		AsnIPAddress        address;
		AsnCounter32        counter;
		AsnGauge32          gauge;
		AsnTimeticks        ticks;
		AsnOpaque           arbitrary;
	}
	_asnValue asnValue;
}
alias AsnAny AsnObjectSyntax;

struct SnmpVarBind {
	AsnObjectName   name;
	AsnObjectSyntax value;
}

struct SnmpVarBindList {
	SnmpVarBind* list;
	UINT         len;
}

extern (Windows) {
	VOID SnmpExtensionClose();
	BOOL SnmpExtensionInit(DWORD, HANDLE*, AsnObjectIdentifier*);
	BOOL SnmpExtensionInitEx(AsnObjectIdentifier*);
	BOOL SnmpExtensionMonitor(LPVOID);
	BOOL SnmpExtensionQuery(BYTE, SnmpVarBindList*, AsnInteger32*,
	  AsnInteger32*);
	BOOL SnmpExtensionQueryEx(DWORD, DWORD, SnmpVarBindList*, AsnOctetString*,
	  AsnInteger32*, AsnInteger32*);
	BOOL SnmpExtensionTrap(AsnObjectIdentifier*, AsnInteger32*, AsnInteger32*,
	  AsnTimeticks*, SnmpVarBindList*);
	DWORD SnmpSvcGetUptime();
	VOID SnmpSvcSetLogLevel(INT);
	VOID SnmpSvcSetLogType(INT);
	SNMPAPI SnmpUtilAsnAnyCpy(AsnAny*, AsnAny*);
	VOID SnmpUtilAsnAnyFree(AsnAny*);
	VOID SnmpUtilDbgPrint(INT, LPSTR, ...);
	LPSTR SnmpUtilIdsToA(UINT*, UINT);
	LPVOID SnmpUtilMemAlloc(UINT);
	VOID SnmpUtilMemFree(LPVOID);
	LPVOID SnmpUtilMemReAlloc(LPVOID, UINT);
	SNMPAPI SnmpUtilOctetsCmp(AsnOctetString*, AsnOctetString*);
	SNMPAPI SnmpUtilOctetsCpy(AsnOctetString*, AsnOctetString*);
	VOID SnmpUtilOctetsFree(AsnOctetString*);
	SNMPAPI SnmpUtilOctetsNCmp(AsnOctetString*, AsnOctetString*, UINT);
	SNMPAPI SnmpUtilOidAppend(AsnObjectIdentifier*, AsnObjectIdentifier*);
	SNMPAPI SnmpUtilOidCmp(AsnObjectIdentifier*, AsnObjectIdentifier*);
	SNMPAPI SnmpUtilOidCpy(AsnObjectIdentifier*, AsnObjectIdentifier*);
	VOID SnmpUtilOidFree(AsnObjectIdentifier*);
	SNMPAPI SnmpUtilOidNCmp(AsnObjectIdentifier*, AsnObjectIdentifier*, UINT);
	LPSTR SnmpUtilOidToA(AsnObjectIdentifier*);
	VOID SnmpUtilPrintAsnAny(AsnAny*);
	VOID SnmpUtilPrintOid(AsnObjectIdentifier*);
	SNMPAPI SnmpUtilVarBindCpy(SnmpVarBind*, SnmpVarBind*);
	SNMPAPI SnmpUtilVarBindListCpy(SnmpVarBindList*, SnmpVarBindList*);
	VOID SnmpUtilVarBindFree(SnmpVarBind*);
	VOID SnmpUtilVarBindListFree(SnmpVarBindList*);
}

alias SnmpUtilMemAlloc SNMP_malloc;
alias SnmpUtilMemFree SNMP_free;
alias SnmpUtilMemReAlloc SNMP_realloc;
alias SnmpUtilMemAlloc SNMP_DBG_malloc;
alias SnmpUtilMemFree SNMP_DBG_free;
alias SnmpUtilMemReAlloc SNMP_DBG_realloc;
alias SnmpUtilOidAppend SNMP_oidappend;
alias SnmpUtilOidCmp SNMP_oidcmp;
alias SnmpUtilOidCpy SNMP_oidcpy;
alias SnmpUtilOidFree SNMP_oidfree;
alias SnmpUtilOidNCmp SNMP_oidncmp;
alias SnmpUtilPrintAsnAny SNMP_printany;
alias SnmpUtilVarBindCpy SNMP_CopyVarBind;
alias SnmpUtilVarBindListCpy SNMP_CopyVarBindList;
alias SnmpUtilVarBindFree SNMP_FreeVarBind;
alias SnmpUtilVarBindListFree SNMP_FreeVarBindList;
alias ASN_IPADDRESS ASN_RFC1155_IPADDRESS;
alias ASN_COUNTER32 ASN_RFC1155_COUNTER;
alias ASN_GAUGE32 ASN_RFC1155_GAUGE;
alias ASN_TIMETICKS ASN_RFC1155_TIMETICKS;
alias ASN_OPAQUE ASN_RFC1155_OPAQUE;
alias ASN_OCTETSTRING ASN_RFC1213_DISPSTRING;
alias SNMP_PDU_GET ASN_RFC1157_GETREQUEST;
alias SNMP_PDU_GETNEXT ASN_RFC1157_GETNEXTREQUEST;
alias SNMP_PDU_RESPONSE ASN_RFC1157_GETRESPONSE;
alias SNMP_PDU_SET ASN_RFC1157_SETREQUEST;
alias SNMP_PDU_V1TRAP ASN_RFC1157_TRAP;
alias ASN_CONTEXT ASN_CONTEXTSPECIFIC;
alias ASN_PRIMITIVE ASN_PRIMATIVE;
alias SnmpVarBindList RFC1157VarBindList;
alias SnmpVarBind RFC1157VarBind;
alias AsnInteger32 AsnInteger;
alias AsnCounter32 AsnCounter;
alias AsnGauge32 AsnGauge;
