@@ -39,57 +39,62 @@ unsigned int address_node_hash(pht_hash_table_t *table, void *node) {
39
39
40
40
address = node ;
41
41
42
- str_ip .len = address -> k .subnet -> ip .len ;
43
- str_ip .s = (char * )address -> k .subnet -> ip .u .addr ;
42
+ str_ip .len = address -> k .subnet . ip .len ;
43
+ str_ip .s = (char * )address -> k .subnet . ip .u .addr ;
44
44
45
45
return address_hash (table , & str_ip );
46
46
}
47
47
48
48
void delete_address_node (p_address_node_t * node ) {
49
- if (node ) {
50
- if (node -> k .subnet ) shm_free (node -> k .subnet );
51
- if (node -> v .pattern ) shm_free (node -> v .pattern );
52
- if (node -> v .info ) shm_free (node -> v .info );
53
- shm_free (node );
54
- }
49
+ if (node ) shm_free (node );
55
50
}
56
51
57
- char * str_dup (str * src ) {
58
- char * dest = NULL ;
59
- if (src -> len ) {
60
- dest = shm_malloc (src -> len + 1 );
61
- if (!dest ) return NULL ;
62
- memcpy (dest , src -> s , src -> len );
63
- dest [src -> len ] = '\0' ;
64
- }
65
- return dest ;
52
+ p_address_node_t * alloc_address_node (str * pattern , str * info ) {
53
+ int total_size , pattern_len , info_len ;
54
+ char * offset ;
55
+ p_address_node_t * node ;
56
+
57
+ pattern_len = pattern -> len > 0 ? pattern -> len + 1 : 0 ;
58
+ info_len = (info -> len > 0 ? info -> len + 1 : 0 );
59
+
60
+ total_size = sizeof (p_address_node_t ) + pattern_len + info_len ;
61
+ offset = shm_malloc (total_size );
62
+ if (!offset ) return NULL ;
63
+
64
+ node = (p_address_node_t * )offset ;
65
+
66
+ offset += sizeof (p_address_node_t );
67
+ node -> v .pattern = pattern_len > 0 ? offset : NULL ;
68
+
69
+ offset += pattern_len ;
70
+ node -> v .info = info_len > 0 ? offset : NULL ;
71
+
72
+ return node ;
66
73
}
67
74
68
75
p_address_node_t * new_address_node (struct net * subnet , unsigned int port , int proto , str * pattern ,
69
76
str * info ) {
70
77
p_address_node_t * node ;
71
78
72
- node = shm_malloc ( sizeof ( p_address_node_t ) );
79
+ node = alloc_address_node ( pattern , info );
73
80
if (!node ) return NULL ;
74
81
75
82
node -> v .port = port ;
76
83
node -> v .proto = proto ;
77
84
78
- node -> k .subnet = shm_malloc (sizeof (struct net ));
79
- if (!node -> k .subnet ) goto err ;
80
- memcpy (node -> k .subnet , subnet , sizeof (struct net ));
85
+ memcpy (& node -> k .subnet , subnet , sizeof (struct net ));
81
86
82
- node -> v .pattern = str_dup (pattern );
83
- if (pattern -> len && !node -> v .pattern ) goto err ;
87
+ if (pattern -> len > 0 ) {
88
+ memcpy (node -> v .pattern , pattern -> s , pattern -> len );
89
+ node -> v .pattern [pattern -> len ] = '\0' ;
90
+ }
84
91
85
- node -> v .info = str_dup (info );
86
- if (info -> len && !node -> v .info ) goto err ;
92
+ if (info -> len > 0 ) {
93
+ memcpy (node -> v .info , info -> s , info -> len );
94
+ node -> v .info [info -> len ] = '\0' ;
95
+ }
87
96
88
97
return node ;
89
-
90
- err :
91
- delete_address_node (node );
92
- return NULL ;
93
98
}
94
99
95
100
void delete_group_node (p_group_node_t * group ) {
@@ -227,7 +232,7 @@ int match_address(p_address_node_t *address, struct ip_addr *ip, unsigned int po
227
232
228
233
if ((address -> v .proto == PROTO_NONE || address -> v .proto == proto || proto == PROTO_NONE ) &&
229
234
(address -> v .port == PORT_ANY || address -> v .port == port || port == PORT_ANY ) &&
230
- (ip_addr_cmp (ip , & address -> k .subnet -> ip ) || matchnet (ip , address -> k .subnet ))) {
235
+ (ip_addr_cmp (ip , & address -> k .subnet . ip ) || matchnet (ip , & address -> k .subnet ))) {
231
236
if (!address -> v .pattern || !pattern ) {
232
237
LM_DBG ("no pattern to match\n" );
233
238
return 1 ;
@@ -336,7 +341,7 @@ int pm_hash_find_group(p_address_table_t *table, struct ip_addr *ip, unsigned in
336
341
for (address = group -> v .address .bucket [address_hash (& group -> v .address , & str_ip )]; address ;
337
342
address = address -> next ) {
338
343
if ((address -> v .port == PORT_ANY || address -> v .port == port || port == PORT_ANY ) &&
339
- (ip_addr_cmp (ip , & address -> k .subnet -> ip ) || matchnet (ip , address -> k .subnet ))) {
344
+ (ip_addr_cmp (ip , & address -> k .subnet . ip ) || matchnet (ip , & address -> k .subnet ))) {
340
345
return group -> k .group ;
341
346
}
342
347
}
@@ -363,13 +368,13 @@ int pm_hash_mi_print(p_address_table_t *table, mi_item_t *part_item, struct pm_p
363
368
for (group = table -> group ; group ; group = group -> next ) {
364
369
for (i = 0 ; i < group -> v .address .bucket_count ; ++ i ) {
365
370
for (address = group -> v .address .bucket [i ]; address ; address = address -> next ) {
366
- mask = ip_addr2a (& address -> k .subnet -> mask );
371
+ mask = ip_addr2a (& address -> k .subnet . mask );
367
372
if (!mask ) {
368
373
LM_ERR ("cannot print mask address\n" );
369
374
continue ;
370
375
}
371
- if (memcmp (& address -> k .subnet -> mask .u , ipv6_mask_128 ,
372
- address -> k . subnet -> mask . len ) == 0 ) {
376
+ if (memcmp (& address -> k .subnet . mask .u , ipv6_mask_128 , address -> k . subnet . mask . len ) ==
377
+ 0 ) {
373
378
if (is_subnet ) continue ;
374
379
is_address = 1 ;
375
380
} else {
@@ -382,11 +387,11 @@ int pm_hash_mi_print(p_address_table_t *table, mi_item_t *part_item, struct pm_p
382
387
383
388
if (add_mi_number (dest_item , MI_SSTR ("grp" ), group -> k .group ) < 0 ) return -1 ;
384
389
385
- p = ip_addr2a (& address -> k .subnet -> ip );
390
+ p = ip_addr2a (& address -> k .subnet . ip );
386
391
if (add_mi_string (dest_item , MI_SSTR ("ip" ), p , strlen (p )) < 0 ) return -1 ;
387
392
388
393
if (is_address ) {
389
- if (address -> k .subnet -> ip .af == AF_INET ) {
394
+ if (address -> k .subnet . ip .af == AF_INET ) {
390
395
if (add_mi_string (dest_item , MI_SSTR ("mask" ), MI_SSTR ("32" )) < 0 ) return -1 ;
391
396
} else {
392
397
if (add_mi_string (dest_item , MI_SSTR ("mask" ), MI_SSTR ("128" )) < 0 )
0 commit comments