Navigation


Changeset 639:95a784729cac in freeDiameter


Ignore:
Timestamp:
Dec 20, 2010, 1:07:06 PM (13 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Added new opaque pointer to fd_sess_handler_create and fd_disp_register for usability. Bumped API version number.

Files:
36 edited

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    r633 r639  
    1515
    1616# Version of the API with the library
    17 SET(FD_PROJECT_VERSION_API 1)
     17SET(FD_PROJECT_VERSION_API 2)
    1818
    1919# The test framework, using CTest and CDash.
  • contrib/debian/changelog

    r629 r639  
    11freediameter (1.0.3) UNRELEASED; urgency=low
    22
     3  * Added parameters to fd_disp_register and fd_sess_handler_create,
     4    Bumped API version number accordingly.
    35  * Fixed a couple of issues for portability (#21, #22, #23)
    46  * Fixed issue with ListenOn bit ordering (#20)
  • doc/dbg_interactive.py.sample

    r638 r639  
    622622np.add()
    623623
    624 # It is possible to specify a callback for when the connection completes or fails to this peer.
     624# It is possible to specify a callback for when the connection completes or fails with this peer.
    625625# The prototype is as follow:
    626626def add_cb(peer):
  • extensions/app_acct/app_acct.c

    r403 r639  
    4646
    4747/* Callback for incoming Base Accounting Accounting-Request messages */
    48 static int acct_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
     48static int acct_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act)
    4949{
    5050        struct msg * m;
     
    135135        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Base Accounting", &data.app, ENOENT) );
    136136        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Accounting-Request", &data.command, ENOENT) );
    137         CHECK_FCT( fd_disp_register( acct_cb, DISP_HOW_CC, &data, NULL ) );
     137        CHECK_FCT( fd_disp_register( acct_cb, DISP_HOW_CC, &data, NULL, NULL ) );
    138138       
    139139        /* Advertise the support for the Diameter Base Accounting application in the peer */
  • extensions/app_diameap/diameap_server.c

    r610 r639  
    8585
    8686
    87 void diameap_cli_sess_cleanup(void * arg, char * sid)
     87void diameap_cli_sess_cleanup(void * arg, char * sid, void * opaque)
    8888{
    8989
     
    30603060
    30613061static int diameap_server_callback(struct msg ** rmsg, struct avp * ravp,
    3062                 struct session * sess, enum disp_action * action)
     3062                struct session * sess, void * opaque, enum disp_action * action)
    30633063{
    30643064        TRACE_ENTRY("%p %p %p %p", rmsg, ravp, sess, action);
     
    33893389
    33903390        /*create handler for sessions */
    3391         CHECK_FCT(fd_sess_handler_create(&diameap_server_reg, diameap_cli_sess_cleanup));
     3391        CHECK_FCT(fd_sess_handler_create(&diameap_server_reg, diameap_cli_sess_cleanup, NULL));
    33923392
    33933393        /* Register the callback */
     
    33973397
    33983398        /* Register the callback for EAP Application */
    3399         CHECK_FCT(fd_disp_register(diameap_server_callback, DISP_HOW_CC, &when,
     3399        CHECK_FCT(fd_disp_register(diameap_server_callback, DISP_HOW_CC, &when, NULL,
    34003400                                        &handle));
    34013401
     
    34103410int diameap_stop_server(void)
    34113411{
    3412         CHECK_FCT(fd_sess_handler_destroy(&diameap_server_reg));
    3413         CHECK_FCT(fd_disp_unregister(&handle));
     3412        CHECK_FCT(fd_sess_handler_destroy(&diameap_server_reg, NULL));
     3413        CHECK_FCT(fd_disp_unregister(&handle, NULL));
    34143414
    34153415        return 0;
  • extensions/app_radgw/rgwx_acct.c

    r564 r639  
    173173        memset(new, 0, sizeof(struct rgwp_config));
    174174       
    175         CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free ) );
     175        CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free, NULL ) );
    176176        new->confstr = conffile;
    177177       
     
    284284        TRACE_ENTRY("%p", state);
    285285        CHECK_PARAMS_DO( state, return );
    286         CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl ),  );
     286        CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl, NULL ),  );
    287287        free(state);
    288288        return;
  • extensions/app_radgw/rgwx_auth.c

    r532 r639  
    139139        memset(new, 0, sizeof(struct rgwp_config));
    140140       
    141         CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free ) );
     141        CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free, NULL ) );
    142142        new->confstr = confstr;
    143143       
     
    225225        TRACE_ENTRY("%p", state);
    226226        CHECK_PARAMS_DO( state, return );
    227         CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl ),  );
     227        CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl, NULL ),  );
    228228        free(state);
    229229        return;
  • extensions/app_radgw/rgwx_echodrop.c

    r403 r639  
    3939
    4040/* If a session is destroyed, empty the list of ed_saved_attribute */
    41 static void state_delete(void * arg, char * sid) {
     41static void state_delete(void * arg, char * sid, void * opaque) {
    4242        struct fd_list * list = (struct fd_list *)arg;
    4343       
     
    6969       
    7070        /* Create the session handler */
    71         CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, state_delete ) );
     71        CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, state_delete, NULL ) );
    7272       
    7373        /* Parse the configuration file */
     
    107107        TRACE_ENTRY("%p", state);
    108108        CHECK_PARAMS_DO( state, return );
    109         CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl ),  );
     109        CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl, NULL ),  );
    110110        while (! FD_IS_LIST_EMPTY(&state->attributes) ) {
    111111                struct fd_list * li = state->attributes.next;
  • extensions/app_radgw/rgwx_sip.c

    r584 r639  
    262262        memset(new, 0, sizeof(struct rgwp_config));
    263263       
    264         CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free ) );
     264        CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free, NULL ) );
    265265        new->confstr = conffile;
    266266       
     
    316316        CHECK_PARAMS_DO( state, return );
    317317       
    318         CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl ),  );
     318        CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl, NULL ),  );
    319319       
    320320        nonce_deletelistnonce(state);
  • extensions/app_sip/app_sip.c

    r433 r639  
    5959struct app_sip_dict sip_dict;
    6060
    61 int app_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
    62 {
    63         TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);
     61int app_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act)
     62{
     63        TRACE_ENTRY("%p %p %p %p %p", msg, avp, sess, opaque, act);
    6464       
    6565        return 0;
     
    179179        if(as_conf->mode==1)
    180180        {
    181           //**Command Codes
     181          // **Command Codes
    182182          //MAR
    183183          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Multimedia-Auth-Request", &data.command, ENOENT) );
    184           CHECK_FCT( fd_disp_register( app_sip_MAR_cb, DISP_HOW_CC, &data, &app_sip_MAR_hdl ) );
     184          CHECK_FCT( fd_disp_register( app_sip_MAR_cb, DISP_HOW_CC, &data, NULL, &app_sip_MAR_hdl ) );
    185185          //RTA
    186186          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Registration-Termination-Answer", &data.command, ENOENT) );
    187           CHECK_FCT( fd_disp_register( app_sip_RTA_cb, DISP_HOW_CC, &data, &app_sip_RTA_hdl ) );
     187          CHECK_FCT( fd_disp_register( app_sip_RTA_cb, DISP_HOW_CC, &data, NULL, &app_sip_RTA_hdl ) );
    188188          //PPA
    189189          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Push-Profile-Answer", &data.command, ENOENT) );
    190           CHECK_FCT( fd_disp_register( app_sip_PPA_cb, DISP_HOW_CC, &data, &app_sip_PPA_hdl ) );
     190          CHECK_FCT( fd_disp_register( app_sip_PPA_cb, DISP_HOW_CC, &data, NULL, &app_sip_PPA_hdl ) );
    191191          //LIR
    192192          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Location-Info-Request", &data.command, ENOENT) );
    193           CHECK_FCT( fd_disp_register( app_sip_LIR_cb, DISP_HOW_CC, &data, &app_sip_LIR_hdl ) );
     193          CHECK_FCT( fd_disp_register( app_sip_LIR_cb, DISP_HOW_CC, &data, NULL, &app_sip_LIR_hdl ) );
    194194          //UAR
    195195          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "User-Authorization-Request", &data.command, ENOENT) );
    196           CHECK_FCT( fd_disp_register( app_sip_UAR_cb, DISP_HOW_CC, &data, &app_sip_UAR_hdl ) );
     196          CHECK_FCT( fd_disp_register( app_sip_UAR_cb, DISP_HOW_CC, &data, NULL, &app_sip_UAR_hdl ) );
    197197          //SAR
    198198          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Server-Assignment-Request", &data.command, ENOENT) );
    199           CHECK_FCT( fd_disp_register( app_sip_SAR_cb, DISP_HOW_CC, &data, &app_sip_SAR_hdl ) );
     199          CHECK_FCT( fd_disp_register( app_sip_SAR_cb, DISP_HOW_CC, &data, NULL, &app_sip_SAR_hdl ) );
    200200        }
    201201        if(as_conf->mode==2)
     
    203203          //LIR
    204204          CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Location-Info-Request", &data.command, ENOENT) );
    205           CHECK_FCT( fd_disp_register( app_sip_SL_LIR_cb, DISP_HOW_CC, &data, &app_sip_SL_LIR_hdl ) );
     205          CHECK_FCT( fd_disp_register( app_sip_SL_LIR_cb, DISP_HOW_CC, &data, NULL, &app_sip_SL_LIR_hdl ) );
    206206        }
    207207        //Callback for unexpected messages
    208         CHECK_FCT( fd_disp_register( app_sip_default_cb, DISP_HOW_APPID, &data, &app_sip_default_hdl ) );
     208        CHECK_FCT( fd_disp_register( app_sip_default_cb, DISP_HOW_APPID, &data, NULL, &app_sip_default_hdl ) );
    209209       
    210210       
     
    213213                return EINVAL;
    214214       
    215         CHECK_FCT(fd_sess_handler_create(&ds_sess_hdl, free));
     215        CHECK_FCT(fd_sess_handler_create(&ds_sess_hdl, free, NULL));
    216216       
    217217        //Creation of thread for Registration Termination       
     
    237237        //TODO:unregister other callbacks
    238238       
    239         (void) fd_disp_unregister(&app_sip_MAR_hdl);
    240         CHECK_FCT_DO( fd_sess_handler_destroy(&ds_sess_hdl),return);
     239        (void) fd_disp_unregister(&app_sip_MAR_hdl, NULL);
     240        CHECK_FCT_DO( fd_sess_handler_destroy(&ds_sess_hdl, NULL),return);
    241241       
    242242       
  • extensions/app_sip/app_sip.h

    r468 r639  
    140140int ds_entry();
    141141void fd_ext_fini(void);
    142 int app_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    143 int app_sip_MAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    144 int app_sip_RTA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    145 int app_sip_PPA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    146 int app_sip_LIR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    147 int app_sip_UAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    148 int app_sip_SAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
     142int app_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     143int app_sip_MAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     144int app_sip_RTA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     145int app_sip_PPA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     146int app_sip_LIR_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     147int app_sip_UAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     148int app_sip_SAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
    149149
    150150//Suscriber Locator
    151 int app_sip_SL_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act);
    152 //int app_sip_SL_SAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act);
     151int app_sip_SL_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act);
     152//int app_sip_SL_SAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act);
    153153
    154154#define SQL_GETPASSWORD "SELECT `password` FROM ds_users WHERE `username` ='%s'"
  • extensions/app_sip/locationinfo.c

    r433 r639  
    3737
    3838
    39 int app_sip_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int app_sip_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141        TRACE_ENTRY("%p %p %p %p", msg, paramavp, sess, act);
  • extensions/app_sip/locationinfosl.c

    r433 r639  
    3737
    3838//This callback is specific to SUSCRIBER LOCATOR. We must look for the "serving" SIP server
    39 int app_sip_SL_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int app_sip_SL_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141        TRACE_ENTRY("%p %p %p %p", msg, paramavp, sess, act);
  • extensions/app_sip/multimediaauth.c

    r433 r639  
    3737
    3838
    39 int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int app_sip_MAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141        struct msg *ans, *qry;
  • extensions/app_sip/pushprofile.c

    r440 r639  
    255255
    256256//Called when an PPA arrive
    257 int app_sip_PPA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     257int app_sip_PPA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    258258{
    259259        //TODO: PPA reception
  • extensions/app_sip/registrationtermination.c

    r440 r639  
    258258
    259259//Called when an RTA arrive
    260 int app_sip_RTA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     260int app_sip_RTA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    261261{
    262262        //TODO: RTA reception
  • extensions/app_sip/serverassignment.c

    r433 r639  
    3737
    3838
    39 int app_sip_SAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int app_sip_SAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141        TRACE_ENTRY("%p %p %p %p", msg, paramavp, sess, act);
  • extensions/app_sip/userauthorization.c

    r433 r639  
    3737
    3838
    39 int app_sip_UAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int app_sip_UAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141        TRACE_ENTRY("%p %p %p %p", msg, paramavp, sess, act);
  • extensions/dbg_interactive/dbg_interactive.c

    r625 r639  
    6767       
    6868end:   
    69         /* Upon exit, issue the order of terminating to fD */
    70         CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
     69        /* Upon exit, issue the order of terminating to fD, if the interpreter was started without a file */
     70        if (!arg) {
     71                CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
     72        }
    7173
    7274        return NULL;
  • extensions/dbg_interactive/dispatch.i

    r638 r639  
    4040
    4141%{
    42 /* store the python callback function here */
    43 static PyObject * py_dispatch_cb = NULL;
    44 static int        py_dispatch_cb_n = 0;
    4542/* call it (will be called from a different thread than the interpreter, when message arrives) */
    46 static int call_the_python_dispatch_callback(struct msg **msg, struct avp *avp, struct session *session, enum disp_action *action) {
     43static int call_the_python_dispatch_callback(struct msg **msg, struct avp *avp, struct session *session, void * pycb, enum disp_action *action) {
    4744        PyObject *PyMsg, *PyAvp, *PySess;
    48         PyObject *result = NULL;
     45        PyObject *cb, *result = NULL;
    4946        int ret = 0;
    5047       
    51         if (!py_dispatch_cb)
     48        if (!pycb) {
     49                fd_log_debug("Internal error: missing the callback!\n");
    5250                return ENOTSUP;
     51        }
     52        cb = pycb;
    5353       
    5454        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
     
    5959       
    6060        /* Call the function */
    61         result = PyEval_CallFunction(py_dispatch_cb, "(OOO)", PyMsg, PyAvp, PySess);
     61        result = PyEval_CallFunction(cb, "(OOO)", PyMsg, PyAvp, PySess);
    6262       
    6363        /* The result is supposedly composed of: [ ret, *msg, *action ] */
     
    108108                struct disp_hdl * hdl = NULL;
    109109                int ret;
    110                 if (py_dispatch_cb && (py_dispatch_cb != PyCb)) {
    111                         DI_ERROR(EINVAL, PyExc_SyntaxError, "Only one dispatch callback is supported at the moment in this extension\n.");
    112                         return NULL;
    113                 }
    114                 py_dispatch_cb = PyCb;
    115                 py_dispatch_cb_n += 1;
    116                 Py_XINCREF(py_dispatch_cb);
    117110               
    118                 ret = fd_disp_register ( call_the_python_dispatch_callback, how, when, &hdl );
     111                Py_XINCREF(PyCb);
     112               
     113                ret = fd_disp_register ( call_the_python_dispatch_callback, how, when, PyCb, &hdl );
    119114                if (ret != 0) {
    120115                        DI_ERROR(ret, NULL, NULL);
     
    125120        ~disp_hdl() {
    126121                struct disp_hdl * hdl = self;
    127                 int ret = fd_disp_unregister(&hdl);
     122                PyObject * cb = NULL;
     123                int ret = fd_disp_unregister(&hdl, (void *)&cb);
    128124                if (ret != 0) {
    129125                        DI_ERROR(ret, NULL, NULL);
    130126                }
    131                 /* Now free the callback */
    132                 Py_XDECREF(py_dispatch_cb);
    133                 py_dispatch_cb_n -= 1;
    134                 if (!py_dispatch_cb_n)
    135                         py_dispatch_cb = NULL;
     127                Py_XDECREF(cb);
    136128                return;
    137129        }
  • extensions/dbg_interactive/sessions.i

    r638 r639  
    3939
    4040%{
    41 /* store the python callback function here */
    42 static PyObject * py_cleanup_cb = NULL;
    4341/* call it (might be called from a different thread than the interpreter, when session times out) */
    44 static void call_the_python_cleanup_callback(session_state * state, char * sid) {
     42static void call_the_python_cleanup_callback(session_state * state, char * sid, void * cb) {
    4543        PyObject *result;
    46         if (!py_cleanup_cb)
     44        if (!cb) {
     45                fd_log_debug("Internal error: missing callback object!\n");
    4746                return;
     47        }
    4848       
    4949        /* Call the function */
    5050        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
    51         result = PyEval_CallFunction(py_cleanup_cb, "(Os)", state, sid);
     51        result = PyEval_CallFunction((PyObject *)cb, "(Os)", state, sid);
    5252        Py_XDECREF(result);
    5353        SWIG_PYTHON_THREAD_END_BLOCK;
     
    6464                struct session_handler * hdl = NULL;
    6565                int ret;
    66                 if (py_cleanup_cb) {
    67                         DI_ERROR(EINVAL, PyExc_SyntaxError, "Only one session handler at a time is supported at the moment in this extension\n.");
    68                         return NULL;
    69                 }
    70                 py_cleanup_cb = PyCb;
    71                 Py_XINCREF(py_cleanup_cb);
    7266               
    73                 ret = fd_sess_handler_create_internal ( &hdl, call_the_python_cleanup_callback );
     67                Py_XINCREF(PyCb);
     68               
     69                ret = fd_sess_handler_create_internal ( &hdl, call_the_python_cleanup_callback, PyCb );
    7470                if (ret != 0) {
    7571                        DI_ERROR(ret, NULL, NULL);
     
    8076        ~session_handler() {
    8177                struct session_handler * hdl = self;
    82                 int ret = fd_sess_handler_destroy(&hdl);
     78                PyObject * cb = NULL;
     79               
     80                int ret = fd_sess_handler_destroy(&hdl, (void *)&cb);
    8381                if (ret != 0) {
    8482                        DI_ERROR(ret, NULL, NULL);
    8583                }
    8684                /* Now free the callback */
    87                 Py_XDECREF(py_cleanup_cb);
    88                 py_cleanup_cb = NULL;
     85                Py_XDECREF(cb);
    8986                return;
    9087        }
  • extensions/test_app/ta_cli.c

    r406 r639  
    234234int ta_cli_init(void)
    235235{
    236         CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, free) );
     236        CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, free, NULL) );
    237237       
    238238        CHECK_FCT( fd_sig_register(ta_conf->signal, "test_app.cli", ta_cli_test_message ) );
     
    245245        CHECK_FCT_DO( fd_sig_unregister(ta_conf->signal), /* continue */ );
    246246       
    247         CHECK_FCT_DO( fd_sess_handler_destroy(&ta_cli_reg), /* continue */ );
     247        CHECK_FCT_DO( fd_sess_handler_destroy(&ta_cli_reg, NULL), /* continue */ );
    248248       
    249249        return;
  • extensions/test_app/ta_serv.c

    r575 r639  
    4242
    4343/* Default callback for the application. */
    44 static int ta_fb_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
     44static int ta_fb_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act)
    4545{
    4646        /* This CB should never be called */
     
    5353
    5454/* Callback for incoming Test-Request messages */
    55 static int ta_tr_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
     55static int ta_tr_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act)
    5656{
    5757        struct msg *ans, *qry;
     
    120120       
    121121        /* fallback CB if command != Test-Request received */
    122         CHECK_FCT( fd_disp_register( ta_fb_cb, DISP_HOW_APPID, &data, &ta_hdl_fb ) );
     122        CHECK_FCT( fd_disp_register( ta_fb_cb, DISP_HOW_APPID, &data, NULL, &ta_hdl_fb ) );
    123123       
    124124        /* Now specific handler for Test-Request */
    125         CHECK_FCT( fd_disp_register( ta_tr_cb, DISP_HOW_CC, &data, &ta_hdl_tr ) );
     125        CHECK_FCT( fd_disp_register( ta_tr_cb, DISP_HOW_CC, &data, NULL, &ta_hdl_tr ) );
    126126       
    127127        return 0;
     
    131131{
    132132        if (ta_hdl_fb) {
    133                 (void) fd_disp_unregister(&ta_hdl_fb);
     133                (void) fd_disp_unregister(&ta_hdl_fb, NULL);
    134134        }
    135135        if (ta_hdl_tr) {
    136                 (void) fd_disp_unregister(&ta_hdl_tr);
     136                (void) fd_disp_unregister(&ta_hdl_tr, NULL);
    137137        }
    138138       
  • extensions/test_sip/locationinfo.c

    r430 r639  
    125125}
    126126
    127 int test_sip_LIA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     127int test_sip_LIA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    128128{
    129129       
  • extensions/test_sip/locationinfosl.c

    r430 r639  
    127127}
    128128
    129 int test_sipSL_LIA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     129int test_sipSL_LIA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    130130{
    131131       
  • extensions/test_sip/multimediaauth.c

    r409 r639  
    3737
    3838
    39 int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int test_sip_MAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141/*
  • extensions/test_sip/registrationtermination.c

    r409 r639  
    3737
    3838
    39 int test_sip_RTR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     39int test_sip_RTR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    4040{
    4141       
  • extensions/test_sip/serverassignment.c

    r432 r639  
    168168}
    169169
    170 int test_sip_SAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     170int test_sip_SAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    171171{
    172172       
  • extensions/test_sip/test_sip.c

    r448 r639  
    6464struct sip_dict sip_dict;
    6565
    66 int test_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
     66int test_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act)
    6767{
    6868        TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);
     
    187187        //MAA
    188188        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Multimedia-Auth-Answer", &data.command, ENOENT) );
    189         CHECK_FCT( fd_disp_register( test_sip_MAA_cb, DISP_HOW_CC, &data, &test_sip_MAA_hdl ) );
     189        CHECK_FCT( fd_disp_register( test_sip_MAA_cb, DISP_HOW_CC, &data, NULL, &test_sip_MAA_hdl ) );
    190190       
    191191        //UAA
    192192        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "User-Authorization-Answer", &data.command, ENOENT) );
    193         CHECK_FCT( fd_disp_register( test_sip_UAA_cb, DISP_HOW_CC, &data, &test_sip_UAA_hdl ) );
     193        CHECK_FCT( fd_disp_register( test_sip_UAA_cb, DISP_HOW_CC, &data, NULL, &test_sip_UAA_hdl ) );
    194194       
    195195        //RTR
    196196        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Registration-Termination-Request", &data.command, ENOENT) );
    197         CHECK_FCT( fd_disp_register( test_sip_RTR_cb, DISP_HOW_CC, &data, &test_sip_RTR_hdl ) );
     197        CHECK_FCT( fd_disp_register( test_sip_RTR_cb, DISP_HOW_CC, &data, NULL, &test_sip_RTR_hdl ) );
    198198       
    199199        //LIA
    200200        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Location-Info-Answer", &data.command, ENOENT) );
    201         CHECK_FCT( fd_disp_register( test_sip_LIA_cb, DISP_HOW_CC, &data, &test_sip_LIA_hdl ) );
     201        CHECK_FCT( fd_disp_register( test_sip_LIA_cb, DISP_HOW_CC, &data, NULL, &test_sip_LIA_hdl ) );
    202202       
    203203        //LIA
    204204        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Server-Assignment-Answer", &data.command, ENOENT) );
    205         CHECK_FCT( fd_disp_register( test_sip_SAA_cb, DISP_HOW_CC, &data, &test_sip_SAA_hdl ) );
     205        CHECK_FCT( fd_disp_register( test_sip_SAA_cb, DISP_HOW_CC, &data, NULL, &test_sip_SAA_hdl ) );
    206206       
    207207        //Callback for unexpected messages
    208         CHECK_FCT( fd_disp_register( test_sip_default_cb, DISP_HOW_APPID, &data, &test_sip_default_hdl ) );
     208        CHECK_FCT( fd_disp_register( test_sip_default_cb, DISP_HOW_APPID, &data, NULL, &test_sip_default_hdl ) );
    209209       
    210210        /*
     
    214214        */
    215215       
    216         CHECK_FCT(fd_sess_handler_create(&ts_sess_hdl, free));
     216        CHECK_FCT(fd_sess_handler_create(&ts_sess_hdl, free, NULL));
    217217        //CHECK_FCT( fd_sig_register(30, "test_sip", (void *)test_sipSL_LIR_cb ) );
    218218        CHECK_FCT( fd_sig_register(30, "test_sip", (void *)test_sip_SAR_cb ) );
  • extensions/test_sip/test_sip.h

    r427 r639  
    115115int test_sipSL_LIR_cb();
    116116
    117 int test_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    118 int test_sip_MAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    119 int test_sip_RTR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    120 int test_sip_UAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    121 int test_sip_LIA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    122 int test_sip_SAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
    123 int test_sipSL_LIA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act);
     117int test_sip_default_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     118int test_sip_MAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     119int test_sip_RTR_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     120int test_sip_UAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     121int test_sip_LIA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     122int test_sip_SAA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
     123int test_sipSL_LIA_cb( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
  • extensions/test_sip/userauthorization.c

    r430 r639  
    159159}
    160160
    161 int test_sip_UAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act)
     161int test_sip_UAA_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, void * opaque, enum disp_action * act)
    162162{
    163163       
  • freeDiameter/tests/testdisp.c

    r90 r639  
    3636#include "tests.h"
    3737       
    38 #define Define_cb( __int, __extra )                                                                             \
    39 int cb_##__int( struct msg ** msg, struct avp * avp, struct session * session, enum disp_action * action )      \
    40 {                                                                                                               \
    41         CHECK( 1, msg ? 1 : 0 );                                                                                \
    42         CHECK( 1, action ? 1 : 0 );                                                                             \
    43         CHECK( sess, session );                                                                                 \
    44         *action = DISP_ACT_CONT;                                                                                \
    45         cbcalled[__int] += 1;                                                                                   \
    46         do {                                                                                                    \
    47                 __extra ;                                                                                       \
    48         } while (0);                                                                                            \
    49         return 0;                                                                                               \
     38#define Define_cb( __int, __extra )                                                                                             \
     39int cb_##__int( struct msg ** msg, struct avp * avp, struct session * session, void * opaque, enum disp_action * action )       \
     40{                                                                                                                               \
     41        CHECK( 1, msg ? 1 : 0 );                                                                                                \
     42        CHECK( 1, action ? 1 : 0 );                                                                                             \
     43        CHECK( sess, session );                                                                                                 \
     44        if (opaque) {                                                                                                           \
     45                CHECK( 1, opaque == g_opaque ? 1 : 0 );                                                                         \
     46        }                                                                                                                       \
     47        *action = DISP_ACT_CONT;                                                                                                \
     48        cbcalled[__int] += 1;                                                                                                   \
     49        do {                                                                                                                    \
     50                __extra ;                                                                                                       \
     51        } while (0);                                                                                                            \
     52        return 0;                                                                                                               \
    5053}
    5154
     
    5356char cbcalled[NB_CB];
    5457struct session * sess;
     58void * g_opaque = (void *)"test";
    5559
    5660/* cb_0 */  Define_cb( 0, );
     
    142146        /* Register first handler, very simple test */
    143147        {
    144                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, NULL, &hdl[0] ) );
     148                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, NULL, NULL, &hdl[0] ) );
    145149                CHECK( 1, hdl[0] ? 1 : 0 );
    146                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
     150                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
    147151                CHECK( NULL, hdl[0] );
    148                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, NULL, &hdl[0] ) );
     152                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, NULL, NULL, &hdl[0] ) );
    149153       
    150154                /* Check this handler is called for a message */
     
    157161                /* Delete the message */
    158162                CHECK( 0, fd_msg_free( msg ) );
    159                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
     163                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
    160164        }
    161165       
    162166        /* Handlers for applications */
    163167        {
    164                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
     168                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
    165169                when.app = app1;
    166                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_APPID, &when, &hdl[1] ) );
     170                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_APPID, &when, NULL, &hdl[1] ) );
    167171                when.app = app2;
    168                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_APPID, &when, &hdl[2] ) );
     172                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_APPID, &when, NULL, &hdl[2] ) );
    169173                when.avp = avp2;
    170                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_APPID, &when, &hdl[3] ) );
     174                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_APPID, &when, NULL, &hdl[3] ) );
    171175                when.avp = avp1;
    172                 CHECK( 0, fd_disp_register( cb_4, DISP_HOW_APPID, &when, &hdl[4] ) );
     176                CHECK( 0, fd_disp_register( cb_4, DISP_HOW_APPID, &when, NULL, &hdl[4] ) );
    173177       
    174178                /* Check the callbacks are called as appropriate */
     
    206210                CHECK( 0, fd_msg_free( msg ) );
    207211               
    208                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    209                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    210                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    211                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    212                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
     212                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     213                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     214                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     215                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     216                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
    213217        }
    214218       
     
    217221                when.app = NULL;
    218222                when.command = NULL;
    219                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
    220                 CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_CC, &when, &hdl[1] ) );
     223                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
     224                CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_CC, &when, NULL, &hdl[1] ) );
    221225                when.command = cmd1;
    222                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_CC, &when, &hdl[1] ) ); /* cmd1 */
     226                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_CC, &when, NULL, &hdl[1] ) ); /* cmd1 */
    223227                when.app = app2;
    224                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_CC, &when, &hdl[2] ) ); /* app2 + cmd1 */
     228                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_CC, &when, NULL, &hdl[2] ) ); /* app2 + cmd1 */
    225229                when.command = cmd2;
    226230                when.app = NULL;
    227231                when.avp = avp1;
    228                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_CC, &when, &hdl[3] ) ); /* cmd2 (avp1 ignored) */
     232                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_CC, &when, NULL, &hdl[3] ) ); /* cmd2 (avp1 ignored) */
    229233               
    230234                /* Check the callbacks are called as appropriate */
     
    269273                CHECK( 0, fd_msg_free( msg ) );
    270274               
    271                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    272                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    273                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    274                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
     275                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     276                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     277                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     278                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
    275279        }
    276280       
     
    281285                when.avp = NULL;
    282286       
    283                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) ); /* all */
    284                 CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP, &when, &hdl[1] ) );
     287                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) ); /* all */
     288                CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP, &when, NULL, &hdl[1] ) );
    285289               
    286290                when.avp = avp1;
    287                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP, &when, &hdl[1] ) ); /* avp1 */
     291                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP, &when, NULL, &hdl[1] ) ); /* avp1 */
    288292               
    289293                when.command = cmd1;
    290                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP, &when, &hdl[2] ) ); /* avp1 + cmd1 */
     294                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP, &when, NULL, &hdl[2] ) ); /* avp1 + cmd1 */
    291295               
    292296                when.command = NULL;
    293297                when.app = app1;
    294                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_AVP, &when, &hdl[3] ) ); /* avp1 + app1 */
     298                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_AVP, &when, NULL, &hdl[3] ) ); /* avp1 + app1 */
    295299               
    296300                when.command = cmd1;
    297                 CHECK( 0, fd_disp_register( cb_4, DISP_HOW_AVP, &when, &hdl[4] ) ); /* avp1 + cmd1 + app1 */
     301                CHECK( 0, fd_disp_register( cb_4, DISP_HOW_AVP, &when, NULL, &hdl[4] ) ); /* avp1 + cmd1 + app1 */
    298302               
    299303                when.app = NULL;
     
    301305                when.avp = avp2;
    302306                when.value = enu1;
    303                 CHECK( 0, fd_disp_register( cb_5, DISP_HOW_AVP, &when, &hdl[5] ) ); /* avp2 */
     307                CHECK( 0, fd_disp_register( cb_5, DISP_HOW_AVP, &when, NULL, &hdl[5] ) ); /* avp2 */
    304308               
    305309                when.value = enu2;
    306                 CHECK( 0, fd_disp_register( cb_7, DISP_HOW_AVP, &when, &hdl[6] ) ); /* avp2 */
     310                CHECK( 0, fd_disp_register( cb_7, DISP_HOW_AVP, &when, NULL, &hdl[6] ) ); /* avp2 */
    307311               
    308312               
     
    396400                CHECK( 0, fd_msg_free( msg ) );
    397401               
    398                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    399                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    400                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    401                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    402                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
    403                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    404                 CHECK( 0, fd_disp_unregister( &hdl[6] ) );
     402                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     403                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     404                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     405                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     406                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
     407                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     408                CHECK( 0, fd_disp_unregister( &hdl[6], NULL ) );
    405409        }
    406410               
     
    412416                when.value = NULL;
    413417               
    414                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) ); /* all */
    415                 CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, &hdl[1] ) );
     418                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) ); /* all */
     419                CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[1] ) );
    416420                when.value = enu1;
    417                 CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, &hdl[1] ) );
     421                CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[1] ) );
    418422                when.avp = avp1;
    419                 CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, &hdl[1] ) );
     423                CHECK( EINVAL, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[1] ) );
    420424                when.avp = avp2;
    421                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, &hdl[1] ) ); /* avp2, enu1 */
     425                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[1] ) ); /* avp2, enu1 */
    422426               
    423427                when.command = cmd1;
    424                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP_ENUMVAL, &when, &hdl[2] ) ); /* avp2, enu1 + cmd1 */
     428                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[2] ) ); /* avp2, enu1 + cmd1 */
    425429               
    426430                when.command = NULL;
    427431                when.app = app1;
    428432                when.value = enu2;
    429                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_AVP_ENUMVAL, &when, &hdl[3] ) ); /* avp2, enu2 + app1 */
     433                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[3] ) ); /* avp2, enu2 + app1 */
    430434               
    431435                /* Check the callbacks are called as appropriate */
     
    498502                CHECK( 0, fd_msg_free( msg ) );
    499503               
    500                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    501                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    502                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    503                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
     504                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     505                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     506                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     507                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
    504508        }
    505509       
    506510        /* Test behavior of handlers */
    507511        {
    508                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
    509                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, &hdl[1] ) );
    510                 CHECK( 0, fd_disp_register( cb_6, DISP_HOW_ANY, &when, &hdl[2] ) );
    511                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, &hdl[3] ) );
    512                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, &hdl[4] ) );
     512                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
     513                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, NULL, &hdl[1] ) );
     514                CHECK( 0, fd_disp_register( cb_6, DISP_HOW_ANY, &when, NULL, &hdl[2] ) );
     515                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, NULL, &hdl[3] ) );
     516                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, NULL, &hdl[4] ) );
    513517               
    514518                memset(cbcalled, 0, sizeof(cbcalled));
     
    522526                CHECK( 0, fd_msg_free( msg ) );
    523527               
    524                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    525                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    526                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    527                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    528                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
    529                
    530                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
    531                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, &hdl[1] ) );
    532                 CHECK( 0, fd_disp_register( cb_8, DISP_HOW_ANY, &when, &hdl[2] ) );
    533                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, &hdl[3] ) );
    534                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, &hdl[4] ) );
     528                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     529                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     530                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     531                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     532                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
     533               
     534                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
     535                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, NULL, &hdl[1] ) );
     536                CHECK( 0, fd_disp_register( cb_8, DISP_HOW_ANY, &when, NULL, &hdl[2] ) );
     537                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, NULL, &hdl[3] ) );
     538                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, NULL, &hdl[4] ) );
    535539               
    536540                memset(cbcalled, 0, sizeof(cbcalled));
     
    544548                CHECK( NULL, msg );
    545549               
    546                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    547                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    548                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    549                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    550                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
    551                
    552                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
    553                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, &hdl[1] ) );
    554                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_ANY, &when, &hdl[2] ) );
    555                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, &hdl[3] ) );
    556                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, &hdl[4] ) );
     550                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     551                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     552                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     553                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     554                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
     555               
     556                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
     557                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_ANY, &when, NULL, &hdl[1] ) );
     558                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_ANY, &when, NULL, &hdl[2] ) );
     559                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_ANY, &when, NULL, &hdl[3] ) );
     560                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_ANY, &when, NULL, &hdl[4] ) );
    557561               
    558562                memset(cbcalled, 0, sizeof(cbcalled));
     
    567571                CHECK( 0, fd_msg_free( msg ) );
    568572               
    569                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    570                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    571                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    572                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    573                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
     573                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     574                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     575                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     576                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     577                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
    574578        }
    575579               
     
    581585                when.value = enu2;
    582586               
    583                 CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, &hdl[0] ) );
    584                 CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, &hdl[1] ) );
    585                 CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP, &when, &hdl[2] ) );
    586                 CHECK( 0, fd_disp_register( cb_3, DISP_HOW_CC, &when, &hdl[3] ) );
    587                 CHECK( 0, fd_disp_register( cb_4, DISP_HOW_APPID, &when, &hdl[4] ) );
     587                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, &when, NULL, &hdl[0] ) );
     588                CHECK( 0, fd_disp_register( cb_1, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[1] ) );
     589                CHECK( 0, fd_disp_register( cb_2, DISP_HOW_AVP, &when, NULL, &hdl[2] ) );
     590                CHECK( 0, fd_disp_register( cb_3, DISP_HOW_CC, &when, NULL, &hdl[3] ) );
     591                CHECK( 0, fd_disp_register( cb_4, DISP_HOW_APPID, &when, NULL, &hdl[4] ) );
    588592               
    589593                memset(cbcalled, 0, sizeof(cbcalled));
     
    598602                CHECK( 0, fd_msg_free( msg ) );
    599603               
    600                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_ANY, &when, &hdl[5] ) );
     604                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_ANY, &when, NULL, &hdl[5] ) );
    601605                memset(cbcalled, 0, sizeof(cbcalled));
    602606                msg = new_msg( 2, cmd2, avp1, avp2, 2 );
     
    609613                CHECK( 1, cbcalled[9] );
    610614                CHECK( 0, fd_msg_free( msg ) );
    611                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    612                
    613                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_AVP_ENUMVAL, &when, &hdl[5] ) );
     615                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     616               
     617                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_AVP_ENUMVAL, &when, NULL, &hdl[5] ) );
    614618                memset(cbcalled, 0, sizeof(cbcalled));
    615619                msg = new_msg( 2, cmd2, avp1, avp2, 2 );
     
    622626                CHECK( 1, cbcalled[9] );
    623627                CHECK( 0, fd_msg_free( msg ) );
    624                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    625                
    626                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_AVP, &when, &hdl[5] ) );
     628                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     629               
     630                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_AVP, &when, NULL, &hdl[5] ) );
    627631                memset(cbcalled, 0, sizeof(cbcalled));
    628632                msg = new_msg( 2, cmd2, avp1, avp2, 2 );
     
    635639                CHECK( 1, cbcalled[9] );
    636640                CHECK( 0, fd_msg_free( msg ) );
    637                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    638                
    639                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_CC, &when, &hdl[5] ) );
     641                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     642               
     643                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_CC, &when, NULL, &hdl[5] ) );
    640644                memset(cbcalled, 0, sizeof(cbcalled));
    641645                msg = new_msg( 2, cmd2, avp1, avp2, 2 );
     
    648652                CHECK( 1, cbcalled[9] );
    649653                CHECK( 0, fd_msg_free( msg ) );
    650                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    651                
    652                 CHECK( 0, fd_disp_register( cb_9, DISP_HOW_APPID, &when, &hdl[5] ) );
     654                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     655               
     656                CHECK( 0, fd_disp_register( cb_9, DISP_HOW_APPID, &when, NULL, &hdl[5] ) );
    653657                memset(cbcalled, 0, sizeof(cbcalled));
    654658                msg = new_msg( 2, cmd2, avp1, avp2, 2 );
     
    661665                CHECK( 1, cbcalled[9] );
    662666                CHECK( 0, fd_msg_free( msg ) );
    663                 CHECK( 0, fd_disp_unregister( &hdl[5] ) );
    664                
    665                 CHECK( 0, fd_disp_unregister( &hdl[0] ) );
    666                 CHECK( 0, fd_disp_unregister( &hdl[1] ) );
    667                 CHECK( 0, fd_disp_unregister( &hdl[2] ) );
    668                 CHECK( 0, fd_disp_unregister( &hdl[3] ) );
    669                 CHECK( 0, fd_disp_unregister( &hdl[4] ) );
     667                CHECK( 0, fd_disp_unregister( &hdl[5], NULL ) );
     668               
     669                CHECK( 0, fd_disp_unregister( &hdl[0], NULL ) );
     670                CHECK( 0, fd_disp_unregister( &hdl[1], NULL ) );
     671                CHECK( 0, fd_disp_unregister( &hdl[2], NULL ) );
     672                CHECK( 0, fd_disp_unregister( &hdl[3], NULL ) );
     673                CHECK( 0, fd_disp_unregister( &hdl[4], NULL ) );
    670674        }                       
    671675       
     
    698702        }
    699703       
     704        /* Test opaque pointer management */
     705        {
     706                void * ptr;
     707                CHECK( 0, fd_disp_register( cb_0, DISP_HOW_ANY, NULL, g_opaque, &hdl[0] ) );
     708       
     709                /* Check this handler is called for a message */
     710                msg = new_msg( 0, cmd1, avp1, NULL, 0 );
     711                memset(cbcalled, 0, sizeof(cbcalled));
     712                CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) );
     713                CHECK( 1, cbcalled[0] );
     714                CHECK( DISP_ACT_CONT, action );
     715               
     716                /* Delete the message */
     717                CHECK( 0, fd_msg_free( msg ) );
     718                CHECK( 0, fd_disp_unregister( &hdl[0], &ptr ) );
     719                CHECK( 1, ptr == g_opaque ? 1 : 0 );
     720        }
     721       
    700722        /* That's all for the tests yet */
    701723        PASSTEST();
  • freeDiameter/tests/testsess.c

    r403 r639  
    4545        char *  sid;    /* the session with which the data was registered */
    4646        int  *  freed;  /* location where to write the freed status */
     47        void *  opaque; /* if opaque was provided, this is the value we expect */
    4748};
    4849
    49 static void mycleanup( struct mystate * data, char * sid )
     50static void mycleanup( struct mystate * data, char * sid, void * opaque )
    5051{
    5152        /* sanity */
     
    5657        if (data->freed)
    5758                *(data->freed) += 1;
     59        if (data->opaque) {
     60                CHECK( 1, opaque == data->opaque ? 1 : 0 ); 
     61        }
    5862        /* Now, free the data */
    5963        free(data->sid);
     
    7377        return new;
    7478}
     79
     80void * g_opaque = (void *)"test";
    7581       
    7682
     
    8894        /* Test functions related to handlers (simple situation) */
    8995        {
    90                 CHECK( 0, fd_sess_handler_create ( &hdl1, mycleanup ) );
    91                 CHECK( 0, fd_sess_handler_create ( &hdl2, mycleanup ) );
    92                 CHECK( 0, fd_sess_handler_destroy( &hdl2 ) );
    93                 CHECK( 0, fd_sess_handler_create ( &hdl2, mycleanup ) );
     96                void * testptr = NULL;
     97                CHECK( 0, fd_sess_handler_create ( &hdl1, mycleanup, NULL ) );
     98                CHECK( 0, fd_sess_handler_create ( &hdl2, mycleanup, NULL ) );
     99                CHECK( 0, fd_sess_handler_destroy( &hdl2, &testptr ) );
     100                CHECK( 1, testptr == NULL ? 1 : 0 );
     101                CHECK( 0, fd_sess_handler_create ( &hdl2, mycleanup, g_opaque ) );
    94102                #if 0
    95103                fd_sess_dump_hdl(0, hdl1);
     
    237245                int freed[6];
    238246                struct timespec timeout;
     247                void * testptr = NULL;
    239248               
    240249                /* Create three sessions */
     
    267276                CHECK( NULL, tms );
    268277               
    269                 mycleanup(ms[0], str1);
    270                 mycleanup(ms[1], str1);
     278                mycleanup(ms[0], str1, NULL);
     279                mycleanup(ms[1], str1, NULL);
    271280               
    272281                /* Now create 6 states */
     
    281290                ms[4] = new_state(str1, &freed[4]);
    282291                ms[5] = new_state(str1, &freed[5]);
     292                ms[5]->opaque = g_opaque;
    283293                str2 = strdup(str1);
    284294                CHECK( 1, str2 ? 1 : 0 );
     
    308318               
    309319                /* Destroy handler 2 */
    310                 CHECK( 0, fd_sess_handler_destroy( &hdl2 ) );
     320                CHECK( 0, fd_sess_handler_destroy( &hdl2, &testptr ) );
    311321                CHECK( 0, freed[0] );
    312322                CHECK( 1, freed[1] );
     
    315325                CHECK( 1, freed[4] );
    316326                CHECK( 1, freed[5] );
     327                CHECK( 1, testptr == g_opaque ? 1 : 0 );
    317328               
    318329                #if 1
     
    349360                CHECK( 0, fd_sess_state_retrieve( hdl1, sess1, &tms ) );
    350361                CHECK( 0, fd_sess_getsid(sess1, &str1) );
    351                 mycleanup(tms, str1);
     362                mycleanup(tms, str1, NULL);
    352363        }
    353364       
  • include/freeDiameter/libfreeDiameter.h

    r638 r639  
    15591559 *  handler     : location where the new handler must be stored.
    15601560 *  cleanup     : a callback function that must be called when the session with associated data is destroyed.
     1561 *  opaque      : A pointer that is passed to the cleanup callback -- the content is never examined by the framework.
    15611562 *
    15621563 * DESCRIPTION:
     
    15701571 *  ENOMEM      : Not enough memory to complete the operation
    15711572 */
    1572 int fd_sess_handler_create_internal ( struct session_handler ** handler, void (*cleanup)(session_state * state, char * sid) );
     1573int fd_sess_handler_create_internal ( struct session_handler ** handler, void (*cleanup)(session_state * state, char * sid, void * opaque), void * opaque );
    15731574/* Macro to avoid casting everywhere */
    1574 #define fd_sess_handler_create( _handler, _cleanup ) \
    1575         fd_sess_handler_create_internal( (_handler), (void (*)(session_state *, char *))(_cleanup) )
     1575#define fd_sess_handler_create( _handler, _cleanup, _opaque ) \
     1576        fd_sess_handler_create_internal( (_handler), (void (*)(session_state *, char *, void *))(_cleanup), (void *)(_opaque) )
    15761577
    15771578       
     
    15811582 * PARAMETERS:
    15821583 *  handler     : location of an handler created by fd_sess_handler_create.
     1584 *  opaque      : the opaque pointer registered with the callback is restored here (if ! NULL).
    15831585 *
    15841586 * DESCRIPTION:
     
    15911593 *  ENOMEM      : Not enough memory to complete the operation
    15921594 */
    1593 int fd_sess_handler_destroy ( struct session_handler ** handler );
     1595int fd_sess_handler_destroy ( struct session_handler ** handler, void **opaque );
    15941596
    15951597
     
    25262528 *  avp         : for callbacks registered with DISP_HOW_AVP or DISP_HOW_AVP_ENUMVAL, direct link to the triggering AVP.
    25272529 *  session     : if the message contains a Session-Id AVP, the corresponding session object, NULL otherwise.
     2530 *  opaque      : An opaque pointer that is registered along the session handler.
    25282531 *  action      : upon return, this tells the daemon what to do next.
    25292532 *
     
    25572560 *  how           : How the callback must be registered.
    25582561 *  when          : Values that must match, depending on the how argument.
     2562 *  opaque        : A pointer that is passed back to the handler. The content is not interpreted by the framework.
    25592563 *  handle        : On success, a handler to the registered callback is stored here if not NULL.
    25602564 *                 This handler can be used to unregister the cb.
     
    25682572 *  ENOMEM      : Not enough memory to complete the operation
    25692573 */
    2570 int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, enum disp_action *),
    2571                         enum disp_how how, struct disp_when * when, struct disp_hdl ** handle );
     2574int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, void *, enum disp_action *),
     2575                        enum disp_how how, struct disp_when * when, void * opaque, struct disp_hdl ** handle );
    25722576
    25732577/*
     
    25762580 * PARAMETERS:
    25772581 *  handle       : Location of the handle of the callback that must be unregistered.
     2582 *  opaque       : If not NULL, the opaque data that was registered is restored here.
    25782583 *
    25792584 * DESCRIPTION:
     
    25842589 *  EINVAL      : A parameter is invalid.
    25852590 */
    2586 int fd_disp_unregister ( struct disp_hdl ** handle );
     2591int fd_disp_unregister ( struct disp_hdl ** handle, void ** opaque );
    25872592
    25882593/* Destroy all handlers */
  • libfreeDiameter/dispatch.c

    r398 r639  
    5656        enum disp_how    how;   /* Copy of registration parameter */
    5757        struct disp_when when;  /* Copy of registration parameter */
    58         int             (*cb)( struct msg **, struct avp *, struct session *, enum disp_action *);      /* The callback itself */
     58        int             (*cb)( struct msg **, struct avp *, struct session *, void *, enum disp_action *);      /* The callback itself */
     59        void            *opaque; /* opaque data passed back to the callback */
    5960};
    6061
     
    9394               
    9495                /* We have a match, the cb must be called. */
    95                 CHECK_FCT( (*hdl->cb)(msg, avp, sess, action) );
     96                CHECK_FCT( (*hdl->cb)(msg, avp, sess, hdl->opaque, action) );
    9697               
    9798                if (*action != DISP_ACT_CONT)
     
    109110
    110111/* Create a new handler and link it */
    111 int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, enum disp_action *),
    112                         enum disp_how how, struct disp_when * when, struct disp_hdl ** handle )
     112int fd_disp_register ( int (*cb)( struct msg **, struct avp *, struct session *, void *, enum disp_action *),
     113                        enum disp_how how, struct disp_when * when, void * opaque, struct disp_hdl ** handle )
    113114{
    114115        struct fd_list * cb_list = NULL;
     
    171172        }
    172173        new->cb = cb;
     174        new->opaque = opaque;
    173175       
    174176        /* Now, link this new element in the appropriate lists */
     
    186188
    187189/* Delete a handler */
    188 int fd_disp_unregister ( struct disp_hdl ** handle )
     190int fd_disp_unregister ( struct disp_hdl ** handle, void ** opaque )
    189191{
    190192        struct disp_hdl * del;
     
    199201        CHECK_POSIX( pthread_rwlock_unlock(&fd_disp_lock) );
    200202       
     203        if (opaque)
     204                *opaque = del->opaque;
     205       
    201206        free(del);
    202207        return 0;
     
    208213        TRACE_ENTRY("");
    209214        while (!FD_IS_LIST_EMPTY(&all_handlers)) {
    210                 CHECK_FCT_DO( fd_disp_unregister((void *)&(all_handlers.next->o)), /* continue */ );
     215                CHECK_FCT_DO( fd_disp_unregister((void *)&(all_handlers.next->o), NULL), /* continue */ );
    211216        }
    212217        return;
  • libfreeDiameter/sessions.c

    r557 r639  
    6969        int               eyec; /* An eye catcher also used to ensure the object is valid, must be SH_EYEC */
    7070        int               id;   /* A unique integer to identify this handler */
    71         void            (*cleanup)(session_state *, char *); /* The cleanup function to be called for cleaning a state */
     71        void            (*cleanup)(session_state *, char *, void *); /* The cleanup function to be called for cleaning a state */
     72        void             *opaque; /* a value that is passed as is to the cleanup callback */
    7273};
    7374
     
    253254
    254255/* Create a new handler */
    255 int fd_sess_handler_create_internal ( struct session_handler ** handler, void (*cleanup)(session_state * state, char * sid) )
     256int fd_sess_handler_create_internal ( struct session_handler ** handler, void (*cleanup)(session_state * state, char * sid, void * opaque), void * opaque )
    256257{
    257258        struct session_handler *new;
     
    270271        new->eyec = SH_EYEC;
    271272        new->cleanup = cleanup;
     273        new->opaque = opaque;
    272274       
    273275        *handler = new;
     
    277279/* Destroy a handler, and all states attached to this handler. This operation is very slow but we don't care since it's rarely used.
    278280 * Note that it's better to call this function after all sessions have been deleted... */
    279 int fd_sess_handler_destroy ( struct session_handler ** handler )
     281int fd_sess_handler_destroy ( struct session_handler ** handler, void ** opaque )
    280282{
    281283        struct session_handler * del;
     
    323325                struct state * st = (struct state *)(deleted_states.next->o);
    324326                TRACE_DEBUG(FULL, "Calling cleanup handler for session '%s' and data %p", st->sid, st->state);
    325                 (*del->cleanup)(st->state, st->sid);
     327                (*del->cleanup)(st->state, st->sid, del->opaque);
    326328                free(st->sid);
    327329                fd_list_unlink(&st->chain);
    328330                free(st);
    329331        }
     332       
     333        if (opaque)
     334                *opaque = del->opaque;
    330335       
    331336        /* Free the handler */
     
    583588                fd_list_unlink(&st->chain);
    584589                TRACE_DEBUG(FULL, "Calling handler %p cleanup for state registered with session '%s'", st->hdl, sess->sid);
    585                 (*st->hdl->cleanup)(st->state, sess->sid);
     590                (*st->hdl->cleanup)(st->state, sess->sid, st->hdl->opaque);
    586591                free(st);
    587592        }
     
    805810                fd_log_debug("\t  %*s  Invalid session handler object\n", level, "");
    806811        } else {
    807                 fd_log_debug("\t  %*s  id %d, cleanup %p\n", level, "", handler->id, handler->cleanup);
     812                fd_log_debug("\t  %*s  id %d, cleanup %p, opaque %p\n", level, "", handler->id, handler->cleanup, handler->opaque);
    808813        }
    809814        fd_log_debug("\t  %*s -- end of handler @%p --\n", level, "", handler);
Note: See TracChangeset for help on using the changeset viewer.