annotate libfdcore/hooks.c @ 1562:6219359a36a9 default tip

Merge latest changes from proposed branch
author Sebastien Decugis <sdecugis@freediameter.net>
date Mon, 21 Jun 2021 19:08:18 +0800
parents 566bb46cc73f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
1 /*********************************************************************************************************
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
4 * *
1554
566bb46cc73f Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1405
diff changeset
5 * Copyright (c) 2020, WIDE Project and NICT *
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
6 * All rights reserved. *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
7 * *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
8 * Redistribution and use of this software in source and binary forms, with or without modification, are *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
9 * permitted provided that the following conditions are met: *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
10 * *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
11 * * Redistributions of source code must retain the above *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
12 * copyright notice, this list of conditions and the *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
13 * following disclaimer. *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
14 * *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
16 * copyright notice, this list of conditions and the *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
17 * following disclaimer in the documentation and/or other *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
18 * materials provided with the distribution. *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
19 * *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
20 * * Neither the name of the WIDE Project or NICT nor the *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
21 * names of its contributors may be used to endorse or *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
22 * promote products derived from this software without *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
23 * specific prior written permission of WIDE Project and *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
24 * NICT. *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
25 * *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
34 *********************************************************************************************************/
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
35
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
36 #include "fdcore-internal.h"
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
37
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
38 /* Structures for the fd_hook_data_hdl management */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
39 static struct fd_hook_data_hdl {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
40 size_t pmd_size;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
41 void (*pmd_init_cb)(struct fd_hook_permsgdata *);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
42 void (*pmd_fini_cb)(struct fd_hook_permsgdata *);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
43 } HDH_array[FD_HOOK_HANDLE_LIMIT];
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
44 static int max_index = 0;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
45 static pthread_mutex_t HDH_lock = PTHREAD_MUTEX_INITIALIZER;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
46
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
47 /* The structure linked from the msg structure list */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
48 struct pmd_list_item {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
49 struct fd_list chain; /* this list is ordered by hdl */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
50 struct fd_hook_data_hdl * hdl;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
51 struct fd_hook_permsgdata { } pmd; /* this data belongs to the extension; we only know the size of it */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
52 };
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
53
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
54 #define sizeof_pmd(hdl) (((size_t)&((struct pmd_list_item *)0)->pmd) + hdl->pmd_size)
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
55
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
56 /* Now a hook registered by an extension */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
57 struct fd_hook_hdl {
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
58 struct fd_list chain[HOOK_LAST+1];
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
59 void (*fd_hook_cb)(enum fd_hook_type type, struct msg * msg, struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
60 void *regdata;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
61 struct fd_hook_data_hdl *data_hdl;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
62 };
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
63
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
64 /* Array of those hooks */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
65 struct {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
66 struct fd_list sentinel;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
67 pthread_rwlock_t rwlock;
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
68 } HS_array[HOOK_LAST+1];
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
69
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
70 /* Initialize the array of sentinels for the hooks */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
71 int fd_hooks_init(void)
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
72 {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
73 int i;
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
74 for (i=0; i <= HOOK_LAST; i++) {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
75 fd_list_init(&HS_array[i].sentinel, NULL);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
76 CHECK_POSIX( pthread_rwlock_init(&HS_array[i].rwlock, NULL) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
77 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
78 return 0;
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
79 }
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
80
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
81 /* Get a slot in the array */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
82 int fd_hook_data_register(
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
83 size_t permsgdata_size,
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
84 void (*permsgdata_init_cb) (struct fd_hook_permsgdata *),
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
85 void (*permsgdata_fini_cb) (struct fd_hook_permsgdata *),
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
86 struct fd_hook_data_hdl **new_handle)
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
87 {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
88 int ret = ENOSPC, idx;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
89 TRACE_ENTRY("%zd %p %p %p", permsgdata_size, permsgdata_init_cb, permsgdata_fini_cb, new_handle);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
90
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
91 CHECK_PARAMS( permsgdata_size && new_handle );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
92
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
93 CHECK_POSIX( pthread_mutex_lock(&HDH_lock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
94 if (max_index < FD_HOOK_HANDLE_LIMIT) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
95 idx = max_index++;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
96 ret = 0;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
97 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
98 CHECK_POSIX( pthread_mutex_unlock(&HDH_lock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
99
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
100 if (ret == 0) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
101 HDH_array[idx].pmd_size = permsgdata_size;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
102 HDH_array[idx].pmd_init_cb = permsgdata_init_cb;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
103 HDH_array[idx].pmd_fini_cb = permsgdata_fini_cb;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
104 *new_handle = &HDH_array[idx];
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
105 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
106
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
107 return ret;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
108 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
109
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
110 /* Register a new hook callback */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
111 int fd_hook_register ( uint32_t type_mask,
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
112 void (*fd_hook_cb)(enum fd_hook_type type, struct msg * msg, struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd, void * regdata),
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
113 void *regdata,
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
114 struct fd_hook_data_hdl *data_hdl,
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
115 struct fd_hook_hdl ** handler )
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
116 {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
117 struct fd_hook_hdl * newhdl = NULL;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
118 int i;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
119
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
120 TRACE_ENTRY("%x %p %p %p %p", type_mask, fd_hook_cb, regdata, data_hdl, handler);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
121
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
122 CHECK_PARAMS( fd_hook_cb && handler );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
123
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
124 CHECK_MALLOC( newhdl = malloc(sizeof(struct fd_hook_hdl)) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
125 memset(newhdl, 0, sizeof(struct fd_hook_hdl));
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
126
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
127 newhdl->fd_hook_cb = fd_hook_cb;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
128 newhdl->regdata = regdata;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
129 newhdl->data_hdl = data_hdl;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
130
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
131 for (i=0; i <= HOOK_LAST; i++) {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
132 fd_list_init(&newhdl->chain[i], newhdl);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
133 if (type_mask & (1<<i)) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
134 CHECK_POSIX( pthread_rwlock_wrlock(&HS_array[i].rwlock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
135 fd_list_insert_before( &HS_array[i].sentinel, &newhdl->chain[i]);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
136 CHECK_POSIX( pthread_rwlock_unlock(&HS_array[i].rwlock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
137 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
138 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
139
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
140 *handler = newhdl;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
141 return 0;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
142 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
143
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
144 /* free this hook callback */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
145 int fd_hook_unregister( struct fd_hook_hdl * handler )
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
146 {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
147 int i;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
148 TRACE_ENTRY("%p", handler);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
149 CHECK_PARAMS( handler );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
150
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
151 for (i=0; i <= HOOK_LAST; i++) {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
152 if ( ! FD_IS_LIST_EMPTY(&handler->chain[i])) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
153 CHECK_POSIX( pthread_rwlock_wrlock(&HS_array[i].rwlock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
154 fd_list_unlink(&handler->chain[i]);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
155 CHECK_POSIX( pthread_rwlock_unlock(&HS_array[i].rwlock) );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
156 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
157 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
158
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
159 free(handler);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
160
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
161 return 0;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
162 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
163
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
164 /* callback for the libfdproto to free the data associated with a message */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
165 static void pmdl_free(struct fd_msg_pmdl *pmdl)
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
166 {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
167 /* destroy all the items in the list */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
168 while (!FD_IS_LIST_EMPTY(&pmdl->sentinel)) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
169 struct pmd_list_item * li = (struct pmd_list_item *)(pmdl->sentinel.next);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
170 if (li->hdl->pmd_fini_cb) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
171 (*li->hdl->pmd_fini_cb)(&li->pmd);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
172 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
173 fd_list_unlink(&li->chain);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
174 free(li);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
175 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
176 CHECK_POSIX_DO( pthread_mutex_destroy(&pmdl->lock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
177 pmdl->sentinel.o = NULL;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
178 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
179
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
180 /* Save the list of pmd into the message structure, as well as the callback to free this list */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
181 void fd_hook_associate(struct msg * msg, struct fd_msg_pmdl * pmdl)
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
182 {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
183 struct fd_msg_pmdl * in_msg;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
184
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
185 CHECK_PARAMS_DO( msg && pmdl, return );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
186 in_msg = fd_msg_pmdl_get(msg);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
187 ASSERT(in_msg && (in_msg->sentinel.o == NULL)); /* error / already initialized ??? */
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
188 in_msg->sentinel.o = pmdl_free;
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
189 /* Now move all items from the pmdl pointer into the initialized list */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
190 CHECK_POSIX_DO( pthread_mutex_lock(&pmdl->lock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
191 fd_list_move_end(&in_msg->sentinel, &pmdl->sentinel);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
192 CHECK_POSIX_DO( pthread_mutex_unlock(&pmdl->lock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
193 pmdl_free(pmdl);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
194 /* We're done */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
195 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
196
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
197 /* Return the location of the permsgdata area corresponding to this handle, after eventually having created it. Return NULL in case of failure */
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
198 static struct fd_hook_permsgdata * get_or_create_pmd(struct fd_msg_pmdl *pmdl, struct fd_hook_data_hdl * h)
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
199 {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
200 struct fd_hook_permsgdata * ret = NULL;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
201 struct fd_list * li;
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
202
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
203 CHECK_POSIX_DO( pthread_mutex_lock(&pmdl->lock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
204
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
205 if (pmdl->sentinel.o == NULL) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
206 pmdl->sentinel.o = pmdl_free;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
207 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
208
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
209 /* Search in the list for an item with the same handle. The list is ordered by this handle */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
210 for (li=pmdl->sentinel.next; li != &pmdl->sentinel; li = li->next) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
211 struct pmd_list_item * pli = (struct pmd_list_item *) li;
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
212 if (pli->hdl == h)
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
213 ret = &pli->pmd;
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
214 if (pli->hdl >= h)
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
215 break;
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
216 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
217 if (!ret) {
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
218 /* we need to create a new one and insert before li */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
219 struct pmd_list_item * pli;
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
220 CHECK_MALLOC_DO( pli = malloc(sizeof_pmd(h)), );
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
221 if (pli) {
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
222 memset(pli, 0, sizeof_pmd(h));
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
223 fd_list_init(&pli->chain, pli);
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
224 pli->hdl = h;
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
225 ret = &pli->pmd;
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
226 if (h->pmd_init_cb) {
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
227 (*h->pmd_init_cb)(ret);
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
228 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
229 fd_list_insert_before(li, &pli->chain);
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
230 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
231 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
232
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
233 CHECK_POSIX_DO( pthread_mutex_unlock(&pmdl->lock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
234 return ret;
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
235 }
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
236
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
237 struct fd_hook_permsgdata * fd_hook_get_pmd(struct fd_hook_data_hdl *data_hdl, struct msg * msg)
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
238 {
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
239 return get_or_create_pmd(fd_msg_pmdl_get(msg), data_hdl);
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
240 }
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
241
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
242 struct fd_hook_permsgdata * fd_hook_get_request_pmd(struct fd_hook_data_hdl *data_hdl, struct msg * answer)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
243 {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
244 struct msg * qry;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
245 struct fd_msg_pmdl *pmdl;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
246 struct fd_hook_permsgdata * ret = NULL;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
247 struct fd_list * li;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
248
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
249 CHECK_FCT_DO( fd_msg_answ_getq(answer, &qry), return NULL );
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
250 if (!qry)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
251 return NULL;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
252
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
253 pmdl = fd_msg_pmdl_get(qry);
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
254 if (!pmdl)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
255 return NULL;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
256
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
257 CHECK_POSIX_DO( pthread_mutex_lock(&pmdl->lock), );
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
258 /* Search in the list for an item with the same handle. The list is ordered by this handle */
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
259 for (li=pmdl->sentinel.next; li != &pmdl->sentinel; li = li->next) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
260 struct pmd_list_item * pli = (struct pmd_list_item *) li;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
261 if (pli->hdl == data_hdl)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
262 ret = &pli->pmd;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
263 if (pli->hdl >= data_hdl)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
264 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
265 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
266 CHECK_POSIX_DO( pthread_mutex_unlock(&pmdl->lock), );
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
267 return ret;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
268 }
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
269
1128
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
270 /* Create a mask */
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
271 uint32_t fd_hook_mask_helper(int dummy, ...)
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
272 {
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
273 va_list ap;
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
274 uint32_t ret = 0;
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
275 int next;
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
276
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
277 va_start(ap, dummy);
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
278 while ((next = va_arg(ap, int)) >= 0) {
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
279 if (next > HOOK_LAST)
1128
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
280 break; /* invalid parameter */
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
281 ret |= (1<<next);
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
282 }
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
283 va_end(ap);
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
284
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
285 return ret;
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
286 }
7c5449ddc434 New macro HOOK_MASK to ease call of the fd_hook_register function
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
287
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
288 static pthread_mutex_t hook_default_mtx = PTHREAD_MUTEX_INITIALIZER;
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
289 static char * hook_default_buf = NULL;
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
290 static size_t hook_default_len = 0;
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
291
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
292 /* The function that does the work of calling the extension's callbacks and also managing the permessagedata structures */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
293 void fd_hook_call(enum fd_hook_type type, struct msg * msg, struct fd_peer * peer, void * other, struct fd_msg_pmdl * pmdl)
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
294 {
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
295 struct fd_list * li;
1194
90d1222a65a8 Rename HOOK_PEER_LAST to HOOK_LAST
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1186
diff changeset
296 ASSERT(type <= HOOK_LAST);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
297 int call_default = 0;
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
298
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
299 /* lock the list of hooks for this type */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
300 CHECK_POSIX_DO( pthread_rwlock_rdlock(&HS_array[type].rwlock), );
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
301
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
302 pthread_cleanup_push( fd_cleanup_rwlock, &HS_array[type].rwlock );
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
303
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
304 if (FD_IS_LIST_EMPTY(&HS_array[type].sentinel)) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
305 call_default = 1;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
306 } else {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
307 /* for each registered hook */
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
308 for (li = HS_array[type].sentinel.next; li != &HS_array[type].sentinel; li = li->next) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
309 struct fd_hook_hdl * h = (struct fd_hook_hdl *)li->o;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
310 struct fd_hook_permsgdata * pmd = NULL;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
311
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
312 /* do we need to handle pmd ? */
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
313 if (h->data_hdl && pmdl) {
1329
175f2eb883a0 Add function to retrieve pmd structure associated with a request.
Thomas Klausner <tk@giga.or.at>
parents: 1307
diff changeset
314 pmd = get_or_create_pmd(pmdl, h->data_hdl);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
315 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
316
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
317 /* Now, call this callback */
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
318 (*h->fd_hook_cb)(type, msg, &peer->p_hdr, other, pmd, h->regdata);
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
319 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
320 }
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
321
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
322 pthread_cleanup_pop(0);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
323
1098
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
324 /* done */
f38d77f9cfd3 Initial implementation of the hook mechanism
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1077
diff changeset
325 CHECK_POSIX_DO( pthread_rwlock_unlock(&HS_array[type].rwlock), );
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
326
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
327 if (call_default) {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
328 CHECK_POSIX_DO( pthread_mutex_lock(&hook_default_mtx), );
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
329
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
330 pthread_cleanup_push( fd_cleanup_mutex, &hook_default_mtx );
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
331
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
332 /* There was no registered handler, default behavior for this hook */
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
333 switch (type) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
334 case HOOK_DATA_RECEIVED: {
1405
3cbe458fbfa9 Fix compiler warnings
Luke Mewburn <luke@mewburn.net>
parents: 1329
diff changeset
335 #ifdef DEBUG
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
336 struct fd_cnx_rcvdata *rcv_data = other;
1405
3cbe458fbfa9 Fix compiler warnings
Luke Mewburn <luke@mewburn.net>
parents: 1329
diff changeset
337 #endif
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
338 LOG_A("RCV: %zd bytes", rcv_data->length);
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
339 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
340 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
341
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
342 case HOOK_MESSAGE_RECEIVED: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
343 CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
344 LOG_D("RCV from '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
345 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
346 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
347
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
348 case HOOK_MESSAGE_LOCAL: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
349 CHECK_MALLOC_DO(fd_msg_dump_full(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
350 LOG_A("Handled to framework for sending: %s", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
351 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
352 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
353
1299
035f489b845b Added a new hook HOOK_MESSAGE_SENDING
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1245
diff changeset
354 case HOOK_MESSAGE_SENDING: {
035f489b845b Added a new hook HOOK_MESSAGE_SENDING
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1245
diff changeset
355 LOG_A("SENDING message to '%s'", peer ? peer->p_hdr.info.pi_diamid : "<unknown>");
035f489b845b Added a new hook HOOK_MESSAGE_SENDING
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1245
diff changeset
356 break;
035f489b845b Added a new hook HOOK_MESSAGE_SENDING
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1245
diff changeset
357 }
035f489b845b Added a new hook HOOK_MESSAGE_SENDING
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1245
diff changeset
358
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
359 case HOOK_MESSAGE_SENT: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
360 CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
361 LOG_D("SENT to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
362 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
363 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
364
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
365 case HOOK_MESSAGE_FAILOVER: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
366 CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
367 LOG_D("Failing over message sent to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
368 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
369 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
370
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
371 case HOOK_MESSAGE_PARSING_ERROR: {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
372 if (msg) {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
373 DiamId_t id = NULL;
1306
0d15dad33f0b Fix logic error when calling fd_msg_source_get().
Thomas Klausner <tk@giga.or.at>
parents: 1245
diff changeset
374 if (fd_msg_source_get( msg, &id, NULL ))
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
375 id = (DiamId_t)"<error getting source>";
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
376
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
377 if (!id)
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
378 id = (DiamId_t)"<local>";
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
379
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
380 CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
381
1163
6df90573cf57 Remove \n from LOG_E line.
Thomas Klausner <tk@giga.or.at>
parents: 1128
diff changeset
382 LOG_E("Parsing error: '%s' for the following message received from '%s':", (char *)other, (char *)id);
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
383 LOG_SPLIT(FD_LOG_ERROR, " ", hook_default_buf, NULL);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
384 } else {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
385 struct fd_cnx_rcvdata *rcv_data = other;
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
386 CHECK_MALLOC_DO(fd_dump_extend_hexdump(&hook_default_buf, &hook_default_len, NULL, rcv_data->buffer, rcv_data->length, 0, 0), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
387 LOG_E("Parsing error: cannot parse %zdB buffer from '%s': %s", rcv_data->length, peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
388 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
389 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
390 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
391
1301
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
392 case HOOK_MESSAGE_PARSING_ERROR2: {
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
393 CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
394
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
395 LOG_E("Returning following message after parsing error:");
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
396 LOG_SPLIT(FD_LOG_ERROR, " ", hook_default_buf, NULL);
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
397 break;
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
398 }
50fb308e84f7 Added a new hook to allow extensions act on the error messages being returned in case of parsing error (e.g. if some mandatory AVP are expected in error messages)
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1299
diff changeset
399
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
400 case HOOK_MESSAGE_ROUTING_ERROR: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
401 CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
1163
6df90573cf57 Remove \n from LOG_E line.
Thomas Klausner <tk@giga.or.at>
parents: 1128
diff changeset
402 LOG_E("Routing error: '%s' for the following message:", (char *)other);
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
403 LOG_SPLIT(FD_LOG_ERROR, " ", hook_default_buf, NULL);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
404 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
405 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
406
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
407 case HOOK_MESSAGE_ROUTING_FORWARD: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
408 CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
409 LOG_D("FORWARDING: %s", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
410 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
411 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
412
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
413 case HOOK_MESSAGE_ROUTING_LOCAL: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
414 CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
415 LOG_D("DISPATCHING: %s", hook_default_buf);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
416 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
417 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
418
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
419 case HOOK_MESSAGE_DROPPED: {
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
420 CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
1163
6df90573cf57 Remove \n from LOG_E line.
Thomas Klausner <tk@giga.or.at>
parents: 1128
diff changeset
421 LOG_E("Message discarded ('%s'):", (char *)other);
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
422 LOG_SPLIT(FD_LOG_ERROR, " ", hook_default_buf, NULL);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
423 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
424 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
425
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
426 case HOOK_PEER_CONNECT_FAILED: {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
427 if (msg) {
1245
4b511d9b3def Change default dump of peer connection, add more options to the dbg_msg_dumps extensions
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1215
diff changeset
428 CHECK_MALLOC_DO(fd_msg_dump_full(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
1168
a4604f98adae Split output of fd_msg_dump_treeview
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1163
diff changeset
429 LOG_N("Connection to '%s' failed: '%s'; CER/CEA dump:", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", (char *)other);
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
430 LOG_SPLIT(FD_LOG_NOTICE, " ", hook_default_buf, NULL);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
431 } else {
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
432 LOG_D("Connection to '%s' failed: %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", (char *)other);
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
433 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
434 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
435 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
436
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
437 case HOOK_PEER_CONNECT_SUCCESS: {
1120
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1103
diff changeset
438 DiamId_t id = NULL;
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1103
diff changeset
439 if ((!fd_msg_source_get( msg, &id, NULL )) && (id == NULL)) { /* The CEA is locally issued */
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1103
diff changeset
440 fd_msg_answ_getq(msg, &msg); /* We dump the CER in that case */
c473581adff2 Cleanup some traces
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1103
diff changeset
441 }
1245
4b511d9b3def Change default dump of peer connection, add more options to the dbg_msg_dumps extensions
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1215
diff changeset
442 CHECK_MALLOC_DO(fd_msg_dump_full(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
1186
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
443 char protobuf[40];
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
444 if (peer) {
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
445 CHECK_FCT_DO(fd_peer_cnx_proto_info(&peer->p_hdr, protobuf, sizeof(protobuf)), break );
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
446 } else {
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
447 protobuf[0] = '-';
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
448 protobuf[1] = '\0';
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
449 }
56c36d1007b4 Further preparation of the DTLS integration. Some cleanups in the GNUTLS handling.
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1168
diff changeset
450 LOG_N("Connected to '%s' (%s), remote capabilities: ", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", protobuf);
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
451 LOG_SPLIT(FD_LOG_NOTICE, " ", hook_default_buf, NULL);
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
452 break;
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
453 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
454
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
455 }
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
456
1215
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
457 pthread_cleanup_pop(0);
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
458
65c6460f60f2 Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1202
diff changeset
459 CHECK_POSIX_DO( pthread_mutex_unlock(&hook_default_mtx), );
1103
d8591b1c56cd Implemented a few hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1098
diff changeset
460 }
1077
b36c81e52e9a Add empty code for hooks so that dbg_interactive extension can load
Sebastien Decugis <sdecugis@freediameter.net>
parents:
diff changeset
461 }
"Welcome to our mercurial repository"