Exemple #1
0
/*! \brief
 * Duplicate a single rr_t structure using pkg_malloc or shm_malloc
 */
static inline int do_duplicate_rr(rr_t** _new, rr_t* _r, int _shm)
{
	int len, ret;
	rr_t* res, *prev, *it;

	if (!_new || !_r) {
		LOG(L_ERR, "duplicate_rr(): Invalid parameter value\n");
		return -1;
	}
	prev  = NULL;
	*_new = NULL;
	it    = _r;
	while(it)
	{
		if (it->params) {
			len = it->params->name.s + it->params->len - it->nameaddr.name.s;
		} else {
			len = it->nameaddr.len;
		}

		if (_shm) res = shm_malloc(sizeof(rr_t) + len);
		else res = pkg_malloc(sizeof(rr_t) + len);
		if (!res) {
			LOG(L_ERR, "duplicate_rr(): No memory left\n");
			return -2;
		}
		memcpy(res, it, sizeof(rr_t));

		res->nameaddr.name.s = (char*)res + sizeof(rr_t);
		memcpy(res->nameaddr.name.s, it->nameaddr.name.s, len);

		if (_shm) {
			ret = shm_duplicate_params(&res->params, it->params);
		} else {
			ret = duplicate_params(&res->params, it->params);
		}

		if (ret < 0) {
			LOG(L_ERR, "duplicate_rr(): Error while duplicating parameters\n");
			if (_shm) shm_free(res);
			else pkg_free(res);
			return -3;
		}

		xlate_pointers(it, res);

		res->next=NULL;
		if(*_new==NULL)
			*_new = res;
		if(prev)
			prev->next = res;
		prev = res;
		it = it->next;
	}
	return 0;
}
Exemple #2
0
/*
 * Duplicate a single rr_t structure using pkg_malloc or shm_malloc
 */
static inline int do_duplicate_rr(rr_t** _new, rr_t* _r, int _shm)
{
	int len, ret;
	rr_t* res;

	if (!_new || !_r) {
		LOG(L_ERR, "duplicate_rr(): Invalid parameter value\n");
		return -1;
	}

	if (_r->params) {
		len = _r->params->name.s + _r->params->len - _r->nameaddr.name.s;
	} else {
		len = _r->nameaddr.len;
	}

	if (_shm) res = shm_malloc(sizeof(rr_t) + len);
	else res = pkg_malloc(sizeof(rr_t) + len);
	if (!res) {
		LOG(L_ERR, "duplicate_rr(): No memory left\n");
		return -2;
	}
	memcpy(res, _r, sizeof(rr_t));

        res->nameaddr.name.s = (char*)res + sizeof(rr_t);
	memcpy(res->nameaddr.name.s, _r->nameaddr.name.s, len);

	if (_shm) {
		ret = shm_duplicate_params(&res->params, _r->params);
	} else {
		ret = duplicate_params(&res->params, _r->params);
	}

	if (ret < 0) {
		LOG(L_ERR, "Error while duplicating parameters\n");
		if (_shm) shm_free(res);
		else pkg_free(res);
		return -3;
	}

	xlate_pointers(_r, res);
	*_new = res;
	return 0;
}
Exemple #3
0
/*
 * Duplicate a single rr_t structure using pkg_malloc or shm_malloc
 */
static inline int do_duplicate_rr(rr_t** _new, rr_t* _r, int _shm, int _first)
{
	int len, ret;
	rr_t* res, *prev, *it;

	if (!_new || !_r) {
		LM_ERR("invalid parameter value\n");
		return -1;
	}
	prev  = NULL;
	*_new = NULL;
	it    = _r;
	while(it)
	{
		if (it->params) {
			len = it->params->name.s + it->params->len - it->nameaddr.name.s;
		} else {
			len = it->nameaddr.len;
		}

		if (_shm) res = shm_malloc(sizeof(rr_t) + len);
		else res = pkg_malloc(sizeof(rr_t) + len);
		if (!res) {
			LM_ERR("no shm memory left\n");
			goto error;
		}
		memcpy(res, it, sizeof(rr_t));

		res->nameaddr.name.s = (char*)res + sizeof(rr_t);
		memcpy(res->nameaddr.name.s, it->nameaddr.name.s, len);

		if (_shm) {
			ret = shm_duplicate_params(&res->params, it->params);
		} else {
			ret = duplicate_params(&res->params, it->params);
		}

		if (ret < 0) {
			LM_ERR("failed to duplicate parameters\n");
			if (_shm) shm_free(res);
			else pkg_free(res);
			goto error;
		}

		xlate_pointers(it, res);

		res->next=NULL;
		if(*_new==NULL)
			*_new = res;

		if (_first)
			return 0;

		if(prev)
			prev->next = res;
		prev = res;
		it = it->next;
	}
	return 0;
error:
	if (_shm) shm_free_rr(_new);
	else free_rr(_new);
	*_new = NULL;
	return -1;
}
Exemple #4
0
/**
 * @brief build a dmq node
 */
dmq_node_t* build_dmq_node(str* uri, int shm) {
    dmq_node_t* ret = NULL;
    param_hooks_t hooks;
    param_t* params;

    /* For DNS-Lookups */
    static char hn[256];
    struct hostent* he;

    LM_DBG("build_dmq_node %.*s with %s memory\n", STR_FMT(uri), shm?"shm":"private");

    if(shm) {
        ret = shm_malloc(sizeof(dmq_node_t));
        if(ret==NULL) {
            LM_ERR("no more shm\n");
            goto error;
        }
        memset(ret, 0, sizeof(dmq_node_t));
        if(shm_str_dup(&ret->orig_uri, uri)<0) {
            goto error;
        }
    } else {
        ret = pkg_malloc(sizeof(dmq_node_t));
        if(ret==NULL) {
            LM_ERR("no more pkg\n");
            goto error;
        }
        memset(ret, 0, sizeof(dmq_node_t));
        if(pkg_str_dup(&ret->orig_uri, uri)<0) {
            goto error;
        }
    }
    set_default_dmq_node_params(ret);
    if(parse_uri(ret->orig_uri.s, ret->orig_uri.len, &ret->uri) < 0 || ret->uri.host.len > 254) {
        LM_ERR("error parsing uri\n");
        goto error;
    }
    /* if any parameters found, parse them */
    if(parse_params(&ret->uri.params, CLASS_ANY, &hooks, &params) < 0) {
        LM_ERR("error parsing params\n");
        goto error;
    }
    /* if any params found */
    if(params) {
        if(shm) {
            if(shm_duplicate_params(&ret->params, params) < 0) {
                LM_ERR("error duplicating params\n");
                free_params(params);
                goto error;
            }
            free_params(params);
        } else {
            ret->params = params;
        }
        if(set_dmq_node_params(ret, ret->params) < 0) {
            LM_ERR("error setting parameters\n");
            goto error;
        }
    } else {
        LM_DBG("no dmqnode params found\n");
    }
    /* resolve hostname */
    strncpy(hn, ret->uri.host.s, ret->uri.host.len);
    hn[ret->uri.host.len]='\0';
    he=resolvehost(hn);
    if (he==0) {
        LM_ERR("could not resolve %.*s\n", ret->uri.host.len, ret->uri.host.s);
        goto error;
    }
    hostent2ip_addr(&ret->ip_address, he, 0);

    return ret;

error:
    if(ret!=NULL) {
        destroy_dmq_node(ret, shm);
    }
    return NULL;
}