Beispiel #1
0
void
freeMetric(Metric *m)
{
    int		numinst;

    /* Metric is on fetch list */
    if (m->profile) {
	if (m->prev) {
	    m->prev->next = m->next;
	    if (m->next) m->next->prev = m->prev;
	}
	else {
	    m->host->waits = m->next;
	    if (m->next) m->next->prev = NULL;
	}
	if (m->host) freeHost(m->host);
    }

    symFree(m->hname);
    numinst =  m->specinst == 0 ? m->m_idom : m->specinst;
    if (numinst > 0 && m->inames) {
	int	i;
	for (i = 0; i < numinst; i++) {
	    if (m->inames[i] != NULL) free(m->inames[i]);
	}
	free(m->inames);
    }
    if (numinst && m->iids) free(m->iids);
    if (m->vals) free(m->vals);
}
Beispiel #2
0
void
freeHost(Host *h)
{
    if ((h->fetches == NULL) && (h->waits == NULL)) {
	if (h->next) h->next->prev = h->prev;
	if (h->prev) h->prev->next = h->next;
	else {
	    h->task->hosts = h->next;
	    freeTask(h->task);
	}
	symFree(h->name);
	free(h);
    }
}
Beispiel #3
0
STATUS
newfh(vxfh_t * vxfhp, char *fullpath)
{
	DEV_HDR        *devhdrp;
	SYMBOL         *sp, *sp2;
	int             fd;
	char           *valuep, type;

	if ((fd = open(fullpath, O_RDONLY, 0)) < 0)
		return ERROR;

	if ((devhdrp = iosFdDevFind(fd)) == NULL) {
		close(fd);
		return ERROR;
	}
	if (devhdrp->drvNum == rt11FsDrvNum) {
		vxfhp->type = rt11FsDrvNum;
		strcpy(vxfhp->opaque, fullpath);
		close(fd);
		return OK;
	}
	if (devhdrp->drvNum == dosFsDrvNum) {
		path_to_all_lower(fullpath);

		if (symFindByName(nfsd_pathtab, fullpath, &valuep,
				  &type) == OK) {
			vxfhp->type = dosFsDrvNum;
			*((int *) (vxfhp->opaque)) = (int) valuep;

			close(fd);

			nfsd_debug("newfh: return existing valuep %x <%s>\n",
				   valuep, fullpath);

			return OK;
		}
		if (!(sp = symAlloc(nfsd_pathtab, fullpath, 0,
				    (SYM_TYPE) NFSD_MSDOS_TYPE, 0))) {
			nfsd_debug("newfh: can't symAlloc sp %x <%s>\n",
				   sp, fullpath);
			nfsd_debugno();
			close(fd);
			return ERROR;
		}
		sp->value = (char *) sp;

		if (symTblAdd(nfsd_pathtab, sp) == ERROR) {
			/*
			 * XXX -- only try 2 times if it fails. highly
			 * unlikely hash will collide two times in a row with
			 * different values. but this is obviously imperfect.
			 */
			if (!(sp2 = symAlloc(nfsd_pathtab, fullpath, 0,
					  (SYM_TYPE) NFSD_MSDOS_TYPE, 0))) {
				nfsd_debug("newfh: can't symAlloc sp2 <%s>\n",
					   fullpath);
				close(fd);
				symFree(nfsd_pathtab, sp);
				return ERROR;
			}
			symFree(nfsd_pathtab, sp);
			sp = sp2;
			sp->value = (char *) sp;

			if (symTblAdd(nfsd_pathtab, sp) == ERROR) {
				nfsd_debugno();
				nfsd_debug("newfh: couldn't add <%s>\n",
					   fullpath);
				symFree(nfsd_pathtab, sp);
				close(fd);

				return ERROR;
			}
		}
		nfsd_debug("newfh: <%s> added as <%x>\n",
			   fullpath, sp);

		nfsd_debug("newfh: total %d paths are in pathtab now.\n",
			   nfsd_pathtab->nsymbols);

		vxfhp->type = dosFsDrvNum;
		*((int *) (vxfhp->opaque)) = (int) sp;

		close(fd);
		return OK;
	}
	close(fd);
	return ERROR;
}