* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA. */
-#include <glib/gprintf.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include "libtcp-portmon.h"
+#include <glib/gprintf.h>
/* -------------------------------------------------------------------
* IMPLEMENTATION INTERFACE
int peek_tcp_port_monitor(const tcp_port_monitor_t *p_monitor, int item,
int connection_index, char *p_buffer, size_t buffer_size)
{
- struct hostent *p_hostent;
- struct servent *p_servent;
struct in_addr net;
+ struct sockaddr_in sa;
+ sa.sin_family = AF_INET;
+
if (!p_monitor || !p_buffer || connection_index < 0) {
return -1;
}
case REMOTEHOST:
- p_hostent = gethostbyaddr((const void *)
- &p_monitor->p_peek[connection_index]->remote_addr,
- sizeof(in_addr_t), AF_INET);
- /* if no host name found, just use ip address. */
- if (!p_hostent || !p_hostent->h_name) {
- net.s_addr = p_monitor->p_peek[connection_index]->remote_addr;
- snprintf(p_buffer, buffer_size, "%s", inet_ntoa(net));
- break;
- }
- snprintf(p_buffer, buffer_size, "%s", p_hostent->h_name);
+ memcpy(&sa.sin_addr.s_addr, &p_monitor->p_peek[connection_index]->remote_addr, sizeof(sa.sin_addr.s_addr));
+ getnameinfo((struct sockaddr *) &sa, sizeof(struct sockaddr_in), p_buffer, buffer_size, NULL, 0, 0);
break;
case REMOTEPORT:
case REMOTESERVICE:
- p_servent = getservbyport(
- htons(p_monitor->p_peek[connection_index]->remote_port), "tcp");
- /* if no service name found for the port,
- * just use the port number. */
- if (!p_servent || !p_servent->s_name) {
- snprintf(p_buffer, buffer_size, "%d",
- p_monitor->p_peek[connection_index]->remote_port);
- } else {
- snprintf(p_buffer, buffer_size, "%s", p_servent->s_name);
- }
+ sa.sin_port=htons(p_monitor->p_peek[connection_index]->remote_port);
+ getnameinfo((struct sockaddr *) &sa, sizeof(struct sockaddr_in), NULL, 0, p_buffer, buffer_size, NI_NUMERICHOST);
break;
case LOCALIP:
case LOCALHOST:
- p_hostent = gethostbyaddr((const void *)
- &p_monitor->p_peek[connection_index]->local_addr,
- sizeof(in_addr_t), AF_INET);
- /* if no host name found, just use ip address. */
- if (!p_hostent || !p_hostent->h_name) {
- net.s_addr = p_monitor->p_peek[connection_index]->local_addr;
- snprintf(p_buffer, buffer_size, "%s", inet_ntoa(net));
- break;
- }
- snprintf(p_buffer, buffer_size, "%s", p_hostent->h_name);
+ memcpy(&sa.sin_addr.s_addr, &p_monitor->p_peek[connection_index]->local_addr, sizeof(sa.sin_addr.s_addr));
+ getnameinfo((struct sockaddr *) &sa, sizeof(struct sockaddr_in), p_buffer, buffer_size, NULL, 0, 0);
break;
case LOCALPORT:
case LOCALSERVICE:
- p_servent = getservbyport(
- htons(p_monitor->p_peek[connection_index]->local_port), "tcp");
- /* if no service name found for the port,
- * just use the port number. */
- if (!p_servent || !p_servent->s_name) {
- snprintf(p_buffer, buffer_size, "%d",
- p_monitor->p_peek[connection_index]->local_port);
- break;
- }
- snprintf(p_buffer, buffer_size, "%s", p_servent->s_name);
+ sa.sin_port=htons(p_monitor->p_peek[connection_index]->local_port);
+ getnameinfo((struct sockaddr *) &sa, sizeof(struct sockaddr_in), NULL, 0, p_buffer, buffer_size, NI_NUMERICHOST);
break;
default:
(unsigned long *) &inode) != 7) {
fprintf(stderr, "/proc/net/tcp: bad file format\n");
}
-
- if ((inode == 0) || (state != TCP_ESTABLISHED)) {
+ /** TCP_ESTABLISHED equals 1, but is not (always??) included **/
+ //if ((inode == 0) || (state != TCP_ESTABLISHED)) {
+ if((inode == 0) || (state != 1)) {
continue;
}