Changeset 295 for trunk/src/sh_port2proc.c
- Timestamp:
- Oct 31, 2010, 10:36:04 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/sh_port2proc.c
r292 r295 62 62 #include "sh_error_min.h" 63 63 #include "sh_pthread.h" 64 #include "sh_ipvx.h" 64 65 65 66 #define FIL__ _("sh_port2proc.c") … … 325 326 /* returns the command and fills the 'user' array 326 327 */ 327 static char * port2proc_query(char * file, int proto, 328 struct in_addr * saddr, int sport,328 static char * port2proc_query(char * file, int proto, int domain, 329 struct sh_sockaddr * saddr, int sport, 329 330 unsigned long * pid, char * user, size_t userlen) 330 331 { … … 338 339 { 339 340 char errmsg[256]; 341 char siface[SH_IP_BUF]; 342 sh_ipvx_ntoa(siface, sizeof(siface), saddr); 340 343 sl_snprintf(errmsg, sizeof(errmsg), 341 344 "query, file=%s, proto=%d, port=%d, iface=%s\n", 342 file, proto, sport, inet_ntoa(*saddr));345 file, proto, sport, siface); 343 346 fprintf(stderr, "%s", errmsg); 344 347 } … … 347 350 if (fd) 348 351 { 349 unsigned int n, i face, port, inode, istatus;352 unsigned int n, i, port, niface, inode, istatus; 350 353 char line[512]; 354 char iface[SH_IP_BUF]; 351 355 352 356 while (NULL != fgets(line, sizeof(line), fd)) … … 360 364 361 365 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)) 364 368 { 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 } 368 399 369 400 #ifdef DEBUG_P2P 370 401 { 371 char a[ 32];372 char b[ 32];373 374 s l_strlcpy(a, inet_ntoa(haddr), sizeof(a));375 s l_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); 376 407 377 408 fprintf(stderr, " -> inode %u, iface/port %s,%u, status %u, searching %s,%u, %u\n", … … 392 423 #endif 393 424 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) 395 427 { 396 428 struct sock_store * new = socklist; … … 445 477 /* returns the command and fills the 'user' array 446 478 */ 447 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport,479 char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport, 448 480 unsigned long * pid, char * user, size_t userlen) 449 481 { 450 482 char file[32]; 451 483 char * ret; 484 452 485 if (proto == IPPROTO_TCP) 453 486 { 454 487 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; 456 497 } 457 498 else … … 459 500 char * ret; 460 501 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 462 504 if (ret[0] == '-' && ret[1] == '\0') 463 505 { 464 506 SH_FREE(ret); 465 507 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); 467 509 } 468 510 return ret; … … 541 583 542 584 static int opt_4 = 1; /* Show IPv4 sockets */ 543 static int opt_6 = 0; /* Show IPv6 sockets */585 static int opt_6 = 1; /* Show IPv6 sockets */ 544 586 static int opt_c = 0; /* Show connected sockets */ 545 587 static int opt_l = 1; /* Show listening sockets */ … … 852 894 } 853 895 854 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport,896 char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport, 855 897 unsigned long * pid, char * user, size_t userlen) 856 898 { 857 899 int n, hash; 858 900 struct xfile *xf; 859 struct in_addr * haddr; 901 struct in_addr * haddr; 902 struct in6_addr * haddr6; 860 903 struct sock * s; 904 struct in6_addr anyaddr = IN6ADDR_ANY_INIT; 861 905 862 906 *pid = 0; … … 886 930 continue; 887 931 888 if (s->family != AF_INET /* && s->family != AF_INET6 */)932 if (s->family != AF_INET && s->family != AF_INET6) 889 933 continue; 890 934 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))) 892 937 continue; 893 938 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 895 948 896 949 /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*haddr)); */ 897 950 /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*saddr)); */ 898 951 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 ) 900 962 { 901 963 struct sock_store try; … … 975 1037 #include "samhain.h" 976 1038 #include "sh_utils.h" 977 978 char * sh_port2proc_query(int proto, struct in_addr * saddr, int sport, 1039 #include "sh_ipvx.h" 1040 1041 char * sh_port2proc_query(int proto, struct sh_sockaddr * saddr, int sport, 979 1042 unsigned long * pid, char * user, size_t userlen) 980 1043 {
Note:
See TracChangeset
for help on using the changeset viewer.