Blame sysdeps/aix/utils.c

Packit d37888
/* Copyright (C) 1998-99 Martin Baulig
Packit d37888
   This file is part of LibGTop 1.0.
Packit d37888
Packit d37888
   Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
Packit d37888
Packit d37888
   LibGTop is free software; you can redistribute it and/or modify it
Packit d37888
   under the terms of the GNU General Public License as published by
Packit d37888
   the Free Software Foundation; either version 2 of the License,
Packit d37888
   or (at your option) any later version.
Packit d37888
Packit d37888
   LibGTop is distributed in the hope that it will be useful, but WITHOUT
Packit d37888
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit d37888
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit d37888
   for more details.
Packit d37888
Packit d37888
   You should have received a copy of the GNU General Public License
Packit d37888
   along with LibGTop; see the file COPYING. If not, write to the
Packit d37888
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d37888
   Boston, MA 02110-1301, USA.
Packit d37888
*/
Packit d37888
Packit d37888
#include <config.h>
Packit d37888
#include <nlist.h>
Packit d37888
Packit d37888
#include <procinfo.h>
Packit d37888
#include <sys/proc.h>
Packit d37888
#include <sys/vminfo.h>
Packit d37888
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/error.h>
Packit d37888
#include "glibtop_suid.h"
Packit d37888
#include "utils.h"
Packit d37888
Packit d37888
#ifndef HAVE_VMGETINFO
Packit d37888
#include <dlfcn.h>
Packit d37888
typedef int (*vmgetinfo_proto)(void *out, int command, int arg);
Packit d37888
#endif
Packit d37888
Packit d37888
off_t
Packit d37888
_glibtop_get_kmem_offset(glibtop* server, char* kname)
Packit d37888
{
Packit d37888
	int result;
Packit d37888
	struct nlist kernelnames[] =
Packit d37888
		{ {NULL, 0, 0, 0, 0, 0},
Packit d37888
		  {NULL, 0, 0, 0, 0, 0},
Packit d37888
		};
Packit d37888
Packit d37888
	kernelnames[0]._n._n_name = kname;
Packit d37888
Packit d37888
	glibtop_suid_enter(server);
Packit d37888
Packit d37888
	result = knlist(kernelnames, 1, sizeof(struct nlist));
Packit d37888
Packit d37888
	glibtop_suid_leave(server);
Packit d37888
Packit d37888
	if (result == -1)
Packit d37888
	{
Packit d37888
		return -1;
Packit d37888
	}
Packit d37888
Packit d37888
	return kernelnames[0].n_value;
Packit d37888
}
Packit d37888
Packit d37888
int
Packit d37888
_glibtop_get_kmem_info(glibtop* server, off_t offset, void* buf, size_t len)
Packit d37888
{
Packit d37888
	int result;
Packit d37888
Packit d37888
	glibtop_suid_enter(server);
Packit d37888
Packit d37888
	lseek(server->machine->kmem_fd, offset, SEEK_SET);
Packit d37888
Packit d37888
	result = read(server->machine->kmem_fd, buf, len);
Packit d37888
Packit d37888
        glibtop_suid_leave(server);
Packit d37888
Packit d37888
	return result;
Packit d37888
}
Packit d37888
Packit d37888
struct procsinfo*
Packit d37888
_glibtop_get_procinfo (glibtop *server, pid_t pid)
Packit d37888
{
Packit d37888
	int result;
Packit d37888
	pid_t current;
Packit d37888
	static int first_time = 1;
Packit d37888
Packit d37888
	/* test if procsinfo already found */
Packit d37888
Packit d37888
	if ((server->machine->last_pinfo.pi_pid == pid) && (!first_time))
Packit d37888
	{
Packit d37888
		return &server->machine->last_pinfo;
Packit d37888
	}
Packit d37888
Packit d37888
	/* seek procsinfo if given pid */
Packit d37888
Packit d37888
	first_time = 0;
Packit d37888
	current = 0;
Packit d37888
	while ((result =  getprocs( &server->machine->last_pinfo
Packit d37888
				  , sizeof(struct procsinfo)
Packit d37888
				  , NULL, 0, &current, 1)) == 1)
Packit d37888
	{
Packit d37888
Packit d37888
		if (pid == server->machine->last_pinfo.pi_pid)
Packit d37888
		{
Packit d37888
			return &server->machine->last_pinfo;
Packit d37888
		}
Packit d37888
	}
Packit d37888
	return NULL;
Packit d37888
}
Packit d37888
Packit d37888
#ifndef HAVE_VMGETINFO
Packit d37888
int
Packit d37888
_glibtop_vmgetinfo (void *out, int command, int arg)
Packit d37888
{
Packit d37888
	void* handle;
Packit d37888
Packit d37888
	static vmgetinfo_proto kern_vmgetinfo = NULL;
Packit d37888
Packit d37888
	if (kern_vmgetinfo == NULL)
Packit d37888
	{
Packit d37888
		handle = dlopen("/unix", RTLD_NOW | RTLD_GLOBAL);
Packit d37888
		if (handle == NULL)
Packit d37888
		{
Packit d37888
			return -1;
Packit d37888
		}
Packit d37888
Packit d37888
		kern_vmgetinfo = dlsym( handle, "vmgetinfo");
Packit d37888
Packit d37888
		dlclose(handle);
Packit d37888
Packit d37888
		if (kern_vmgetinfo == NULL)
Packit d37888
		{
Packit d37888
			return -1;
Packit d37888
		}
Packit d37888
	}
Packit d37888
Packit d37888
	return kern_vmgetinfo(out, command, arg);
Packit d37888
}
Packit d37888
#endif