/vmdns/server/common/nameEntry.c

https://github.com/vmware/lightwave · C · 207 lines · 155 code · 39 blank · 13 comment · 17 complexity · 6c95d42a6d9406dda088f5ea9ad2e5ec MD5 · raw file

  1. /*
  2. * Copyright � 2012-2015 VMware, Inc. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the �License�); you may not
  5. * use this file except in compliance with the License. You may obtain a copy
  6. * of the License at http://www.apache.org/licenses/LICENSE-2.0
  7. *
  8. * Unless required by applicable law or agreed to in writing, software
  9. * distributed under the License is distributed on an �AS IS� BASIS, without
  10. * warranties or conditions of any kind, EITHER EXPRESS OR IMPLIED. See the
  11. * License for the specific language governing permissions and limitations
  12. * under the License.
  13. */
  14. #include "includes.h"
  15. DWORD
  16. VmDnsNameEntryCreate(
  17. PCSTR pszName,
  18. PVMDNS_NAME_ENTRY *ppNameEntry
  19. )
  20. {
  21. DWORD dwError = ERROR_SUCCESS;
  22. PVMDNS_NAME_ENTRY pNameEntry = NULL;
  23. BAIL_ON_VMDNS_INVALID_POINTER(pszName, dwError);
  24. BAIL_ON_VMDNS_INVALID_POINTER(ppNameEntry, dwError);
  25. dwError = VmDnsAllocateMemory(sizeof(VMDNS_NAME_ENTRY), (VOID*)&pNameEntry);
  26. BAIL_ON_VMDNS_ERROR(dwError);
  27. pNameEntry->nRefCount = 1;
  28. pNameEntry->dwRoundRobinIndex = 0;
  29. pNameEntry->dwRoundRobinType = 0;
  30. dwError = VmDnsAllocateStringA(pszName, &pNameEntry->pszName);
  31. BAIL_ON_VMDNS_ERROR(dwError);
  32. dwError = VmDnsRecordListCreate(&pNameEntry->pRecords);
  33. BAIL_ON_VMDNS_ERROR(dwError);
  34. *ppNameEntry = pNameEntry;
  35. cleanup:
  36. return dwError;
  37. error:
  38. VmDnsNameEntryRelease(pNameEntry);
  39. goto cleanup;
  40. }
  41. ULONG
  42. VmDnsNameEntryAddRef(
  43. PVMDNS_NAME_ENTRY pNameEntry
  44. )
  45. {
  46. return InterlockedIncrement(&pNameEntry->nRefCount);
  47. }
  48. VOID
  49. VmDnsNameEntryRelease(
  50. PVMDNS_NAME_ENTRY pNameEntry
  51. )
  52. {
  53. if (pNameEntry && InterlockedDecrement(&pNameEntry->nRefCount) == 0)
  54. {
  55. VmDnsNameEntryDelete(pNameEntry);
  56. }
  57. }
  58. VOID
  59. VmDnsNameEntryDelete(
  60. PVMDNS_NAME_ENTRY pNameEntry
  61. )
  62. {
  63. if (pNameEntry)
  64. {
  65. VmDnsRecordListRelease(pNameEntry->pRecords);
  66. VMDNS_SAFE_FREE_STRINGA(pNameEntry->pszName);
  67. VmDnsFreeMemory(pNameEntry);
  68. }
  69. }
  70. DWORD
  71. VmDnsNameEntryReplaceRecords(
  72. PVMDNS_NAME_ENTRY pNameEntry,
  73. PVMDNS_RECORD_LIST pRecordList
  74. )
  75. {
  76. DWORD dwError = 0;
  77. VmDnsRecordListRelease(pNameEntry->pRecords);
  78. pNameEntry->pRecords = pRecordList;
  79. VmDnsRecordListAddRef(pNameEntry->pRecords);
  80. return dwError;
  81. }
  82. DWORD
  83. VmDnsNameEntryAddRecord(
  84. PVMDNS_NAME_ENTRY pNameEntry,
  85. PVMDNS_RECORD_OBJECT pRecordObject
  86. )
  87. {
  88. DWORD dwError = 0;
  89. dwError = VmDnsRecordListAdd(pNameEntry->pRecords, pRecordObject);
  90. BAIL_ON_VMDNS_ERROR(dwError);
  91. cleanup:
  92. return dwError;
  93. error:
  94. goto cleanup;
  95. }
  96. DWORD
  97. VmDnsNameEntryRemoveRecord(
  98. PVMDNS_NAME_ENTRY pNameEntry,
  99. PVMDNS_RECORD_OBJECT pRecordObject
  100. )
  101. {
  102. DWORD dwError = 0;
  103. dwError = VmDnsRecordListRemove(pNameEntry->pRecords, pRecordObject);
  104. BAIL_ON_VMDNS_ERROR(dwError);
  105. cleanup:
  106. return dwError;
  107. error:
  108. goto cleanup;
  109. }
  110. DWORD
  111. VmDnsNameEntryGetRecords(
  112. PVMDNS_NAME_ENTRY pNameEntry,
  113. VMDNS_RR_TYPE rrType,
  114. PVMDNS_RECORD_LIST *ppRecordList
  115. )
  116. {
  117. DWORD dwError = 0, i = 0, dwListSize = 0;
  118. PVMDNS_RECORD_OBJECT pRecordObj = NULL;
  119. DWORD dwSize = 0;
  120. PVMDNS_RECORD_LIST pRecordList = NULL, pTempRecordList = NULL;
  121. DWORD dwRoundRobinIndex = 0;
  122. BAIL_ON_VMDNS_INVALID_POINTER(pNameEntry, dwError);
  123. BAIL_ON_VMDNS_INVALID_POINTER(ppRecordList, dwError);
  124. if (!pNameEntry->pRecords)
  125. {
  126. dwError = ERROR_NOT_FOUND;
  127. BAIL_ON_VMDNS_ERROR(dwError);
  128. }
  129. dwSize = VmDnsRecordListGetSize(pNameEntry->pRecords);
  130. if (pNameEntry->dwRoundRobinType == rrType)
  131. {
  132. dwRoundRobinIndex = pNameEntry->dwRoundRobinIndex;
  133. }
  134. dwError = VmDnsRecordListCreate(&pTempRecordList);
  135. BAIL_ON_VMDNS_ERROR(dwError);
  136. for (i = 0; i < dwSize; ++i)
  137. {
  138. pRecordObj = VmDnsRecordListGetRecord(pNameEntry->pRecords, i);
  139. if (pRecordObj->pRecord->dwType == rrType || rrType == VMDNS_RR_QTYPE_ANY
  140. || pRecordObj->pRecord->dwType == VMDNS_RR_TYPE_CNAME)
  141. {
  142. dwError = VmDnsRecordListAdd(pTempRecordList, pRecordObj);
  143. BAIL_ON_VMDNS_ERROR(dwError);
  144. }
  145. VmDnsRecordObjectRelease(pRecordObj);
  146. pRecordObj = NULL;
  147. }
  148. dwError = VmDnsRecordListRoundRobin(pTempRecordList, dwRoundRobinIndex, &pRecordList);
  149. BAIL_ON_VMDNS_ERROR(dwError);
  150. dwListSize = VmDnsRecordListGetSize(pRecordList);
  151. if (dwListSize)
  152. {
  153. dwRoundRobinIndex = (dwRoundRobinIndex + 1) % dwListSize;
  154. }
  155. pNameEntry->dwRoundRobinIndex = dwRoundRobinIndex;
  156. if (pNameEntry->dwRoundRobinType != rrType)
  157. {
  158. pNameEntry->dwRoundRobinType = rrType;
  159. }
  160. *ppRecordList = pRecordList;
  161. cleanup:
  162. VmDnsRecordObjectRelease(pRecordObj);
  163. VmDnsRecordListRelease(pTempRecordList);
  164. return dwError;
  165. error:
  166. VmDnsRecordListRelease(pRecordList);
  167. goto cleanup;
  168. }