#endif /* AFS_FREELANCE_CLIENT */
extern int cm_dnsEnabled;
-extern int cm_freelanceEnabled;
extern int cm_readonlyVolumeVersioning;
extern long rx_mtu;
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);
return (foundCell) ? 0 : -11;
}
+long
+cm_EnumerateCellFile(afs_uint32 client, cm_enumCellProc_t *procp, void *rockp)
+{
+ char wdir[MAX_PATH]="";
+ FILE *tfilep = NULL;
+ char *tp;
+ char lineBuffer[257];
+
+ if (!procp)
+ return 0;
+
+ cm_GetCellServDB(wdir, sizeof(wdir));
+ if (*wdir)
+ tfilep = fopen(wdir, "r");
+
+ if (!tfilep)
+ return -2;
+
+#ifdef CELLSERV_DEBUG
+ osi_Log2(afsd_logp,"cm_enumfile fopen handle[%p], wdir[%s]", tfilep,
+ osi_LogSaveString(afsd_logp,wdir));
+#endif
+ while (1) {
+ tp = fgets(lineBuffer, sizeof(lineBuffer), tfilep);
+ if (tp == NULL && feof(tfilep)) {
+ /* hit EOF */
+ fclose(tfilep);
+ return (0);
+ }
+
+ /* turn trailing cr or lf into null */
+ tp = strrchr(lineBuffer, '\r');
+ if (tp) *tp = 0;
+ tp = strrchr(lineBuffer, '\n');
+ if (tp) *tp = 0;
+
+ /* skip blank lines */
+ if (lineBuffer[0] == 0)
+ continue;
+
+ /*
+ * The format is:
+ * >[cell] [linked-cell] #[Description]
+ * where linked-cell and Description are optional
+ * but we are only going to use the initial cell name
+ */
+ if (lineBuffer[0] == '>') {
+ /*
+ * terminate the cellname at the first white space
+ * leaving 'tp' pointing to the next string if any
+ */
+ for (tp = &lineBuffer[1]; tp && !isspace(*tp); tp++);
+ if (tp)
+ *tp = '\0';
+
+ /* Now process the cell */
+ (*procp)(rockp, &lineBuffer[1]);
+ }
+ } /* while loop processing all lines */
+
+ return 0;
+}
+
/*
* The CellServDB registry schema is as follows:
*
typedef long (cm_configProc_t)(void *rockp, struct sockaddr_in *addrp, char *namep, unsigned short);
-typedef long (cm_enumCellRegistryProc_t)(void *rockp, char *cellNamep);
+typedef long (cm_enumCellProc_t)(void *rockp, char *cellNamep);
extern long cm_GetRootCellName(char *namep);
char *linkedNamep,
cm_configProc_t *procp, void *rockp);
+extern long cm_EnumerateCellFile(afs_uint32 client,
+ cm_enumCellProc_t *procp,
+ void *rockp);
+
extern long cm_SearchCellRegistry(afs_uint32 client,
char *cellNamep, char *newCellNamep,
char *linkedNamep,
cm_configProc_t *procp, void *rockp);
extern long cm_EnumerateCellRegistry(afs_uint32 client,
- cm_enumCellRegistryProc_t *procp,
+ cm_enumCellProc_t *procp,
void *rockp);
extern long cm_SearchCellByDNS(char *cellNamep, char *newCellNamep, int *ttl,
afsi_log("No Windows Firewall detected");
}
+ if (cm_freelanceEnabled && cm_freelanceImportCellServDB)
+ cm_FreelanceImportCellServDB();
+
/* ping all file servers, up or down, with unauthenticated connection,
* to find out whether we have all our callbacks from the server still.
* Also, ping down VLDBs.
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
+#include <cm_nls.h>
#include <WINNT/afsreg.h>
#include "afsd.h"
#ifdef AFS_FREELANCE_CLIENT
#include "cm_freelance.h"
-#include "stdio.h"
+#include <stdio.h>
+#define STRSAFE_NO_DEPRECATE
+#include <strsafe.h>
extern void afsi_log(char *pattern, ...);
-static int cm_noLocalMountPoints = 0;
+static unsigned int cm_noLocalMountPoints = 0;
char * cm_FakeRootDir = NULL;
int cm_fakeDirSize = 0;
int cm_fakeDirCallback=0;
osi_mutex_t cm_Freelance_Lock;
static int cm_localMountPointChangeFlag = 0;
int cm_freelanceEnabled = 1;
+int cm_freelanceImportCellServDB = 0;
time_t FakeFreelanceModTime = 0x3b49f6e2;
static int freelance_ShutdownFlag = 0;
thrd_SetEvent(hFreelanceChangeEvent);
if (hFreelanceSymlinkChangeEvent != 0)
thrd_SetEvent(hFreelanceSymlinkChangeEvent);
-}
+}
+
+static long
+cm_FreelanceAddCSDBMountPoints(void *rockp, char *cellNamep)
+{
+ char szCellName[CELL_MAXNAMELEN+1] = ".";
+
+ cm_FsStrCpy( &szCellName[1], CELL_MAXNAMELEN, cellNamep);
+ /* create readonly mount point */
+ cm_FreelanceAddMount( cellNamep, cellNamep, "root.cell", 0, NULL);
+
+ /* create read/write mount point */
+ cm_FreelanceAddMount( szCellName, szCellName, "root.cell", 1, NULL);
+
+ return 0;
+}
+
+void
+cm_FreelanceImportCellServDB(void)
+{
+ cm_EnumerateCellRegistry( TRUE, cm_FreelanceAddCSDBMountPoints, NULL);
+ cm_EnumerateCellFile( TRUE, cm_FreelanceAddCSDBMountPoints, NULL);
+}
void cm_InitFreelance() {
thread_t phandle;
lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock", LOCK_HIERARCHY_FREELANCE_GLOBAL);
lock_ObtainMutex(&cm_Freelance_Lock);
+
// yj: first we make a call to cm_initLocalMountPoints
// to read all the local mount points from the registry
cm_InitLocalMountPoints();
int curChunk = 13; // chunks 0 - 12 are used for header stuff
// of the first page in the directory
int curPage = 0;
- int curDirEntry = 0;
+ unsigned int curDirEntry = 0;
int curDirEntryInPage = 0;
int sizeOfCurEntry;
int dirSize;
int cm_reInitLocalMountPoints() {
cm_fid_t aFid;
- int i, hash;
+ unsigned int i, hash;
cm_scache_t *scp, **lscpp, *tscp;
osi_Log0(afsd_logp,"----- freelance reinitialization starts ----- ");
/* to be called while holding freelance lock. */
long cm_InitLocalMountPoints() {
FILE *fp;
- int i;
+ unsigned int i;
char line[512];
char*t, *t2;
cm_localMountPoint_t* aLocalMountPoint;
if ( filename[0] == '\0' || cellname[0] == '\0' || volume[0] == '\0' )
return CM_ERROR_INVAL;
+ if ( cm_FreelanceMountPointExists(filename, 0) ||
+ cm_FreelanceSymlinkExists(filename, 0) ) {
+ code = CM_ERROR_EXISTS;
+ goto done;
+ }
+
if (cellname[0] == '.') {
if (!cm_GetCell_Gen(&cellname[1], fullname, CM_FLAG_CREATE))
return CM_ERROR_INVAL;
return CM_ERROR_INVAL;
}
- if ( cm_FreelanceMountPointExists(filename, 0) ||
- cm_FreelanceSymlinkExists(filename, 0) ) {
- code = CM_ERROR_EXISTS;
- goto done;
- }
-
osi_Log1(afsd_logp,"Freelance Adding Mount for Cell: %s",
osi_LogSaveString(afsd_logp,cellname));
long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp)
{
char line[512];
- char fullname[CELL_MAXNAMELEN];
+ char fullname[CELL_MAXNAMELEN] = "";
int alias = 0;
HKEY hkFreelanceSymlinks = 0;
DWORD dwType, dwSize;
if ( filename[strlen(filename)-1] == '.')
return CM_ERROR_INVAL;
- fullname[0] = '\0';
+ if ( cm_FreelanceMountPointExists(filename, 0) ||
+ cm_FreelanceSymlinkExists(filename, 0) ) {
+ code = CM_ERROR_EXISTS;
+ goto done;
+ }
+
if (filename[0] == '.') {
cm_GetCell_Gen(&filename[1], fullname, CM_FLAG_CREATE);
if (cm_stricmp_utf8(&filename[1],fullname) == 0) {
}
}
- if ( cm_FreelanceMountPointExists(filename, 0) ||
- cm_FreelanceSymlinkExists(filename, 0) ) {
- code = CM_ERROR_EXISTS;
- goto done;
- }
-
lock_ObtainMutex(&cm_Freelance_Lock);
if (RegCreateKeyEx( HKEY_LOCAL_MACHINE,
extern long cm_FreelanceSymlinkExists(char * filename, int prefix_ok);
extern long cm_FreelanceFetchMountPointString(cm_scache_t *scp);
extern long cm_FreelanceFetchFileType(cm_scache_t *scp);
+extern void cm_FreelanceImportCellServDB(void);
extern int cm_clearLocalMountPointChange();
extern int cm_FakeRootFid(cm_fid_t *fidp);
#define AFS_FAKE_ROOT_VOL_ID 0xFFFFFFFF
extern time_t FakeFreelanceModTime;
+extern int cm_freelanceEnabled;
+extern int cm_freelanceImportCellServDB;
#endif // _CM_FREELANCE_H