Store the port number as a string for the unresolved ports to avoid repeated calls to getservbyport() for all unresolved ports.

svn path=/trunk/; revision=51170
This commit is contained in:
Anders Broman 2013-08-06 17:07:20 +00:00
parent f6c55aa296
commit cc7c777f55
1 changed files with 30 additions and 28 deletions

View File

@ -657,6 +657,7 @@ static gchar
const char *serv_proto;
struct servent *servp;
serv_port_t *serv_port_table;
gchar *name;
if (!service_resolution_initialized) {
@ -717,36 +718,37 @@ static gchar
if ((!gbl_resolv_flags.transport_name) ||
(servp = getservbyport(g_htons(port), serv_proto)) == NULL) {
/* unknown port */
return ep_utoa(port);
} else {
if(serv_port_table == NULL){
int *key;
key = (int *)g_new(int, 1);
*key = port;
serv_port_table = g_new0(serv_port_t,1);
g_hash_table_insert(serv_port_hashtable, key, serv_port_table);
}
switch(proto) {
case PT_UDP:
serv_port_table->udp_name = servp->s_name;
break;
case PT_TCP:
serv_port_table->tcp_name = servp->s_name;
break;
case PT_SCTP:
serv_port_table->sctp_name = servp->s_name;
break;
case PT_DCCP:
serv_port_table->dccp_name = servp->s_name;
break;
default:
return NULL;
/*NOTREACHED*/
}
return servp->s_name;
name = (gchar*)g_malloc(16);
guint32_to_str_buf(port, name, 16);
}else{
name = g_strdup(servp->s_name);
}
if(serv_port_table == NULL){
int *key;
key = (int *)g_new(int, 1);
*key = port;
serv_port_table = g_new0(serv_port_t,1);
g_hash_table_insert(serv_port_hashtable, key, serv_port_table);
}
switch(proto) {
case PT_UDP:
serv_port_table->udp_name = name;
break;
case PT_TCP:
serv_port_table->tcp_name = name;
break;
case PT_SCTP:
serv_port_table->sctp_name = name;
break;
case PT_DCCP:
serv_port_table->dccp_name = name;
break;
default:
return NULL;
/*NOTREACHED*/
}
return name;
} /* serv_name_lookup */