本文整理汇总了C++中pkg_malloc函数的典型用法代码示例。如果您正苦于以下问题:C++ pkg_malloc函数的具体用法?C++ pkg_malloc怎么用?C++ pkg_malloc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pkg_malloc函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: add_credential
int add_credential( unsigned int type, void *val)
{
struct uac_credential *crd;
char *p;
str foo;
p = (char*)val;
crd = 0;
if (p==0 || *p==0)
goto error;
crd = (struct uac_credential*)pkg_malloc(sizeof(struct uac_credential));
if (crd==0)
{
LM_ERR("no more pkg mem\n");
goto error;
}
memset( crd, 0, sizeof(struct uac_credential));
/*parse the user */
while (*p && isspace((int)*p)) p++;
foo.s = p;
while (*p && *p!=':' && !isspace((int)*p)) p++;
if (foo.s==p || *p==0)
/* missing or empty user */
goto parse_error;
foo.len = p - foo.s;
/* dulicate it */
duplicate_str( crd->user, foo, error);
/* parse the ':' separator */
while (*p && isspace((int)*p)) p++;
if (*p!=':')
goto parse_error;
p++;
while (*p && isspace((int)*p)) p++;
if (*p==0)
goto parse_error;
/*parse the realm */
while (*p && isspace((int)*p)) p++;
foo.s = p;
while (*p && *p!=':' && !isspace((int)*p)) p++;
if (foo.s==p || *p==0)
/* missing or empty realm */
goto parse_error;
foo.len = p - foo.s;
/* dulicate it */
duplicate_str( crd->realm, foo, error);
/* parse the ':' separator */
while (*p && isspace((int)*p)) p++;
if (*p!=':')
goto parse_error;
p++;
while (*p && isspace((int)*p)) p++;
if (*p==0)
goto parse_error;
/*parse the passwd */
while (*p && isspace((int)*p)) p++;
foo.s = p;
while (*p && !isspace((int)*p)) p++;
if (foo.s==p)
/* missing or empty passwd */
goto parse_error;
foo.len = p - foo.s;
/* dulicate it */
duplicate_str( crd->passwd, foo, error);
/* end of string */
while (*p && isspace((int)*p)) p++;
if (*p!=0)
goto parse_error;
/* link the new cred struct */
crd->next = crd_list;
crd_list = crd;
pkg_free(val);
return 0;
parse_error:
LM_ERR("parse error in <%s> "
"around %ld\n", (char*)val, (long)(p-(char*)val));
error:
if (crd)
free_credential(crd);
return -1;
}
示例2: dlg_replace_contact
int dlg_replace_contact(struct sip_msg* msg, struct dlg_cell* dlg)
{
// str local_contact;
struct lump* lump, *crt, *prev_crt =0, *a, *foo;
int offset;
int len,n;
char *prefix=NULL,*suffix=NULL,*p,*p_init;
int prefix_len,suffix_len;
if(!msg->contact)
{
if(parse_headers(msg, HDR_CONTACT_F, 0)< 0)
{
LM_ERR("Failed to parse headers\n");
return -1;
}
if(!msg->contact)
return 0;
}
prefix_len = 5; /* <sip: */
prefix = pkg_malloc(prefix_len);
if (!prefix) {
LM_ERR("no more pkg\n");
goto error;
}
suffix_len = RR_DLG_PARAM_SIZE+1; /* > */
suffix = pkg_malloc(suffix_len);
if (!suffix) {
LM_ERR("no more pkg\n");
goto error;
}
memcpy(prefix,"<sip:",prefix_len);
p_init = p = suffix;
*p++ = ';';
memcpy(p,"did",3);
p+=3;
*p++ = '=';
n = RR_DLG_PARAM_SIZE - (p-p_init);
if (int2reverse_hex( &p, &n, dlg->h_entry)==-1)
return -1;
*(p++) = DLG_SEPARATOR;
n = RR_DLG_PARAM_SIZE - (p-p_init);
if (int2reverse_hex( &p, &n, dlg->h_id)==-1)
return -1;
*p++ = '>';
suffix_len = p - p_init;
offset = msg->contact->body.s - msg->buf;
len = msg->contact->body.len;
for (crt = msg->add_rm;crt;) {
if (crt->type == HDR_CONTACT_T && crt->op == LUMP_DEL &&
crt->u.offset >= offset && crt->u.offset <= offset + len) {
lump = crt;
crt = crt->next;
a=lump->before;
while(a) {
LM_DBG("before [%p], op=%d\n", a, a->op);
if(a->op == LUMP_ADD)
LM_DBG("value= %.*s\n", a->len, a->u.value);
foo=a; a=a->before;
if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
free_lump(foo);
if (!(foo->flags&LUMPFLAG_SHMEM))
pkg_free(foo);
}
a=lump->after;
while(a) {
LM_DBG("after [%p], op=%d\n", a, a->op);
if(a->op == LUMP_ADD)
LM_DBG("value= %.*s\n", a->len, a->u.value);
foo=a; a=a->after;
if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
free_lump(foo);
if (!(foo->flags&LUMPFLAG_SHMEM))
pkg_free(foo);
}
if(lump == msg->add_rm)
msg->add_rm = lump->next;
else
prev_crt->next = lump->next;
if (!(lump->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
free_lump(lump);
if (!(lump->flags&LUMPFLAG_SHMEM))
pkg_free(lump);
continue;
}
prev_crt = crt;
crt= crt->next;
}
//.........这里部分代码省略.........
示例3: l_siplua_moduleFunc
static int l_siplua_moduleFunc(lua_State *L)
{
struct sipapi_object *o;
const char *func;
int n, nargs;
cmd_export_t *exp_func_struct;
action_elem_t elems[MAX_ACTION_ELEMS];
const char *s, *msg;
char *str;
int i;
struct action *act;
int retval;
o = luaL_checkudata(L, 1, "siplua.api");
func = luaL_checkstring(L, 2);
n = lua_gettop(L);
nargs = n - 2;
if (n - 1 > MAX_ACTION_ELEMS)
return luaL_error(L, "function '%s' called with too many arguments [%d > %d]",
func, nargs, MAX_ACTION_ELEMS - 1);
exp_func_struct = find_cmd_export_t((char *)func, nargs, 0);
if (!exp_func_struct)
{
return luaL_error(L, "function '%s' called, but not available.");
}
elems[0].type = CMD_ST;
elems[0].u.data = exp_func_struct;
memset(&elems[1], '\0', nargs * sizeof(action_elem_t));
for (i = 0; i < nargs; ++i)
{
s = lua_tostring(L, 3 + i);
if (!s)
{
siplua_moduleFunc_free(func, exp_func_struct, elems, nargs);
msg = lua_pushfstring(L, "%s expected, got %s",
lua_typename(L, LUA_TSTRING), luaL_typename(L, 3 + i));
return luaL_argerror(L, 3 + i, msg);
}
str = pkg_malloc(strlen(s) + 1);
if (!str)
{
siplua_moduleFunc_free(func, exp_func_struct, elems, nargs);
return luaL_error(L, "Not enough memory");
}
strcpy(str, s);
/* We should maybe try STR_ST and elems[].u.str.{s,len} */
elems[i + 1].type = STRING_ST;
elems[i + 1].u.data = str; /* elems[].u.string */
}
act = mk_action(MODULE_T, n - 2 + 1, elems, 0);
if (!act)
{
siplua_moduleFunc_free(func, exp_func_struct, elems, nargs);
return luaL_error(L, "action structure could not be created. Error.");
}
/* siplua_log(L_DBG, "fixup/%p free_fixup/%p", */
/* exp_func_struct->fixup, */
/* exp_func_struct->free_fixup); */
if (exp_func_struct->fixup)
{
if (!siplua_unsafemodfnc && !exp_func_struct->free_fixup)
{
siplua_moduleFunc_free(func, exp_func_struct, act->elem, nargs);
return luaL_error(L, "Module function '%s' is unsafe. Call is refused.\n", func);
}
if (nargs == 0)
{
retval = exp_func_struct->fixup(0, 0);
if (retval < 0)
{
siplua_moduleFunc_free(func, exp_func_struct, act->elem, nargs);
return luaL_error(L, "Error in fixup (0)\n");
}
}
for (i = 0; i < nargs; ++i)
{
retval = exp_func_struct->fixup(&act->elem[i + 1].u.data, i + 1);
if (retval < 0)
{
siplua_moduleFunc_free(func, exp_func_struct, act->elem, nargs);
return luaL_error(L, "Error in fixup (%d)\n", i + 1);
}
act->elem[i + 1].type = MODFIXUP_ST;
}
}
retval = do_action(act, o->msg);
siplua_moduleFunc_free(func, exp_func_struct, act->elem, nargs);
pkg_free(act);
lua_pushinteger(L, retval);
return 1;
}
示例4: convert_row
/*
* Convert a row from result into db API representation
*/
int convert_row(db_con_t* _h, db_res_t* _res, db_row_t* _r)
{
int i;
if ((!_h) || (!_r) || (!_res))
{
#ifdef DBT_EXTRA_DEBUG
LOG(L_ERR, "DBT:convert_row: Invalid parameter value\n");
#endif
return -1;
}
ROW_VALUES(_r) = (db_val_t*)pkg_malloc(sizeof(db_val_t) * RES_COL_N(_res));
ROW_N(_r) = RES_COL_N(_res);
if (!ROW_VALUES(_r))
{
LOG(L_ERR, "DBT:convert_row: No memory left\n");
return -1;
}
for(i = 0; i < RES_COL_N(_res); i++)
{
(ROW_VALUES(_r)[i]).nul = DBT_CON_ROW(_h)->fields[i].nul;
switch(RES_TYPES(_res)[i])
{
case DB_INT:
VAL_INT(&(ROW_VALUES(_r)[i])) =
DBT_CON_ROW(_h)->fields[i].val.int_val;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_INT;
break;
case DB_DOUBLE:
VAL_DOUBLE(&(ROW_VALUES(_r)[i])) =
DBT_CON_ROW(_h)->fields[i].val.double_val;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_DOUBLE;
break;
case DB_STRING:
VAL_STR(&(ROW_VALUES(_r)[i])).s =
DBT_CON_ROW(_h)->fields[i].val.str_val.s;
VAL_STR(&(ROW_VALUES(_r)[i])).len =
DBT_CON_ROW(_h)->fields[i].val.str_val.len;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_STR;
break;
case DB_STR:
VAL_STR(&(ROW_VALUES(_r)[i])).s =
DBT_CON_ROW(_h)->fields[i].val.str_val.s;
VAL_STR(&(ROW_VALUES(_r)[i])).len =
DBT_CON_ROW(_h)->fields[i].val.str_val.len;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_STR;
break;
case DB_DATETIME:
VAL_INT(&(ROW_VALUES(_r)[i])) =
DBT_CON_ROW(_h)->fields[i].val.int_val;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_INT;
break;
case DB_BLOB:
VAL_STR(&(ROW_VALUES(_r)[i])).s =
DBT_CON_ROW(_h)->fields[i].val.str_val.s;
VAL_STR(&(ROW_VALUES(_r)[i])).len =
DBT_CON_ROW(_h)->fields[i].val.str_val.len;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_STR;
break;
case DB_BITMAP:
VAL_INT(&(ROW_VALUES(_r)[i])) =
DBT_CON_ROW(_h)->fields[i].val.bitmap_val;
VAL_TYPE(&(ROW_VALUES(_r)[i])) = DB_INT;
break;
}
}
return 0;
}
示例5: load_pcres
/*! \brief Convert the file content into regular expresions and store them in pcres */
static int load_pcres(int action)
{
int i, j;
FILE *f;
char line[FILE_MAX_LINE];
char **patterns = NULL;
pcre *pcre_tmp = NULL;
size_t pcre_size;
int pcre_rc;
const char *pcre_error;
int pcre_erroffset;
int num_pcres_tmp = 0;
pcre **pcres_tmp = NULL;
/* Get the lock */
lock_get(reload_lock);
if (!(f = fopen(file, "r"))) {
LM_ERR("could not open file '%s'\n", file);
goto err;
}
/* Array containing each pattern in the file */
if ((patterns = pkg_malloc(sizeof(char*) * max_groups)) == 0) {
LM_ERR("no more memory for patterns\n");
fclose(f);
goto err;
}
memset(patterns, 0, sizeof(char*) * max_groups);
for (i=0; i<max_groups; i++) {
if ((patterns[i] = pkg_malloc(sizeof(char) * group_max_size)) == 0) {
LM_ERR("no more memory for patterns[%d]\n", i);
fclose(f);
goto err;
}
memset(patterns[i], '\0', group_max_size);
}
/* Read the file and extract the patterns */
memset(line, '\0', FILE_MAX_LINE);
i = -1;
while (fgets(line, FILE_MAX_LINE, f) != NULL) {
/* Ignore comments and lines starting by space, tab, CR, LF */
if(isspace(line[0]) || line[0]=='#') {
memset(line, '\0', FILE_MAX_LINE);
continue;
}
/* First group */
if (i == -1 && line[0] != '[') {
LM_ERR("first group must be initialized with [0] before any regular expression\n");
fclose(f);
goto err;
}
/* New group */
if (line[0] == '[') {
i++;
/* Check if there are more patterns than the max value */
if (i >= max_groups) {
LM_ERR("max patterns exceeded\n");
fclose(f);
goto err;
}
/* Start the regular expression with '(' */
patterns[i][0] = '(';
memset(line, '\0', FILE_MAX_LINE);
continue;
}
/* Check if the patter size is too big (aprox) */
if (strlen(patterns[i]) + strlen(line) >= group_max_size - 2) {
LM_ERR("pattern max file exceeded\n");
fclose(f);
goto err;
}
/* Append ')' at the end of the line */
if (line[strlen(line) - 1] == '\n') {
line[strlen(line)] = line[strlen(line) - 1];
line[strlen(line) - 2] = ')';
} else {
/* This is the last char in the file and it's not \n */
line[strlen(line)] = ')';
}
/* Append '(' at the beginning of the line */
memcpy(patterns[i]+strlen(patterns[i]), "(", 1);
/* Append the line to the current pattern */
memcpy(patterns[i]+strlen(patterns[i]), line, strlen(line));
memset(line, '\0', FILE_MAX_LINE);
}
num_pcres_tmp = i + 1;
fclose(f);
//.........这里部分代码省略.........
示例6: dbt_result_extract_fields
int dbt_result_extract_fields(dbt_table_p _dtp, dbt_row_p _drp,
int* _lres, dbt_result_p _dres)
{
dbt_row_p _rp=NULL;
int i, n;
if(!_dtp || !_drp || !_dres || _dres->nrcols<=0)
return -1;
_rp = dbt_result_new_row(_dres);
if(!_rp)
return -1;
for(i=0; i<_dres->nrcols; i++)
{
n = (_lres)?_lres[i]:i;
if(dbt_is_neq_type(_dres->colv[i].type, _dtp->colv[n]->type))
{
LM_DBG("wrong types!\n");
goto clean;
}
_rp->fields[i].nul = _drp->fields[n].nul;
if(_rp->fields[i].nul)
{
memset(&(_rp->fields[i].val), 0, sizeof(_rp->fields[i].val));
continue;
}
switch(_dres->colv[i].type)
{
case DB1_INT:
case DB1_DATETIME:
case DB1_BITMAP:
_rp->fields[i].type = _dres->colv[i].type;
_rp->fields[i].val.int_val = _drp->fields[n].val.int_val;
break;
case DB1_DOUBLE:
_rp->fields[i].type = DB1_DOUBLE;
_rp->fields[i].val.double_val=_drp->fields[n].val.double_val;
break;
case DB1_STRING:
case DB1_STR:
case DB1_BLOB:
_rp->fields[i].type = _dres->colv[i].type;
_rp->fields[i].val.str_val.len =
_drp->fields[n].val.str_val.len;
_rp->fields[i].val.str_val.s =(char*)pkg_malloc(sizeof(char)*
(_drp->fields[n].val.str_val.len+1));
if(!_rp->fields[i].val.str_val.s)
goto clean;
memcpy(_rp->fields[i].val.str_val.s,
_drp->fields[n].val.str_val.s,
_rp->fields[i].val.str_val.len);
_rp->fields[i].val.str_val.s[_rp->fields[i].val.str_val.len]=0;
break;
default:
goto clean;
}
}
if(_dres->rows)
(_dres->rows)->prev = _rp;
_rp->next = _dres->rows;
_dres->rows = _rp;
_dres->nrrows++;
return 0;
clean:
LM_DBG("make clean!\n");
while(i>=0)
{
if((_rp->fields[i].type == DB1_STRING
|| _rp->fields[i].type == DB1_STR
|| _rp->fields[i].type == DB1_BLOB)
&& !_rp->fields[i].nul
&& _rp->fields[i].val.str_val.s)
pkg_free(_rp->fields[i].val.str_val.s);
i--;
}
pkg_free(_rp->fields);
pkg_free(_rp);
return -1;
}
示例7: send_sip_msg_request
int send_sip_msg_request(str *to, str *from_user, str *body)
{
str msg_type = STR_STATIC_INIT("MESSAGE");
str from;
str hdrs;
int foo;
char *p;
uac_req_t uac_r;
from.s = hdrs.s = 0;
from.len = hdrs.len = 0;
/* From header */
from.len = 6 /*"<sip:+"*/ + from_user->len/*user*/ + 1/*"@"*/
+ domain.len /*host*/ + 1 /*">"*/ ;
from.s = (char*)pkg_malloc(from.len);
if (!from.s)
goto error;
p=from.s;
append_str(p,"<sip:+",6);
append_str(p,from_user->s,from_user->len);
*(p++)='@';
append_str(p,domain.s,domain.len);
*(p++)='>';
/* hdrs = Contact header + Content-type */
/* length */
hdrs.len = CONTENT_TYPE_HDR_LEN + CRLF_LEN;
if (use_contact)
hdrs.len += 15 /*"Contact: <sip:+"*/ + from_user->len/*user*/ +
1/*"@"*/ + domain.len/*host*/ + 1 /*">"*/ + CRLF_LEN;
hdrs.s = (char*)pkg_malloc(hdrs.len);
if (!hdrs.s)
goto error;
p=hdrs.s;
append_str(p,CONTENT_TYPE_HDR,CONTENT_TYPE_HDR_LEN);
append_str(p,CRLF,CRLF_LEN);
if (use_contact) {
append_str(p,"Contact: <sip:+",15);
append_str(p,from_user->s,from_user->len);
*(p++)='@';
append_str(p,domain.s,domain.len);
append_str(p,">"CRLF,1+CRLF_LEN);
}
/* sending the request */
set_uac_req(&uac_r,
&msg_type, /* request type */
&hdrs, /* Additional headers including CRLF */
body, /* Message body */
0, /* dialog structure */
0, /* callback flags */
0, /* Callback function */
0 /* Callback parameter */
);
foo = tmb.t_request(&uac_r,
0, /* Request-URI */
to, /* To */
&from, /* From */
0 /* next hop */
);
if (from.s) pkg_free(from.s);
if (hdrs.s) pkg_free(hdrs.s);
return foo;
error:
LM_ERR("no free pkg memory!\n");
if (from.s) pkg_free(from.s);
if (hdrs.s) pkg_free(hdrs.s);
return -1;
}
示例8: alter_mediaip
static int alter_mediaip(struct sip_msg *msg, str *body, str *oldip, int oldpf,
str *newip, int newpf, int preserve)
{
char *buf;
int offset;
struct lump* anchor;
str omip, nip, oip;
/* check that updating mediaip is really necessary */
if (oldpf == newpf && isnulladdr(oldip, oldpf))
return 0;
if (newip->len == oldip->len && memcmp(newip->s, oldip->s, newip->len) == 0)
return 0;
/*
* Since rewriting the same info twice will mess SDP up,
* apply simple anti foot shooting measure - put flag on
* messages that have been altered and check it when
* another request comes.
*/
#if 0
/* disabled:
* - alter_mediaip is called twice if 2 c= lines are present
* in the sdp (and we want to allow it)
* - the message flags are propagated in the on_reply_route
* => if we set the flags for the request they will be seen for the
* reply too, but we don't want that
* --andrei
*/
if (msg->msg_flags & FL_SDP_IP_AFS) {
LOG(L_ERR, "ERROR: alter_mediaip: you can't rewrite the same "
"SDP twice, check your config!\n");
return -1;
}
#endif
if (preserve != 0) {
anchor = anchor_lump(msg, body->s + body->len - msg->buf , 0, 0);
if (anchor == NULL)
{
LOG(L_ERR, "ERROR: alter_mediaip: anchor_lump failed\n");
return -1;
}
if (oldpf == AF_INET6)
{
omip.s = AOLDMEDIP6 ;
omip.len = AOLDMEDIP6_LEN;
} else {
omip.s = AOLDMEDIP;
omip.len = AOLDMEDIP_LEN;
}
buf = pkg_malloc(omip.len + oldip->len + CRLF_LEN);
if (buf == NULL)
{
LOG(L_ERR, "ERROR: alter_mediaip: out of memory\n");
return -1;
}
memcpy(buf, omip.s, omip.len);
memcpy(buf + omip.len, oldip->s, oldip->len);
memcpy(buf + omip.len + oldip->len, CRLF, CRLF_LEN);
if (insert_new_lump_after(anchor, buf,
omip.len + oldip->len + CRLF_LEN, 0) == NULL) {
LOG(L_ERR, "ERROR: alter_mediaip: insert_new_lump_after failed\n");
pkg_free(buf);
return -1;
}
}
if (oldpf == newpf) {
nip.len = newip->len;
nip.s = pkg_malloc(nip.len);
if (nip.s == NULL) {
LOG(L_ERR, "ERROR: alter_mediaip: out of memory\n");
return -1;
}
memcpy(nip.s, newip->s, newip->len);
} else {
nip.len = newip->len + 2;
nip.s = pkg_malloc(nip.len);
if (nip.s == NULL) {
LOG(L_ERR, "ERROR: alter_mediaip: out of memory\n");
return -1;
}
memcpy(nip.s + 2, newip->s, newip->len);
nip.s[0] = (newpf == AF_INET6) ? '6' : '4';
nip.s[1] = ' ';
}
oip = *oldip;
if (oldpf != newpf) {
do {
oip.s--;
oip.len++;
} while (*oip.s != '6' && *oip.s != '4');
}
offset = oip.s - msg->buf;
anchor = del_lump(msg, offset, oip.len, 0);
if (anchor == NULL) {
LOG(L_ERR, "ERROR: alter_mediaip: del_lump failed\n");
pkg_free(nip.s);
//.........这里部分代码省略.........
示例9: alter_mediaport
static int alter_mediaport(struct sip_msg *msg, str *body, str *oldport, str *newport,
int preserve)
{
char *buf;
int offset;
struct lump* anchor;
/* check that updating mediaport is really necessary */
if (newport->len == oldport->len &&
memcmp(newport->s, oldport->s, newport->len) == 0)
return 0;
/*
* Since rewriting the same info twice will mess SDP up,
* apply simple anti foot shooting measure - put flag on
* messages that have been altered and check it when
* another request comes.
*/
#if 0
/* disabled: - it propagates to the reply and we don't want this
* -- andrei */
if (msg->msg_flags & FL_SDP_PORT_AFS) {
LOG(L_ERR, "ERROR: alter_mediaip: you can't rewrite the same "
"SDP twice, check your config!\n");
return -1;
}
#endif
if (preserve != 0) {
anchor = anchor_lump(msg, body->s + body->len - msg->buf, 0, 0);
if (anchor == NULL) {
LOG(L_ERR, "ERROR: alter_mediaport: anchor_lump failed\n");
return -1;
}
buf = pkg_malloc(AOLDMEDPRT_LEN + oldport->len + CRLF_LEN);
if (buf == NULL) {
LOG(L_ERR, "ERROR: alter_mediaport: out of memory\n");
return -1;
}
memcpy(buf, AOLDMEDPRT, AOLDMEDPRT_LEN);
memcpy(buf + AOLDMEDPRT_LEN, oldport->s, oldport->len);
memcpy(buf + AOLDMEDPRT_LEN + oldport->len, CRLF, CRLF_LEN);
if (insert_new_lump_after(anchor, buf,
AOLDMEDPRT_LEN + oldport->len + CRLF_LEN, 0) == NULL) {
LOG(L_ERR, "ERROR: alter_mediaport: insert_new_lump_after failed\n");
pkg_free(buf);
return -1;
}
}
buf = pkg_malloc(newport->len);
if (buf == NULL) {
LOG(L_ERR, "ERROR: alter_mediaport: out of memory\n");
return -1;
}
offset = oldport->s - msg->buf;
anchor = del_lump(msg, offset, oldport->len, 0);
if (anchor == NULL) {
LOG(L_ERR, "ERROR: alter_mediaport: del_lump failed\n");
pkg_free(buf);
return -1;
}
memcpy(buf, newport->s, newport->len);
if (insert_new_lump_after(anchor, buf, newport->len, 0) == 0) {
LOG(L_ERR, "ERROR: alter_mediaport: insert_new_lump_after failed\n");
pkg_free(buf);
return -1;
}
#if 0
msg->msg_flags |= FL_SDP_PORT_AFS;
#endif
return 0;
}
示例10: UseMediaProxy
static int
UseMediaProxy(struct sip_msg* msg, char* str1, char* str2)
{
str sdp, sessionIP, callId, fromDomain, toDomain, userAgent, tokens[64];
str fromAddr, toAddr, fromTag, toTag;
char *clientIP, *ptr, *command, *result, *agent, *fromType, *toType, *info;
int streamCount, i, port, count, portCount, cmdlen, infolen, success, type;
StreamInfo streams[64], stream;
Bool request;
if (msg->first_line.type == SIP_REQUEST) {
if (msg->first_line.u.request.method_value == METHOD_INVITE)
type = MSG_INVITE;
else if (msg->first_line.u.request.method_value == METHOD_ACK)
type = MSG_ACK;
else
type = MSG_UNKNOWN;
} else if (msg->first_line.type == SIP_REPLY) {
type = MSG_REPLY;
} else {
type = MSG_UNKNOWN;
}
if (type==MSG_INVITE || type==MSG_ACK) {
request = True;
} else if (type==MSG_REPLY) {
request = False;
} else {
return -1;
}
if (!getCallId(msg, &callId)) {
LOG(L_ERR, "error: use_media_proxy(): can't get Call-Id\n");
return -1;
}
success = getSDPMessage(msg, &sdp);
if (success==0 && type==MSG_ACK) {
return 1; // nothing to do. it's ok for ACK to not have a SDP body
} else if (success <= 0) {
LOG(L_ERR, "error: use_media_proxy(): failed to get the SDP message\n");
return -1;
}
if (!getSessionLevelMediaIP(&sdp, &sessionIP)) {
LOG(L_ERR, "error: use_media_proxy(): error parsing the SDP message\n");
return -1;
}
streamCount = getMediaStreams(&sdp, &sessionIP, streams, 64);
if (streamCount == -1) {
LOG(L_ERR, "error: use_media_proxy(): can't extract media streams "
"from the SDP message\n");
return -1;
}
if (streamCount == 0) {
// there are no media streams. we have nothing to do.
return 1;
}
fromDomain = getFromDomain(&fromType, msg);
fromAddr = getFromAddress(msg);
toAddr = getToAddress(msg);
fromTag = getFromTag(msg);
toTag = getToTag(msg);
userAgent = getUserAgent(msg);
if (request) {
toDomain = getDestinationDomain(&toType, msg); // call only for requests
} else {
toDomain = getToDomain(&toType, msg);
}
clientIP = ip_addr2a(&msg->rcv.src_ip);
infolen = fromAddr.len + toAddr.len + fromTag.len + toTag.len + 64;
cmdlen = callId.len + strlen(clientIP) + fromDomain.len + toDomain.len +
userAgent.len*3 + infolen + 128;
for (i=0; i<streamCount; i++) {
stream = streams[i];
cmdlen += stream.ip.len + stream.port.len + stream.type.len + 4;
}
command = pkg_malloc(cmdlen);
if (!command) {
LOG(L_ERR, "error: use_media_proxy(): out of memory\n");
return -1;
}
if (request)
count = sprintf(command, "request %.*s", callId.len, callId.s);
else
count = sprintf(command, "lookup %.*s", callId.len, callId.s);
for (i=0, ptr=command+count; i<streamCount; i++) {
char c = (i==0 ? ' ' : ',');
count = sprintf(ptr, "%c%.*s:%.*s:%.*s", c,
streams[i].ip.len, streams[i].ip.s,
//.........这里部分代码省略.........
示例11: rtpproxy_init
/* initialization of rtp_proxy module */
int rtpproxy_init()
{
memset(&rtpp_list, 0, sizeof(rtpp_list));
rtpp_node_count = 0;
if (rtpproxy_enable) {
/* Make rtp proxies list. */
char *p, *p1, *p2, *plim;
p = rtpproxy_sock;
plim = p + strlen(p);
for(;;) {
struct rtpp_node *pnode;
int weight;
weight = 1;
while (*p && isspace(*p))
++p;
if (p >= plim)
break;
p1 = p;
while (*p && !isspace(*p))
++p;
if (p <= p1)
break; /* may happen??? */
/* Have weight specified? If yes, scan it */
p2 = memchr(p1, '=', p - p1);
if (p2 != NULL) {
weight = strtoul(p2 + 1, NULL, 10);
} else {
p2 = p;
}
pnode = pkg_malloc(sizeof(struct rtpp_node));
if (pnode == NULL) {
LOG(L_ERR, "nathelper: Can't allocate memory\n");
return -1;
}
memset(pnode, 0, sizeof(*pnode));
pnode->rn_recheck_ticks = 0;
pnode->rn_weight = weight;
pnode->rn_umode = 0;
pnode->rn_fd = -1;
pnode->rn_disabled = 0;
pnode->rn_url = pkg_malloc(p2 - p1 + 1);
LOG(L_INFO,"INFO:"M_NAME"node is created\n") ;
if (pnode->rn_url == NULL) {
LOG(L_ERR, "nathelper: Can't allocate memory\n");
return -1;
}
/*LOG(L_CRIT,"started to add the pnode to rtpp list\n") ; */
/* adding proxy nodes to the list */
memmove(pnode->rn_url, p1, p2 - p1);
pnode->rn_url[p2 - p1] = 0;
if (rtpp_list.rn_first == NULL) {
rtpp_list.rn_first = pnode;
} else {
rtpp_list.rn_last->rn_next = pnode;
}
rtpp_list.rn_last = pnode;
++rtpp_node_count;
/* Leave only address in rn_address */
pnode->rn_address = pnode->rn_url;
if (strncmp(pnode->rn_address, "udp:", 4) == 0) {
pnode->rn_umode = 1;
pnode->rn_address += 4;
} else if (strncmp(pnode->rn_address, "udp6:", 5) == 0) {
pnode->rn_umode = 6;
pnode->rn_address += 5;
} else if (strncmp(pnode->rn_address, "unix:", 5) == 0) {
pnode->rn_umode = 0;
pnode->rn_address += 5;
}
/* LOG(L_CRIT,"is getting out of the rtp block\n") ;*/
}
}
return 1;
}
示例12: checkAsymmetricFile
// Check if the requested asymmetrics file has changed and reload it if needed
static void
checkAsymmetricFile(AsymmetricClients *aptr)
{
char buf[512], errbuf[256], *which;
regex_t *re, **regs;
int i, size, code;
Bool firstTime = False;
struct stat statbuf;
FILE *file;
str line;
if (stat(aptr->file, &statbuf) < 0)
return; // ignore missing file
if (statbuf.st_mtime <= aptr->timestamp)
return; // not changed
// now we have work to do
which = (aptr == &sipAsymmetrics ? "SIP" : "RTP");
if (!aptr->clients) {
// if we are here the first time allocate memory to hold the regexps
// initial size of array
// (hopefully not reached so we won't need to realloc)
size = 32;
aptr->clients = (regex_t**)pkg_malloc(size*sizeof(regex_t**));
if (!aptr->clients) {
LOG(L_WARN, "warning: mediaproxy/checkAsymmetricFile() cannot "
"allocate memory for the %s asymmetric client list. "
"%s asymmetric clients will not be handled properly.\n",
which, which);
return; // ignore as it is not fatal
}
aptr->size = size;
aptr->count = 0;
firstTime = True;
} else {
// else clean old stuff
for (i=0; i<aptr->count; i++) {
regfree(aptr->clients[i]);
pkg_free(aptr->clients[i]);
aptr->clients[i] = NULL;
}
aptr->count = 0;
}
// read new
file = fopen(aptr->file, "r");
i = 0; // this will count on which line are we in the file
while (!feof(file)) {
if (!fgets(buf, 512, file))
break;
i++;
line.s = buf;
line.len = strlen(buf);
trim(&line);
if (line.len == 0 || line.s[0] == '#')
continue; // comment or empty line. ignore
line.s[line.len] = 0;
re = (regex_t*)pkg_malloc(sizeof(regex_t));
if (!re) {
LOG(L_WARN, "warning: mediaproxy/checkAsymmetricFile(): "
"cannot allocate memory for all the %s asymmetric "
"clients listed in file. Some of them will not be "
"handled properly.\n", which);
break;
}
code = regcomp(re, line.s, REG_EXTENDED|REG_ICASE|REG_NOSUB);
if (code == 0) {
if (aptr->count+1 > aptr->size) {
size = aptr->size * 2;
regs = aptr->clients;
regs = (regex_t**)pkg_realloc(regs, size*sizeof(regex_t**));
if (!regs) {
LOG(L_WARN, "warning: mediaproxy/checkAsymmetricFile(): "
"cannot allocate memory for all the %s asymmetric "
"clients listed in file. Some of them will not be "
"handled properly.\n", which);
break;
}
aptr->clients = regs;
aptr->size = size;
}
aptr->clients[aptr->count] = re;
aptr->count++;
} else {
regerror(code, re, errbuf, 256);
LOG(L_WARN, "warning: mediaproxy/checkAsymmetricFile(): cannot "
"compile line %d of the %s asymmetric clients file into a "
"regular expression (will be ignored): %s", i, which, errbuf);
pkg_free(re);
}
}
aptr->timestamp = statbuf.st_mtime;
//.........这里部分代码省略.........
示例13: ht_cell_value_add
ht_cell_t* ht_cell_value_add(ht_t *ht, str *name, int val, ht_cell_t *old)
{
unsigned int idx;
unsigned int hid;
ht_cell_t *it, *prev, *cell;
time_t now;
int_str isval;
if(ht==NULL || ht->entries==NULL)
return NULL;
hid = ht_compute_hash(name);
idx = ht_get_entry(hid, ht->htsize);
now = 0;
if(ht->htexpire>0)
now = time(NULL);
prev = NULL;
ht_slot_lock(ht, idx);
it = ht->entries[idx].first;
while(it!=NULL && it->cellid < hid)
{
prev = it;
it = it->next;
}
while(it!=NULL && it->cellid == hid)
{
if(name->len==it->name.len
&& strncmp(name->s, it->name.s, name->len)==0)
{
/* found */
if(now>0 && it->expire!=0 && it->expire<now) {
/* entry has expired */
if(ht->flags==PV_VAL_INT) {
/* initval is integer, use it to create a fresh entry */
it->flags &= ~AVP_VAL_STR;
it->value.n = ht->initval.n;
/* increment will be done below */
} else {
ht_slot_unlock(ht, idx);
return NULL;
}
}
/* update value */
if(it->flags&AVP_VAL_STR)
{
/* string value cannot be incremented */
ht_slot_unlock(ht, idx);
return NULL;
} else {
it->value.n += val;
if(ht->updateexpire)
it->expire = now + ht->htexpire;
if(old!=NULL)
{
if(old->msize>=it->msize)
{
memcpy(old, it, it->msize);
ht_slot_unlock(ht, idx);
return old;
}
}
cell = (ht_cell_t*)pkg_malloc(it->msize);
if(cell!=NULL)
memcpy(cell, it, it->msize);
ht_slot_unlock(ht, idx);
return cell;
}
}
prev = it;
it = it->next;
}
/* add val if htable has an integer init value */
if(ht->flags!=PV_VAL_INT)
{
ht_slot_unlock(ht, idx);
return NULL;
}
isval.n = ht->initval.n + val;
it = ht_cell_new(name, 0, &isval, hid);
if(it == NULL)
{
LM_ERR("cannot create new cell.\n");
ht_slot_unlock(ht, idx);
return NULL;
}
it->expire = now + ht->htexpire;
if(prev==NULL)
{
if(ht->entries[idx].first!=NULL)
{
it->next = ht->entries[idx].first;
ht->entries[idx].first->prev = it;
}
ht->entries[idx].first = it;
} else {
it->next = prev->next;
//.........这里部分代码省略.........
示例14: my_pkg_malloc
void* my_pkg_malloc(size_t size){
return pkg_malloc(size);
}
示例15: buffer
//.........这里部分代码省略.........
}
fl->type=SIP_REQUEST;
fl->u.request.method_value=METHOD_OTHER;
fl->u.request.method.len=tmp-buffer;
}
/* identifying type of message over now;
tmp points at space after; go ahead */
fl->u.request.method.s=buffer; /* store ptr to first token */
second=tmp+1; /* jump to second token */
offset=second-buffer;
/* EoJku */
/* next element */
tmp=eat_token_end(second, second+len-offset);
if (tmp>=end){
goto error;
}
offset+=tmp-second;
third=eat_space_end(tmp, tmp+len-offset);
offset+=third-tmp;
if ((third==tmp)||(tmp>=end)){
goto error;
}
fl->u.request.uri.s=second;
fl->u.request.uri.len=tmp-second;
/* jku: parse status code */
if (fl->type==SIP_REPLY) {
if (fl->u.request.uri.len!=3) {
LOG(L_INFO, "ERROR:parse_first_line: len(status code)!=3: %.*s\n",
fl->u.request.uri.len, ZSW(second) );
goto error;
}
s1=*second; s2=*(second+1);s3=*(second+2);
if (s1>='0' && s1<='9' &&
s2>='0' && s2<='9' &&
s3>='0' && s3<='9' ) {
fl->u.reply.statuscode=(s1-'0')*100+10*(s2-'0')+(s3-'0');
} else {
LOG(L_INFO, "ERROR:parse_first_line: status_code non-numerical: %.*s\n",
fl->u.request.uri.len, ZSW(second) );
goto error;
}
}
/* EoJku */
/* last part: for a request it must be the version, for a reply
* it can contain almost anything, including spaces, so we don't care
* about it*/
if (fl->type==SIP_REQUEST){
tmp=eat_token_end(third,third+len-offset);
offset+=tmp-third;
if ((tmp==third)||(tmp>=end)){
goto error;
}
if (! is_empty_end(tmp, tmp+len-offset)){
goto error;
}
}else{
tmp=eat_token2_end(third,third+len-offset,'\r'); /* find end of line
('\n' or '\r') */
if (tmp>=end){ /* no crlf in packet => invalid */
goto error;
}
offset+=tmp-third;
}
nl=eat_line(tmp,len-offset);
if (nl>=end){ /* no crlf in packet or only 1 line > invalid */
goto error;
}
fl->u.request.version.s=third;
fl->u.request.version.len=tmp-third;
fl->len=nl-buffer;
return nl;
error:
LOG(L_DBG, "parse_first_line: bad %s first line\n",
(fl->type==SIP_REPLY)?"reply(status)":"request");
LOG(L_DBG, "at line 0 char %d: \n", offset );
prn=pkg_malloc( offset );
if (prn) {
for (t=0; t<offset; t++)
if (*(buffer+t)) *(prn+t)=*(buffer+t);
else *(prn+t)=176; /* '°' */
LOG(L_DBG, "parsed so far: %.*s\n", offset, ZSW(prn) );
pkg_free( prn );
};
error1:
fl->type=SIP_INVALID;
LOG(L_ERR, "parse_first_line: bad message (offset: %d)\n", offset);
/* skip line */
nl=eat_line(buffer,len);
return nl;
}