Blame sysdeps/cygwin/glibtop_private.c

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