Juan Lang : inetmib1: Support querying the MIB2 number of interfaces.

Alexandre Julliard julliard at winehq.org
Wed Jun 25 04:47:33 CDT 2008


Module: wine
Branch: master
Commit: f913252ea2d94bc9cf732b716419b126a8361f27
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f913252ea2d94bc9cf732b716419b126a8361f27

Author: Juan Lang <juan.lang at 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),




More information about the wine-cvs mailing list