implement proc_port for aix
This commit is contained in:
parent
b82ab9ede1
commit
730ee36885
|
@ -1,3 +1,7 @@
|
||||||
|
#define _KERNEL 1 /* for struct file */
|
||||||
|
#include <sys/file.h>
|
||||||
|
#undef _KERNEL
|
||||||
|
|
||||||
#include "sigar.h"
|
#include "sigar.h"
|
||||||
#include "sigar_private.h"
|
#include "sigar_private.h"
|
||||||
#include "sigar_util.h"
|
#include "sigar_util.h"
|
||||||
|
@ -25,6 +29,12 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
|
||||||
|
/* for proc_port */
|
||||||
|
#include <netinet/in_pcb.h>
|
||||||
|
#include <sys/domain.h>
|
||||||
|
#include <sys/protosw.h>
|
||||||
|
#include <sys/socketvar.h>
|
||||||
|
|
||||||
/* for odm api */
|
/* for odm api */
|
||||||
#include <sys/cfgodm.h>
|
#include <sys/cfgodm.h>
|
||||||
#include <sys/cfgdb.h>
|
#include <sys/cfgdb.h>
|
||||||
|
@ -2016,3 +2026,108 @@ int sigar_net_connection_list_get(sigar_t *sigar,
|
||||||
{
|
{
|
||||||
return SIGAR_ENOTIMPL;
|
return SIGAR_ENOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* derived from pidentd's k_aix432.c */
|
||||||
|
int sigar_proc_port_get(sigar_t *sigar, unsigned long port, sigar_pid_t *pidp)
|
||||||
|
{
|
||||||
|
struct procsinfo pinfo;
|
||||||
|
struct fdsinfo finfo;
|
||||||
|
pid_t pid = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
int fd, status;
|
||||||
|
int num = getprocs(&pinfo, sizeof(pinfo),
|
||||||
|
&finfo, sizeof(finfo),
|
||||||
|
&pid, 1);
|
||||||
|
|
||||||
|
if (num == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((pinfo.pi_state == 0) || (pinfo.pi_state == SZOMB)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (fd = 0; fd < pinfo.pi_maxofile; fd++) {
|
||||||
|
struct file file;
|
||||||
|
struct socket socket, *sockp;
|
||||||
|
struct protosw protosw;
|
||||||
|
struct domain domain;
|
||||||
|
struct inpcb inpcb;
|
||||||
|
long ptr;
|
||||||
|
|
||||||
|
if (!(ptr = (long)finfo.pi_ufd[fd].fp)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kread(sigar, &file, sizeof(file), ptr);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.f_type != DTYPE_SOCKET) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(sockp = (struct socket *)file.f_data)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kread(sigar, &socket, sizeof(socket), (long)sockp);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ptr = (long)socket.so_proto)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kread(sigar, &protosw, sizeof(protosw), ptr);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (protosw.pr_protocol != IPPROTO_TCP) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ptr = (long)protosw.pr_domain)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kread(sigar, &domain, sizeof(domain), ptr);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((domain.dom_family != AF_INET) &&
|
||||||
|
domain.dom_family != AF_INET6)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ptr = (long)socket.so_pcb)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kread(sigar, &inpcb, sizeof(inpcb), ptr);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sockp != inpcb.inp_socket) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inpcb.inp_lport != port) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pidp = pinfo.pi_pid;
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue