/* * cfg_CellServDbEnumerate() -- Enumerate database machines known to the * specified database or fileserver machine. Enumeration is returned * as a multistring. */ int ADMINAPI cfg_CellServDbEnumerate(const char *fsDbHost, /* fileserver or database host */ char **cellName, /* cell name for cellDbHosts */ char **cellDbHosts, /* cell database hosts */ afs_status_p st) { /* completion status */ int rc = 1; afs_status_t tst2, tst = 0; /* validate parameters */ if (fsDbHost == NULL || *fsDbHost == '\0') { tst = ADMCFGHOSTNAMENULL; } else if (cellName == NULL) { tst = ADMCFGCELLNAMENULL; } else if (cellDbHosts == NULL) { tst = ADMCFGCELLDBHOSTSNULL; } /* enumerate server CellServDB on specified host, along with cell name */ if (tst == 0) { void *cellHandle; void *bosHandle; char dbhostName[MAXHOSTSPERCELL][BOS_MAX_NAME_LEN]; char dbhostCell[BOS_MAX_NAME_LEN]; int dbhostCount = 0; if (!afsclient_NullCellOpen(&cellHandle, &tst2)) { tst = tst2; } else { if (!bos_ServerOpen(cellHandle, fsDbHost, &bosHandle, &tst2)) { tst = tst2; } else { void *dbIter; if (!bos_HostGetBegin(bosHandle, &dbIter, &tst2)) { tst = tst2; } else { for (dbhostCount = 0;; dbhostCount++) { char dbhostNameTemp[BOS_MAX_NAME_LEN]; if (!bos_HostGetNext(dbIter, dbhostNameTemp, &tst2)) { /* no more entries (or failure) */ if (tst2 != ADMITERATORDONE) { tst = tst2; } break; } else if (dbhostCount >= MAXHOSTSPERCELL) { /* more entries than expected */ tst = ADMCFGCELLSERVDBTOOMANYENTRIES; break; } else { strcpy(dbhostName[dbhostCount], dbhostNameTemp); } } if (!bos_HostGetDone(dbIter, &tst2)) { tst = tst2; } if (tst == 0) { /* got database servers; now get cell name */ if (!bos_CellGet(bosHandle, dbhostCell, &tst2)) { tst = tst2; } } } if (!bos_ServerClose(bosHandle, &tst2)) { tst = tst2; } } if (!afsclient_CellClose(cellHandle, &tst2)) { tst = tst2; } } if (tst == 0) { /* return database hosts to caller */ int i; size_t bufSize = 0; for (i = 0; i < dbhostCount; i++) { bufSize += strlen(dbhostName[i]) + 1; } bufSize++; /* end multistring */ *cellDbHosts = (char *)malloc(bufSize); if (*cellDbHosts == NULL) { tst = ADMNOMEM; } else { char *bufp = *cellDbHosts; for (i = 0; i < dbhostCount; i++) { strcpy(bufp, dbhostName[i]); bufp += strlen(bufp) + 1; } *bufp = '\0'; } /* return cell name to caller */ if (tst == 0) { *cellName = (char *)malloc(strlen(dbhostCell) + 1); if (*cellName == NULL) { free(*cellDbHosts); *cellDbHosts = NULL; tst = ADMNOMEM; } else { strcpy(*cellName, dbhostCell); } } } } if (tst != 0) { /* indicate failure */ rc = 0; } if (st != NULL) { *st = tst; } return rc; }
/* * cfgutil_HostNameGetCellServDbAlias() -- Get alias for given host name * as listed in the server CellServDB on the specified host. If no * alias is found then hostNameAlias is set to the empty string. * * Note: hostNameAlias is presumed to be a buffer of size MAXHOSTCHARS. * * RETURN CODES: 1 success, 0 failure */ int cfgutil_HostNameGetCellServDbAlias(const char *fsDbHost, const char *hostName, char *hostNameAlias, afs_status_p st) { int rc = 1; afs_status_t tst2, tst = 0; void *cellHandle; void *bosHandle; if (!afsclient_NullCellOpen(&cellHandle, &tst2)) { tst = tst2; } else { if (!bos_ServerOpen(cellHandle, fsDbHost, &bosHandle, &tst2)) { tst = tst2; } else { void *dbIter; if (!bos_HostGetBegin(bosHandle, &dbIter, &tst2)) { tst = tst2; } else { short dbhostDone = 0; short dbhostFound = 0; while (!dbhostDone) { short isAlias; if (!bos_HostGetNext(dbIter, hostNameAlias, &tst2)) { /* no more entries (or failure) */ if (tst2 != ADMITERATORDONE) { tst = tst2; } dbhostDone = 1; } else if (!cfgutil_HostNameIsAlias (hostName, hostNameAlias, &isAlias, &tst2)) { tst = tst2; dbhostDone = 1; } else if (isAlias) { dbhostFound = 1; dbhostDone = 1; } } if (!dbhostFound) { *hostNameAlias = '\0'; } if (!bos_HostGetDone(dbIter, &tst2)) { tst = tst2; } } if (!bos_ServerClose(bosHandle, &tst2)) { tst = tst2; } } if (!afsclient_CellClose(cellHandle, &tst2)) { tst = tst2; } } if (tst != 0) { /* indicate failure */ rc = 0; } if (st != NULL) { *st = tst; } return rc; }