From 8efd417b806dc400b8cc74d3114e007c80300270 Mon Sep 17 00:00:00 2001 From: Jeff Riegel Date: Thu, 15 Nov 2001 03:30:08 +0000 Subject: [PATCH] STABLE12-freelance-updates-20011031 freelance client updates (cherry picked from commit c1d1a27ba99284b8877f4449f2871eb81a9b31ce) --- src/WINNT/afsd/cm_cell.c | 26 +++++++++++++++++++------- src/WINNT/afsd/cm_cell.h | 2 ++ src/WINNT/afsd/cm_freelance.c | 22 +++++++++++++++++++--- src/WINNT/afsd/cm_ioctl.c | 2 +- src/WINNT/afsd/cm_vnodeops.c | 28 ++++++++++++++++++++++++++-- src/auth/cellconfig.c | 2 +- src/bozo/NTMakefile | 6 ++++-- src/bucoord/NTMakefile | 3 ++- src/budb/NTMakefile | 3 ++- src/butc/NTMakefile | 3 ++- src/ptserver/ptclient.c | 2 +- src/tbutc/NTMakefile | 3 ++- src/update/NTMakefile | 3 ++- src/vlserver/NTMakefile | 3 ++- src/volser/NTMakefile | 3 ++- 15 files changed, 87 insertions(+), 24 deletions(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 5ef16bc9a..e2ba9e4ca 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -56,15 +56,24 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep) /* load up a cell structure from the cell database, afsdcell.ini */ cm_cell_t *cm_GetCell(char *namep, long flags) +{ + return cm_GetCell_Gen(namep, NULL, flags); +} + +cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags) { cm_cell_t *cp; long code; static cellCounter = 1; /* locked by cm_cellLock */ int ttl; + char fullname[200]; lock_ObtainWrite(&cm_cellLock); for(cp = cm_allCellsp; cp; cp=cp->nextp) { - if (strcmp(namep, cp->namep) == 0) break; + if (strcmp(namep, cp->namep) == 0) { + strcpy(fullname, cp->namep); + break; + } } if ((!cp && (flags & CM_FLAG_CREATE)) @@ -75,10 +84,11 @@ cm_cell_t *cm_GetCell(char *namep, long flags) ) { if (!cp) cp = malloc(sizeof(*cp)); memset(cp, 0, sizeof(*cp)); - code = cm_SearchCellFile(namep, NULL, cm_AddCellProc, cp); + code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp); + if (code) { #ifdef AFS_AFSDB_ENV - if (code && cm_dnsEnabled) { - code = cm_SearchCellByDNS(namep, NULL, &ttl, cm_AddCellProc, cp); + if (cm_dnsEnabled /*&& cm_DomainValid(namep)*/) + code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp); #endif if (code) { free(cp); @@ -90,8 +100,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags) cp->flags |= CM_CELLFLAG_DNS; cp->timeout = time(0) + ttl; } - } #endif + } /* randomise among those vlservers having the same rank*/ cm_RandomizeServer(&cp->vlServersp); @@ -100,8 +110,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags) lock_InitializeMutex(&cp->mx, "cm_cell_t mutex"); /* copy in name */ - cp->namep = malloc(strlen(namep)+1); - strcpy(cp->namep, namep); + cp->namep = malloc(strlen(fullname)+1); + strcpy(cp->namep, fullname); /* thread on global list */ cp->nextp = cm_allCellsp; @@ -111,6 +121,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags) } done: + if (newnamep) + strcpy(newnamep, fullname); lock_ReleaseWrite(&cm_cellLock); return cp; } diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h index a642d04d2..bf0363435 100644 --- a/src/WINNT/afsd/cm_cell.h +++ b/src/WINNT/afsd/cm_cell.h @@ -30,6 +30,8 @@ extern void cm_InitCell(void); extern cm_cell_t *cm_GetCell(char *namep, long flags); +extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags); + extern cm_cell_t *cm_FindCellByID(long cellID); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 1da7f857d..26d3c1fd5 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -435,13 +435,24 @@ cm_localMountPoint_t* cm_getLocalMountPoint(int vnode) { return 0; } -long cm_FreelanceAddMount(char *filename, char *cellname, char *volume) +long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, cm_fid_t *fidp) { FILE *fp; char hfile[120]; char line[200]; + char fullname[200]; int n; + /* before adding, verify the cell name; if it is not a valid cell, + don't add the mount point */ + /* major performance issue? */ + if (!cm_GetCell_Gen(cellname, fullname, CM_FLAG_CREATE)) + return -1; +#if 0 + if (strcmp(cellname, fullname) != 0) /* no partial matches allowed */ + return -1; +#endif + lock_ObtainMutex(&cm_Freelance_Lock); cm_GetConfigDir(hfile); @@ -455,12 +466,17 @@ long cm_FreelanceAddMount(char *filename, char *cellname, char *volume) fseek(fp, 0, SEEK_SET); fprintf(fp, "%d", n); fseek(fp, 0, SEEK_END); - fprintf(fp, "%s#%s:%s\n", filename, cellname, volume); + fprintf(fp, "%s#%s:%s\n", filename, fullname, volume); fclose(fp); lock_ReleaseMutex(&cm_Freelance_Lock); + /*cm_reInitLocalMountPoints(&vnode);*/ + if (fidp) { + fidp->unique = 1; + fidp->vnode = cm_noLocalMountPoints + 1; /* vnode value of last mt pt */ + } cm_noteLocalMountPointChange(); - + return 0; } diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index eb5a6715c..17399bf6f 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1176,7 +1176,7 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) if (cm_freelanceEnabled && dscp == cm_rootSCachep) { /* we are adding the mount point to the root dir., so call the freelance code to do the add. */ - code = cm_FreelanceAddMount(leaf, fullCell, volume); + code = cm_FreelanceAddMount(leaf, fullCell, volume, NULL); return code; } #endif diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index e29d89dd1..7e7da24e5 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -959,6 +959,7 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_scache_t *mountedScp; cm_lookupSearch_t rock; char tname[256]; + int getroot; if (dscp->fid.vnode == 1 && dscp->fid.unique == 1 && strcmp(namep, "..") == 0) { @@ -988,12 +989,27 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, * looking for. Any other non-zero code is an error. */ if (code && code != CM_ERROR_STOPNOW) return code; - - if (!rock.found) + + getroot = (dscp==cm_rootSCachep) ; + if (!rock.found) { + if (!cm_freelanceEnabled || !getroot) { if (flags & CM_FLAG_CHECKPATH) return CM_ERROR_NOSUCHPATH; else return CM_ERROR_NOSUCHFILE; + } + else { /* nonexistent dir on freelance root, so add it */ + code = cm_FreelanceAddMount(namep, namep, "root.cell.", + &rock.fid); + if (code < 0) { /* add mount point failed, so give up */ + if (flags & CM_FLAG_CHECKPATH) + return CM_ERROR_NOSUCHPATH; + else + return CM_ERROR_NOSUCHFILE; + } + tscp = NULL; /* to force call of cm_GetSCache */ + } + } haveFid: if ( !tscp ) /* we did not find it in the dnlc */ @@ -1190,9 +1206,17 @@ long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp, *newRootScpp = cm_rootSCachep; cm_HoldSCache(cm_rootSCachep); } else if (*linkp == '\\' || *linkp == '/') { + /* formerly, this was considered to be from the AFS root, + but this seems to create problems. instead, we will just + reject the link */ +#if 0 strcpy(tsp->data, linkp+1); *newRootScpp = cm_rootSCachep; cm_HoldSCache(cm_rootSCachep); +#else + code = CM_ERROR_NOSUCHPATH; + goto done; +#endif } else { /* a relative link */ diff --git a/src/auth/cellconfig.c b/src/auth/cellconfig.c index a9d89598c..cf40e4106 100644 --- a/src/auth/cellconfig.c +++ b/src/auth/cellconfig.c @@ -33,12 +33,12 @@ RCSID("$Header$"); #include #include #include -#include #ifdef AFS_AFSDB_ENV #include #include #endif /* AFS_AFSDB_ENV */ #endif /* AFS_NT40_ENV */ +#include #include #include #include diff --git a/src/bozo/NTMakefile b/src/bozo/NTMakefile index 4653dc80c..7a6f08524 100644 --- a/src/bozo/NTMakefile +++ b/src/bozo/NTMakefile @@ -66,7 +66,8 @@ BOSSERVER_EXELIBS =\ $(DESTDIR)\lib\afs\afsaudit.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ $(DESTDIR)\lib\afs\afseventlog.lib \ - $(DESTDIR)\lib\afs\afsprocmgmt.lib + $(DESTDIR)\lib\afs\afsprocmgmt.lib \ + $(DESTDIR)\lib\cm_dns.obj $(BOSSERVER_EXEFILE): $(BOSSERVER_EXEOBJS) $(BOSSERVER_EXELIBS) $(EXECONLINK) @@ -100,7 +101,8 @@ BOS_EXELIBS =\ $(DESTDIR)\lib\afs\afsbos.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ $(DESTDIR)\lib\afs\afsprocmgmt.lib \ - $(DESTDIR)\lib\afs\afspioctl.lib + $(DESTDIR)\lib\afs\afspioctl.lib \ + $(DESTDIR)\lib\cm_dns.obj $(RS_BOS_EXEFILE): $(BOS_EXEOBJS) $(BOS_EXELIBS) diff --git a/src/bucoord/NTMakefile b/src/bucoord/NTMakefile index bc2437b26..68e5fe607 100644 --- a/src/bucoord/NTMakefile +++ b/src/bucoord/NTMakefile @@ -79,7 +79,8 @@ EXELIBS =\ $(DESTDIR)\lib\afs\afsusd.lib \ $(DESTDIR)\lib\afs\afsprocmgmt.lib \ $(DESTDIR)\lib\afs\afspioctl.lib \ - $(DESTDIR)\lib\afs\afsreg.lib + $(DESTDIR)\lib\afs\afsreg.lib \ + $(DESTDIR)\lib\cm_dns.obj $(EXEFILE): $(EXEOBJS) $(EXELIBS) diff --git a/src/budb/NTMakefile b/src/budb/NTMakefile index 278bf71b8..2bbe30456 100644 --- a/src/budb/NTMakefile +++ b/src/budb/NTMakefile @@ -75,7 +75,8 @@ EXELIBS =\ $(DESTDIR)\lib\afsubik.lib \ $(DESTDIR)\lib\afs\afseventlog.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afsprocmgmt.lib + $(DESTDIR)\lib\afs\afsprocmgmt.lib \ + $(DESTDIR)\lib\cm_dns.obj $(EXEFILE): $(EXEOBJS) $(EXELIBS) diff --git a/src/butc/NTMakefile b/src/butc/NTMakefile index e798e6de0..9c87cf826 100644 --- a/src/butc/NTMakefile +++ b/src/butc/NTMakefile @@ -49,7 +49,8 @@ EXELIBS =\ $(DESTDIR)\lib\afs\afsprocmgmt.lib \ $(DESTDIR)\lib\afs\afspioctl.lib \ $(DESTDIR)\lib\afs\afseventlog.lib \ - $(DESTDIR)\lib\afs\afsreg.lib + $(DESTDIR)\lib\afs\afsreg.lib \ + $(DESTDIR)\lib\cm_dns.obj $(EXEFILE): $(EXEOBJS) $(EXELIBS) $(EXECONLINK) diff --git a/src/ptserver/ptclient.c b/src/ptserver/ptclient.c index 8fa312ff0..92a49ecf0 100644 --- a/src/ptserver/ptclient.c +++ b/src/ptserver/ptclient.c @@ -21,8 +21,8 @@ RCSID("$Header$"); #include #else #include -#endif #include +#endif #include #include #include diff --git a/src/tbutc/NTMakefile b/src/tbutc/NTMakefile index 6d3ec6450..261fa2069 100644 --- a/src/tbutc/NTMakefile +++ b/src/tbutc/NTMakefile @@ -73,7 +73,8 @@ BUTCLIBS=$(DESTDIR)\lib\afs\afsbudb.lib \ !ELSE $(DESTDIR)\lib\pthread.lib \ !ENDIF - $(DESTDIR)\lib\afsdes.lib + $(DESTDIR)\lib\afsdes.lib \ + $(DESTDIR)\lib\cm_dns.obj # $(DESTDIR)\lib\afsauthent.lib \ diff --git a/src/update/NTMakefile b/src/update/NTMakefile index 607c74520..8643cca38 100644 --- a/src/update/NTMakefile +++ b/src/update/NTMakefile @@ -21,7 +21,8 @@ LIBS = \ $(DESTDIR)\lib\afsubik.lib \ $(DESTDIR)\lib\afs\afseventlog.lib \ $(DESTDIR)\lib\afsrxkad.lib \ - $(DESTDIR)\lib\afs\afsprocmgmt.lib + $(DESTDIR)\lib\afs\afsprocmgmt.lib \ + $(DESTDIR)\lib\cm_dns.obj ############################################################################ # Definitions for generating files via RXGEN diff --git a/src/vlserver/NTMakefile b/src/vlserver/NTMakefile index 9f0a5e4b5..e2331e4e1 100644 --- a/src/vlserver/NTMakefile +++ b/src/vlserver/NTMakefile @@ -85,7 +85,8 @@ VLSERVER_EXECLIBS = \ $(DESTDIR)\lib\afs\afsaudit.lib \ $(DESTDIR)\lib\afs\afseventlog.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afsprocmgmt.lib + $(DESTDIR)\lib\afs\afsprocmgmt.lib \ + $(DESTDIR)\lib\cm_dns.obj $(VLSERVER): $(VLSERVER_EXEOBJS) $(LIBFILE) $(VLSERVER_EXECLIBS) diff --git a/src/volser/NTMakefile b/src/volser/NTMakefile index 90d4038fc..f9f2e7039 100644 --- a/src/volser/NTMakefile +++ b/src/volser/NTMakefile @@ -64,7 +64,8 @@ EXEC_LIBS = \ $(DESTDIR)\lib\afslwp.lib \ $(DESTDIR)\lib\afs\afsacl.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afseventlog.lib + $(DESTDIR)\lib\afs\afseventlog.lib \ + $(DESTDIR)\lib\cm_dns.obj ############################################################################ -- 2.39.5