Blame examples/procmap.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
#ifdef HAVE_CONFIG_H
Packit d37888
#  include <config.h>
Packit d37888
#endif
Packit d37888
Packit d37888
#include <locale.h>
Packit d37888
#include <libintl.h>
Packit d37888
#include <stdio.h>
Packit d37888
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/open.h>
Packit d37888
#include <glibtop/close.h>
Packit d37888
Packit d37888
#include <glibtop/parameter.h>
Packit d37888
Packit d37888
#include <glibtop/procmap.h>
Packit d37888
Packit d37888
Packit d37888
#include <sys/resource.h>
Packit d37888
#include <sys/mman.h>
Packit d37888
Packit d37888
#include <fcntl.h>
Packit d37888
Packit d37888
#ifndef PROFILE_COUNT
Packit d37888
#define PROFILE_COUNT	1
Packit d37888
#endif
Packit d37888
Packit d37888
static void
Packit d37888
try_mmap(const char *path)
Packit d37888
{
Packit d37888
	struct stat buf;
Packit d37888
	int fd;
Packit d37888
Packit d37888
	if ((fd = open(path, O_RDONLY)) < 0)
Packit d37888
		goto out;
Packit d37888
Packit d37888
	if (fstat(fd, &buf) < 0)
Packit d37888
		goto out;
Packit d37888
Packit d37888
	if (mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0) == MAP_FAILED)
Packit d37888
		goto out;
Packit d37888
Packit d37888
	close(fd);
Packit d37888
Packit d37888
	return;
Packit d37888
Packit d37888
out:
Packit d37888
	fprintf(stderr, "Failed to test mmap with '%s'\n", path);
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
int
Packit d37888
main (int argc, char *argv [])
Packit d37888
{
Packit d37888
	glibtop_proc_map procmap;
Packit d37888
	glibtop_map_entry *maps;
Packit d37888
	unsigned method, count, port, i;
Packit d37888
	char buffer [BUFSIZ];
Packit d37888
	pid_t pid;
Packit d37888
Packit d37888
	count = PROFILE_COUNT;
Packit d37888
Packit d37888
	setlocale (LC_ALL, "");
Packit d37888
	bindtextdomain (GETTEXT_PACKAGE, GTOPLOCALEDIR);
Packit d37888
	textdomain (GETTEXT_PACKAGE);
Packit d37888
Packit d37888
	glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_INIT_NO_OPEN);
Packit d37888
Packit d37888
	glibtop_get_parameter (GLIBTOP_PARAM_METHOD, &method, sizeof (method));
Packit d37888
Packit d37888
	printf ("Method = %d\n", method);
Packit d37888
Packit d37888
	count = glibtop_get_parameter (GLIBTOP_PARAM_COMMAND, buffer, BUFSIZ);
Packit d37888
	buffer [count] = 0;
Packit d37888
Packit d37888
	printf ("Command = '%s'\n", buffer);
Packit d37888
Packit d37888
	count = glibtop_get_parameter (GLIBTOP_PARAM_HOST, buffer, BUFSIZ);
Packit d37888
	buffer [count] = 0;
Packit d37888
Packit d37888
	glibtop_get_parameter (GLIBTOP_PARAM_PORT, &port, sizeof (port));
Packit d37888
Packit d37888
	printf ("Host = '%s' - %u\n\n", buffer, port);
Packit d37888
Packit d37888
	glibtop_init_r (&glibtop_global_server, 0, 0);
Packit d37888
Packit d37888
	if (argc == 1) {
Packit d37888
		pid = getpid();
Packit d37888
	}
Packit d37888
	else if ((argc != 2) || (sscanf (argv [1], "%d", (int *) &pid) != 1))
Packit d37888
		g_error ("Usage: %s [pid]", argv [0]);
Packit d37888
Packit d37888
	if (pid == getpid()) {
Packit d37888
		/* let's map something for a try */
Packit d37888
		try_mmap("/etc/passwd");
Packit d37888
		try_mmap("/etc/resolv.conf");
Packit d37888
		try_mmap(argv[0]);
Packit d37888
	}
Packit d37888
Packit d37888
	fprintf (stderr, "Getting memory maps for pid %d.\n\n", (int) pid);
Packit d37888
Packit d37888
	maps = glibtop_get_proc_map (&procmap, pid);
Packit d37888
Packit d37888
	for (i = 0; i < procmap.number; i++) {
Packit d37888
		const char *filename = NULL;
Packit d37888
		char * format;
Packit d37888
		unsigned device, device_major, device_minor;
Packit d37888
		char perm [5];
Packit d37888
Packit d37888
		if (maps [i].flags & (1L << GLIBTOP_MAP_ENTRY_FILENAME))
Packit d37888
			filename = maps [i].filename;
Packit d37888
Packit d37888
		perm [0] = (maps [i].perm & GLIBTOP_MAP_PERM_READ) ? 'r' : '-';
Packit d37888
		perm [1] = (maps [i].perm & GLIBTOP_MAP_PERM_WRITE) ? 'w' : '-';
Packit d37888
		perm [2] = (maps [i].perm & GLIBTOP_MAP_PERM_EXECUTE) ? 'x' : '-';
Packit d37888
		perm [3] = (maps [i].perm & GLIBTOP_MAP_PERM_SHARED) ? 's' : '-';
Packit d37888
		perm [4] = (maps [i].perm & GLIBTOP_MAP_PERM_PRIVATE) ? 'p' : '-';
Packit d37888
Packit d37888
		device = (unsigned long) maps [i].device;
Packit d37888
		device_minor = (device & 255);
Packit d37888
		device_major = ((device >> 8) & 255);
Packit d37888
Packit d37888
		if (sizeof (void*) == 8)
Packit d37888
			format = "%016lx-%016lx +%016lx (%8lu bytes mapped) - "
Packit d37888
				 "%02x:%02x % 8lu - %.*s";
Packit d37888
		else
Packit d37888
			format = "%08lx-%08lx +%08lx (%8lu bytes mapped) - "
Packit d37888
				 "%02x:%02x % 8lu - %.*s";
Packit d37888
Packit d37888
		fprintf (stderr, format,
Packit d37888
			 (unsigned long) maps [i].start,
Packit d37888
			 (unsigned long) maps [i].end,
Packit d37888
			 (unsigned long) maps [i].offset,
Packit d37888
			 (unsigned long) (maps [i].end - (maps [i].start + maps [i].offset)),
Packit d37888
			 device_major, device_minor,
Packit d37888
			 (unsigned long) maps [i].inode,
Packit d37888
			 sizeof perm, perm);
Packit d37888
Packit d37888
		if (filename) {
Packit d37888
			fprintf(stderr, " - %s", filename);
Packit d37888
		}
Packit d37888
Packit d37888
		fputc('\n', stderr);
Packit d37888
Packit d37888
		g_print("smaps flags:%#llx size:%lluKiB rss:%lluKiB "
Packit d37888
			"shared_clean:%lluKib shared_dirty:%lluKiB "
Packit d37888
			"private_clean:%lluKiB private_dirty: %lluKiB\n",
Packit d37888
			maps[i].flags,
Packit d37888
			maps[i].size >> 10,
Packit d37888
			maps[i].rss >> 10,
Packit d37888
			maps[i].shared_clean >> 10,
Packit d37888
			maps[i].shared_dirty >> 10,
Packit d37888
			maps[i].private_clean >> 10,
Packit d37888
			maps[i].private_dirty >> 10);
Packit d37888
Packit d37888
		if (filename && (filename != maps [i].filename))
Packit d37888
			g_free ((void*)filename);
Packit d37888
	}
Packit d37888
Packit d37888
	g_free (maps);
Packit d37888
Packit d37888
	glibtop_close ();
Packit d37888
Packit d37888
	exit (0);
Packit d37888
}