/*! \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; }
/* * 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; }
/* * 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; }
/** * @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, ¶ms) < 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; }