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:
@@ -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,
|
||||
|
@@ -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
101
sysdeps/linux/fsusage.c
Normal 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);
|
||||
}
|
||||
}
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user