/*++ Copyright (c) 1996 Microsoft Corporation Module Name: tgroup.c Abstract: Test for cluster network API Author: John Vert (jvert) 15-Mar-1996 Charlie Wickham (charlwi) 6-Jun-1997 Revision History: --*/ #include "windows.h" #include "cluster.h" #include "stdio.h" #include "stdlib.h" int _cdecl main (argc, argv) int argc; char *argv[]; { HCLUSTER Cluster; HNETWORK Network; HNODE Node; HCLUSENUM ResEnum; DWORD ClusterCountBefore, ClusterCountAfter; HNETWORKENUM hNetworkEnum; DWORD NetCountBefore, NetCountAfter; HNODEENUM hNodeEnum; DWORD NodeCountBefore, NodeCountAfter; DWORD i,j; DWORD Status; WCHAR NameBuf[50]; DWORD NameLen; DWORD Type; CLUSTER_NETWORK_STATE NetworkState; CLUSTER_NODE_STATE NodeState; DWORD Count; Cluster = OpenCluster(NULL); if (Cluster == NULL) { fprintf(stderr, "OpenCluster(NULL) failed %d\n",GetLastError()); return(0); } // // Dump nodes // printf("\n\nENUMERATING NODES\n"); ResEnum = ClusterOpenEnum(Cluster, CLUSTER_ENUM_NODE); if (ResEnum == NULL) { fprintf(stderr, "ClusterOpenEnum failed %d\n",GetLastError()); return(0); } ClusterCountBefore = ClusterGetEnumCount(ResEnum); for(i=0; ; i++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterEnum(ResEnum, i, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "ClusterEnum %d returned error %d\n",i,Status); return(0); } if (Type != CLUSTER_ENUM_NODE) { printf("Invalid Type %d returned from ClusterEnum\n", Type); return(0); } fprintf(stderr, "\nOpening Node: %ws\n", NameBuf); Node = OpenClusterNode(Cluster, NameBuf); if (Node == NULL) { fprintf(stderr, "OpenClusterNode %ws failed %d\n",NameBuf, GetLastError()); return(0); } NodeState = GetClusterNodeState(Node); if (NodeState == -1) { Status = GetLastError(); if ( Status != ERROR_SUCCESS ) fprintf(stderr, "GetClusterNodeState failed %d\n", Status); } if (NodeState == ClusterNodeUp) { printf("Node %ws is UP\n", NameBuf); } else if (NodeState == ClusterNodeDown) { printf("Node %ws is DOWN\n", NameBuf ); } NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = GetClusterNodeId( Node, NameBuf, &NameLen ); if (Status == ERROR_SUCCESS) { fprintf(stderr, "Node ID: %ws\n", NameBuf ); } else { Status = GetLastError(); fprintf(stderr, "GetClusterNodeId failed %d\n", Status); } hNodeEnum = ClusterNodeOpenEnum(Node, CLUSTER_NODE_ENUM_NETINTERFACES); if (hNodeEnum == NULL) { fprintf(stderr, "Node %ws failed to open enum %d\n",NameBuf, GetLastError()); } else { NodeCountBefore = ClusterNodeGetEnumCount(hNodeEnum); for (j=0; ; j++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterNodeEnum(hNodeEnum, j, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "Failed to enum node item %d, error %d\n",j,Status); } if (Type != CLUSTER_NODE_ENUM_NETINTERFACES) { printf("Invalid Type %d returned from ClusterNodeEnum\n", Type); return(0); } printf("\tInterface %ws\n",NameBuf); } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nNode count: %d\n", j); NodeCountAfter = ClusterNodeGetEnumCount(hNodeEnum); if (NodeCountBefore != NodeCountAfter) fprintf(stderr, "\nReported node count was %d before enumeration, and %d afterward\n", NodeCountBefore, NodeCountAfter); else if (j != NodeCountBefore) fprintf(stderr, "\nReported node count: %d\n", NodeCountBefore); } ClusterNodeCloseEnum(hNodeEnum); } CloseClusterNode(Node); } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nCluster count: %d\n", i); ClusterCountAfter = ClusterGetEnumCount(ResEnum); if (ClusterCountBefore != ClusterCountAfter) fprintf(stderr, "\nReported cluster count was %d before enumeration, and %d afterward\n", ClusterCountBefore, ClusterCountAfter); else if (i != ClusterCountBefore) fprintf(stderr, "\nReported cluster count: %d\n", ClusterCountBefore); } ClusterCloseEnum(ResEnum); // // Dump networks // printf("\n\nENUMERATING NETWORKS\n"); ResEnum = ClusterOpenEnum(Cluster, CLUSTER_ENUM_NETWORK); if (ResEnum == NULL) { fprintf(stderr, "ClusterOpenEnum failed %d\n",GetLastError()); return(0); } ClusterCountBefore = ClusterGetEnumCount(ResEnum); for(i=0; ; i++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterEnum(ResEnum, i, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "ClusterEnum %d returned error %d\n",i,Status); return(0); } if (Type != CLUSTER_ENUM_NETWORK) { printf("Invalid Type %d returned from ClusterEnum\n", Type); return(0); } fprintf(stderr, "\nOpening Network: %ws\n", NameBuf); Network = OpenClusterNetwork(Cluster, NameBuf); if (Network == NULL) { fprintf(stderr, "OpenClusterNetwork %ws failed %d\n",NameBuf, GetLastError()); return(0); } NetworkState = GetClusterNetworkState(Network); if (NetworkState == -1) { Status = GetLastError(); if ( Status != ERROR_SUCCESS ) fprintf(stderr, "GetClusterNetworkState failed %d\n", Status); } if (NetworkState == ClusterNetworkUp) { printf("Network %ws is UP\n", NameBuf); } else if (NetworkState == ClusterNetworkPartitioned) { printf("Network %ws is PARTITIONED\n", NameBuf ); } else if (NetworkState == ClusterNetworkDown) { printf("Network %ws is DOWN\n", NameBuf ); } else if (NetworkState == ClusterNetworkStateUnknown) { printf("Network %ws is UNKNOWN\n", NameBuf ); } else if (NetworkState == ClusterNetworkUnavailable) { printf("Network %ws is UNAVAILABLE\n", NameBuf ); } NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = GetClusterNetworkId( Network, NameBuf, &NameLen ); if (Status == ERROR_SUCCESS) { fprintf(stderr, "Network ID: %ws\n", NameBuf ); } else { Status = GetLastError(); fprintf(stderr, "GetClusterNetworkId failed %d\n", Status); } hNetworkEnum = ClusterNetworkOpenEnum(Network, CLUSTER_NETWORK_ENUM_NETINTERFACES); if (hNetworkEnum == NULL) { fprintf(stderr, "Network %ws failed to open enum %d\n",NameBuf, GetLastError()); } else { NetCountBefore = ClusterNetworkGetEnumCount(hNetworkEnum); for (j=0; ; j++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterNetworkEnum(hNetworkEnum, j, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "Failed to enum network item %d, error %d\n",j,Status); } if (Type != CLUSTER_NETWORK_ENUM_NETINTERFACES) { printf("Invalid Type %d returned from ClusterNetworkEnum\n", Type); return(0); } printf("\tInterface %ws\n",NameBuf); } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nNetwork count: %d\n", j); NetCountAfter = ClusterNetworkGetEnumCount(hNetworkEnum); if (NetCountBefore != NetCountAfter) fprintf(stderr, "\nReported network count was %d before enumeration, and %d afterward\n", NetCountBefore, NetCountAfter); else if (j != NetCountBefore) fprintf(stderr, "\nReported network count: %d\n", NetCountBefore); } ClusterNetworkCloseEnum(hNetworkEnum); } CloseClusterNetwork(Network); } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nCluster count: %d\n", i); ClusterCountAfter = ClusterGetEnumCount(ResEnum); if (ClusterCountBefore != ClusterCountAfter) fprintf(stderr, "\nReported cluster count was %d before enumeration, and %d afterward\n", ClusterCountBefore, ClusterCountAfter); else if (i != ClusterCountBefore) fprintf(stderr, "\nReported cluster count: %d\n", ClusterCountBefore); } ClusterCloseEnum(ResEnum); printf("\n\nCURRENT INTERNAL NETWORK PRIORITY ORDER\n"); ResEnum = ClusterOpenEnum(Cluster, CLUSTER_ENUM_INTERNAL_NETWORK); if (ResEnum == NULL) { fprintf(stderr, "ClusterOpenEnum failed %d\n",GetLastError()); return(0); } ClusterCountBefore = ClusterGetEnumCount(ResEnum); for(i=0, Count=0; ; i++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterEnum(ResEnum, i, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "ClusterEnum %d returned error %d\n",i,Status); return(0); } printf("%ws\n", NameBuf); Count++; } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nCluster count: %d\n", i); ClusterCountAfter = ClusterGetEnumCount(ResEnum); if (ClusterCountBefore != ClusterCountAfter) fprintf(stderr, "\nReported cluster count was %d before enumeration, and %d afterward\n", ClusterCountBefore, ClusterCountAfter); else if (i != ClusterCountBefore) fprintf(stderr, "\nReported cluster count: %d\n", ClusterCountBefore); } ClusterCloseEnum(ResEnum); if (Count != 0) { DWORD newIndex; HNETWORK * NetworkList = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT, sizeof(HNETWORK) * Count ); if (NetworkList == NULL) { fprintf(stderr, "Out of memory\n"); return(0); } ResEnum = ClusterOpenEnum(Cluster, CLUSTER_ENUM_INTERNAL_NETWORK); if (ResEnum == NULL) { fprintf(stderr, "ClusterOpenEnum failed %d\n",GetLastError()); return(0); } ClusterCountBefore = ClusterGetEnumCount(ResEnum); for(i=0; ; i++) { NameLen = sizeof(NameBuf)/sizeof(WCHAR); Status = ClusterEnum(ResEnum, i, &Type, NameBuf, &NameLen); if (Status == ERROR_NO_MORE_ITEMS) { break; } else if (Status != ERROR_SUCCESS) { fprintf(stderr, "ClusterEnum %d returned error %d\n",i,Status); return(0); } if (i == Count) { fprintf(stderr, "Another network was added after we counted.\n"); return(0); } newIndex = (i+1) % Count; NetworkList[newIndex] = OpenClusterNetwork(Cluster, NameBuf); if (NetworkList[newIndex] == NULL) { fprintf(stderr, "OpenClusterNetwork %ws failed %d\n",NameBuf, GetLastError()); return(0); } } if (Status == ERROR_NO_MORE_ITEMS) { printf("\nCluster count: %d\n", i); ClusterCountAfter = ClusterGetEnumCount(ResEnum); if (ClusterCountBefore != ClusterCountAfter) fprintf(stderr, "\nReported cluster count was %d before enumeration, and %d afterward\n", ClusterCountBefore, ClusterCountAfter); else if (i != ClusterCountBefore) fprintf(stderr, "\nReported cluster count: %d\n", ClusterCountBefore); } ClusterCloseEnum(ResEnum); Status = SetClusterNetworkPriorityOrder( Cluster, Count, NetworkList ); if (Status != ERROR_SUCCESS) { fprintf(stderr, "SetClusterNetworkPriorityOrder failed %d\n", Status); return(0); } for (i=0; i