Added to repository. WIP.

* Makefile.am:
	* fsusage.c: (linux_2_6_0), (linux_2_4_0),
	(_glibtop_linux_get_fsusage_read_write): Added to repository. WIP.


	* glibtop_server.h: LINUX_VERSION -> LINUX_VERSION_CODE

	* netload.c: (glibtop_get_netload_s): Cleanups. Added support for
	hardware address. s/LINUX_VERSION/LINUX_VERSION_CODE/

	* open.c: (get_linux_version): s/LINUX_VERSION/LINUX_VERSION_CODE/

	* procmap.c: (glibtop_get_proc_map_s): glibify: used GArray

	* procuid.c: (glibtop_get_proc_uid_s): s/LINUX_VERSION/LINUX_VERSION_CODE/.
	Used Linux MKDEV.
This commit is contained in:
Benoît Dejean
2004-07-17 12:01:24 +00:00
parent b1c611c7fc
commit bfc14a1925
8 changed files with 192 additions and 75 deletions

View File

@@ -1,3 +1,22 @@
2004-07-17 Benoît Dejean <tazforever@dlfp.org>
* Makefile.am:
* fsusage.c: (linux_2_6_0), (linux_2_4_0),
(_glibtop_linux_get_fsusage_read_write): Added to repository. WIP.
* glibtop_server.h: LINUX_VERSION -> LINUX_VERSION_CODE
* netload.c: (glibtop_get_netload_s): Cleanups. Added support for
hardware address. s/LINUX_VERSION/LINUX_VERSION_CODE/
* open.c: (get_linux_version): s/LINUX_VERSION/LINUX_VERSION_CODE/
* procmap.c: (glibtop_get_proc_map_s): glibify: used GArray
* procuid.c: (glibtop_get_proc_uid_s): s/LINUX_VERSION/LINUX_VERSION_CODE/.
Used Linux MKDEV.
2004-07-15 Benoît Dejean <tazforever@dlfp.org>
* procstate.c: (glibtop_get_proc_state_s): Wake, we're libgtop2.7.x,

View File

@@ -8,7 +8,9 @@ libgtop_sysdeps_2_0_la_SOURCES = open.c close.c cpu.c mem.c swap.c \
sem_limits.c proclist.c procstate.c procuid.c \
proctime.c procmem.c procsignal.c prockernel.c \
procsegment.c procargs.c procmap.c siglist.c \
sysinfo.c netload.c ppp.c glibtop_server.c
sysinfo.c netload.c ppp.c glibtop_server.c \
fsusage.c
libgtop_sysdeps_2_0_la_LIBADD = @GLIB_LIBS@
libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO)

101
sysdeps/linux/fsusage.c Normal file
View File

@@ -0,0 +1,101 @@
#include <glibtop.h>
#include <glibtop/fsusage.h>
#include <glib.h>
#include <mntent.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void _glibtop_linux_get_fsusage_read_write(glibtop *server,
glibtop_fsusage *buf,
const char *path);
/*
* Linux 2.6.x
* linux/Documentation/iostats.txt
*/
static void linux_2_6_0(glibtop *server, glibtop_fsusage *buf, const char *path)
{
FILE *mtab = setmntent("/etc/mtab", "r");
struct mntent *emnt;
while((emnt = getmntent(mtab)) != NULL)
{
if(strcmp(emnt->mnt_dir, path) != 0)
continue;
char filename[64]; /* magic */
char buffer[1024]; /* magic */
char *p;
char device[32]; /* magic */
unsigned partition;
const char *devname = emnt->mnt_fsname;
size_t offset;
/*
we only deal with /dev block devices "/dev/<DEVICE><PARTITION>"
i don't know if other block devices such as network block
devices provide this kind of information.
*/
if(!g_str_has_prefix(devname, "/dev/"))
break;
/* skip the "/dev/" */
devname += sizeof "/dev/" - 1;
g_strlcpy(device, devname, sizeof device);
offset = strcspn(devname, "0123456789");
partition = strtoul(devname + offset, NULL, 0);
device[offset] = '\0';
if((size_t) g_snprintf(filename, sizeof filename,
"/sys/block/%s/%s%u/stat",
device, device, partition) >= sizeof filename)
break;
if(try_file_to_buffer(buffer, filename) < 0)
break;
p = buffer;
p = skip_token(p);
buf->read = strtoull(p, &p, 0);
p = skip_token(p);
buf->write = strtoull(p, &p, 0);
}
endmntent(mtab);
}
static void linux_2_4_0(glibtop *server, glibtop_fsusage *buf, const char *path)
{
}
void _glibtop_linux_get_fsusage_read_write(glibtop *server,
glibtop_fsusage *buf,
const char *path)
{
if(server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0))
{
linux_2_6_0(server, buf, path);
}
else if(server->os_version_code >= LINUX_VERSION_CODE(2, 4, 0))
{
linux_2_4_0(server, buf, path);
}
}

View File

@@ -36,7 +36,7 @@ G_BEGIN_DECLS
#ifdef _IN_LIBGTOP
#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z)
#define LINUX_VERSION_CODE(x,y,z) (0x10000*(x) + 0x100*(y) + z)
unsigned get_pageshift();

View File

@@ -128,58 +128,53 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf,
skfd = socket (AF_INET, SOCK_DGRAM, 0);
if (skfd) {
struct ifreq ifr;
unsigned long long flags;
g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
if (!ioctl (skfd, SIOCGIFFLAGS, &ifr)) {
const unsigned long long flags = ifr.ifr_flags;
buf->flags |= (1L << GLIBTOP_NETLOAD_IF_FLAGS);
flags = ifr.ifr_flags;
} else
flags = 0;
if (flags & IFF_UP)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP);
if (flags & IFF_UP)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP);
if (flags & IFF_BROADCAST)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST);
if (flags & IFF_BROADCAST)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST);
if (flags & IFF_DEBUG)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG);
if (flags & IFF_DEBUG)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG);
if (flags & IFF_LOOPBACK)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK);
if (flags & IFF_LOOPBACK)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK);
if (flags & IFF_POINTOPOINT)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT);
if (flags & IFF_POINTOPOINT)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT);
if (flags & IFF_RUNNING)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING);
if (flags & IFF_RUNNING)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING);
if (flags & IFF_NOARP)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP);
if (flags & IFF_NOARP)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP);
if (flags & IFF_PROMISC)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC);
if (flags & IFF_PROMISC)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC);
if (flags & IFF_ALLMULTI)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI);
if (flags & IFF_ALLMULTI)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI);
if (flags & IFF_MULTICAST)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST);
if (flags & IFF_MULTICAST)
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST);
}
g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
if (!ioctl (skfd, SIOCGIFADDR, &ifr)) {
struct sockaddr_in addr =
*(struct sockaddr_in *) &ifr.ifr_addr;
buf->address = addr.sin_addr.s_addr;
buf->address = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
buf->flags |= (1L << GLIBTOP_NETLOAD_ADDRESS);
}
g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
if (!ioctl (skfd, SIOCGIFNETMASK, &ifr)) {
struct sockaddr_in addr =
*(struct sockaddr_in *) &ifr.ifr_addr;
buf->subnet = addr.sin_addr.s_addr;
buf->subnet = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
buf->flags |= (1L << GLIBTOP_NETLOAD_SUBNET);
}
@@ -189,6 +184,12 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf,
buf->flags |= (1L << GLIBTOP_NETLOAD_MTU);
}
g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
if (!ioctl (skfd, SIOCGIFHWADDR, &ifr)) {
memcpy(buf->hwaddress, &ifr.ifr_hwaddr.sa_data, 8);
buf->flags |= (1L << GLIBTOP_NETLOAD_HWADDRESS);
}
close (skfd);
}
@@ -197,7 +198,7 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf,
* need IP accounting.
*/
if (server->os_version_code < 131442) {
if (server->os_version_code < LINUX_VERSION_CODE(2, 1, 14)) {
/* If IP accounting is enabled in the kernel and it is
* enabled for the requested interface, we use it to

View File

@@ -46,9 +46,9 @@ static unsigned get_linux_version(void) {
fprintf(stderr, /* *very* unlikely to happen by accident */
"Non-standard uts for running kernel:\n"
"release %s=%u.%u.%u gives version code %d\n",
uts.release, x, y, z, LINUX_VERSION(x,y,z));
uts.release, x, y, z, LINUX_VERSION_CODE(x,y,z));
linux_version_code = LINUX_VERSION(x, y, z);
linux_version_code = LINUX_VERSION_CODE(x, y, z);
}
return linux_version_code;

View File

@@ -21,10 +21,14 @@
Boston, MA 02111-1307, USA.
*/
#include <glib.h>
#include <glibtop.h>
#include <glibtop/error.h>
#include <glibtop/procmap.h>
#include <linux/kdev_t.h>
#define PROC_MAPS_FORMAT ((sizeof(void*) == 8) \
? "%16lx-%16lx %4c %16lx %02hx:%02hx %lu%*[ ]%[^\n]\n" \
@@ -54,35 +58,34 @@ glibtop_init_proc_map_s (glibtop *server)
glibtop_map_entry *
glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
{
char filename [GLIBTOP_MAP_FILENAME_LEN+1];
glibtop_map_entry *entry_list;
gsize allocated;
char procfilename[GLIBTOP_MAP_FILENAME_LEN+1];
GArray *entry_list = g_array_new(FALSE, FALSE,
sizeof(glibtop_map_entry));
FILE *maps;
/* fscanf args */
unsigned short dev_major, dev_minor;
unsigned long start, end, offset, inode;
char flags[4];
/* filename is the 8th argument */
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0);
memset (buf, 0, sizeof (glibtop_proc_map));
sprintf (filename, "/proc/%d/maps", pid);
snprintf (procfilename, sizeof procfilename, "/proc/%d/maps", pid);
maps = fopen (filename, "r");
if (!maps) return NULL;
if((maps = fopen (procfilename, "r")) == NULL) {
return (glibtop_map_entry*) g_array_free(entry_list, TRUE);
}
allocated = 32; /* magic */
entry_list = g_new(glibtop_map_entry, allocated);
for(buf->number = 0; TRUE; buf->number++)
while(TRUE)
{
unsigned long perm = 0;
int rv;
unsigned short dev_major, dev_minor;
unsigned long start, end, offset, inode;
char flags[4];
char filename [GLIBTOP_MAP_FILENAME_LEN+1];
glibtop_map_entry entry;
/* 8 arguments */
rv = fscanf (maps, PROC_MAPS_FORMAT,
&start, &end, flags, &offset,
@@ -110,34 +113,25 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
else if (flags [3] == 'p')
perm |= GLIBTOP_MAP_PERM_PRIVATE;
entry.flags = _glibtop_sysdeps_map_entry;
entry.start = (guint64) start;
entry.end = (guint64) end;
entry.offset = (guint64) offset;
entry.perm = (guint64) perm;
entry.device = (guint64) MKDEV(dev_major, dev_minor);
entry.inode = (guint64) inode;
g_strlcpy (entry.filename, filename, sizeof entry.filename);
if(buf->number == allocated) {
/* grow by 2 and blank the newly allocated entries */
entry_list = g_renew (glibtop_map_entry, entry_list, allocated * 2);
allocated *= 2;
}
entry_list [buf->number].flags = _glibtop_sysdeps_map_entry;
entry_list [buf->number].start = (guint64) start;
entry_list [buf->number].end = (guint64) end;
entry_list [buf->number].offset = (guint64) offset;
entry_list [buf->number].perm = (guint64) perm;
entry_list [buf->number].device = (guint64) (dev_major << 8) +
(guint64) dev_minor;
entry_list [buf->number].inode = (guint64) inode;
g_strlcpy (entry_list [buf->number].filename, filename,
sizeof entry_list [buf->number].filename);
g_array_append_val(entry_list, entry);
}
fclose (maps);
buf->flags = _glibtop_sysdeps_proc_map;
buf->number = entry_list->len;
buf->size = sizeof (glibtop_map_entry);
buf->total = buf->number * buf->size;
g_renew(glibtop_map_entry, entry_list, buf->number);
return entry_list;
return (glibtop_map_entry*) g_array_free(entry_list, FALSE);
}

View File

@@ -112,12 +112,12 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
/* the old notty val, update elsewhere bef. moving to 0 */
buf->tty = -1;
if (server->os_version_code < LINUX_VERSION(1,3,39)) {
if (server->os_version_code < LINUX_VERSION_CODE(1,3,39)) {
/* map old meanings to new */
buf->priority = 2*15 - buf->priority;
buf->nice = 15 - buf->nice;
}
else if (server->os_version_code < LINUX_VERSION(1,1,30) && buf->tty != -1)
else if (server->os_version_code < LINUX_VERSION_CODE(1,1,30) && buf->tty != -1)
/* when tty wasn't full devno */
buf->tty = 4*0x100 + buf->tty;