summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoît Dejean <bdejean@src.gnome.org>2004-07-17 12:01:24 +0000
committerBenoît Dejean <bdejean@src.gnome.org>2004-07-17 12:01:24 +0000
commitbfc14a192537818ab4bd89602a80fd22cb90d3b1 (patch)
treeaddb140881ba35149894adedb3dd251b158d7c35
parentb1c611c7fcc266c3efe2caa4631b5632e3a45899 (diff)
downloadlibgtop-bfc14a192537818ab4bd89602a80fd22cb90d3b1.tar.gz
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.
-rw-r--r--sysdeps/linux/ChangeLog19
-rw-r--r--sysdeps/linux/Makefile.am4
-rw-r--r--sysdeps/linux/fsusage.c101
-rw-r--r--sysdeps/linux/glibtop_server.h2
-rw-r--r--sysdeps/linux/netload.c63
-rw-r--r--sysdeps/linux/open.c4
-rw-r--r--sysdeps/linux/procmap.c70
-rw-r--r--sysdeps/linux/procuid.c4
8 files changed, 192 insertions, 75 deletions
diff --git a/sysdeps/linux/ChangeLog b/sysdeps/linux/ChangeLog
index f859891c..a1adc463 100644
--- a/sysdeps/linux/ChangeLog
+++ b/sysdeps/linux/ChangeLog
@@ -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,
diff --git a/sysdeps/linux/Makefile.am b/sysdeps/linux/Makefile.am
index 9f26335e..bceb2d36 100644
--- a/sysdeps/linux/Makefile.am
+++ b/sysdeps/linux/Makefile.am
@@ -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)
diff --git a/sysdeps/linux/fsusage.c b/sysdeps/linux/fsusage.c
new file mode 100644
index 00000000..c3a198b3
--- /dev/null
+++ b/sysdeps/linux/fsusage.c
@@ -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);
+ }
+}
diff --git a/sysdeps/linux/glibtop_server.h b/sysdeps/linux/glibtop_server.h
index ab1d32aa..69143fe4 100644
--- a/sysdeps/linux/glibtop_server.h
+++ b/sysdeps/linux/glibtop_server.h
@@ -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();
diff --git a/sysdeps/linux/netload.c b/sysdeps/linux/netload.c
index d85dffea..ae7ea0c1 100644
--- a/sysdeps/linux/netload.c
+++ b/sysdeps/linux/netload.c
@@ -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
diff --git a/sysdeps/linux/open.c b/sysdeps/linux/open.c
index b6d61f38..c75c3c2f 100644
--- a/sysdeps/linux/open.c
+++ b/sysdeps/linux/open.c
@@ -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;
diff --git a/sysdeps/linux/procmap.c b/sysdeps/linux/procmap.c
index fbe3d0dc..e0088737 100644
--- a/sysdeps/linux/procmap.c
+++ b/sysdeps/linux/procmap.c
@@ -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);
-
- maps = fopen (filename, "r");
- if (!maps) return NULL;
+ snprintf (procfilename, sizeof procfilename, "/proc/%d/maps", pid);
- allocated = 32; /* magic */
- entry_list = g_new(glibtop_map_entry, allocated);
+ if((maps = fopen (procfilename, "r")) == NULL) {
+ return (glibtop_map_entry*) g_array_free(entry_list, TRUE);
+ }
- 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);
}
diff --git a/sysdeps/linux/procuid.c b/sysdeps/linux/procuid.c
index d4dc61b2..612d952d 100644
--- a/sysdeps/linux/procuid.c
+++ b/sysdeps/linux/procuid.c
@@ -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;