5.115.11 GetUsnUtdVectorFromCookie

 procedure GetUsnUtdVectorFromCookie(
   [in] replCookie: LDAPString,
   [in/out] nativeRequest: DRS_MSG_GETCHGREQ_V10
   ): ULONG

Informative summary of behavior: The GetUsnUtdVectorFromCookie procedure extracts the USN vector and the UTD vector from an LDAP_SERVER_DIRSYNC_OID control value (replCookie) and sets the USN vector from (nativeRequest.usnvecFrom) and UTD vector destination (nativeRequest.pUpToDateVecDest).

  
 utdVectorSize: ULONG
 minCookieLength: ULONG
 /* minimum possible cookie size in bytes; that is, the size of a cookie
 when a UTD vector is not present in the cookie. */
  
 minCookieLength := 17*4
  
 /* Validate cookie, and extract USN and UTD vectors. */
 If (replCookie.length ≠ 0) then
    If (replCookie.length < minCookieLength) 
       or
       (replCookie.value.signature ≠ "SDSM")
       or
       (replCookie.value.version ≠ 3) 
  
       return protocolError
    endif
  
    utdVectorSize := replCookie.value.utdVectorSize
    if (utdVectorSize < sizeof(UPTODATE_VECTOR_V1_EXT)
        or
        replCookie.length < minCookieLength +
                            utdVectorSize) then
       utdVectorSize := 0
    endif
  
    if (replCookie.value.uuidSourceDsaInvocationId =
                                    DSAObj()!invocationId) then
       nativeRequest.usnvecFrom := replCookie.value.usnVector
    endif
  
    if (utdVectorSize > 0) then
       Copy utdVectorSize bytes from replCookie.value.utdVector
            to nativeRequest.pUpToDateVecDest
  
       /* some more validation */
       if (nativeRequest.pUpToDateVecDest.dwVersion ≠ 1
           or
           16 /* (offsetof(UPTODATE_VECTOR,V1.rgCursors[0]) */
            + (nativeRequest.pUpToDateVecDest.V1.cNumCursors 
               * sizeof(UPTODATE_CURSOR_V1))) ≠ utdVectorSize
           or
           replCookie.length ≠ minCookieLength
                               + utdVectorSize) then
           return protocolError
        endif
    Endif
 endif
  
 return 0 /* success */
Show: