Ignore:
Timestamp:
Oct 31, 2010, 10:36:04 AM (14 years ago)
Author:
katerina
Message:

Support for IPv6 (ticket #222).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_port2proc.c

    r292 r295  
    6262#include "sh_error_min.h"
    6363#include "sh_pthread.h"
     64#include "sh_ipvx.h"
    6465
    6566#define FIL__  _("sh_port2proc.c")
     
    325326/* returns the command and fills the 'user' array
    326327 */
    327 static char * port2proc_query(char * file, int proto,
    328                               struct in_addr * saddr, int sport,
     328static char * port2proc_query(char * file, int proto, int domain,
     329                              struct sh_sockaddr * saddr, int sport,
    329330                              unsigned long * pid, char * user, size_t userlen)
    330331{
     
    338339  {
    339340    char errmsg[256];
     341    char siface[SH_IP_BUF];
     342    sh_ipvx_ntoa(siface, sizeof(siface), saddr);
    340343    sl_snprintf(errmsg, sizeof(errmsg),
    341344                "query, file=%s, proto=%d, port=%d, iface=%s\n",
    342                 file, proto, sport, inet_ntoa(*saddr));
     345                file, proto, sport, siface);
    343346    fprintf(stderr, "%s", errmsg);
    344347  }
     
    347350  if (fd)
    348351    {
    349       unsigned int n, iface, port, inode, istatus;
     352      unsigned int n, i, port, niface, inode, istatus;
    350353      char line[512];
     354      char iface[SH_IP_BUF];
    351355
    352356      while (NULL != fgets(line, sizeof(line), fd))
     
    360364
    361365          if (5 == sscanf(line,
    362                           "%u: %X:%X %*X:%*X %X %*X:%*X %*X:%*X %*X %*d %*d %u %*s",
    363                           &n, &iface, &port, &istatus, &inode))
     366                          "%u: %s:%X %*X:%*X %X %*X:%*X %*X:%*X %*X %*d %*d %u %*s",
     367                          &n, iface, &port, &istatus, &inode))
    364368            {
    365               struct in_addr haddr;
    366 
    367               haddr.s_addr = (unsigned long)iface;
     369              struct sockaddr_in  addr4;
     370              struct sockaddr_in6 addr6;
     371              struct sh_sockaddr  ss;
     372             
     373              niface = 0;
     374
     375              switch (domain)
     376                {
     377                case AF_INET:
     378                  addr4.sin_addr.s_addr = (int) strtol(iface, NULL, 16);
     379                  niface = (unsigned int) addr4.sin_addr.s_addr;
     380                  sh_ipvx_save(&ss, AF_INET, (struct sockaddr *)&addr4);
     381                  break;
     382
     383                case AF_INET6:
     384                  sscanf(iface,
     385                         "%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
     386                         &addr6.sin6_addr.s6_addr[3], &addr6.sin6_addr.s6_addr[2], &addr6.sin6_addr.s6_addr[1], &addr6.sin6_addr.s6_addr[0],
     387                         &addr6.sin6_addr.s6_addr[7], &addr6.sin6_addr.s6_addr[6], &addr6.sin6_addr.s6_addr[5], &addr6.sin6_addr.s6_addr[4],
     388                         &addr6.sin6_addr.s6_addr[11], &addr6.sin6_addr.s6_addr[10], &addr6.sin6_addr.s6_addr[9], &addr6.sin6_addr.s6_addr[8],
     389                         &addr6.sin6_addr.s6_addr[15], &addr6.sin6_addr.s6_addr[14], &addr6.sin6_addr.s6_addr[13], &addr6.sin6_addr.s6_addr[12]);
     390                 
     391                  for (i = 0; i < 16; ++i)
     392                    {
     393                      if (0 != (unsigned int) addr6.sin6_addr.s6_addr[i])
     394                        ++niface;
     395                    }
     396                  sh_ipvx_save(&ss, AF_INET6, (struct sockaddr *)&addr6);
     397                  break;
     398                }
    368399
    369400#ifdef DEBUG_P2P
    370401              {
    371                 char a[32];
    372                 char b[32];
    373 
    374                 sl_strlcpy(a, inet_ntoa(haddr), sizeof(a));
    375                 sl_strlcpy(b, inet_ntoa(*saddr), sizeof(b));
     402                char a[SH_IP_BUF];
     403                char b[SH_IP_BUF];
     404
     405                sh_ipvx_ntoa(a, sizeof(a), &ss);
     406                sh_ipvx_ntoa(b, sizeof(b), &ss);
    376407
    377408                fprintf(stderr, " -> inode %u, iface/port %s,%u, status %u, searching %s,%u, %u\n",
     
    392423#endif
    393424
    394               if ((proto == IPPROTO_UDP || iface == 0 || haddr.s_addr == saddr->s_addr) && port == (unsigned int)sport)
     425              if ((proto == IPPROTO_UDP || niface == 0 || 0 == sh_ipvx_cmp(&ss, saddr)) &&
     426                  port == (unsigned int)sport)
    395427                {
    396428                  struct sock_store * new = socklist;
     
    445477/* returns the command and fills the 'user' array
    446478 */
    447 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport,
     479char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport,
    448480                          unsigned long * pid, char * user, size_t userlen)
    449481{
    450482  char file[32];
    451 
     483  char * ret;
     484 
    452485  if (proto == IPPROTO_TCP)
    453486    {
    454487      sl_strlcpy(file, _("/proc/net/tcp"), sizeof(file));
    455       return port2proc_query(file, proto, saddr, sport, pid, user, userlen);
     488      ret = port2proc_query(file, proto, AF_INET, saddr, sport, pid, user, userlen);
     489
     490      if (ret[0] == '-' && ret[1] == '\0')
     491        {
     492          SH_FREE(ret);
     493          sl_strlcpy(file, _("/proc/net/tcp6"), sizeof(file));
     494          ret = port2proc_query(file, proto, AF_INET6, saddr, sport, pid, user, userlen);
     495        }
     496      return ret;
    456497    }
    457498  else
     
    459500      char * ret;
    460501      sl_strlcpy(file, _("/proc/net/udp"), sizeof(file));
    461       ret = port2proc_query(file, proto, saddr, sport, pid, user, userlen);
     502      ret = port2proc_query(file, proto, AF_INET, saddr, sport, pid, user, userlen);
     503
    462504      if (ret[0] == '-' && ret[1] == '\0')
    463505        {
    464506          SH_FREE(ret);
    465507          sl_strlcpy(file, _("/proc/net/udp6"), sizeof(file));
    466           ret = port2proc_query(file, proto, saddr, sport, pid, user, userlen);
     508          ret = port2proc_query(file, proto, AF_INET6, saddr, sport, pid, user, userlen);
    467509        }
    468510      return ret;
     
    541583
    542584static int       opt_4 = 1;         /* Show IPv4 sockets */
    543 static int       opt_6 = 0;         /* Show IPv6 sockets */
     585static int       opt_6 = 1;         /* Show IPv6 sockets */
    544586static int       opt_c = 0;         /* Show connected sockets */
    545587static int       opt_l = 1;         /* Show listening sockets */
     
    852894}
    853895
    854 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport,
     896char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport,
    855897                          unsigned long * pid, char * user, size_t userlen)
    856898{
    857899  int n, hash;
    858900  struct xfile *xf;
    859   struct in_addr * haddr;
     901  struct in_addr  * haddr;
     902  struct in6_addr * haddr6;
    860903  struct sock * s;
     904  struct in6_addr   anyaddr = IN6ADDR_ANY_INIT;
    861905
    862906  *pid = 0;
     
    886930      continue;
    887931
    888     if (s->family != AF_INET /* && s->family != AF_INET6 */)
     932    if (s->family != AF_INET && s->family != AF_INET6)
    889933      continue;
    890934
    891     if (sport != ntohs(((struct sockaddr_in *)(&s->laddr))->sin_port))
     935    if (s->family == AF_INET &&
     936        (sport != ntohs(((struct sockaddr_in *)(&s->laddr))->sin_port)))
    892937      continue;
    893938
    894     haddr = &((struct sockaddr_in *)(&s->laddr))->sin_addr;
     939    if (s->family == AF_INET6 &&
     940        (sport != ntohs(((struct sockaddr_in6 *)(&s->laddr))->sin6_port)))
     941      continue;
     942
     943    if (s->family == AF_INET)
     944      haddr  = &((struct sockaddr_in  *)(&s->laddr))->sin_addr;
     945    if (s->family == AF_INET6)
     946      haddr6 = &((struct sockaddr_in6 *)(&s->laddr))->sin6_addr;
     947   
    895948
    896949    /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*haddr)); */
    897950    /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*saddr)); */
    898951
    899     if (haddr->s_addr == saddr->s_addr || inet_lnaof(*saddr) == INADDR_ANY || inet_lnaof(*haddr) == INADDR_ANY)
     952    if ( (s->family == AF_INET &&
     953          (haddr->s_addr == (saddr->sin).sin_addr.s_addr ||
     954           sh_ipvx_isany(saddr) ||
     955           inet_lnaof(*haddr) == INADDR_ANY))
     956         ||
     957         (s->family == AF_INET6 &&
     958          (0 == memcmp(haddr6->s6_addr, &((saddr->sin6).sin6_addr.s6_addr), 16) ||
     959           0 == memcmp(haddr6->s6_addr, &(anyaddr.s6_addr), 16) ||
     960           sh_ipvx_isany(saddr) ))
     961         )
    900962      {
    901963        struct sock_store try;
     
    9751037#include "samhain.h"
    9761038#include "sh_utils.h"
    977 
    978 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport,
     1039#include "sh_ipvx.h"
     1040
     1041char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport,
    9791042                          unsigned long * pid, char * user, size_t userlen)
    9801043{
Note: See TracChangeset for help on using the changeset viewer.