Module: wine Branch: master Commit: f913252ea2d94bc9cf732b716419b126a8361f27 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f913252ea2d94bc9cf732b7164...
Author: Juan Lang juan.lang@gmail.com Date: Tue May 20 20:53:17 2008 -0700
inetmib1: Support querying the MIB2 number of interfaces.
---
dlls/inetmib1/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++- dlls/inetmib1/tests/main.c | 2 - 2 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/dlls/inetmib1/main.c b/dlls/inetmib1/main.c index 5e87b8c..be2d3b9 100644 --- a/dlls/inetmib1/main.c +++ b/dlls/inetmib1/main.c @@ -48,6 +48,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; }
+/** + * Utility functions + */ +static void copyInt(AsnAny *value, void *src) +{ + value->asnType = ASN_INTEGER; + value->asnValue.number = *(DWORD *)src; +} + static UINT mib2[] = { 1,3,6,1,2,1 }; static UINT mib2System[] = { 1,3,6,1,2,1,1 };
@@ -76,9 +85,51 @@ static void mib2IfNumberInit(void) } }
+static BOOL mib2IfNumberQuery(BYTE bPduType, SnmpVarBind *pVarBind, + AsnInteger32 *pErrorStatus) +{ + AsnObjectIdentifier numberOid = DEFINE_OID(mib2IfNumber); + + TRACE("(0x%02x, %s, %p)\n", bPduType, SnmpUtilOidToA(&pVarBind->name), + pErrorStatus); + + switch (bPduType) + { + case SNMP_PDU_GET: + case SNMP_PDU_GETNEXT: + if ((bPduType == SNMP_PDU_GET && + !SnmpUtilOidNCmp(&pVarBind->name, &numberOid, numberOid.idLength)) + || SnmpUtilOidNCmp(&pVarBind->name, &numberOid, numberOid.idLength) + < 0) + { + DWORD numIfs = ifTable ? ifTable->dwNumEntries : 0; + + copyInt(&pVarBind->value, &numIfs); + if (bPduType == SNMP_PDU_GETNEXT) + SnmpUtilOidCpy(&pVarBind->name, &numberOid); + *pErrorStatus = SNMP_ERRORSTATUS_NOERROR; + } + else + { + *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME; + /* Caller deals with OID if bPduType == SNMP_PDU_GETNEXT, so don't + * need to set it here. + */ + } + break; + case SNMP_PDU_SET: + *pErrorStatus = SNMP_ERRORSTATUS_READONLY; + break; + default: + FIXME("0x%02x: unsupported PDU type\n", bPduType); + *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME; + } + return TRUE; +} + /* This list MUST BE lexicographically sorted */ static struct mibImplementation supportedIDs[] = { - { DEFINE_OID(mib2IfNumber), mib2IfNumberInit }, + { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery }, }; static UINT minSupportedIDLength;
diff --git a/dlls/inetmib1/tests/main.c b/dlls/inetmib1/tests/main.c index 6e4627e..71bf141 100644 --- a/dlls/inetmib1/tests/main.c +++ b/dlls/inetmib1/tests/main.c @@ -132,11 +132,9 @@ static void testQuery(void) moreData = TRUE; ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index); ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError()); - todo_wine { ok(error == SNMP_ERRORSTATUS_NOERROR, "expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error); ok(index == 0, "expected index 0, got %d\n", index); - } vars[0].name.idLength = sizeof(mib2If) / sizeof(mib2If[0]); vars[0].name.ids = mib2If; ok(!SnmpUtilOidNCmp(&vars2[0].name, &vars[0].name, vars[0].name.idLength),