/* NT client CellServDB has different file name than NT server or Unix */
if (_afsconf_IsClientConfigDirectory(adir->name)) {
if (!afssw_GetClientCellServDBDir(&p)) {
- asprintf(path, "%s/%s", p, AFSDIR_CELLSERVDB_FILE_NTCLIENT);
+ if (asprintf(path, "%s/%s", p, AFSDIR_CELLSERVDB_FILE_NTCLIENT) < 0)
+ *path = NULL;
free(p);
} else {
- asprintf(path, "%s/%s", adir->name, AFSDIR_CELLSERVDB_FILE_NTCLIENT);
+ if (asprintf(path, "%s/%s", adir->name,
+ AFSDIR_CELLSERVDB_FILE_NTCLIENT) < 0)
+ *path = NULL;
}
} else {
- asprintf(path, "%s/%s", adir->name, AFSDIR_CELLSERVDB_FILE);
+ if (asprintf(path, "%s/%s", adir->name, AFSDIR_CELLSERVDB_FILE) < 0)
+ *path = NULL;
}
return;
}
static void
_afsconf_CellServDBPath(struct afsconf_dir *adir, char **path)
{
- asprintf(path, "%s/%s", adir->name, AFSDIR_CELLSERVDB_FILE);
+ if (asprintf(path, "%s/%s", adir->name, AFSDIR_CELLSERVDB_FILE) < 0)
+ *path = NULL;
}
#endif /* AFS_NT40_ENV */
int code;
time_t now = time(0);
- if (adir->timeCheck == now) {
+ if (adir->timeRead && (adir->timeCheck == now)) {
return 1; /* stat no more than once a second */
}
adir->timeCheck = now;
LOCK_GLOBAL_MUTEX;
/* zero structure and fill in name; rest is done by internal routine */
- tdir = (struct afsconf_dir *)malloc(sizeof(struct afsconf_dir));
- memset(tdir, 0, sizeof(struct afsconf_dir));
+ tdir = calloc(1, sizeof(struct afsconf_dir));
tdir->name = strdup(adir);
code = afsconf_OpenInternal(tdir, 0, 0);
/* The "AFSCONF" environment (or contents of "/.AFSCONF") will be typically set to something like "/afs/<cell>/common/etc" where, by convention, the default files for "ThisCell" and "CellServDB" will reside; note that a major drawback is that a given afs client on that cell may NOT contain the same contents... */
char *home_dir;
afsconf_FILE *fp;
- size_t len;
+ size_t len = 0;
+ int r;
if (!(home_dir = getenv("HOME"))) {
/* Our last chance is the "/.AFSCONF" file */
fp = fopen("/.AFSCONF", "r");
- if (fp == 0) {
- free(tdir);
- UNLOCK_GLOBAL_MUTEX;
- return (struct afsconf_dir *)0;
- }
- fgets(afs_confdir, 128, fp);
- fclose(fp);
+ if (fp == 0)
+ goto fail;
+
} else {
- char pathname[256];
+ char *pathname = NULL;
+
+ r = asprintf(&pathname, "%s/%s", home_dir, ".AFSCONF");
+ if (r < 0 || pathname == NULL)
+ goto fail;
- sprintf(pathname, "%s/%s", home_dir, ".AFSCONF");
fp = fopen(pathname, "r");
+ free(pathname);
+
if (fp == 0) {
/* Our last chance is the "/.AFSCONF" file */
fp = fopen("/.AFSCONF", "r");
- if (fp == 0) {
- free(tdir);
- UNLOCK_GLOBAL_MUTEX;
- return (struct afsconf_dir *)0;
- }
+ if (fp == 0)
+ goto fail;
}
- fgets(afs_confdir, 128, fp);
- fclose(fp);
- }
- len = strlen(afs_confdir);
- if (len == 0) {
- free(tdir);
- UNLOCK_GLOBAL_MUTEX;
- return (struct afsconf_dir *)0;
}
+ if (fgets(afs_confdir, 128, fp) != NULL)
+ len = strlen(afs_confdir);
+ fclose(fp);
+ if (len == 0)
+ goto fail;
+
if (afs_confdir[len - 1] == '\n') {
afs_confdir[len - 1] = 0;
}
code = afsconf_OpenInternal(tdir, 0, 0);
if (code) {
free(tdir->name);
- free(tdir);
- UNLOCK_GLOBAL_MUTEX;
- return (struct afsconf_dir *)0;
+ goto fail;
}
}
UNLOCK_GLOBAL_MUTEX;
return tdir;
+
+fail:
+ free(tdir);
+ UNLOCK_GLOBAL_MUTEX;
+ return NULL;
}
static int
char *start, *p;
afsconf_FILE *fp;
- strcompose(tbuffer, 256, adir->name, "/", AFSDIR_THISCELL_FILE, NULL);
+ strcompose(tbuffer, 256, adir->name, "/", AFSDIR_THISCELL_FILE,
+ (char *)NULL);
fp = fopen(tbuffer, "r");
if (fp == 0) {
return -1;
cm_enumCellRegistry_t enumCellRegistry = {0, 0};
#endif /* AFS_NT40_ENV */
+ /* init the keys queue before any call to afsconf_CloseInternal() */
+ _afsconf_InitKeys(adir);
+
/* figure out the local cell name */
#ifdef AFS_NT40_ENV
i = GetCellNT(adir);
return -1;
}
- /* init the keys queue before any call to afsconf_CloseInternal() */
- _afsconf_InitKeys(adir);
-
/* The CellServDB file is now open.
* The following code parses the contents of the
* file and creates a list with the first cell entry
adir->entries = curEntry;
curEntry = 0;
}
- curEntry =
- (struct afsconf_entry *)malloc(sizeof(struct afsconf_entry));
- memset(curEntry, 0, sizeof(struct afsconf_entry));
+ curEntry = calloc(1, sizeof(struct afsconf_entry));
code =
ParseCellLine(tbuffer, curEntry->cellInfo.name, linkedcell);
if (code) {
#endif /* AFS_NT40_ENV */
/* Read in the alias list */
- strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLALIAS_FILE, NULL);
+ strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLALIAS_FILE,
+ (char *)NULL);
tf = fopen(tbuffer, "r");
while (tf) {
tp++;
tp[0] = '\0';
- curAlias = malloc(sizeof(*curAlias));
- memset(curAlias, 0, sizeof(*curAlias));
+ curAlias = calloc(1, sizeof(*curAlias));
strlcpy(curAlias->aliasInfo.aliasName, aliasPtr, sizeof curAlias->aliasInfo.aliasName);
strlcpy(curAlias->aliasInfo.realName, tbuffer, sizeof curAlias->aliasInfo.realName);
int *numServers, int *ttl, char **arealCellName)
{
int code = 0;
+ int r;
int len;
- unsigned char answer[1024];
+ unsigned char answer[4096];
unsigned char *p;
char *dotcellname = NULL;
char *realCellName;
#endif
retryafsdb:
+ r = -1;
switch (pass) {
case 0:
dnstype = T_SRV;
- asprintf(&dotcellname, "_%s._%s.%s.", IANAname, protocol, cellName);
+ r = asprintf(&dotcellname, "_%s._%s.%s.", IANAname, protocol, cellName);
break;
case 1:
dnstype = T_AFSDB;
- asprintf(&dotcellname, "%s.", cellName);
+ r = asprintf(&dotcellname, "%s.", cellName);
break;
case 2:
dnstype = T_SRV;
- asprintf(&dotcellname, "_%s._%s.%s", IANAname, protocol, cellName);
+ r = asprintf(&dotcellname, "_%s._%s.%s", IANAname, protocol, cellName);
break;
case 3:
dnstype = T_AFSDB;
- asprintf(&dotcellname, "%s", cellName);
+ r = asprintf(&dotcellname, "%s", cellName);
break;
}
- if (dotcellname == NULL)
+ if (r < 0 || dotcellname == NULL)
goto findservererror;
LOCK_GLOBAL_MUTEX;
for (i = 0; i < numServers; i++) {
memcpy(&acellInfo->hostAddr[i].sin_addr.s_addr, &cellHostAddrs[i],
- sizeof(long));
+ sizeof(afs_uint32));
memcpy(acellInfo->hostName[i], cellHostNames[i], MAXHOSTCHARS);
acellInfo->hostAddr[i].sin_family = AF_INET;
if (aservice)
for (i=0 ; he->h_addr_list[i] && numServers < MAXHOSTSPERCELL; i++) {
/* check to see if this is a new address; if so insert it into the list */
int k, dup;
+ afs_uint32 addr;
+ memcpy(&addr, he->h_addr_list[i], sizeof(addr));
for (k=0, dup=0; !dup && k < numServers; k++) {
- if (hostAddr[k].sin_addr.s_addr == *(u_long *)he->h_addr_list[i])
+ if (hostAddr[k].sin_addr.s_addr == addr) {
dup = 1;
+ }
}
if (dup)
continue;
#ifdef STRUCT_SOCKADDR_HAS_SA_LEN
hostAddr[numServers].sin_len = sizeof(struct sockaddr_in);
#endif
- memcpy(&hostAddr[numServers].sin_addr.s_addr, he->h_addr_list[i], sizeof(long));
+ memcpy(&hostAddr[numServers].sin_addr.s_addr, he->h_addr_list[i], sizeof(afs_uint32));
strcpy(hostName[numServers], acellInfo->hostName[j]);
foundAddr = 1;
numServers++;
*
* @return status
* @retval 0 success
- * @retval AFSCONF_UNKNOWN failed to get cellname
+ * @retval AFSCONF_NOCELLNAME cannot determine local cell name
*
* @internal
*/
if (adir->cellName) {
*pname = adir->cellName;
} else
- code = AFSCONF_UNKNOWN;
+ code = AFSCONF_NOCELLNAME;
}
return code;
}