int eXosip_options_build_request (osip_message_t ** options, const char *to, const char *from, const char *route) { int i; *options = NULL; if (to != NULL && *to == '\0') return -1; if (from != NULL && *from == '\0') return -1; if (route != NULL && *route == '\0') route = NULL; i = generating_request_out_of_dialog (options, "OPTIONS", to, "UDP", from, route); if (i != 0) return -1; /* after this delay, we should send a CANCEL */ osip_message_set_expires (*options, "120"); /* osip_message_set_organization(*invite, "Jack's Org"); */ return 0; }
int eXosip_build_publish (struct eXosip_t *excontext, osip_message_t ** message, const char *to, const char *from, const char *route, const char *event, const char *expires, const char *ctype, const char *body) { int i; *message = NULL; if (to == NULL || to[0] == '\0') return OSIP_BADPARAMETER; if (from == NULL || from[0] == '\0') return OSIP_BADPARAMETER; if (event == NULL || event[0] == '\0') return OSIP_BADPARAMETER; if (ctype == NULL || ctype[0] == '\0') { if (body != NULL && body[0] != '\0') return OSIP_BADPARAMETER; } else { if (body == NULL || body[0] == '\0') return OSIP_BADPARAMETER; } i = _eXosip_generating_publish (excontext, message, to, from, route); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot send message (cannot build PUBLISH)! ")); return i; } if (body != NULL && body[0] != '\0' && ctype != NULL && ctype[0] != '\0') { osip_message_set_content_type (*message, ctype); osip_message_set_body (*message, body, strlen (body)); /* osip_message_set_header (*message, "Content-Disposition", "render;handling=required"); */ } if (expires != NULL && expires[0] != '\0') osip_message_set_expires (*message, expires); else osip_message_set_expires (*message, "3600"); osip_message_set_header (*message, "Event", event); return OSIP_SUCCESS; }
int sal_unsubscribe(SalOp *op){ osip_message_t *msg=NULL; if (op->did==-1){ ms_error("cannot unsubscribe, no dialog !"); return -1; } eXosip_lock(); eXosip_subscribe_build_refresh_request(op->did,&msg); if (msg){ osip_message_set_expires(msg,"0"); eXosip_subscribe_send_refresh_request(op->did,msg); }else ms_error("Could not build subscribe refresh request ! op->sid=%i, op->did=%i", op->sid,op->did); eXosip_unlock(); return 0; }
void _eXosip_notify_add_expires_in_2XX_for_subscribe(eXosip_notify_t * jn, osip_message_t * answer) { char tmp[20]; time_t now; now = osip_getsystemtime(NULL); if (jn->n_ss_expires - now < 0) { tmp[0] = '0'; tmp[1] = '\0'; } else { snprintf(tmp, 20, "%li", jn->n_ss_expires - now); } osip_message_set_expires(answer, tmp); }
int eXosip_subscribe_send_subscribe(eXosip_subscribe_t *js, eXosip_dialog_t *jd, const char *expires) { osip_transaction_t *transaction; osip_message_t *subscribe; osip_event_t *sipevent; int i; transaction = eXosip_find_last_out_subscribe(js, jd); if (transaction!=NULL) { if (transaction->state!=NICT_TERMINATED && transaction->state!=NIST_TERMINATED) return -1; } i = _eXosip_build_request_within_dialog(&subscribe, "SUBSCRIBE", jd->d_dialog, "UDP"); if (i!=0) return -2; osip_message_set_expires(subscribe, expires); i = osip_transaction_init(&transaction, NICT, eXosip.j_osip, subscribe); if (i!=0) { /* TODO: release the j_call.. */ osip_message_free(subscribe); return -1; } _eXosip_subscribe_set_refresh_interval(js, subscribe); osip_list_add(jd->d_out_trs, transaction, 0); sipevent = osip_new_outgoing_sipmessage(subscribe); sipevent->transactionid = transaction->transactionid; osip_transaction_add_event(transaction, sipevent); osip_transaction_set_your_instance(transaction, __eXosip_new_jinfo(NULL, jd, js, NULL)); __eXosip_wakeup(); return 0; }
/* this method can't be called unless the previous INVITE transaction is over. */ int eXosip_call_build_initial_invite (osip_message_t ** invite, const char *to, const char *from, const char *route, const char *subject) { int i; osip_to_t *_to = NULL; *invite = NULL; if (to != NULL && *to == '\0') return OSIP_BADPARAMETER; if (route != NULL && *route == '\0') route = NULL; if (subject != NULL && *subject == '\0') subject = NULL; i = osip_to_init (&_to); if (i != 0) return i; i = osip_to_parse (_to, to); if (i != 0) { osip_to_free (_to); return i; } i = generating_request_out_of_dialog (invite, "INVITE", to, eXosip.transport, from, route); osip_to_free (_to); if (i != 0) return i; _eXosip_dialog_add_contact (*invite, NULL); if (subject != NULL) osip_message_set_subject (*invite, subject); /* after this delay, we should send a CANCEL */ osip_message_set_expires (*invite, "120"); return OSIP_SUCCESS; }
int eXosip_subscribe_build_initial_request (struct eXosip_t *excontext, osip_message_t ** sub, const char *to, const char *from, const char *route, const char *event, int expires) { char tmp[10]; int i; osip_to_t *_to = NULL; *sub = NULL; if (to == NULL || *to == '\0') return OSIP_BADPARAMETER; if (from == NULL || *from == '\0') return OSIP_BADPARAMETER; if (event == NULL || *event == '\0') return OSIP_BADPARAMETER; if (route == NULL || *route == '\0') route = NULL; i = osip_to_init (&_to); if (i != 0) return i; i = osip_to_parse (_to, to); if (i != 0) { osip_to_free (_to); return i; } i = _eXosip_generating_request_out_of_dialog (excontext, sub, "SUBSCRIBE", to, excontext->transport, from, route); osip_to_free (_to); if (i != 0) return i; _eXosip_dialog_add_contact (excontext, *sub, NULL); snprintf (tmp, 10, "%i", expires); osip_message_set_expires (*sub, tmp); osip_message_set_header (*sub, "Event", event); return OSIP_SUCCESS; }
/* * send answer to a registration request. * flag = STS_SUCCESS -> positive answer (200) * flag = STS_FAILURE -> negative answer (503) * flag = STS_NEED_AUTH -> proxy authentication needed (407) * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int register_response(sip_ticket_t *ticket, int flag) { osip_message_t *response; int code; int sts; osip_via_t *via; int port; char *buffer; size_t buflen; struct in_addr addr; osip_header_t *expires_hdr; /* ok -> 200, fail -> 503 */ switch (flag) { case STS_SUCCESS: code = 200; /* OK */ break; case STS_FAILURE: code = 503; /* failed */ break; case STS_NEED_AUTH: code = 407; /* proxy authentication needed */ break; default: code = 503; /* failed */ break; } /* create the response template */ if ((response=msg_make_template_reply(ticket, code))==NULL) { ERROR("register_response: error in msg_make_template_reply"); return STS_FAILURE; } /* insert the expiration header */ osip_message_get_expires(ticket->sipmsg, 0, &expires_hdr); if (expires_hdr) { osip_message_set_expires(response, expires_hdr->hvalue); } /* if we send back an proxy authentication needed, include the Proxy-Authenticate field */ if (code == 407) { auth_include_authrq(response); } /* get the IP address from existing VIA header */ osip_message_get_via (response, 0, &via); if (via == NULL) { ERROR("register_response: Cannot send response - no via field"); return STS_FAILURE; } /* name resolution needed? */ if (utils_inet_aton(via->host,&addr) == 0) { /* yes, get IP address */ sts = get_ip_by_host(via->host, &addr); if (sts == STS_FAILURE) { DEBUGC(DBCLASS_REG, "register_response: cannot resolve VIA [%s]", via->host); return STS_FAILURE; } } sts = sip_message_to_str(response, &buffer, &buflen); if (sts != 0) { ERROR("register_response: msg_2char failed"); return STS_FAILURE; } /* send answer back */ if (via->port) { port=atoi(via->port); if ((port<=0) || (port>65535)) port=SIP_PORT; } else { port=configuration.sip_listen_port; } sipsock_send(addr, port, ticket->protocol, buffer, buflen); /* free the resources */ osip_message_free(response); free(buffer); return STS_SUCCESS; }
/* * handles register requests and updates the URL mapping table * * RETURNS: * STS_SUCCESS : successfully registered * STS_FAILURE : registration failed * STS_NEED_AUTH : authentication needed */ int register_client(sip_ticket_t *ticket, int force_lcl_masq) { int i, j, n, sts; int expires; time_t time_now; osip_contact_t *contact; osip_uri_t *url1_to, *url1_contact=NULL; osip_uri_t *url2_to; osip_header_t *expires_hdr; osip_uri_param_t *expires_param=NULL; /* * Authorization - do only if I'm not just acting as outbound proxy * but am ment to be the registrar */ if (force_lcl_masq == 0) { /* * RFC 3261, Section 16.3 step 6 * Proxy Behavior - Request Validation - Proxy-Authorization */ sts = authenticate_proxy(ticket->sipmsg); if (sts == STS_FAILURE) { /* failed */ WARN("proxy authentication failed for %s@%s", (ticket->sipmsg->to->url->username)? ticket->sipmsg->to->url->username : "******", ticket->sipmsg->to->url->host); return STS_FAILURE; } else if (sts == STS_NEED_AUTH) { /* needed */ DEBUGC(DBCLASS_REG,"proxy authentication needed for %s@%s", ticket->sipmsg->to->url->username, ticket->sipmsg->to->url->host); return STS_NEED_AUTH; } } /* fetch 1st Via entry and remember this address. Incoming requests for the registered address have to be passed on to that host. To: -> address to be registered Contact: -> host is reachable there Note: in case of un-REGISTER, the contact header may contain '*' only - which means "all registrations made by this UA" => Mapping is To: <1--n> Contact */ time(&time_now); DEBUGC(DBCLASS_BABBLE,"sip_register:"); /* * First make sure, we have a proper Contact header: * - url * - url -> hostname * * Libosip parses an: * "Contact: *" * the following way (Note: Display name!! and URL is NULL) * (gdb) p *((osip_contact_t*)(sip->contacts.node->element)) * $5 = {displayname = 0x8af8848 "*", url = 0x0, gen_params = 0x8af8838} */ osip_message_get_contact(ticket->sipmsg, 0, &contact); if ((contact == NULL) || (contact->url == NULL) || (contact->url->host == NULL)) { /* Don't have required Contact fields. This may be a Registration query or unregistering all registered records for this UA. We should simply forward this request to its destination. However, if this is an unregistration from a client that is not registered (Grandstream "unregister at startup" option) -> How do I handle this one? Right now we do a direction lookup and if this fails we generate an OK message by ourself (fake) */ DEBUGC(DBCLASS_REG, "empty Contact header - " "seems to be a registration query"); sts = sip_find_direction(ticket, NULL); if (sts != STS_SUCCESS) { /* answer the request myself. Most likely this is an UNREGISTER * request when the client just booted */ sts = register_response(ticket, STS_SUCCESS); return STS_SIP_SENT; } return STS_SUCCESS; } url1_contact=contact->url; /* evaluate Expires Header field */ osip_message_get_expires(ticket->sipmsg, 0, &expires_hdr); /* * look for an Contact expires parameter - in case of REGISTER * these two are equal. The Contact expires has higher priority! */ if (ticket->sipmsg->contacts.node && ticket->sipmsg->contacts.node->element) { osip_contact_param_get_byname( (osip_contact_t*) ticket->sipmsg->contacts.node->element, EXPIRES, &expires_param); } if (expires_param && expires_param->gvalue) { /* get expires from contact Header */ expires=atoi(expires_param->gvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } else if (expires_hdr && expires_hdr->hvalue) { /* get expires from expires Header */ expires=atoi(expires_hdr->hvalue); if ((expires < 0) || (expires >= UINT_MAX )) expires=configuration.default_expires; } else { char tmp[16]; /* it seems, the expires field is not present everywhere... */ DEBUGC(DBCLASS_REG,"no 'expires' header found - set time to %i sec", configuration.default_expires); expires=configuration.default_expires; sprintf(tmp,"%i",expires); osip_message_set_expires(ticket->sipmsg, tmp); } url1_to=ticket->sipmsg->to->url; /* * REGISTER */ if (expires > 0) { DEBUGC(DBCLASS_REG,"register: %s@%s expires=%i seconds", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", expires); /* * Update registration. There are two possibilities: * - already registered, then update the existing record * - not registered, then create a new record */ j=-1; for (i=0; i<URLMAP_SIZE; i++) { if (urlmap[i].active == 0) { if (j < 0) j=i; /* remember first hole */ continue; } url2_to=urlmap[i].reg_url; /* check address-of-record ("public address" of user) */ if (compare_url(url1_to, url2_to)==STS_SUCCESS) { DEBUGC(DBCLASS_REG, "found entry for %s@%s <-> %s@%s at " "slot=%i, exp=%li", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url2_to->username) ? url2_to->username : "******", (url2_to->host) ? url2_to->host : "*NULL*", i, (long)urlmap[i].expires-time_now); break; } } if ( (j < 0) && (i >= URLMAP_SIZE) ) { /* oops, no free entries left... */ ERROR("URLMAP is full - registration failed"); return STS_FAILURE; } if (i >= URLMAP_SIZE) { /* entry not existing, create new one */ i=j; /* write entry */ urlmap[i].active=1; /* Contact: field */ osip_uri_clone( ((osip_contact_t*) (ticket->sipmsg->contacts.node->element))->url, &urlmap[i].true_url); /* To: field */ osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].reg_url); DEBUGC(DBCLASS_REG,"create new entry for %s@%s <-> %s@%s at slot=%i", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (urlmap[i].reg_url->username) ? urlmap[i].reg_url->username : "******", (urlmap[i].reg_url->host) ? urlmap[i].reg_url->host : "*NULL*", i); /* * try to figure out if we ought to do some masquerading */ osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].masq_url); n=configuration.mask_host.used; if (n != configuration.masked_host.used) { ERROR("# of mask_host is not equal to # of masked_host in config!"); n=0; } DEBUG("%i entries in MASK config table", n); for (j=0; j<n; j++) { DEBUG("compare [%s] <-> [%s]",configuration.mask_host.string[j], ticket->sipmsg->to->url->host); if (strcmp(configuration.mask_host.string[j], ticket->sipmsg->to->url->host)==0) break; } if (j<n) { /* we are masquerading this UA, replace the host part of the url */ DEBUGC(DBCLASS_REG,"masquerading UA %s@%s as %s@%s", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url1_contact->username) ? url1_contact->username : "******", configuration.masked_host.string[j]); urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, strlen(configuration.masked_host.string[j])+1); strcpy(urlmap[i].masq_url->host, configuration.masked_host.string[j]); } } else { /* if new entry */ /* This is an existing entry */ /* * Some phones (like BudgeTones *may* dynamically grab a SIP port * so we might want to update the true_url and reg_url each time * we get an REGISTER */ /* Contact: field (true_url) */ osip_uri_free(urlmap[i].true_url); osip_uri_clone( ((osip_contact_t*) (ticket->sipmsg->contacts.node->element))->url, &urlmap[i].true_url); /* To: field (reg_url) */ osip_uri_free(urlmap[i].reg_url); osip_uri_clone( ticket->sipmsg->to->url, &urlmap[i].reg_url); } /* * for proxying: force device to be masqueraded * as with the outbound IP (masq_url) */ if (force_lcl_masq) { struct in_addr addr; char *addrstr; if (get_interface_ip(IF_OUTBOUND, &addr) != STS_SUCCESS) { return STS_FAILURE; } /* host part */ addrstr = utils_inet_ntoa(addr); DEBUGC(DBCLASS_REG,"masquerading UA %s@%s local %s@%s", (url1_contact->username) ? url1_contact->username : "******", (url1_contact->host) ? url1_contact->host : "*NULL*", (url1_contact->username) ? url1_contact->username : "******", addrstr); urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, strlen(addrstr)+1); strcpy(urlmap[i].masq_url->host, addrstr); /* port number if required */ if (configuration.sip_listen_port != SIP_PORT) { urlmap[i].masq_url->port=realloc(urlmap[i].masq_url->port, 16); sprintf(urlmap[i].masq_url->port, "%i", configuration.sip_listen_port); } } /* give some safety margin for the next update */ if (expires > 0) expires+=30; /* update registration timeout */ urlmap[i].expires=time_now+expires; /* * un-REGISTER */ } else { /* expires > 0 */ /* * Remove registration * Siproxd will ALWAYS remove ALL bindings for a given * address-of-record */ for (i=0; i<URLMAP_SIZE; i++) { if (urlmap[i].active == 0) continue; url2_to=urlmap[i].reg_url; if (compare_url(url1_to, url2_to)==STS_SUCCESS) { DEBUGC(DBCLASS_REG, "removing registration for %s@%s at slot=%i", (url2_to->username) ? url2_to->username : "******", (url2_to->host) ? url2_to->host : "*NULL*", i); urlmap[i].expires=0; break; } } } return STS_SUCCESS; }
int Node::SndRegister(REG_TYPE type , ChordId req_uri , ChordId to , ChordId contact , BOOL IncludeSuccList) { char *message1; unsigned int len = 0; osip_transaction_t *transaction; osip_event_t *sipevent; osip_message_t *request; /* temp uri */ char * tmp_uri; int i; i = osip_message_init(&request); if (i!=0) goto si2perror1; /* prepare the request-line */ osip_message_set_method(request, osip_strdup("REGISTER")); osip_message_set_version(request, osip_strdup("SIP/2.0")); osip_message_set_status_code(request, 0); osip_message_set_reason_phrase(request, NULL); //requset uri if(type == MULTICAST) { tmp_uri = osip_strdup("sip:224.0.1.75") ; } else tmp_uri = ChordId2Uri(req_uri,false) ; osip_uri_t *uri; i=osip_uri_init(&uri); if (i!=0) goto si2perror2; i=osip_uri_parse(uri, tmp_uri ); if(tmp_uri) osip_free(tmp_uri) ; if (i!=0) goto si2perror2; osip_message_set_uri(request , uri) ; if(type == JOIN) { tmp_uri = ChordId2Uri(to,false) ; /* when JOIN , to and from are same */ osip_message_set_to(request, tmp_uri ); osip_message_set_from(request, tmp_uri); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("join")); } else if(type == FINDSUCC) { tmp_uri = ChordId2Uri(to,true) ; osip_message_set_to(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false); osip_message_set_from(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("findsucc")); //has no contact } else if(type == STABILIZE) { tmp_uri = ChordId2Uri(to,false); osip_message_set_to(request, tmp_uri); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false) ; osip_message_set_from(request, tmp_uri ); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("stabilize")); if (tmp_uri) osip_free(tmp_uri) ; //contact tmp_uri = ChordId2Uri(chordId,false); char * pre_uri = ChordId2Uri(getFingerTable()->getPredecessor(),false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=") + strlen(pre_uri) +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=%s", tmp_uri,pre_uri); osip_free(tmp_uri) ; osip_free(pre_uri) ; osip_message_set_contact(request, ctt ); osip_free(ctt) ; } else if(type == LEAVE) { tmp_uri = ChordId2Uri(to,false) ; osip_message_set_to(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false) ; osip_message_set_from(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("leave")); //contact tmp_uri = ChordId2Uri(chordId,false); char * pre_uri = ChordId2Uri(getFingerTable()->getPredecessor(),false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=") + strlen(pre_uri) +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=%s", tmp_uri,pre_uri); osip_free(tmp_uri) ; osip_free(pre_uri) ; osip_message_set_contact(request, ctt ); osip_free(ctt) ; //succlist if(IncludeSuccList) { for(i = 0 ; i < getFingerTable()->getSuccNum() ; i++) { tmp_uri = ChordId2Uri(getFingerTable()->getSuccessor(i),false) ; osip_message_set_contact(request, tmp_uri ); osip_free(tmp_uri) ; } } }//type == LEAVE if(type == MULTICAST) { tmp_uri = ChordId2Uri(chordId,false); /* when JOIN , to and from are same */ osip_message_set_to(request, tmp_uri ); osip_message_set_from(request, tmp_uri); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("multicast")); osip_free(tmp_uri) ; //no contact }//type == MULTIPL //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; /* call-id is always the same for REGISTRATIONS */ i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; /*the Max-Forward header */ osip_message_set_max_forwards(request, "5"); /* a UA should start a request with 70 */ /* the via header */ char tmp[200]; unsigned int branch; branch=osip_build_random_number(); snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, branch ); osip_message_set_via(request, tmp); /* the UA header */ osip_message_set_user_agent(request, user_agent); /* the expires header */ char exp[10]; /* MUST never be ouside 1 and 3600 */ snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); /*** then must wake up osip ***/ i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror2 ; //jr->r_last_tr = transaction; /* send REGISTER */ i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: if(request != NULL)osip_message_free(request); return -1 ; si2perror2: if(request != NULL)osip_message_free(request); return -1; }
int Node::SndUserRegisterRequest(char *aor ,const char *requri) { char *message1; unsigned int len = 0; osip_transaction_t *transaction; osip_event_t *sipevent; osip_message_t *request; int i; i = osip_message_init(&request); if (i!=0) goto si2perror1; /* prepare the request-line */ osip_message_set_method(request, osip_strdup("REGISTER")); osip_message_set_version(request, osip_strdup("SIP/2.0")); osip_message_set_status_code(request, 0); osip_message_set_reason_phrase(request, NULL); //requset uri osip_uri_t *uri; i=osip_uri_init(&uri); if (i!=0) goto si2perror2; i=osip_uri_parse(uri, requri); if (i!=0) goto si2perror2; osip_message_set_uri(request , uri) ; //to from ,no contact osip_message_set_to(request,aor); osip_message_set_from(request,aor); osip_from_param_add(request->from,osip_strdup("user"),osip_strdup("user_query")); //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; /* call-id is always the same for REGISTRATIONS */ i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; /*the Max-Forward header */ osip_message_set_max_forwards(request, "5"); /* a UA should start a request with 70 */ /* the via header */ char tmp[200]; unsigned int branch; branch=osip_build_random_number(); snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, branch ); osip_message_set_via(request, tmp); /* the UA header */ osip_message_set_user_agent(request, user_agent); /* the expires header */ char exp[10]; /* MUST never be ouside 1 and 3600 */ snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); /*** then must wake up osip ***/ i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror2 ; /* send REGISTER */ i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: if(request != NULL)osip_message_free(request); return -1 ; si2perror2: if(request != NULL)osip_message_free(request); return -1; return 0; }
int Node::SndUserRegisterRequest(REG_TYPE type, uinfo_t *user_info, const char *registrar, int expires) { char *message1; unsigned int len = 0; osip_message_t *request; osip_event_t *sipevent; osip_transaction_t *transaction; osip_uri_t *uri; char *tmp_uri; int i; i=osip_message_init(&request); if(i!=0) goto si2perror1; osip_message_set_method(request,strdup("REGISTER")); osip_message_set_version(request,strdup("SIP/2.0")); osip_message_set_status_code(request,0); osip_message_set_reason_phrase(request,NULL); i=osip_uri_init(&uri); if(i!=0) goto si2perror2; i=osip_uri_parse(uri,osip_strdup(registrar)); osip_message_set_uri(request,uri); //*set to,from and header if(type==USER_REGISTRATION) { char *dest1; char *dest2; osip_uri_to_str(user_info->aor->uri,&dest1); i=osip_message_set_to(request,dest1); i=osip_message_set_from(request,dest1); if(dest1) osip_free(dest1) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("user_registration")); osip_contact_to_str(user_info->bindings->contact,&dest2); i=osip_message_set_contact(request,osip_strdup(dest2)); if(dest2) osip_free(dest2) ; } if(type == RED_REGISTER) { char *dest1; char *dest2; osip_uri_to_str(user_info->aor->uri,&dest1); i=osip_message_set_to(request,dest1); i=osip_message_set_from(request,dest1); if(dest1) osip_free(dest1) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("red_register")); osip_contact_to_str(user_info->bindings->contact,&dest2); i=osip_message_set_contact(request,osip_strdup(dest2)); if(dest2) osip_free(dest2) ; } if(type==TRANSFER_REGISTRATION) { char *dest1; char *dest2; //string tmp_uri; osip_uri_to_str(user_info->aor->uri,&dest1); osip_message_set_to(request,dest1); if(dest1) osip_free(dest1) ; tmp_uri = ChordId2Uri(chordId,false); osip_message_set_from(request,tmp_uri); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("transfer_registration")); if(tmp_uri) osip_free(tmp_uri) ; osip_contact_to_str(user_info->bindings->contact,&dest2); osip_message_set_contact(request,dest2); if(dest2) osip_free(dest2) ; } if(type==THIRD_PARTY) { //todo } //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; //* call-id is always the same for REGISTRATIONS i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; //*the Max-Forward header osip_message_set_max_forwards(request, "5"); //* a UA should start a request with 70 //* the via header char tmp[200]; snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, via_branch_new_random() ); osip_message_set_via(request, tmp); //* the UA header osip_message_set_user_agent(request, user_agent); //* the expires header char exp[10]; //* MUST never be ouside 1 and 3600 snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); //*** then must wake up osip i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror3 ; //* send REGISTER i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: return -1; si2perror2: if(request!=NULL) osip_message_free(request); return -1; si2perror3: if(transaction!=NULL) osip_message_free(request); return -1; }
int generating_register (eXosip_reg_t * jreg, osip_message_t ** reg, char *transport, char *from, char *proxy, char *contact, int expires) { int i; char locip[65]; char firewall_ip[65]; char firewall_port[10]; if (eXosip.eXtl == NULL) return OSIP_NO_NETWORK; if (eXosip.eXtl->tl_get_masquerade_contact != NULL) { eXosip.eXtl->tl_get_masquerade_contact (firewall_ip, sizeof (firewall_ip), firewall_port, sizeof (firewall_port)); } i = generating_request_out_of_dialog (reg, "REGISTER", NULL, transport, from, proxy); if (i != 0) return i; memset (locip, '\0', sizeof (locip)); eXosip_guess_ip_for_via (eXosip.eXtl->proto_family, locip, 49); if (locip[0] == '\0') { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: no default interface defined\n")); osip_message_free (*reg); *reg = NULL; return OSIP_NO_NETWORK; } if (contact == NULL) { osip_contact_t *new_contact = NULL; osip_uri_t *new_contact_url = NULL; i = osip_contact_init (&new_contact); if (i == 0) i = osip_uri_init (&new_contact_url); new_contact->url = new_contact_url; if (i == 0 && (*reg)->from != NULL && (*reg)->from->url != NULL && (*reg)->from->url->username != NULL) { new_contact_url->username = osip_strdup ((*reg)->from->url->username); } if (i == 0 && (*reg)->from != NULL && (*reg)->from->url != NULL) { /* serach for correct ip */ if (firewall_ip[0] != '\0') { char *c_address = (*reg)->req_uri->host; struct addrinfo *addrinfo; struct __eXosip_sockaddr addr; i = eXosip_get_addrinfo (&addrinfo, (*reg)->req_uri->host, 5060, IPPROTO_UDP); if (i == 0) { memcpy (&addr, addrinfo->ai_addr, addrinfo->ai_addrlen); eXosip_freeaddrinfo (addrinfo); c_address = inet_ntoa (((struct sockaddr_in *) &addr)->sin_addr); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: here is the resolved destination host=%s\n", c_address)); } if (eXosip_is_public_address (c_address)) { new_contact_url->host = osip_strdup (firewall_ip); new_contact_url->port = osip_strdup (firewall_port); } else { new_contact_url->host = osip_strdup (locip); new_contact_url->port = osip_strdup (firewall_port); } } else { new_contact_url->host = osip_strdup (locip); new_contact_url->port = osip_strdup (firewall_port); } if (transport != NULL && osip_strcasecmp (transport, "UDP") != 0) { osip_uri_uparam_add (new_contact_url, osip_strdup ("transport"), osip_strdup (transport)); } if (jreg->r_line[0] != '\0') { osip_uri_uparam_add (new_contact_url, osip_strdup ("line"), osip_strdup (jreg->r_line)); } osip_list_add (&(*reg)->contacts, new_contact, -1); } } else { osip_message_set_contact (*reg, contact); } { char exp[10]; /* MUST never be ouside 1 and 3600 */ snprintf (exp, 9, "%i", expires); osip_message_set_expires (*reg, exp); } osip_message_set_content_length (*reg, "0"); return OSIP_SUCCESS; }
int _eXosip_subscribe_automatic_refresh (struct eXosip_t *excontext, eXosip_subscribe_t * js, eXosip_dialog_t * jd, osip_transaction_t * out_tr) { osip_message_t *sub = NULL; osip_header_t *expires; int i; if (js == NULL || jd == NULL || out_tr == NULL || out_tr->orig_request == NULL) return OSIP_BADPARAMETER; i = eXosip_subscribe_build_refresh_request (excontext, jd->d_id, &sub); if (i != 0) return i; i = osip_message_get_expires (out_tr->orig_request, 0, &expires); if (expires != NULL && expires->hvalue != NULL) { osip_message_set_expires (sub, expires->hvalue); } { int pos = 0; osip_accept_t *_accept = NULL; i = osip_message_get_accept (out_tr->orig_request, pos, &_accept); while (i >= 0 && _accept != NULL) { osip_accept_t *_accept2; i = osip_accept_clone (_accept, &_accept2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Accept header\n")); break; } osip_list_add (&sub->accepts, _accept2, -1); _accept = NULL; pos++; i = osip_message_get_accept (out_tr->orig_request, pos, &_accept); } } { int pos = 0; osip_header_t *_event = NULL; pos = osip_message_header_get_byname (out_tr->orig_request, "Event", 0, &_event); while (pos >= 0 && _event != NULL) { osip_header_t *_event2; i = osip_header_clone (_event, &_event2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Event header\n")); break; } osip_list_add (&sub->headers, _event2, -1); _event = NULL; pos++; pos = osip_message_header_get_byname (out_tr->orig_request, "Event", pos, &_event); } } i = eXosip_subscribe_send_refresh_request (excontext, jd->d_id, sub); return i; }
int bSipRegisterBuild(osip_message_t **regMsgPtrPtr) { static int gSeqNum = 1; int status; char *callidNumberStr = NULL; char *seqNumStr = NULL; osip_call_id_t *callidPtr; char temp[MESSAGE_ENTRY_MAX_LENGTH]; char sipPort[MESSAGE_ENTRY_MAX_LENGTH]; osip_cseq_t *cseqPtr; unsigned int number; osip_message_t *regMsgPtr; char expires[10]; if((status = osip_message_init(®MsgPtr)) != 0){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"Can't init message!\n")); return -1; } osip_message_set_method(regMsgPtr, osip_strdup("OPTIONS")); osip_uri_init(&(regMsgPtr->req_uri)); if ( ( status = osip_uri_parse(regMsgPtr->req_uri, SIP_PROXY) ) != 0) { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"uri parse failed!\n")); osip_message_free(regMsgPtr); return -1; } osip_message_set_version(regMsgPtr, osip_strdup("SIP/2.0")); osip_message_set_status_code(regMsgPtr, 0); osip_message_set_reason_phrase(regMsgPtr, NULL); osip_message_set_to(regMsgPtr, SIP_TO); osip_message_set_from(regMsgPtr, SIP_FROM); if((status = osip_call_id_init(&callidPtr)) != 0 ){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"call id failed!\n")); osip_message_free(regMsgPtr); return -1; } callidNumberStr = (char *)osip_malloc(MAX_ADDR_STR); number = osip_build_random_number(); sprintf(callidNumberStr,"%u",number); osip_call_id_set_number(callidPtr, callidNumberStr); osip_call_id_set_host(callidPtr, osip_strdup("10.1.1.63")); regMsgPtr->call_id = callidPtr; if((status = osip_cseq_init(&cseqPtr)) != 0 ){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"seq init failed!\n")); osip_message_free(regMsgPtr); return -1; } gSeqNum++; seqNumStr = (char *)osip_malloc(MAX_ADDR_STR); sprintf(seqNumStr,"%i", gSeqNum); osip_cseq_set_number(cseqPtr, seqNumStr); osip_cseq_set_method(cseqPtr, osip_strdup("OPTIONS")); regMsgPtr->cseq = cseqPtr; osip_message_set_max_forwards(regMsgPtr, "70"); sprintf(sipPort, "%i", SIP_PORT); sprintf(temp, "SIP/2.0/%s %s;branch=z9hG4bK%u", "UDP",LOCAL_IP,osip_build_random_number() ); osip_message_set_via(regMsgPtr, temp); osip_message_set_contact(regMsgPtr, SIP_CONTACT); sprintf(expires, "%i", EXPIRES_TIME_INSECS); osip_message_set_expires(regMsgPtr, expires); osip_message_set_content_length(regMsgPtr, "0"); osip_message_set_user_agent(regMsgPtr, "TotalView 1.0"); AddSupportedMethods(regMsgPtr); *regMsgPtrPtr = regMsgPtr; return 0; }
int eXosip_subscribe_send_subscribe(eXosip_subscribe_t *js, eXosip_dialog_t *jd, const char *expires) { osip_transaction_t *transaction; osip_message_t *subscribe; osip_event_t *sipevent; int i; assert(jd && jd->d_dialog); transaction = eXosip_find_last_out_subscribe(js, jd); if (transaction!=NULL) { if (transaction->state!=NICT_TERMINATED && transaction->state!=NIST_TERMINATED) return -1; //<MINHPQ> // Remove the transaction from dialog structure if (jd) osip_list_remove_element (jd->d_out_trs, transaction); // Remove the transaction from jd->d_out_trs list if (js && (js->s_out_tr == transaction)) { js->s_out_tr = NULL; // Remove the transaction from js->s_out_tr } eXosip_transaction_free(transaction); transaction = NULL; //</MINHPQ> } i = _eXosip_build_request_within_dialog(&subscribe, "SUBSCRIBE", jd->d_dialog, "UDP"); if (i!=0) return -2; //<MINHPQ> if (js->winfo) { osip_message_set_header(subscribe, "Event", "presence.winfo"); osip_message_set_header(subscribe, "Accept", "application/watcherinfo+xml"); } //</MINHPQ> osip_message_set_expires(subscribe, expires); i = osip_transaction_init(&transaction, NICT, eXosip.j_osip, subscribe); if (i!=0) { /* TODO: release the j_call.. */ osip_message_free(subscribe); return -1; } _eXosip_subscribe_set_refresh_interval(js, subscribe); osip_list_add(jd->d_out_trs, transaction, 0); sipevent = osip_new_outgoing_sipmessage(subscribe); sipevent->transactionid = transaction->transactionid; osip_transaction_add_event(transaction, sipevent); osip_transaction_set_your_instance(transaction, __eXosip_new_jinfo(NULL, jd, js, NULL)); __eXosip_wakeup(); return 0; }