updates to make freelance patches work, create mountpoints from afsdb on the fly
/* 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))
) {
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);
cp->flags |= CM_CELLFLAG_DNS;
cp->timeout = time(0) + ttl;
}
- }
#endif
+ }
/* randomise among those vlservers having the same rank*/
cm_RandomizeServer(&cp->vlServersp);
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;
}
done:
+ if (newnamep)
+ strcpy(newnamep, fullname);
lock_ReleaseWrite(&cm_cellLock);
return cp;
}
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);
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);
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;
}
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
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) {
* 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 */
*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 */
#include <netdb.h>
#include <sys/file.h>
#include <sys/time.h>
-#include <afs/afsint.h>
#ifdef AFS_AFSDB_ENV
#include <arpa/nameser.h>
#include <resolv.h>
#endif /* AFS_AFSDB_ENV */
#endif /* AFS_NT40_ENV */
+#include <afs/afsint.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>
$(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)
$(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)
$(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)
$(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)
$(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)
#include <WINNT/afsevent.h>
#else
#include <netinet/in.h>
-#endif
#include <netdb.h>
+#endif
#include <stdio.h>
#include <rx/xdr.h>
#include <rx/rx.h>
!ELSE
$(DESTDIR)\lib\pthread.lib \
!ENDIF
- $(DESTDIR)\lib\afsdes.lib
+ $(DESTDIR)\lib\afsdes.lib \
+ $(DESTDIR)\lib\cm_dns.obj
# $(DESTDIR)\lib\afsauthent.lib \
$(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
$(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)
$(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
############################################################################