/* * cfg_ClientSetCell() -- Define default client cell for host. * * The cellDbHosts argument is a multistring containing the names of * the existing database servers already configured in the cell; this * multistring list can be obtained via cfg_CellServDbEnumerate(). * If configuring the first server in a new cell then the cellDbHosts * list contains only the name of that host. * * Warning: client (cache-manager) should be stopped prior to setting cell. */ int ADMINAPI cfg_ClientSetCell(void *hostHandle, /* host config handle */ const char *cellName, /* cell name */ const char *cellDbHosts, /* cell database hosts */ afs_status_p st) { /* completion status */ int rc = 1; afs_status_t tst2, tst = 0; cfg_host_p cfg_host = (cfg_host_p) hostHandle; /* validate parameters */ if (!cfgutil_HostHandleValidate(cfg_host, &tst2)) { tst = tst2; } else if (cellName == NULL || *cellName == '\0') { tst = ADMCFGCELLNAMENULL; } else if (strlen(cellName) > (MAXCELLCHARS - 1)) { tst = ADMCFGCELLNAMETOOLONG; } else if (!cfgutil_HostHandleCellNameCompatible(cfg_host, cellName)) { tst = ADMCFGCELLNAMECONFLICT; } else if (cellDbHosts == NULL || *cellDbHosts == '\0') { tst = ADMCFGCELLDBHOSTSNULL; } /* remote configuration not yet supported in this function */ if (tst == 0) { if (!cfg_host->is_local) { tst = ADMCFGNOTSUPPORTED; } } /* define cell database hosts */ #ifdef AFS_NT40_ENV if (tst == 0) { CELLSERVDB clientDb; if (!CSDB_ReadFile(&clientDb, AFSDIR_CLIENT_CELLSERVDB_FILEPATH)) { tst = ADMCFGCLIENTCELLSERVDBNOTREAD; } else { CELLDBLINE *cellLinep = CSDB_FindCell(&clientDb, cellName); if (cellLinep != NULL) { /* cell entry exists; remove host entries */ if (!CSDB_RemoveCellServers(&clientDb, cellLinep)) { /* should never happen */ tst = ADMCFGCLIENTCELLSERVDBEDITFAILED; } } else { /* cell entry does not exist; add it */ cellLinep = CSDB_AddCell(&clientDb, cellName, NULL, NULL); if (cellLinep == NULL) { tst = ADMNOMEM; } } if (tst == 0) { /* add new host entries to cell */ const char *dbHost = cellDbHosts; int dbHostCount = 0; while (*dbHost != '\0' && tst == 0) { size_t dbHostLen = strlen(dbHost); const char *dbHostAddrStr; if (dbHostLen > (MAXHOSTCHARS - 1)) { tst = ADMCFGHOSTNAMETOOLONG; } else if (dbHostCount >= MAXHOSTSPERCELL) { tst = ADMCFGCELLDBHOSTCOUNTTOOLARGE; } else if (!cfgutil_HostNameGetAddressString (dbHost, &dbHostAddrStr, &tst2)) { tst = tst2; } else if (CSDB_AddCellServer (&clientDb, cellLinep, dbHostAddrStr, dbHost) == NULL) { tst = ADMNOMEM; } else { dbHostCount++; dbHost += dbHostLen + 1; } } if (tst == 0) { /* edit successful; write CellServDB */ if (!CSDB_WriteFile(&clientDb)) { tst = ADMCFGCLIENTCELLSERVDBNOTWRITTEN; } } } CSDB_FreeFile(&clientDb); } } #else if (tst == 0) { /* function not yet implemented for Unix */ tst = ADMCFGNOTSUPPORTED; } #endif /* AFS_NT40_ENV */ /* define default client cell */ #ifdef AFS_NT40_ENV if (tst == 0) { if (afssw_SetClientCellName(cellName)) { /* failed to set cell name in registry (ThisCell equivalent) */ if (errno == EACCES) { tst = ADMNOPRIV; } else { tst = ADMCFGCLIENTTHISCELLNOTWRITTEN; } } } #else if (tst == 0) { /* function not yet implemented for Unix */ tst = ADMCFGNOTSUPPORTED; } #endif /* AFS_NT40_ENV */ /* help any underlying packages adjust to cell change */ if (tst == 0) { int rc; if ((rc = ka_CellConfig(AFSDIR_CLIENT_ETC_DIRPATH)) != 0) { tst = rc; } } if (tst != 0) { rc = 0; } if (st != NULL) { *st = tst; } return rc; }
/* * cfg_HostSetCell() -- Define server cell membership for host. * * The cellDbHosts argument is a multistring containing the names of * the existing database servers already configured in the cell; this * multistring list can be obtained via cfg_CellServDbEnumerate(). * If configuring the first server in a new cell then the cellDbHosts * list contains only the name of that host. * * Note: The names in cellDbHosts MUST exactly match those in the * cell-wide server CellServDB; using cfg_CellServDbEnumerate() * is highly recommended. */ int ADMINAPI cfg_HostSetCell(void *hostHandle, /* host config handle */ const char *cellName, /* cell name */ const char *cellDbHosts, /* cell database hosts */ afs_status_p st) { /* completion status */ int rc = 1; afs_status_t tst2, tst = 0; cfg_host_p cfg_host = (cfg_host_p) hostHandle; /* validate parameters */ if (!cfgutil_HostHandleValidate(cfg_host, &tst2)) { tst = tst2; } else if (cellName == NULL || *cellName == '\0') { tst = ADMCFGCELLNAMENULL; } else if (strlen(cellName) > (MAXCELLCHARS - 1)) { tst = ADMCFGCELLNAMETOOLONG; } else if (!cfgutil_HostHandleCellNameCompatible(cfg_host, cellName)) { tst = ADMCFGCELLNAMECONFLICT; } else if (cellDbHosts == NULL || *cellDbHosts == '\0') { tst = ADMCFGCELLDBHOSTSNULL; } /* remote configuration not yet supported in this function */ if (tst == 0) { if (!cfg_host->is_local) { tst = ADMCFGNOTSUPPORTED; } } /* define server cell and cell database hosts */ if (tst == 0) { const char *dbHost = cellDbHosts; struct afsconf_cell hostCell; memset(&hostCell, 0, sizeof(hostCell)); strcpy(hostCell.name, cellName); hostCell.numServers = 0; while (*dbHost != '\0' && tst == 0) { /* fill in each database host */ size_t dbHostLen = strlen(dbHost); if (dbHostLen > (MAXHOSTCHARS - 1)) { tst = ADMCFGHOSTNAMETOOLONG; } else if (hostCell.numServers >= MAXHOSTSPERCELL) { tst = ADMCFGCELLDBHOSTCOUNTTOOLARGE; } else { strcpy(hostCell.hostName[hostCell.numServers++], dbHost); dbHost += dbHostLen + 1; } } if (tst == 0) { /* create server ThisCell/CellServDB dir if it does not exist */ #ifdef AFS_NT40_ENV (void)mkdir(AFSDIR_USR_DIRPATH); (void)mkdir(AFSDIR_SERVER_AFS_DIRPATH); (void)mkdir(AFSDIR_SERVER_ETC_DIRPATH); #else (void)mkdir(AFSDIR_USR_DIRPATH, 0755); (void)mkdir(AFSDIR_SERVER_AFS_DIRPATH, 0755); (void)mkdir(AFSDIR_SERVER_ETC_DIRPATH, 0755); #endif if (afsconf_SetCellInfo (NULL, AFSDIR_SERVER_ETC_DIRPATH, &hostCell)) { /* failed; most likely cause is bad host name */ tst = ADMCFGSERVERSETCELLFAILED; } } } if (tst != 0) { rc = 0; } if (st != NULL) { *st = tst; } return rc; }