Added a bufsiz argument to file_to_buffer().
Increased read buffer size in get_sysinfo(). svn path=/trunk/; revision=2637
This commit is contained in:
@@ -75,7 +75,7 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_cpu));
|
memset (buf, 0, sizeof (glibtop_cpu));
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GLOBAL
|
* GLOBAL
|
||||||
|
@@ -107,7 +107,7 @@ static void linux_2_6_0(glibtop *server, glibtop_fsusage *buf, const char *path)
|
|||||||
get_sys_path(device, &filename, &format);
|
get_sys_path(device, &filename, &format);
|
||||||
g_free(device);
|
g_free(device);
|
||||||
|
|
||||||
ret = try_file_to_buffer(buffer, filename);
|
ret = try_file_to_buffer(buffer, sizeof buffer, filename);
|
||||||
|
|
||||||
if(ret < 0) return;
|
if(ret < 0) return;
|
||||||
|
|
||||||
|
@@ -63,13 +63,16 @@ enum TRY_FILE_TO_BUFFER
|
|||||||
TRY_FILE_TO_BUFFER_READ = -2
|
TRY_FILE_TO_BUFFER_READ = -2
|
||||||
};
|
};
|
||||||
|
|
||||||
int try_file_to_buffer(char *buffer, const char *format, ...)
|
int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...)
|
||||||
{
|
{
|
||||||
char path[4096];
|
char path[4096];
|
||||||
int fd;
|
int fd;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
va_list pa;
|
va_list pa;
|
||||||
|
|
||||||
|
if (bufsiz <= sizeof(char*))
|
||||||
|
g_warning("Huhu, bufsiz of %lu looks bad", (gulong)bufsiz);
|
||||||
|
|
||||||
va_start(pa, format);
|
va_start(pa, format);
|
||||||
|
|
||||||
/* C99 also provides vsnprintf */
|
/* C99 also provides vsnprintf */
|
||||||
@@ -82,7 +85,7 @@ int try_file_to_buffer(char *buffer, const char *format, ...)
|
|||||||
if((fd = open (path, O_RDONLY)) < 0)
|
if((fd = open (path, O_RDONLY)) < 0)
|
||||||
return TRY_FILE_TO_BUFFER_OPEN;
|
return TRY_FILE_TO_BUFFER_OPEN;
|
||||||
|
|
||||||
len = read (fd, buffer, BUFSIZ-1);
|
len = read (fd, buffer, bufsiz - 1);
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
@@ -95,9 +98,9 @@ int try_file_to_buffer(char *buffer, const char *format, ...)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
file_to_buffer(glibtop *server, char *buffer, const char *filename)
|
file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filename)
|
||||||
{
|
{
|
||||||
switch(try_file_to_buffer(buffer, filename))
|
switch(try_file_to_buffer(buffer, bufsiz, filename))
|
||||||
{
|
{
|
||||||
case TRY_FILE_TO_BUFFER_OPEN:
|
case TRY_FILE_TO_BUFFER_OPEN:
|
||||||
glibtop_error_io_r (server, "open (%s)", filename);
|
glibtop_error_io_r (server, "open (%s)", filename);
|
||||||
@@ -115,7 +118,7 @@ read_boot_time(glibtop *server)
|
|||||||
char buffer[BUFSIZ];
|
char buffer[BUFSIZ];
|
||||||
char *btime;
|
char *btime;
|
||||||
|
|
||||||
file_to_buffer(server, buffer, "/proc/stat");
|
file_to_buffer(server, buffer, sizeof buffer, "/proc/stat");
|
||||||
|
|
||||||
btime = strstr(buffer, "btime");
|
btime = strstr(buffer, "btime");
|
||||||
|
|
||||||
|
@@ -68,11 +68,11 @@ get_scaled(const char *buffer, const char *key);
|
|||||||
|
|
||||||
/* aborts on error */
|
/* aborts on error */
|
||||||
void
|
void
|
||||||
file_to_buffer(glibtop *server, char *buffer, const char *filename);
|
file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filename);
|
||||||
|
|
||||||
/* return < 0 on error, otherwise 0 on success */
|
/* return < 0 on error, otherwise 0 on success */
|
||||||
int
|
int
|
||||||
try_file_to_buffer(char *buffer, const char *format, ...) G_GNUC_PRINTF(2, 3);
|
try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...) G_GNUC_PRINTF(3, 4);
|
||||||
|
|
||||||
|
|
||||||
/* some inline functions that wrap proc path
|
/* some inline functions that wrap proc path
|
||||||
@@ -80,27 +80,27 @@ try_file_to_buffer(char *buffer, const char *format, ...) G_GNUC_PRINTF(2, 3);
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
proc_file_to_buffer (char *buffer, const char *fmt, pid_t pid)
|
proc_file_to_buffer (char *buffer, size_t bufsiz, const char *fmt, pid_t pid)
|
||||||
{
|
{
|
||||||
return try_file_to_buffer(buffer, fmt, pid);
|
return try_file_to_buffer(buffer, bufsiz, fmt, pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
proc_stat_to_buffer (char *buffer, pid_t pid)
|
proc_stat_to_buffer (char *buffer, size_t bufsiz, pid_t pid)
|
||||||
{
|
{
|
||||||
return proc_file_to_buffer (buffer, "/proc/%d/stat", pid);
|
return proc_file_to_buffer(buffer, bufsiz, "/proc/%d/stat", pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
proc_status_to_buffer (char *buffer, pid_t pid)
|
proc_status_to_buffer (char *buffer, size_t bufsiz, pid_t pid)
|
||||||
{
|
{
|
||||||
return proc_file_to_buffer (buffer, "/proc/%d/status", pid);
|
return proc_file_to_buffer(buffer, bufsiz, "/proc/%d/status", pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
proc_statm_to_buffer (char *buffer, pid_t pid)
|
proc_statm_to_buffer (char *buffer, size_t bufsiz, pid_t pid)
|
||||||
{
|
{
|
||||||
return proc_file_to_buffer (buffer, "/proc/%d/statm", pid);
|
return proc_file_to_buffer(buffer, bufsiz, "/proc/%d/statm", pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -52,7 +52,7 @@ glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_loadavg));
|
memset (buf, 0, sizeof (glibtop_loadavg));
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
buf->loadavg [0] = g_ascii_strtod (buffer, &p);
|
buf->loadavg [0] = g_ascii_strtod (buffer, &p);
|
||||||
buf->loadavg [1] = g_ascii_strtod (p, &p);
|
buf->loadavg [1] = g_ascii_strtod (p, &p);
|
||||||
|
@@ -50,7 +50,7 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
|||||||
|
|
||||||
memset(buf, 0, sizeof *buf);
|
memset(buf, 0, sizeof *buf);
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
buf->total = get_scaled(buffer, "MemTotal:");
|
buf->total = get_scaled(buffer, "MemTotal:");
|
||||||
buf->free = get_scaled(buffer, "MemFree:");
|
buf->free = get_scaled(buffer, "MemFree:");
|
||||||
|
@@ -193,6 +193,7 @@ read_value(glibtop *server,
|
|||||||
char buffer[BUFSIZ];
|
char buffer[BUFSIZ];
|
||||||
|
|
||||||
if(try_file_to_buffer(buffer,
|
if(try_file_to_buffer(buffer,
|
||||||
|
sizeof buffer,
|
||||||
"/sys/class/net/%s/statistics/%s",
|
"/sys/class/net/%s/statistics/%s",
|
||||||
device,
|
device,
|
||||||
filename))
|
filename))
|
||||||
|
@@ -73,7 +73,7 @@ glibtop_open_s (glibtop *server, const char *program_name,
|
|||||||
|
|
||||||
set_linux_version(server);
|
set_linux_version(server);
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
p = skip_line(p); /* cpu */
|
p = skip_line(p); /* cpu */
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_kernel));
|
memset (buf, 0, sizeof (glibtop_proc_kernel));
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
|
@@ -54,7 +54,7 @@ glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_mem));
|
memset (buf, 0, sizeof (glibtop_proc_mem));
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
@@ -68,7 +68,7 @@ glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid)
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_mem;
|
buf->flags = _glibtop_sysdeps_proc_mem;
|
||||||
|
|
||||||
if (proc_statm_to_buffer (buffer, pid))
|
if (proc_statm_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buf->size = strtoull (buffer, &p, 0);
|
buf->size = strtoull (buffer, &p, 0);
|
||||||
|
@@ -57,7 +57,7 @@ glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_segment));
|
memset (buf, 0, sizeof (glibtop_proc_segment));
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
@@ -71,7 +71,7 @@ glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_segment;
|
buf->flags = _glibtop_sysdeps_proc_segment;
|
||||||
|
|
||||||
if (proc_statm_to_buffer (buffer, pid))
|
if (proc_statm_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = skip_multiple_token (buffer, 3);
|
p = skip_multiple_token (buffer, 3);
|
||||||
|
@@ -47,7 +47,7 @@ glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, pid_t pid)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_signal));
|
memset (buf, 0, sizeof (glibtop_proc_signal));
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
|
@@ -73,7 +73,7 @@ glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf, pid_t pid)
|
|||||||
|
|
||||||
/* Now we read the remaining fields. */
|
/* Now we read the remaining fields. */
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd(buffer);
|
p = proc_stat_after_cmd(buffer);
|
||||||
|
@@ -58,7 +58,7 @@ glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, pid_t pid)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_time));
|
memset (buf, 0, sizeof (glibtop_proc_time));
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
@@ -113,7 +113,7 @@ glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, pid_t pid)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* FIXME: doesn't work with 2.6 */
|
/* FIXME: doesn't work with 2.6 */
|
||||||
if (proc_file_to_buffer (buffer, "/proc/%d/cpu", pid))
|
if (proc_file_to_buffer(buffer, sizeof buffer, "/proc/%d/cpu", pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = skip_multiple_token (p, 3);
|
p = skip_multiple_token (p, 3);
|
||||||
|
@@ -55,7 +55,7 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_uid));
|
memset (buf, 0, sizeof (glibtop_proc_uid));
|
||||||
|
|
||||||
if (proc_status_to_buffer (buffer, pid))
|
if (proc_status_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Search substring 'Pid:' */
|
/* Search substring 'Pid:' */
|
||||||
@@ -89,7 +89,7 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_uid;
|
buf->flags = _glibtop_sysdeps_proc_uid;
|
||||||
|
|
||||||
if (proc_stat_to_buffer (buffer, pid))
|
if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = proc_stat_after_cmd (buffer);
|
p = proc_stat_after_cmd (buffer);
|
||||||
|
@@ -56,7 +56,7 @@ glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_swap));
|
memset (buf, 0, sizeof (glibtop_swap));
|
||||||
|
|
||||||
file_to_buffer(server, buffer, MEMINFO);
|
file_to_buffer(server, buffer, sizeof buffer, MEMINFO);
|
||||||
|
|
||||||
/* Kernel 2.6 with multiple lines */
|
/* Kernel 2.6 with multiple lines */
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
|
|||||||
|
|
||||||
if(server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0))
|
if(server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0))
|
||||||
{
|
{
|
||||||
file_to_buffer (server, buffer, PROC_VMSTAT);
|
file_to_buffer (server, buffer, sizeof buffer, PROC_VMSTAT);
|
||||||
|
|
||||||
p = strstr (buffer, "\npswpin");
|
p = strstr (buffer, "\npswpin");
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
|
|||||||
}
|
}
|
||||||
else /* Linux 2.4 */
|
else /* Linux 2.4 */
|
||||||
{
|
{
|
||||||
file_to_buffer (server, buffer, PROC_STAT);
|
file_to_buffer (server, buffer, sizeof buffer, PROC_STAT);
|
||||||
|
|
||||||
p = strstr (buffer, "\nswap");
|
p = strstr (buffer, "\nswap");
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#include "glibtop_private.h"
|
#include "glibtop_private.h"
|
||||||
|
|
||||||
#define FILENAME "/proc/cpuinfo"
|
#define FILENAME "/home/benoit/Desktop/libgtop/cpuinfo8.txt"
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_sysinfo =
|
static const unsigned long _glibtop_sysdeps_sysinfo =
|
||||||
(1L << GLIBTOP_SYSINFO_CPUINFO);
|
(1L << GLIBTOP_SYSINFO_CPUINFO);
|
||||||
@@ -36,12 +36,12 @@ static glibtop_sysinfo sysinfo = { .flags = 0 };
|
|||||||
static void
|
static void
|
||||||
init_sysinfo (glibtop *server)
|
init_sysinfo (glibtop *server)
|
||||||
{
|
{
|
||||||
char buffer [BUFSIZ];
|
char buffer [16384];
|
||||||
gchar ** processors;
|
gchar ** processors;
|
||||||
|
|
||||||
if(G_LIKELY(sysinfo.flags)) return;
|
if(G_LIKELY(sysinfo.flags)) return;
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
/* cpuinfo records are seperated by a blank line */
|
/* cpuinfo records are seperated by a blank line */
|
||||||
processors = g_strsplit(buffer, "\n\n", 0);
|
processors = g_strsplit(buffer, "\n\n", 0);
|
||||||
|
@@ -51,7 +51,7 @@ glibtop_get_uptime_s (glibtop *server, glibtop_uptime *buf)
|
|||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_uptime));
|
memset (buf, 0, sizeof (glibtop_uptime));
|
||||||
|
|
||||||
file_to_buffer(server, buffer, FILENAME);
|
file_to_buffer(server, buffer, sizeof buffer, FILENAME);
|
||||||
|
|
||||||
buf->uptime = g_ascii_strtod (buffer, &p);
|
buf->uptime = g_ascii_strtod (buffer, &p);
|
||||||
buf->idletime = g_ascii_strtod (p, &p);
|
buf->idletime = g_ascii_strtod (p, &p);
|
||||||
|
Reference in New Issue
Block a user