#pragma module SIP_UTILS "SIP_UTILS-1-X" /* **++ ** FACILITY: ** ** MODULE DESCRIPTION: ** This module contains utility routines used by the server. ** ** ** AUTHORS: ** ** Ruslan R. Laishev ** ** CREATION DATE: 19-MAR-2009 ** ** DESIGN ISSUES: ** ** ** MODIFICATION HISTORY: ** ** {@tbs@}... **-- */ /* ** ** INCLUDE FILES ** */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define __NEW_STARLET 1 /* ** ** SIP DEFINITONS ** */ #include "sipdef.h" #include "macros.h" $DESCRIPTOR(VMZoneName_SIPMSG, "SIP messages"); $DESCRIPTOR(VMZoneName_SIPFLD, "SIP message fields"); $DESCRIPTOR(VMZoneName_SIPARG, "SIP fields arguments"); $DESCRIPTOR(VMZoneName_SIPREG, "SIP registry"); $DESCRIPTOR(VMZoneName_ADR, "ADR list"); $DESCRIPTOR(VMZoneName_ASC, "ASC list"); $DESCRIPTOR(VMZoneName_REALM, "REALM list"); $DESCRIPTOR(VMZoneName_PATH, "PATH list"); int VMZoneDetail=3, VMZoneId_SIPMSG = 0, VMZoneId_SIPFLD = 0, VMZoneId_SIPARG = 0, VMZoneId_SIPREG = 0, VMZoneId_ADR = 0 , VMZoneId_ASC = 0, VMZoneId_REALM = 0, VMZoneId_PATH; /* **++ ** FUNCTIONAL DESCRIPTION: ** ** Put formated message to standard output device (SYS$OUTPUT). ** ** FORMAL PARAMETERS: ** ** ctx: A session context ** msgid: VMS condition code ** variable agriments list ** ** RETURN VALUE: ** ** VMS condition code ** ** **-- */ int _sip_log ( int msgid, ... ) { long status,retvalue = msgid; va_list ap; char buf[4096] = {"!%D "},outadr[4],msg_buf[4096]; struct dsc$descriptor opr_dsc,buf_dsc,fao_dsc; int argc,argl[32],idx,flag=15,lvl; /* ** Get a message text with given msgid */ INIT_SDESC(fao_dsc,sizeof(buf)-4,&buf[4]); if ( !(1 & (status = sys$getmsg (msgid,&fao_dsc.dsc$w_length,&fao_dsc,flag,&outadr))) ) lib$signal(status); /* ** Reorganize parameters list for $FAOL */ va_start(ap,msgid); argl[0] = 0; for (idx = 1,va_count(argc);idx < argc;idx++) argl[idx] = va_arg(ap,unsigned); va_end((void *) msgid); /* ** Format a message, put it to SYS$OUTPUT */ fao_dsc.dsc$a_pointer -=4; fao_dsc.dsc$w_length +=4; INIT_SDESC(buf_dsc, sizeof(msg_buf),msg_buf); if ( !(1 & (status = sys$faol(&fao_dsc,&buf_dsc.dsc$w_length,&buf_dsc,argl))) ) lib$signal(status); lib$put_output(&buf_dsc); return retvalue; } int _sip_getvm ( void * * adr, unsigned sz ) { int status = SS$_NORMAL; static int VMZoneAlg = LIB$K_VM_FIXED, VMZoneFlags = LIB$M_VM_EXTEND_AREA | LIB$M_VM_GET_FILL0; int VMZoneBlockSz = 0,*VMZid = NULL; struct dsc$descriptor *VMZname = NULL; switch (sz) { case sizeof(SIP_FLD): VMZid = &VMZoneId_SIPFLD; VMZname = &VMZoneName_SIPFLD; break; case sizeof(SIP_MSG): VMZid = &VMZoneId_SIPMSG; VMZname = &VMZoneName_SIPMSG; break; case sizeof(SIP_ARG): VMZid = &VMZoneId_SIPARG; VMZname = &VMZoneName_SIPARG; break; case sizeof(SIP_REG): VMZid = &VMZoneId_SIPREG; VMZname = &VMZoneName_SIPREG; break; case sizeof(ADR): VMZid = &VMZoneId_ADR; VMZname = &VMZoneName_ADR; case sizeof(ASC): VMZid = &VMZoneId_ASC; VMZname = &VMZoneName_ASC; break; case sizeof(SIP_REALM): VMZid = &VMZoneId_REALM; VMZname = &VMZoneName_REALM; break; case sizeof(SIP_PATH): VMZid = &VMZoneId_PATH; VMZname = &VMZoneName_PATH; break; default: lib$signal(SS$_DEBUG); } VMZoneBlockSz = sz*256; /* ** At first call initalize the Expression VM Zone */ if ( !(*VMZid) && !(1 & (status = lib$create_vm_zone(VMZid, &VMZoneAlg,&VMZoneBlockSz,&VMZoneFlags,0, &sz,0,0,0,0,VMZname,0,0))) ) lib$signal(SS$_DEBUG); /* ** Allocate a memory */ if ( !(1 & (status = lib$get_vm(&sz,adr,VMZid))) ) { lib$show_vm_zone(VMZid,&VMZoneDetail); lib$signal(SS$_DEBUG); _sip_log(status); } return status; } int _sip_freevm ( void * adr, unsigned sz ) { int status,*VMZid = NULL; switch (sz) { case sizeof(SIP_FLD): VMZid = &VMZoneId_SIPFLD; break; case sizeof(SIP_MSG): VMZid = &VMZoneId_SIPMSG; break; case sizeof(SIP_ARG): VMZid = &VMZoneId_SIPARG; break; case sizeof(SIP_REG): VMZid = &VMZoneId_SIPREG; break; case sizeof(ADR): VMZid = &VMZoneId_ADR; break; case sizeof(ASC): VMZid = &VMZoneId_ASC; break; case sizeof(SIP_REALM): VMZid = &VMZoneId_REALM; break; case sizeof(SIP_PATH): VMZid = &VMZoneId_PATH; break; default: lib$signal(SS$_DEBUG); } if ( !(1 & (status = lib$free_vm(&sz,&adr,VMZid))) ) lib$signal(SS$_DEBUG); return status; } int _sip_vmfreerealm ( SIP_REALM * realm ) { if ( !realm ) return SS$_NORMAL; if ( realm->realm_a_next ) _sip_vmfreerealm(realm->realm_a_next); return _sip_freevm(realm,sizeof(SIP_REALM)); } int _sip_vmfreepath ( SIP_PATH * path ) { if ( !path ) return SS$_NORMAL; if ( path->path_a_next ) _sip_vmfreepath(path->path_a_next); return _sip_freevm(path,sizeof(SIP_PATH)); } int _sip_vmfreeadr ( ADR * adr ) { if ( !adr ) return SS$_NORMAL; if ( adr->adr_a_next ) _sip_vmfreearg(adr->adr_a_next); return _sip_freevm(adr,sizeof(ADR)); } int _sip_vmfreearg ( SIP_ARG * arg ) { if ( !arg ) return SS$_NORMAL; if ( arg->arg_a_next ) _sip_vmfreearg(arg->arg_a_next); return _sip_freevm(arg,sizeof(SIP_ARG)); } int _sip_vmfreefld ( SIP_FLD * fld ) { if ( !fld ) return SS$_NORMAL; /* ** Free memory has been allocated for arguments */ if ( fld->fld_a_args ) _sip_vmfreearg(fld->fld_a_args); /* ** Free memory has been allocated for field */ if ( fld->fld_a_next ) _sip_vmfreefld(fld->fld_a_next); return _sip_freevm(fld,sizeof(SIP_FLD)); } int _sip_vmfreemsg ( SIP_MSG * msg ) { int status; if ( !msg ) return SS$_NORMAL; if ( msg->msg_a_flds ) _sip_vmfreefld(msg->msg_a_flds); /* ** Is there message body ? */ if ( msg->msg_l_bodylen && !(1 & (status = lib$free_vm(&msg->msg_l_bodylen,&msg->msg_a_body))) ) lib$signal(status); return _sip_freevm(msg,sizeof(SIP_MSG)); } void hex2bin ( unsigned char * dst, unsigned char * src, unsigned short len ) { char c = 0; for(;len;len--,src++) { if ( isdigit(*src) ) c = *src - '0'; else if ( isupper(*src) ) c = *src - 'A' + 10; else c = *src - 'a' + 10; if ( len & 1 ) *(dst++)|= c; else *dst = c<<4 ; } } void bin2hex ( unsigned char * src, unsigned char * dst, unsigned short len ) { char l,h; for(;len;len--,src += 2,dst++) { h = (*dst) >>4; l = (*dst) & 0x0F; *src = (h < 10)?h + '0':h + 'a' - 10; *(src+1)= (l < 10)?l + '0':l + 'a' - 10; } }