# HG changeset patch # User Alexandre Westfahl # Date 1278413452 -32400 # Node ID 8e260030f32c572fa093664e872c6187c5baa358 # Parent 1042347401cc3c3caa2de3c769c7087f6a362d77 Added configuration file for app_sip and test_sip diff -r 1042347401cc -r 8e260030f32c doc/app_sip.conf.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/app_sip.conf.sample Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,13 @@ + +# MODE Diameter-SIP server (DSSERVER) or Subscriber Locator (SL) +mode = DSSERVER; + +# DATASOURCE: MYSQL +datasource = MYSQL; + +#MYSQL connection details +mysql_login = "login"; +mysql_password = "password"; +mysql_database = "db"; +mysql_server = "server.fr"; +mysql_port = 0; diff -r 1042347401cc -r 8e260030f32c doc/test_sip.conf.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/test_sip.conf.sample Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,8 @@ +#User configuration +username = "awestfahl" +password = "test" +sip_aor = "sip:awestfahl@tera.ics.keio.ac.jp" + +#Destination information +destination_realm = "freediameter.net" +destination_sip = "sip:awestfahl@freediameter.net" diff -r 1042347401cc -r 8e260030f32c extensions/CMakeLists.txt --- a/extensions/CMakeLists.txt Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/CMakeLists.txt Tue Jul 06 19:50:52 2010 +0900 @@ -58,7 +58,7 @@ SUBDIRS(app_acct) ENDIF (BUILD_APP_ACCT) -OPTION(BUILD_APP_SIP "Build app_sip? (Authentication and authorization for Diameter SIP RFC4740)" OFF) +OPTION(BUILD_APP_SIP "Build app_sip? (Authentication and Authorization for Diameter SIP RFC4740)" OFF) IF (BUILD_APP_SIP) SUBDIRS(app_sip) ENDIF (BUILD_APP_SIP) @@ -102,7 +102,7 @@ SUBDIRS(test_app) ENDIF (BUILD_TEST_APP) -OPTION(BUILD_TEST_APP "Build test_sip.fdx? (Testing application to simulate Diameter-SIP client (RFC4740), for testing purpose only)" OFF) +OPTION(BUILD_TEST_SIP "Build test_sip.fdx? (Testing application to simulate Diameter-SIP client (RFC4740), for testing purpose only)" OFF) IF (BUILD_TEST_SIP) SUBDIRS(test_sip) ENDIF (BUILD_TEST_SIP) diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/CMakeLists.txt --- a/extensions/app_sip/CMakeLists.txt Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/app_sip/CMakeLists.txt Tue Jul 06 19:50:52 2010 +0900 @@ -4,8 +4,16 @@ FIND_PACKAGE(MySQL REQUIRED) INCLUDE_DIRECTORIES(${MySQL_INCLUDE_DIR}) +# Parser files +BISON_FILE(diamsip.y) +FLEX_FILE(diamsip.l) +SET_SOURCE_FILES_PROPERTIES(lex.diamsip.c diamsip.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}") + # List of source files SET( DIAM_SIP_SRC + lex.diamsip.c + diamsip.tab.c + diamsip.tab.h diamsip.c diamsip.h libdiamsip.c diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/diamsip.c --- a/extensions/app_sip/diamsip.c Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/app_sip/diamsip.c Tue Jul 06 19:50:52 2010 +0900 @@ -39,23 +39,66 @@ struct disp_hdl * diamsip_default_hdl=NULL; struct session_handler * ds_sess_hdl; +//configuration stucture +struct as_conf * as_conf=NULL; +static struct as_conf app_sip_conf; + +//dictionary of SIP struct diamsip_dict sip_dict; int diamsip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act) { - TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act); - return 0; } +void dump_config() +{ + TRACE_DEBUG(FULL,"***Configuration of Diameter-SIP extension***"); + TRACE_DEBUG(FULL,"# mode: *%d*",as_conf->mode); + TRACE_DEBUG(FULL,"# datasource: *%d*",as_conf->datasource); + TRACE_DEBUG(FULL,"# mysql_login: *%s*",as_conf->mysql_login); + TRACE_DEBUG(FULL,"# mysql_password: *%s*",as_conf->mysql_password); + TRACE_DEBUG(FULL,"# mysql_database: *%s*",as_conf->mysql_database); + TRACE_DEBUG(FULL,"# mysql_server: *%s*",as_conf->mysql_server); + TRACE_DEBUG(FULL,"# mysql_port: *%d*",as_conf->mysql_port); + TRACE_DEBUG(FULL,"***End of Diameter-SIP configuration extension***"); +} + +static int as_conf_init(void) +{ + as_conf=&app_sip_conf; + //memset(app_sip_conf, 0, sizeof(struct as_conf)); + + + return 0; +} + /* entry point */ -int ds_entry() +int as_entry(char * conffile) { + TRACE_ENTRY("%p", conffile); + struct dict_object * app=NULL; struct disp_when data; + /* Initialize configuration */ + CHECK_FCT( as_conf_init() ); + + + //We parse the configuration file + if (conffile != NULL) { + CHECK_FCT( as_conf_handle(conffile) ); + } + else + { + TRACE_DEBUG(INFO, "We need a configuration file for Diameter-SIP extension. See doc/ for an example."); + } + + //We can dump the configuration extracted from app_sip.conf + //dump_config(); + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Session Initiation Protocol (SIP) Application", &app, ENOENT) ); CHECK_FCT( fd_disp_app_support ( app, NULL, 1, 0 ) ); @@ -104,7 +147,7 @@ //TRACE_DEBUG(INFO,"*%s*%s*%s*%s*",DB_SERVER,DB_USERNAME, DB_PASSWORD, DB_DATABASE); //We start database connection - if(start_mysql_connection(DB_SERVER,DB_USERNAME, DB_PASSWORD, DB_DATABASE)) + if(start_mysql_connection()) return 1; CHECK_FCT(fd_sess_handler_create(&ds_sess_hdl, free)); @@ -130,55 +173,4 @@ return ; } -EXTENSION_ENTRY("diam_sip", ds_entry); - - -/* - - - - - - -test set for digest calculate - -TRACE_DEBUG(FULL,"TEST"); - DigestCalcHA1("MD5", "12345678", "example.com", "secret", "3bada1a0","56593a80", HA1); - TRACE_DEBUG(FULL,"TEST->HA1 done: *%s*",HA1); - DigestCalcResponse(HA1, "3bada1a0", "00000001", "56593a80", "auth","INVITE", "sip:97226491335@example.com", HA2, response); - DigestCalcResponseAuth(HA1, "3bada1a0", "00000001", "56593a80", "auth","INVITE", "sip:97226491335@example.com", HA2, responseauth); - - - - - - -old digest reponse check - - struct avp_hdr * tempavphdr=NULL; - - - CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_WALK, &tempavp, NULL) ); - - while(tempavp) - { - CHECK_FCT( fd_msg_avp_hdr( tempavp, &tempavphdr ) ); - - if(tempavphdr->avp_code==380) - { - found_response=0; - //We have not found it but we finished looking in this Auth-Data-Item - tempavp=NULL; - } - else if(tempavphdr->avp_code==103) - { - found_response=1; - //We found it, we can leave the loop - tempavp=NULL; - } - else - { - CHECK_FCT(fd_msg_browse ( tempavp, MSG_BRW_WALK, &tempavp, NULL) ); - } - } -*/ +EXTENSION_ENTRY("app_sip", as_entry); diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/diamsip.h --- a/extensions/app_sip/diamsip.h Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/app_sip/diamsip.h Tue Jul 06 19:50:52 2010 +0900 @@ -47,11 +47,28 @@ #define NONCE_SIZE 16 #define DIGEST_LEN 16 -//SQL configuration -#define DB_USERNAME "diamsip" -#define DB_PASSWORD "BAVpzCUhULVHayFr" -#define DB_SERVER "pineapple.tera.ics.keio.ac.jp" -#define DB_DATABASE "diamsip" + +/* Mode for the extension */ +#define MODE_DSSERVER 0x1 +#define MODE_SL 0x2 + + +/* The module configuration */ +struct as_conf { + int mode; /* default MODE_DSSERVER | MODE_SL */ + enum {ASMYSQL} datasource; + char * mysql_login; + char * mysql_password; + char * mysql_database; + char * mysql_server; + uint16_t mysql_port; + +}; +extern struct as_conf * as_conf; + +/* Parse the configuration file */ +int as_conf_handle(char * conffile); + extern MYSQL *conn; @@ -60,26 +77,9 @@ void calc_md5(char *buffer, char * data); void clear_digest(char * digest, char * readable_digest, int digestlength); struct avp_hdr * walk_digest(struct avp *avp, int avp_code); -int start_mysql_connection(char *server,char *user, char *password, char *database); +int start_mysql_connection(); void request_mysql(char *query); void close_mysql_connection(); -/* -typedef struct noncechain noncechain; -struct noncechain -{ - int timestamp; - char * nonce; - noncechain *next; -}; - - -//Global variable which points to chained list of nonce -noncechain* listnonce; - -void nonce_add_element(char * nonce); -int nonce_check_element(char * nonce); -void nonce_deletelistnonce(); -*/ diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/diamsip.l --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/app_sip/diamsip.l Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,157 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* Based on ta_conf.l (Sebastien Decugis ) * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + + + +%{ +#include "diamsip.h" +/* Include yacc tokens definitions */ +#include "diamsip.tab.h" + +/* Update the column information */ +#define YY_USER_ACTION { \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column = yylloc->first_column + yyleng - 1; \ +} + +/* Avoid warning with newer flex */ +#define YY_NO_INPUT + +%} + +%option bison-bridge bison-locations +%option noyywrap +%option nounput + +%% + + /* Update the line count */ +\n { + yylloc->first_line++; + yylloc->last_line++; + yylloc->last_column=0; + } + + /* Eat all spaces but not new lines */ +([[:space:]]{-}[\n])+ ; + /* Eat all comments */ +#.*$ ; + + /* Recognize any integer */ +[-]?[[:digit:]]+ { + /* Convert this to an integer value */ + int ret=0; + ret = sscanf(yytext, "%i", &yylval->integer); + if (ret != 1) { + /* No matching: an error occurred */ + fd_log_debug("Unable to convert the value '%s' to a valid number: %s\n", yytext, strerror(errno)); + return LEX_ERROR; /* trig an error in yacc parser */ + /* Maybe we could REJECT instead of failing here? */ + } + return INTEGER; + } + + /* Recognize quoted strings -- we do not support escaped \" in the string currently. */ +\"[^\"]+\" { + /* Match a quoted string. Let's be very permissive. */ + yylval->string = strdup(yytext+1); + if (!yylval->string) { + fd_log_debug("Unable to copy the string '%s': %s\n", yytext, strerror(errno)); + TRACE_DEBUG(INFO, "strdup failed"); + return LEX_ERROR; /* trig an error in yacc parser */ + } + yylval->string[strlen(yytext) - 2] = '\0'; + return QSTRING; + } + + + + /* Recognize the tokens */ +(?i:"mysql_login") { + return ASMYSQL_LOGIN; + } + +(?i:"mysql_password") { + return ASMYSQL_PASSWORD; + } + +(?i:"mysql_database") { + return ASMYSQL_DATABASE; + } + +(?i:"mysql_server") { + return ASMYSQL_SERVER; + } + +(?i:"mysql_port") { + return ASMYSQL_PORT; + } + +(?i:"mode") { + return MODE; + } + +(?i:"datasource") { + return DATASOURCE; + } + +(?i:"mysql") { + yylval->integer = ASMYSQL; + return INTEGER; + } +(?i:"dsserver") { + yylval->integer = MODE_DSSERVER; + return INTEGER; + } + +(?i:"sl") { + yylval->integer = MODE_SL; + return INTEGER; + } + + + + /* Valid single characters for yyparse */ +[=;] { return yytext[0]; } + + /* Unrecognized sequence, if it did not match any previous pattern */ +[^[:space:]"*=>;\n]+ { + fd_log_debug("Unrecognized text on line %d col %d: '%s'.\n", yylloc->first_line, yylloc->first_column, yytext); + return LEX_ERROR; + } + +%% diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/diamsip.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/app_sip/diamsip.y Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,194 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* Based on ta_conf.y (Sebastien Decugis ) * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + + + +/* For development only : */ +%debug +%error-verbose + +/* The parser receives the configuration file filename as parameter */ +%parse-param {char * conffile} + +/* Keep track of location */ +%locations +%pure-parser + +%{ +#include "diamsip.h" +#include "diamsip.tab.h" /* bison is not smart enough to define the YYLTYPE before including this code, so... */ + +#include +#include + +/* Forward declaration */ +int yyparse(char * conffile); + +/* Parse the configuration file */ +int as_conf_handle(char * conffile) +{ + extern FILE * diamsipin; + int ret; + + TRACE_ENTRY("%p", conffile); + + TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile); + + diamsipin = fopen(conffile, "r"); + if (diamsipin == NULL) { + ret = errno; + fd_log_debug("Unable to open extension configuration file %s for reading: %s\n", conffile, strerror(ret)); + TRACE_DEBUG (INFO, "Error occurred, message logged -- configuration file."); + return ret; + } + + ret = yyparse(conffile); + + fclose(diamsipin); + + if (ret != 0) { + TRACE_DEBUG (INFO, "Unable to parse the configuration file."); + return EINVAL; + } + + return 0; +} + +/* The Lex parser prototype */ +int diamsipflex(YYSTYPE *lvalp, YYLTYPE *llocp); + +/* Function to report the errors */ +void yyerror (YYLTYPE *ploc, char * conffile, char const *s) +{ + TRACE_DEBUG(INFO, "Error in configuration parsing"); + + if (ploc->first_line != ploc->last_line) + fd_log_debug("%s:%d.%d-%d.%d : %s\n", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); + else if (ploc->first_column != ploc->last_column) + fd_log_debug("%s:%d.%d-%d : %s\n", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); + else + fd_log_debug("%s:%d.%d : %s\n", conffile, ploc->first_line, ploc->first_column, s); +} + +%} + +/* Values returned by lex for token */ +%union { + char *string; /* The string is allocated by strdup in lex.*/ + int integer; /* Store integer values */ +} + +/* In case of error in the lexical analysis */ +%token LEX_ERROR + +/* Key words */ +%token MODE +%token DATASOURCE +%token ASMYSQL_LOGIN +%token ASMYSQL_PASSWORD +%token ASMYSQL_DATABASE +%token ASMYSQL_SERVER +%token ASMYSQL_PORT + +/* Tokens and types for routing table definition */ +/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ +%token QSTRING + +/* An integer value */ +%token INTEGER + + + +/* -------------------------------------- */ +%% + + /* The grammar definition */ +conffile: /* empty grammar is OK */ + | conffile mode + | conffile datasource + | conffile mysql_login + | conffile mysql_password + | conffile mysql_database + | conffile mysql_server + | conffile mysql_port + ; + +mode: MODE '=' INTEGER ';' + { + as_conf->mode = $3; + } + ; + +datasource: DATASOURCE '=' INTEGER ';' + { + as_conf->datasource = $3; + } + ; + +mysql_login: ASMYSQL_LOGIN '=' QSTRING ';' + { + free(as_conf->mysql_login); + as_conf->mysql_login = $3; + } + ; + +mysql_password: ASMYSQL_PASSWORD '=' QSTRING ';' + { + free(as_conf->mysql_password); + as_conf->mysql_password = $3; + } + ; + +mysql_database: ASMYSQL_DATABASE '=' QSTRING ';' + { + free(as_conf->mysql_database); + as_conf->mysql_database = $3; + } + ; + +mysql_server: ASMYSQL_SERVER '=' QSTRING ';' + { + free(as_conf->mysql_server); + as_conf->mysql_server = $3; + } + ; + +mysql_port: ASMYSQL_PORT '=' INTEGER ';' + { + as_conf->mysql_port = (uint16_t)$3; + } + ; diff -r 1042347401cc -r 8e260030f32c extensions/app_sip/libdiamsip.c --- a/extensions/app_sip/libdiamsip.c Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/app_sip/libdiamsip.c Tue Jul 06 19:50:52 2010 +0900 @@ -157,15 +157,15 @@ return temphdr; } -int start_mysql_connection(char *server,char *user, char *password, char *database) +int start_mysql_connection() { conn = mysql_init(NULL); mysql_options(conn, MYSQL_OPT_RECONNECT, "true"); - if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0)) - { - TRACE_DEBUG(INFO,"Unable to connect to database (%s) with login:%s",database,user); + if (!mysql_real_connect(conn, as_conf->mysql_server,as_conf->mysql_login, as_conf->mysql_password, as_conf->mysql_database, as_conf->mysql_port, NULL, 0)) + {//TODO: display error from mysql + TRACE_DEBUG(INFO,"Unable to connect to database (%s) with login:%s",as_conf->mysql_database,as_conf->mysql_login); return 1; } return 0; diff -r 1042347401cc -r 8e260030f32c extensions/test_sip/test_sip.c --- a/extensions/test_sip/test_sip.c Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/test_sip/test_sip.c Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,42 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + + +#include"test_sip.h" + + + + diff -r 1042347401cc -r 8e260030f32c extensions/test_sip/test_sip.h --- a/extensions/test_sip/test_sip.h Tue Jul 06 18:28:33 2010 +0900 +++ b/extensions/test_sip/test_sip.h Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,62 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + + +/* The module configuration */ +struct test_sip_conf { + int mode; /* default MODE_DSSERVER | MODE_SL */ + enum {ASMYSQL} datasource; + char * mysql_login; + char * mysql_password; + char * mysql_database; + char * mysql_server; + uint16_t mysql_port; + +}; +extern struct test_sip_conf * test_sip_conf; + + + + + + + + + + + + + diff -r 1042347401cc -r 8e260030f32c extensions/test_sip/test_sip.l --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_sip/test_sip.l Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,137 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* Based on ta_conf.l (Sebastien Decugis ) * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + + + +%{ +#include "test_sip.h" +/* Include yacc tokens definitions */ +#include "test_sip.tab.h" + +/* Update the column information */ +#define YY_USER_ACTION { \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column = yylloc->first_column + yyleng - 1; \ +} + +/* Avoid warning with newer flex */ +#define YY_NO_INPUT + +%} + +%option bison-bridge bison-locations +%option noyywrap +%option nounput + +%% + + /* Update the line count */ +\n { + yylloc->first_line++; + yylloc->last_line++; + yylloc->last_column=0; + } + + /* Eat all spaces but not new lines */ +([[:space:]]{-}[\n])+ ; + /* Eat all comments */ +#.*$ ; + + /* Recognize any integer */ +[-]?[[:digit:]]+ { + /* Convert this to an integer value */ + int ret=0; + ret = sscanf(yytext, "%i", &yylval->integer); + if (ret != 1) { + /* No matching: an error occurred */ + fd_log_debug("Unable to convert the value '%s' to a valid number: %s\n", yytext, strerror(errno)); + return LEX_ERROR; /* trig an error in yacc parser */ + /* Maybe we could REJECT instead of failing here? */ + } + return INTEGER; + } + + /* Recognize quoted strings -- we do not support escaped \" in the string currently. */ +\"[^\"]+\" { + /* Match a quoted string. Let's be very permissive. */ + yylval->string = strdup(yytext+1); + if (!yylval->string) { + fd_log_debug("Unable to copy the string '%s': %s\n", yytext, strerror(errno)); + TRACE_DEBUG(INFO, "strdup failed"); + return LEX_ERROR; /* trig an error in yacc parser */ + } + yylval->string[strlen(yytext) - 2] = '\0'; + return QSTRING; + } + + + + + /* Recognize the tokens */ +(?i:"username") { + return TESTSIP_USERNAME; + } + +(?i:"password") { + return TESTSIP_PASSWORD; + } + +(?i:"sip_aor") { + return TESTSIP_SIPAOR; + } + +(?i:"destination_realm") { + return TESTSIP_DESTREALM; + } + +(?i:"destination_sip") { + return TESTSIP_DESTSIP; + } + + + + + /* Valid single characters for yyparse */ +[=;] { return yytext[0]; } + + /* Unrecognized sequence, if it did not match any previous pattern */ +[^[:space:]"*=>;\n]+ { + fd_log_debug("Unrecognized text on line %d col %d: '%s'.\n", yylloc->first_line, yylloc->first_column, yytext); + return LEX_ERROR; + } + +%% diff -r 1042347401cc -r 8e260030f32c extensions/test_sip/test_sip.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_sip/test_sip.y Tue Jul 06 19:50:52 2010 +0900 @@ -0,0 +1,175 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Alexandre Westfahl * +* * +* Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * +* * +* All rights reserved. * +* Based on ta_conf.y (Sebastien Decugis ) * +* * +* Redistribution and use of this software in source and binary forms, with or without modification, are * +* permitted provided that the following conditions are met: * +* * +* * Redistributions of source code must retain the above * +* copyright notice, this list of conditions and the * +* following disclaimer. * +* * +* * Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the * +* following disclaimer in the documentation and/or other * +* materials provided with the distribution. * +* * +* * Neither the name of the Teraoka Laboratory nor the * +* names of its contributors may be used to endorse or * +* promote products derived from this software without * +* specific prior written permission of Teraoka Laboratory * +* * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * +* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * +* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +*********************************************************************************************************/ + +/* For development only : */ +%debug +%error-verbose + +/* The parser receives the configuration file filename as parameter */ +%parse-param {char * conffile} + +/* Keep track of location */ +%locations +%pure-parser + +%{ +#include "test_sip.h" +#include "test_sip.tab.h" /* bison is not smart enough to define the YYLTYPE before including this code, so... */ + +#include +#include + +/* Forward declaration */ +int yyparse(char * conffile); + +/* Parse the configuration file */ +int ts_conf_handle(char * conffile) +{ + extern FILE * test_sipin; + int ret; + + TRACE_ENTRY("%p", conffile); + + TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile); + + test_sipin = fopen(conffile, "r"); + if (test_sipin == NULL) { + ret = errno; + fd_log_debug("Unable to open extension configuration file %s for reading: %s\n", conffile, strerror(ret)); + TRACE_DEBUG (INFO, "Error occurred, message logged -- configuration file."); + return ret; + } + + ret = yyparse(conffile); + + fclose(test_sipin); + + if (ret != 0) { + TRACE_DEBUG (INFO, "Unable to parse the configuration file."); + return EINVAL; + } + + return 0; +} + +/* The Lex parser prototype */ +int test_sipflex(YYSTYPE *lvalp, YYLTYPE *llocp); + +/* Function to report the errors */ +void yyerror (YYLTYPE *ploc, char * conffile, char const *s) +{ + TRACE_DEBUG(INFO, "Error in configuration parsing"); + + if (ploc->first_line != ploc->last_line) + fd_log_debug("%s:%d.%d-%d.%d : %s\n", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); + else if (ploc->first_column != ploc->last_column) + fd_log_debug("%s:%d.%d-%d : %s\n", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); + else + fd_log_debug("%s:%d.%d : %s\n", conffile, ploc->first_line, ploc->first_column, s); +} + +%} + +/* Values returned by lex for token */ +%union { + char *string; /* The string is allocated by strdup in lex.*/ + int integer; /* Store integer values */ +} + +/* In case of error in the lexical analysis */ +%token LEX_ERROR + +/* Key words */ +%token TESTSIP_DESTREALM +%token TESTSIP_DESTSIP +%token TESTSIP_PASSWORD +%token TESTSIP_SIPAOR +%token TESTSIP_USERNAME + +/* Tokens and types for routing table definition */ +/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ +%token QSTRING + +/* An integer value */ +%token INTEGER + +/* -------------------------------------- */ +%% + + /* The grammar definition */ +conffile: /* empty grammar is OK */ + | conffile destination_realm + | conffile destination_sip + | conffile username + | conffile password + | conffile sip_aor + ; + +destination_realm: TESTSIP_DESTREALM '=' QSTRING ';' + { + free(ts_conf->destination_realm); + ts_conf->destination_realm = $3; + } + ; + +destination_sip: TESTSIP_DESTSIP '=' QSTRING ';' + { + free(ts_conf->destination_sip); + ts_conf->destination_sip = $3; + } + ; + +username: TESTSIP_USERNAME '=' QSTRING ';' + { + free(ts_conf->username); + ts_conf->username = $3; + } + ; + +password: TESTSIP_PASSWORD '=' QSTRING ';' + { + free(ts_conf->password); + ts_conf->password = $3; + } + ; + +sip_aor: TESTSIP_SIPAOR '=' QSTRING ';' + { + free(ts_conf->sip_aor); + ts_conf->sip_aor = $3; + } + ;