Blame sysdeps/cygwin/glibtop_private.c

Packit d37888
#include <config.h>
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/error.h>
Packit d37888
Packit d37888
#include "glibtop_private.h"
Packit d37888
Packit d37888
#include <glib.h>
Packit d37888
Packit d37888
#include <string.h>
Packit d37888
#include <stdlib.h>
Packit d37888
#include <stdarg.h>
Packit d37888
Packit d37888
#include <fcntl.h>
Packit d37888
#include <unistd.h>
Packit d37888
Packit d37888
Packit d37888
unsigned long long
Packit d37888
get_scaled(const char *buffer, const char *key)
Packit d37888
{
Packit d37888
	const char    *ptr = buffer;
Packit d37888
	char	      *next;
Packit d37888
	unsigned long long value;
Packit d37888
Packit d37888
	if (key) {
Packit d37888
		if (G_LIKELY((ptr = strstr(buffer, key))))
Packit d37888
			ptr += strlen(key);
Packit d37888
		else {
Packit d37888
			g_warning("Could not read key '%s' in buffer '%s'",
Packit d37888
				  key, buffer);
Packit d37888
			return 0;
Packit d37888
		}
Packit d37888
	}
Packit d37888
Packit d37888
	value = strtoull(ptr, &next, 0);
Packit d37888
Packit d37888
	for ( ; *next; ++next) {
Packit d37888
		if (*next == 'k') {
Packit d37888
			value *= 1024;
Packit d37888
			break;
Packit d37888
		} else if (*next == 'M') {
Packit d37888
			value *= 1024 * 1024;
Packit d37888
			break;
Packit d37888
		}
Packit d37888
	}
Packit d37888
Packit d37888
	return value;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
char *
Packit d37888
skip_token (const char *p)
Packit d37888
{
Packit d37888
	p = next_token(p);
Packit d37888
	while (*p && !isspace(*p)) p++;
Packit d37888
	p = next_token(p);
Packit d37888
	return (char *)p;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
/*
Packit d37888
 * Read functions
Packit d37888
 */
Packit d37888
enum TRY_FILE_TO_BUFFER
Packit d37888
{
Packit d37888
	TRY_FILE_TO_BUFFER_OK = 0,
Packit d37888
	TRY_FILE_TO_BUFFER_OPEN = -1,
Packit d37888
	TRY_FILE_TO_BUFFER_READ = -2
Packit d37888
};
Packit d37888
Packit d37888
/*
Packit d37888
 * Doesn't handle bufsiz == 0
Packit d37888
 */
Packit d37888
int try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...)
Packit d37888
{
Packit d37888
	char path[4096];
Packit d37888
	int fd;
Packit d37888
	size_t len = 0;
Packit d37888
	ssize_t nread = 0;
Packit d37888
	va_list pa;
Packit d37888
Packit d37888
	if (G_UNLIKELY(bufsiz <= sizeof(char*)))
Packit d37888
	  g_warning("Huhu, bufsiz of %lu looks bad", (gulong)bufsiz);
Packit d37888
Packit d37888
	va_start(pa, format);
Packit d37888
Packit d37888
	/* C99 also provides vsnprintf */
Packit d37888
	g_vsnprintf(path, sizeof path, format, pa);
Packit d37888
Packit d37888
	va_end(pa);
Packit d37888
Packit d37888
	bufsiz--; /* reserve 1 for trailing NUL */
Packit d37888
	buffer [0] = '\0';
Packit d37888
Packit d37888
	if((fd = open (path, O_RDONLY)) < 0)
Packit d37888
		return TRY_FILE_TO_BUFFER_OPEN;
Packit d37888
Packit d37888
	while (len < bufsiz) {
Packit d37888
		nread = read (fd, buffer + len, bufsiz - len);
Packit d37888
Packit d37888
		if (G_UNLIKELY(nread < 0)) {
Packit d37888
			if (errno == EINTR)
Packit d37888
				continue;
Packit d37888
			else
Packit d37888
				break;
Packit d37888
		}
Packit d37888
Packit d37888
		len += nread;
Packit d37888
Packit d37888
		if (nread == 0)
Packit d37888
			break;
Packit d37888
	}
Packit d37888
Packit d37888
	close (fd);
Packit d37888
Packit d37888
	if (nread < 0)
Packit d37888
		return TRY_FILE_TO_BUFFER_READ;
Packit d37888
Packit d37888
	buffer [len] = '\0';
Packit d37888
Packit d37888
	return TRY_FILE_TO_BUFFER_OK;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
void
Packit d37888
file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filename)
Packit d37888
{
Packit d37888
	switch(try_file_to_buffer(buffer, bufsiz, "%s", filename))
Packit d37888
	{
Packit d37888
	case TRY_FILE_TO_BUFFER_OPEN:
Packit d37888
		glibtop_error_io_r (server, "open (%s)", filename);
Packit d37888
	case TRY_FILE_TO_BUFFER_READ:
Packit d37888
		glibtop_error_io_r (server, "read (%s)", filename);
Packit d37888
	}
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
Packit d37888
Packit d37888
static unsigned long
Packit d37888
read_boot_time(glibtop *server)
Packit d37888
{
Packit d37888
	char* line = NULL;
Packit d37888
	size_t size = 0;
Packit d37888
	FILE* stat;
Packit d37888
	unsigned long btime = 0;
Packit d37888
Packit d37888
	if (!(stat = fopen("/proc/stat", "r"))) {
Packit d37888
		glibtop_error_io_r(server, "fopen(\"/proc/stat\")");
Packit d37888
		goto out;
Packit d37888
	}
Packit d37888
Packit d37888
	while (getline(&line, &size, stat) != -1) {
Packit d37888
		if (!strncmp(line, "btime", 5)) {
Packit d37888
			btime = strtoul(skip_token(line), NULL, 10);
Packit d37888
			break;
Packit d37888
		}
Packit d37888
	}
Packit d37888
Packit d37888
	free(line);
Packit d37888
	fclose(stat);
Packit d37888
out:
Packit d37888
	return btime;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
Packit d37888
unsigned long
Packit d37888
get_boot_time(glibtop *server)
Packit d37888
{
Packit d37888
	static unsigned long boot_time = 0UL;
Packit d37888
Packit d37888
	if(G_UNLIKELY(!boot_time))
Packit d37888
	{
Packit d37888
		boot_time = read_boot_time(server);
Packit d37888
	}
Packit d37888
Packit d37888
	return boot_time;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
size_t
Packit d37888
get_page_size(void)
Packit d37888
{
Packit d37888
	static size_t pagesize = 0;
Packit d37888
Packit d37888
	if(G_UNLIKELY(!pagesize))
Packit d37888
	{
Packit d37888
		pagesize = getpagesize();
Packit d37888
	}
Packit d37888
Packit d37888
	return pagesize;
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
Packit d37888
gboolean
Packit d37888
check_cpu_line(glibtop *server, const char *line, unsigned i)
Packit d37888
{
Packit d37888
	char start[10];
Packit d37888
Packit d37888
	g_snprintf(start, sizeof start, "cpu%u", i);
Packit d37888
Packit d37888
	return g_str_has_prefix(line, start);
Packit d37888
}
Packit d37888
Packit d37888
Packit d37888
Packit d37888
gboolean safe_readlink(const char *path, char *buf, size_t bufsiz)
Packit d37888
{
Packit d37888
	ssize_t ret;
Packit d37888
Packit d37888
	ret = readlink(path, buf, bufsiz - 1);
Packit d37888
Packit d37888
	if (ret == -1) {
Packit d37888
		g_warning("Could not read link %s : %s", path, strerror(errno));
Packit d37888
		return FALSE;
Packit d37888
	}
Packit d37888
Packit d37888
	buf[ret] = '\0';
Packit d37888
	return TRUE;
Packit d37888
}