Juan Lang : inetmib1: Use a helper function to get the item from the Oid.

Alexandre Julliard julliard at winehq.org
Wed Jun 25 16:44:39 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Jun 25 09:29:00 2008 -0700

inetmib1: Use a helper function to get the item from the Oid.

---

 dlls/inetmib1/main.c |  100 +++++++++++++++++++++++++++++---------------------
 1 files changed, 58 insertions(+), 42 deletions(-)

diff --git a/dlls/inetmib1/main.c b/dlls/inetmib1/main.c
index 2500fa1..f97a5ee 100644
--- a/dlls/inetmib1/main.c
+++ b/dlls/inetmib1/main.c
@@ -260,6 +260,57 @@ static AsnInteger32 getItemAndIntegerInstanceFromOid(AsnObjectIdentifier *oid,
     return ret;
 }
 
+/* Given an OID and a base OID that it must begin with, finds the item from the
+ * OID.  E.g., given an OID foo.1 and a base OID foo, returns item 1.
+ * If bPduType is not SNMP_PDU_GETNEXT and the item is missing, returns
+ * SNMP_ERRORSTATUS_NOSUCHNAME.
+ * If bPduType is SNMP_PDU_GETNEXT, returns the successor to the item, or item
+ * 1 if the item is missing.
+ */
+static AsnInteger32 getItemFromOid(AsnObjectIdentifier *oid,
+    AsnObjectIdentifier *base, BYTE bPduType, UINT *item)
+{
+    AsnInteger32 ret = SNMP_ERRORSTATUS_NOERROR;
+
+    switch (bPduType)
+    {
+    case SNMP_PDU_GETNEXT:
+        if (SnmpUtilOidNCmp(oid, base, base->idLength) < 0)
+            *item = 1;
+        else if (!SnmpUtilOidNCmp(oid, base, base->idLength))
+        {
+            if (oid->idLength == base->idLength)
+            {
+                /* The item is missing, assume the first item */
+                *item = 1;
+            }
+            else
+                *item = oid->ids[base->idLength] + 1;
+        }
+        else
+            ret = SNMP_ERRORSTATUS_NOSUCHNAME;
+        break;
+    default:
+        if (!SnmpUtilOidNCmp(oid, base, base->idLength))
+        {
+            if (oid->idLength == base->idLength)
+            {
+                /* The item is missing */
+                ret = SNMP_ERRORSTATUS_NOSUCHNAME;
+            }
+            else
+            {
+                *item = oid->ids[base->idLength];
+                if (!*item)
+                    ret = SNMP_ERRORSTATUS_NOSUCHNAME;
+            }
+        }
+        else
+            ret = SNMP_ERRORSTATUS_NOSUCHNAME;
+    }
+    return ret;
+}
+
 static struct structToAsnValue mib2IfEntryMap[] = {
     { FIELD_OFFSET(MIB_IFROW, dwIndex), copyInt },
     { FIELD_OFFSET(MIB_IFROW, dwDescrLen), copyLengthPrecededString },
@@ -401,30 +452,14 @@ static BOOL mib2IpStatsQuery(BYTE bPduType, SnmpVarBind *pVarBind,
     switch (bPduType)
     {
     case SNMP_PDU_GET:
-        if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
-            pVarBind->name.idLength == myOid.idLength + 1)
-        {
-            item = pVarBind->name.ids[pVarBind->name.idLength - 1];
-            *pErrorStatus = mapStructEntryToValue(mib2IpMap,
-                DEFINE_SIZEOF(mib2IpMap), &ipStats, item, bPduType, pVarBind);
-        }
-        else
-            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
-        break;
     case SNMP_PDU_GETNEXT:
-        if (!SnmpUtilOidCmp(&pVarBind->name, &myOid) ||
-            SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) < 0)
-            item = 1;
-        else if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
-            pVarBind->name.idLength == myOid.idLength + 1)
-            item = pVarBind->name.ids[pVarBind->name.idLength - 1] + 1;
-        else
-            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
-        if (item)
+        *pErrorStatus = getItemFromOid(&pVarBind->name, &myOid, bPduType,
+            &item);
+        if (!*pErrorStatus)
         {
             *pErrorStatus = mapStructEntryToValue(mib2IpMap,
                 DEFINE_SIZEOF(mib2IpMap), &ipStats, item, bPduType, pVarBind);
-            if (!*pErrorStatus)
+            if (!*pErrorStatus && bPduType == SNMP_PDU_GETNEXT)
             {
                 AsnObjectIdentifier oid;
 
@@ -434,8 +469,6 @@ static BOOL mib2IpStatsQuery(BYTE bPduType, SnmpVarBind *pVarBind,
                 SnmpUtilOidAppend(&pVarBind->name, &oid);
             }
         }
-        else
-            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
         break;
     case SNMP_PDU_SET:
         *pErrorStatus = SNMP_ERRORSTATUS_READONLY;
@@ -656,27 +689,10 @@ static BOOL mib2IcmpQuery(BYTE bPduType, SnmpVarBind *pVarBind,
     switch (bPduType)
     {
     case SNMP_PDU_GET:
-        if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
-            pVarBind->name.idLength == myOid.idLength + 1)
-        {
-            item = pVarBind->name.ids[pVarBind->name.idLength - 1];
-            *pErrorStatus = mapStructEntryToValue(mib2IcmpMap,
-                DEFINE_SIZEOF(mib2IcmpMap), &icmpStats, item, bPduType,
-                pVarBind);
-        }
-        else
-            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
-        break;
     case SNMP_PDU_GETNEXT:
-        if (!SnmpUtilOidCmp(&pVarBind->name, &myOid) ||
-            SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) < 0)
-            item = 1;
-        else if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
-            pVarBind->name.idLength == myOid.idLength + 1)
-            item = pVarBind->name.ids[pVarBind->name.idLength - 1] + 1;
-        else
-            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
-        if (item)
+        *pErrorStatus = getItemFromOid(&pVarBind->name, &myOid, bPduType,
+            &item);
+        if (!*pErrorStatus)
         {
             *pErrorStatus = mapStructEntryToValue(mib2IcmpMap,
                 DEFINE_SIZEOF(mib2IcmpMap), &icmpStats, item, bPduType,




More information about the wine-cvs mailing list