#endif
#include <rx\rx.h>
#include <rx\rx_null.h>
+#include <rx\rxstat.h>
#include <WINNT/syscfg.h>
#include <WINNT/afsreg.h>
+#include <afs\afscbint.h>
#include "smb.h"
#include "cm_rpc.h"
#include "lanahelper.h"
#include <strsafe.h>
#include "cm_memmap.h"
+#include "msrpc.h"
#ifdef DEBUG
#include <crtdbg.h>
#endif
-extern int RXAFSCB_ExecuteRequest(struct rx_call *z_call);
-extern int RXSTATS_ExecuteRequest(struct rx_call *z_call);
-
extern afs_uint32 cryptall;
extern afs_uint32 cm_anonvldb;
extern int cm_enableServerLocks;
clientchar_t cm_mountRootC[1024];
DWORD cm_mountRootCLen;
+int cm_readonlyVolumeVersioning = 0;
int cm_logChunkSize;
int cm_chunkSize;
HANDLE afsi_file;
-#ifdef AFS_AFSDB_ENV
int cm_dnsEnabled = 1;
-#endif
static int afsi_log_useTimestamp = 1;
saddr.sin_addr.S_un.S_addr = *(unsigned long *)pEntry->h_addr;
}
+ saddr.sin_port = htons(7003);
saddr.sin_family = AF_INET;
dwRank += (rand() & 0x000f);
tsp = cm_FindServer(&saddr, CM_SERVER_VLDB);
if ( tsp ) /* an existing server - ref count increased */
{
- tsp->ipRank = (USHORT)dwRank; /* no need to protect by mutex*/
+ lock_ObtainMutex(&tsp->mx);
+ tsp->ipRank = (USHORT)dwRank;
+ tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
+ lock_ReleaseMutex(&tsp->mx);
/* set preferences for an existing vlserver */
cm_ChangeRankCellVLServer(tsp);
else /* add a new server without a cell */
{
tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
+ lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
+ tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
+ lock_ReleaseMutex(&tsp->mx);
}
}
saddr.sin_addr.S_un.S_addr = *(unsigned long *)pEntry->h_addr;
}
+ saddr.sin_port = htons(7000);
saddr.sin_family = AF_INET;
dwRank += (rand() & 0x000f);
tsp = cm_FindServer(&saddr, CM_SERVER_FILE);
if ( tsp ) /* an existing server - ref count increased */
{
- tsp->ipRank = (USHORT)dwRank; /* no need to protect by mutex*/
+ lock_ObtainMutex(&tsp->mx);
+ tsp->ipRank = (USHORT)dwRank;
+ tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
+ lock_ReleaseMutex(&tsp->mx);
/* find volumes which might have RO copy
/* on server and change the ordering of
else /* add a new server without a cell */
{
tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
+ lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
+ tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
+ lock_ReleaseMutex(&tsp->mx);
}
}
* AFSD Initialization
*/
-int afsd_InitCM(char **reasonP)
+static int
+afsd_InitRoot(char **reasonP)
+{
+ long code;
+ cm_req_t req;
+
+ cm_InitReq(&req);
+
+ if (cm_freelanceEnabled) {
+ cm_FakeRootFid(&cm_data.rootFid);
+ } else {
+ int attempts = 10;
+
+ osi_Log0(afsd_logp, "Loading Root Volume from cell");
+ do {
+ code = cm_FindVolumeByName(cm_data.rootCellp, cm_rootVolumeName, cm_rootUserp,
+ &req, CM_GETVOL_FLAG_CREATE, &cm_data.rootVolumep);
+ afsi_log("cm_FindVolumeByName code %x root vol %x", code,
+ (code ? (cm_volume_t *)-1 : cm_data.rootVolumep));
+ } while (code && --attempts);
+ if (code != 0) {
+ *reasonP = "can't find root volume in root cell";
+ return -1;
+ }
+
+ /* compute the root fid */
+ cm_SetFid(&cm_data.rootFid, cm_data.rootCellp->cellID, cm_GetROVolumeID(cm_data.rootVolumep), 1, 1);
+ }
+
+ code = cm_GetSCache(&cm_data.rootFid, &cm_data.rootSCachep, cm_rootUserp, &req);
+ afsi_log("cm_GetSCache code %x scache %x", code,
+ (code ? (cm_scache_t *)-1 : cm_data.rootSCachep));
+ if (code != 0) {
+ *reasonP = "unknown error";
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+afsd_InitCM(char **reasonP)
{
osi_uid_t debugID;
afs_uint64 cacheBlocks;
long maxcpus;
long ltt, ltto;
long rx_nojumbo;
+ int rx_max_rwin_size;
+ int rx_max_swin_size;
+ int rx_min_peer_timeout;
long virtualCache = 0;
fschar_t rootCellName[256];
struct rx_service *serverp;
init_et_to_sys_error();
+ cm_utilsInit();
+
/* setup osidebug server at RPC slot 1000 */
osi_LongToUID(1000, &debugID);
code = osi_InitDebug(&debugID);
osi_Log0(afsd_logp, "Log init");
+ dummyLen = sizeof(smb_monitorReqs);
+ code = RegQueryValueEx(parmKey, "SMBRequestMonitor", NULL, NULL,
+ (BYTE *) &smb_monitorReqs, &dummyLen);
+ afsi_log("SMB request monitoring is %s", (smb_monitorReqs != 0)? "enabled": "disabled");
+
dummyLen = sizeof(cacheSize);
code = RegQueryValueEx(parmKey, "CacheSize", NULL, NULL,
(BYTE *) &cacheSize, &dummyLen);
(BYTE *) &cm_anonvldb, &dummyLen);
afsi_log("CM ForceAnonVLDB is %s", cm_anonvldb ? "on" : "off");
-#ifdef AFS_AFSDB_ENV
dummyLen = sizeof(cm_dnsEnabled);
code = RegQueryValueEx(parmKey, "UseDNS", NULL, NULL,
(BYTE *) &cm_dnsEnabled, &dummyLen);
cm_dnsEnabled = 1; /* default on */
afsi_log("Default to use DNS to find AFS cell servers");
}
-#else /* AFS_AFSDB_ENV */
- afsi_log("AFS not built with DNS support to find AFS cell servers");
-#endif /* AFS_AFSDB_ENV */
#ifdef AFS_FREELANCE_CLIENT
dummyLen = sizeof(cm_freelanceEnabled);
code = RegQueryValueEx(parmKey, "FreelanceClient", NULL, NULL,
(BYTE *) &cm_freelanceEnabled, &dummyLen);
- if (code == ERROR_SUCCESS) {
- afsi_log("Freelance client feature %s activated",
- cm_freelanceEnabled ? "is" : "is not");
- }
- else {
- cm_freelanceEnabled = 1; /* default on */
- }
+ afsi_log("Freelance client feature %s activated",
+ cm_freelanceEnabled ? "is" : "is not");
+
+ dummyLen = sizeof(cm_freelanceImportCellServDB);
+ code = RegQueryValueEx(parmKey, "FreelanceImportCellServDB", NULL, NULL,
+ (BYTE *) &cm_freelanceImportCellServDB, &dummyLen);
+ afsi_log("Freelance client %s import CellServDB",
+ cm_freelanceImportCellServDB ? "does" : "does not");
#endif /* AFS_FREELANCE_CLIENT */
dummyLen = sizeof(smb_UseUnicode);
afsi_log("Dot files/dirs will %sbe marked hidden",
smb_hideDotFiles ? "" : "not ");
+ dummyLen = sizeof(dwValue);
+ code = RegQueryValueEx(parmKey, "UnixModeFileDefault", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ smb_unixModeDefaultFile = (dwValue & 07777);
+ }
+ afsi_log("Default unix mode bits for files is 0%04o", smb_unixModeDefaultFile);
+
+ dummyLen = sizeof(dwValue);
+ code = RegQueryValueEx(parmKey, "UnixModeDirDefault", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ smb_unixModeDefaultDir = (dwValue & 07777);
+ }
+ afsi_log("Default unix mode bits for directories is 0%04o", smb_unixModeDefaultDir);
+
dummyLen = sizeof(smb_maxMpxRequests);
code = RegQueryValueEx(parmKey, "MaxMpxRequests", NULL, NULL,
(BYTE *) &smb_maxMpxRequests, &dummyLen);
}
afsi_log("SMB authentication type is %s", ((smb_authType == SMB_AUTH_NONE)?"NONE":((smb_authType == SMB_AUTH_EXTENDED)?"EXTENDED":"NTLM")));
+ dummyLen = sizeof(rx_max_rwin_size);
+ code = RegQueryValueEx(parmKey, "RxMaxRecvWinSize", NULL, NULL,
+ (BYTE *) &rx_max_rwin_size, &dummyLen);
+ if (code == ERROR_SUCCESS)
+ rx_SetMaxReceiveWindow(rx_max_rwin_size);
+ afsi_log("Rx Maximum Receive Window Size is %d", rx_GetMaxReceiveWindow());
+
+ dummyLen = sizeof(rx_max_swin_size);
+ code = RegQueryValueEx(parmKey, "RxMaxSendWinSize", NULL, NULL,
+ (BYTE *) &rx_max_swin_size, &dummyLen);
+ if (code == ERROR_SUCCESS)
+ rx_SetMaxSendWindow(rx_max_swin_size);
+ afsi_log("Rx Maximum Send Window Size is %d", rx_GetMaxSendWindow());
+
+ dummyLen = sizeof(rx_min_peer_timeout);
+ code = RegQueryValueEx(parmKey, "RxMinPeerTimeout", NULL, NULL,
+ (BYTE *) &rx_min_peer_timeout, &dummyLen);
+ if (code == ERROR_SUCCESS)
+ rx_SetMinPeerTimeout(rx_min_peer_timeout);
+ afsi_log("Rx Minimum Peer Timeout is %d ms", rx_GetMinPeerTimeout());
+
dummyLen = sizeof(rx_nojumbo);
code = RegQueryValueEx(parmKey, "RxNoJumbo", NULL, NULL,
(BYTE *) &rx_nojumbo, &dummyLen);
if (code == ERROR_SUCCESS) {
cm_OfflineROIsValid = (unsigned short) dwValue;
}
- afsi_log("CM OfflineReadOnlyIsValid is %u", cm_deleteReadOnly);
+ afsi_log("CM OfflineReadOnlyIsValid is %u", cm_OfflineROIsValid);
dummyLen = sizeof(DWORD);
code = RegQueryValueEx(parmKey, "GiveUpAllCallBacks", NULL, NULL,
}
afsi_log("CM FollowBackupPath is %u", cm_followBackupPath);
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "PerFileAccessCheck", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_accessPerFileCheck = (int) dwValue;
+ }
+ afsi_log("CM PerFileAccessCheck is %d", cm_accessPerFileCheck);
+
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "ReadOnlyVolumeVersioning", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_readonlyVolumeVersioning = (unsigned short) dwValue;
+ }
+ afsi_log("CM ReadOnlyVolumeVersioning is %u", cm_readonlyVolumeVersioning);
+
RegCloseKey (parmKey);
cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize;
return -1;
}
-#ifdef AFS_AFSDB_ENV
#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
if (cm_InitDNS(cm_dnsEnabled) == -1)
cm_dnsEnabled = 0; /* init failed, so deactivate */
afsi_log("cm_InitDNS %d", cm_dnsEnabled);
#endif
-#endif
/* Set RX parameters before initializing RX */
if ( rx_nojumbo ) {
/* Initialize the RPC server for session keys */
RpcInit();
+ /* Initialize the RPC server for pipe services */
+ MSRPC_Init();
+
afsd_InitServerPreferences();
- return 0;
+
+ code = afsd_InitRoot(reasonP);
+
+ return code;
}
int afsd_ShutdownCM(void)
{
+ MSRPC_Shutdown();
+
cm_ReleaseSCache(cm_data.rootSCachep);
+ cm_utilsCleanup();
+
cm_shutdown = 1;
return 0;
int afsd_InitDaemons(char **reasonP)
{
- long code;
- cm_req_t req;
-
- cm_InitReq(&req);
-
- /* this should really be in an init daemon from here on down */
-
- if (!cm_freelanceEnabled) {
- int attempts = 10;
-
- osi_Log0(afsd_logp, "Loading Root Volume from cell");
- do {
- code = cm_FindVolumeByName(cm_data.rootCellp, cm_rootVolumeName, cm_rootUserp,
- &req, CM_GETVOL_FLAG_CREATE, &cm_data.rootVolumep);
- afsi_log("cm_FindVolumeByName code %x root vol %x", code,
- (code ? (cm_volume_t *)-1 : cm_data.rootVolumep));
- } while (code && --attempts);
- if (code != 0) {
- *reasonP = "can't find root volume in root cell";
- return -1;
- }
- }
-
- /* compute the root fid */
- if (!cm_freelanceEnabled) {
- cm_SetFid(&cm_data.rootFid, cm_data.rootCellp->cellID, cm_GetROVolumeID(cm_data.rootVolumep), 1, 1);
- }
- else
- cm_FakeRootFid(&cm_data.rootFid);
-
- code = cm_GetSCache(&cm_data.rootFid, &cm_data.rootSCachep, cm_rootUserp, &req);
- afsi_log("cm_GetSCache code %x scache %x", code,
- (code ? (cm_scache_t *)-1 : cm_data.rootSCachep));
- if (code != 0) {
- *reasonP = "unknown error";
- return -1;
- }
-
cm_InitDaemon(numBkgD);
afsi_log("cm_InitDaemon complete");
static HANDLE
OpenDumpFile(void)
{
+ char tmp[256];
char wd[256];
+ SYSTEMTIME st;
DWORD code;
- code = GetEnvironmentVariable("TEMP", wd, sizeof(wd));
- if ( code == 0 || code > sizeof(wd) )
+ code = GetEnvironmentVariable("TEMP", tmp, sizeof(tmp));
+ if ( code == 0 || code > sizeof(tmp) )
{
- if (!GetWindowsDirectory(wd, sizeof(wd)))
+ if (!GetWindowsDirectory(tmp, sizeof(tmp)))
return NULL;
}
- StringCbCatA(wd, sizeof(wd), "\\afsd.dmp");
+ GetLocalTime(&st);
+ StringCbPrintfA(wd, sizeof(wd),
+ "%s\\afsd-%04d-%02d-%02d-%02d_%02d_%02d.dmp", tmp,
+ st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return CreateFile( wd, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
}