void CellEdit_OnApply (HWND hDlg) { TCHAR szCell[ cchCELLDBLINE ]; GetDlgItemText (hDlg, IDC_CELL, szCell, cchCELLDBLINE); TCHAR szComment[ cchCELLDBLINE ]; GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE); TCHAR szLinkedCell[ cchCELLDBLINE ] = TEXT(""); // Find out if there's already an entry in CellServDB for this cell // PCELLDBLINE pCellLine; if ((pCellLine = CSDB_FindCell (&g.Configuration.CellServDB, szCell)) != NULL) { CELLDBLINEINFO Info; if (CSDB_CrackLine (&Info, pCellLine->szLine)) lstrcpy (szLinkedCell, Info.szLinkedCell); } // Replace our cell's entry in CellServDB, or add one if necessary. // if ((pCellLine = CSDB_AddCell (&g.Configuration.CellServDB, szCell, szLinkedCell, szComment)) != NULL) { // Remove the old servers from this cell // CSDB_RemoveCellServers (&g.Configuration.CellServDB, pCellLine); // Add the servers from our list to the CellServDB // PCELLDBLINE pAppendTo = pCellLine; HWND hList = GetDlgItem (hDlg, IDC_LIST); for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem)) { PCELLDBLINE pFromList = (PCELLDBLINE)FastList_GetItemParam (hList, hItem); pAppendTo = CSDB_AddLine (&g.Configuration.CellServDB, pAppendTo, pFromList->szLine); } } }
/* * 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; }