Blame ui/irqbalance-ui.c

Packit Service 2212bb
Packit Service 2212bb
#include <ctype.h>
Packit Service 2212bb
#include <errno.h>
Packit Service 2212bb
#include <netdb.h>
Packit Service 2212bb
#include <stdio.h>
Packit Service 2212bb
#include <string.h>
Packit Service 2212bb
#include <stdlib.h>
Packit Service 2212bb
#include <sys/socket.h>
Packit Service 2212bb
#include <sys/types.h>
Packit Service 2212bb
#include <sys/un.h>
Packit Service 2212bb
#include <unistd.h>
Packit Service 2212bb
#include <curses.h>
Packit Service 2212bb
#include <ncurses.h>
Packit Service 2212bb
#include "irqbalance-ui.h"
Packit Service 2212bb
#include "ui.h"
Packit Service 2212bb
#include "helpers.h"
Packit Service 2212bb
Packit Service 2212bb
Packit Service 2212bb
int irqbalance_pid = -1;
Packit Service 2212bb
GList *tree = NULL;
Packit Service 2212bb
setup_t setup;
Packit Service 2212bb
GMainLoop *main_loop;
Packit Service 2212bb
int is_tree = 1;
Packit Service 2212bb
Packit Service 2212bb
struct msghdr * create_credentials_msg()
Packit Service 2212bb
{
Packit Service 2212bb
	struct ucred *credentials = malloc(sizeof(struct ucred));
Packit Service 2212bb
	credentials->pid = getpid();
Packit Service 2212bb
	credentials->uid = geteuid();
Packit Service 2212bb
	credentials->gid = getegid();
Packit Service 2212bb
Packit Service 2212bb
	struct msghdr *msg = malloc(sizeof(struct msghdr));
Packit Service 2212bb
	memset(msg, 0, sizeof(struct msghdr));
Packit Service 2212bb
	msg->msg_iovlen = 1;
Packit Service 2212bb
	msg->msg_control = malloc(CMSG_SPACE(sizeof(struct ucred)));
Packit Service 2212bb
	msg->msg_controllen = CMSG_SPACE(sizeof(struct ucred));
Packit Service 2212bb
Packit Service 2212bb
	struct cmsghdr *cmsg = CMSG_FIRSTHDR(msg);
Packit Service 2212bb
	cmsg->cmsg_level = SOL_SOCKET;
Packit Service 2212bb
	cmsg->cmsg_type = SCM_CREDENTIALS;
Packit Service 2212bb
	cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
Packit Service 2212bb
	memcpy(CMSG_DATA(cmsg), credentials, sizeof(struct ucred));
Packit Service 2212bb
Packit Service 54b776
	free(credentials);
Packit Service 2212bb
	return msg;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
int init_connection()
Packit Service 2212bb
{
Packit Service 2212bb
	struct sockaddr_un addr;
Packit Service 2212bb
	memset(&addr, 0, sizeof(struct sockaddr_un));
Packit Service 2212bb
Packit Service 2212bb
	int socket_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
Packit Service 2212bb
	if(socket_fd < 0) {
Packit Service 2212bb
		perror("Error opening socket");
Packit Service 2212bb
		return 0;
Packit Service 2212bb
	}
Packit Service 2212bb
	addr.sun_family = AF_UNIX;
Packit Service 2212bb
	char socket_name[64];
Packit Service 2212bb
	snprintf(socket_name, 64, "%s%d.sock", SOCKET_PATH, irqbalance_pid);
Packit Service 2212bb
	strncpy(addr.sun_path + 1, socket_name, strlen(socket_name));
Packit Service 2212bb
Packit Service 2212bb
	if(connect(socket_fd, (struct sockaddr *)&addr,
Packit Service 2212bb
				sizeof(sa_family_t) + strlen(socket_name) + 1) < 0) {
Packit Service 14d45b
		close(socket_fd);
Packit Service 2212bb
		return 0;
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	return socket_fd;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void send_settings(char *data)
Packit Service 2212bb
{
Packit Service 2212bb
	/* Send "settings sleep X" to set sleep interval, "settings ban
Packit Service 2212bb
	 * irqs X Y..." to ban IRQs from balancing,
Packit Service 2212bb
	 * "settings cpus <banned_list>" to setup which CPUs are forbidden
Packit Service 2212bb
	 * to handle IRQs
Packit Service 2212bb
	 */
Packit Service 2212bb
	int socket_fd = init_connection();
Packit Service 2212bb
	if(!socket_fd) {
Packit Service 2212bb
		return;
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	struct msghdr *msg = create_credentials_msg();
Packit Service 2212bb
	struct iovec iov;
Packit Service 2212bb
	iov.iov_base = (void *) data;
Packit Service 2212bb
	iov.iov_len = strlen(data);
Packit Service 2212bb
	msg->msg_iov = &iov;
Packit Service 2212bb
	sendmsg(socket_fd, msg, 0);
Packit Service 2212bb
Packit Service 2212bb
	close(socket_fd);
Packit Service 54b776
	free(msg->msg_control);
Packit Service 54b776
	free(msg);
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
char * get_data(char *string)
Packit Service 2212bb
{
Packit Service 2212bb
	/* Send "setup" to get sleep interval, banned IRQs and banned CPUs,
Packit Service 2212bb
	 * "stats" to get CPU tree statistics
Packit Service 2212bb
	 */
Packit Service 2212bb
	int socket_fd = init_connection();
Packit Service 2212bb
	if(!socket_fd) {
Packit Service 2212bb
		return NULL;
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	struct msghdr *msg = create_credentials_msg();
Packit Service 2212bb
	struct iovec iov;
Packit Service 2212bb
	iov.iov_base = (void *) string;
Packit Service 2212bb
	iov.iov_len = strlen(string);
Packit Service 2212bb
	msg->msg_iov = &iov;
Packit Service 2212bb
	sendmsg(socket_fd, msg, 0);
Packit Service 2212bb
Packit Service 2212bb
	/*
Packit Service 2212bb
	 * This is just...horrible.  Mental note to replace this
Packit Service 2212bb
	 * With a select, ioctl to determine size, and malloc based
Packit Service 2212bb
	 * on that
Packit Service 2212bb
	 */
Packit Service 2212bb
	char *data = malloc(8192);
Packit Service 2212bb
	int len = recv(socket_fd, data, 8192, 0);
Packit Service 2212bb
	close(socket_fd);
Packit Service 2212bb
	data[len] = '\0';
Packit Service 54b776
	free(msg->msg_control);
Packit Service 54b776
	free(msg);
Packit Service 2212bb
	return data;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void parse_setup(char *setup_data)
Packit Service 2212bb
{
Packit Service 2212bb
	char *token, *ptr;
Packit Service 2212bb
	int i,j;
Packit Service 2212bb
	char *copy;
Packit Service 54b776
	irq_t *new_irq = NULL;
Packit Service 2212bb
	if((setup_data == NULL) || (strlen(setup_data) == 0)) return;
Packit Service 2212bb
	copy = strdup(setup_data);
Packit Service 2212bb
	if (!copy)
Packit Service 2212bb
		return;
Packit Service 2212bb
Packit Service 2212bb
	setup.banned_irqs = NULL;
Packit Service 2212bb
	setup.banned_cpus = NULL;
Packit Service 2212bb
	token = strtok_r(copy, " ", &ptr);
Packit Service 2212bb
	if(strncmp(token, "SLEEP", strlen("SLEEP"))) goto out;
Packit Service 2212bb
	setup.sleep = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
	token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
	/* Parse banned IRQ data */
Packit Service 2212bb
	while(!strncmp(token, "IRQ", strlen("IRQ"))) {
Packit Service 54b776
		new_irq = malloc(sizeof(irq_t));
Packit Service 2212bb
		new_irq->vector = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "LOAD", strlen("LOAD"))) goto out;
Packit Service 2212bb
		new_irq->load = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "DIFF", strlen("DIFF"))) goto out;
Packit Service 2212bb
		new_irq->diff = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(ptr, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "CLASS", strlen("CLASS"))) goto out;
Packit Service 2212bb
		new_irq->class = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		new_irq->is_banned = 1;
Packit Service 2212bb
		new_irq->assigned_to = NULL;
Packit Service 2212bb
		setup.banned_irqs = g_list_append(setup.banned_irqs, new_irq);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 54b776
		new_irq = NULL;
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	if(strncmp(token, "BANNED", strlen("BANNED"))) goto out;
Packit Service 2212bb
	token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
	for(i = strlen(token) - 1; i >= 0; i--) {
Packit Service 2212bb
		char *map = hex_to_bitmap(token[i]);
Packit Service 2212bb
		for(j = 3; j >= 0; j--) {
Packit Service 2212bb
			if(map[j] == '1') {
Packit Service 2212bb
				uint64_t *banned_cpu = malloc(sizeof(uint64_t));
Packit Service 2212bb
				*banned_cpu = (4 * (strlen(token) - (i + 1)) + (4 - (j + 1)));
Packit Service 2212bb
				setup.banned_cpus = g_list_append(setup.banned_cpus,
Packit Service 2212bb
								banned_cpu);
Packit Service 2212bb
			}
Packit Service 2212bb
		}
Packit Service 54b776
		free(map);
Packit Service 2212bb
	
Packit Service 2212bb
	}
Packit Service 2212bb
	free(copy);
Packit Service 2212bb
	return;
Packit Service 2212bb
Packit Service 2212bb
out: {
Packit Service 2212bb
	/* Invalid data presented */
Packit Service 2212bb
	printf("Invalid data sent.  Unexpected token: %s", token);
Packit Service 54b776
	if (new_irq) {
Packit Service 54b776
		free(new_irq);
Packit Service 54b776
	}
Packit Service 2212bb
	free(copy);
Packit Service 2212bb
	g_list_free(tree);
Packit Service 2212bb
	exit(1);
Packit Service 2212bb
}
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
GList * concat_child_lists(cpu_node_t *node)
Packit Service 2212bb
{
Packit Service 2212bb
	GList *new = NULL;
Packit Service 2212bb
	GList *child_entry = g_list_first(node->children);
Packit Service 2212bb
	do {
Packit Service 2212bb
		cpu_node_t *child = (cpu_node_t *)child_entry->data;
Packit Service 2212bb
		GList *cpu_entry = g_list_first(child->cpu_list);
Packit Service 2212bb
		do {
Packit Service 2212bb
			uint64_t *cpu = (uint64_t *)cpu_entry->data;
Packit Service 2212bb
			new = g_list_append(new, cpu);
Packit Service 2212bb
			cpu_entry = g_list_next(cpu_entry);
Packit Service 2212bb
		} while(cpu_entry != NULL);
Packit Service 2212bb
		child_entry = g_list_next(child_entry);
Packit Service 2212bb
	} while(child_entry != NULL);
Packit Service 2212bb
Packit Service 2212bb
	return new;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void copy_cpu_list_to_irq(irq_t *irq, void *data)
Packit Service 2212bb
{
Packit Service 2212bb
	irq->assigned_to = g_list_copy((GList *)data);
Packit Service 2212bb
	irq->assigned_to = g_list_sort(irq->assigned_to, sort_ints);
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void assign_cpu_lists(cpu_node_t *node, void *data __attribute__((unused)))
Packit Service 2212bb
{
Packit Service 2212bb
	if(g_list_length(node->children) > 0) {
Packit Service 2212bb
		for_each_node(node->children, assign_cpu_lists, NULL);
Packit Service 2212bb
		node->cpu_list = concat_child_lists(node);
Packit Service 2212bb
	} else {
Packit Service 2212bb
		node->cpu_list = g_list_append(node->cpu_list, &(node->number));
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	for_each_irq(node->irqs, copy_cpu_list_to_irq, node->cpu_list);
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void assign_cpu_mask(cpu_node_t *node, void *data __attribute__((unused)))
Packit Service 2212bb
{
Packit Service 2212bb
	char *mask = malloc(16 * sizeof(char));
Packit Service 2212bb
	mask[0] = '\0';
Packit Service 2212bb
	unsigned int sum = 0;
Packit Service 2212bb
	GList *list_entry = g_list_first(node->cpu_list);
Packit Service 2212bb
	do {
Packit Service 2212bb
		int *cpu = list_entry->data;
Packit Service 2212bb
		sum += 1 << (*cpu);
Packit Service 2212bb
		list_entry = g_list_next(list_entry);
Packit Service 2212bb
	} while(list_entry != NULL);
Packit Service 2212bb
	snprintf(mask, 15, "0x%x", sum);
Packit Service 2212bb
	node->cpu_mask = mask;
Packit Service 2212bb
Packit Service 2212bb
	if(g_list_length(node->children) > 0) {
Packit Service 2212bb
		for_each_node(node->children, assign_cpu_mask, NULL);
Packit Service 2212bb
	}
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
void parse_into_tree(char *data)
Packit Service 2212bb
{
Packit Service 2212bb
	char *token, *ptr;
Packit Service 2212bb
	cpu_node_t *parent = NULL;
Packit Service 2212bb
	char *copy;
Packit Service 2212bb
	tree = NULL;
Packit Service 54b776
	irq_t *new_irq = NULL;
Packit Service 54b776
	cpu_node_t *new = NULL;
Packit Service 54b776
Packit Service 2212bb
	if (!data || strlen(data) == 0)
Packit Service 2212bb
		return;
Packit Service 2212bb
Packit Service 2212bb
	copy = strdup(data);
Packit Service 2212bb
	if (!copy)
Packit Service 2212bb
		return;
Packit Service 2212bb
Packit Service 2212bb
	token = strtok_r(copy, " ", &ptr);
Packit Service 2212bb
	while(token != NULL) {
Packit Service 2212bb
		/* Parse node data */
Packit Service 2212bb
		if(strncmp(token, "TYPE", strlen("TYPE"))) {
Packit Service 2212bb
			free(copy);
Packit Service 2212bb
			 goto out;
Packit Service 2212bb
		}
Packit Service 54b776
		new = malloc(sizeof(cpu_node_t));
Packit Service 2212bb
		new->irqs = NULL;
Packit Service 2212bb
		new->children = NULL;
Packit Service 2212bb
		new->cpu_list = NULL;
Packit Service 2212bb
		new->cpu_mask = NULL;
Packit Service 2212bb
		new->type = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		if(new->type == OBJ_TYPE_NODE) {
Packit Service 2212bb
			parent = NULL;
Packit Service 2212bb
		} else if(new->type >= parent->type) {
Packit Service 2212bb
			parent = parent->parent;
Packit Service 2212bb
		}
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "NUMBER", strlen("NUMBER"))) goto out;
Packit Service 2212bb
		new->number = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "LOAD", strlen("LOAD"))) goto out;
Packit Service 2212bb
		new->load = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
		if(strncmp(token, "SAVE_MODE", strlen("SAVE_MODE"))) goto out;
Packit Service 2212bb
		new->is_powersave = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
		token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
Packit Service 2212bb
		/* Parse assigned IRQ data */
Packit Service 2212bb
		while((token != NULL) && (!strncmp(token, "IRQ", strlen("IRQ")))) {
Packit Service 54b776
			new_irq = malloc(sizeof(irq_t));
Packit Service 2212bb
			new_irq->vector = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
			token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
			if(strncmp(token, "LOAD", strlen("LOAD"))) goto out;
Packit Service 2212bb
			new_irq->load = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
			token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
			if(strncmp(token, "DIFF", strlen("DIFF"))) goto out;
Packit Service 2212bb
			new_irq->diff = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
			token = strtok_r(NULL, " ", &ptr);
Packit Service 2212bb
			if(strncmp(token, "CLASS", strlen("CLASS"))) goto out;
Packit Service 2212bb
			new_irq->class = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
Packit Service 2212bb
			new_irq->is_banned = 0;
Packit Service 2212bb
			new->irqs = g_list_append(new->irqs, new_irq);
Packit Service 2212bb
			token = strtok_r(NULL, " ", &ptr);
Packit Service 54b776
			new_irq = NULL;
Packit Service 2212bb
		}
Packit Service 2212bb
Packit Service 2212bb
		if((token == NULL) || (strncmp(token, "IRQ", strlen("IRQ")))) {
Packit Service 2212bb
			new->parent = parent;
Packit Service 2212bb
			if(parent == NULL) {
Packit Service 2212bb
				tree = g_list_append(tree, new);
Packit Service 2212bb
			} else {
Packit Service 2212bb
				parent->children = g_list_append(parent->children, new);
Packit Service 2212bb
			}
Packit Service 2212bb
			if(new->type != OBJ_TYPE_CPU) {
Packit Service 2212bb
				parent = new;
Packit Service 2212bb
			}
Packit Service 2212bb
		}
Packit Service 54b776
Packit Service 54b776
		new = NULL;
Packit Service 2212bb
	}
Packit Service 2212bb
	free(copy);
Packit Service 2212bb
	for_each_node(tree, assign_cpu_lists, NULL);
Packit Service 2212bb
	for_each_node(tree, assign_cpu_mask, NULL);
Packit Service 2212bb
	return;
Packit Service 2212bb
Packit Service 2212bb
out: {
Packit Service 2212bb
	/* Invalid data presented */
Packit Service 2212bb
	printf("Invalid data sent.  Unexpected token: %s\n", token);
Packit Service 54b776
	if (new_irq) {
Packit Service 54b776
		free(new_irq);
Packit Service 54b776
	}
Packit Service 54b776
	if (new) {
Packit Service 54b776
		free(new);
Packit Service 54b776
	}
Packit Service 2212bb
	g_list_free(tree);
Packit Service 2212bb
	exit(1);
Packit Service 2212bb
}
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
gboolean rescan_tree(gpointer data __attribute__((unused)))
Packit Service 2212bb
{
Packit Service 2212bb
	char *setup_data = get_data(SETUP);
Packit Service 2212bb
	parse_setup(setup_data);
Packit Service 2212bb
	char *irqbalance_data = get_data(STATS);
Packit Service 2212bb
	parse_into_tree(irqbalance_data);
Packit Service 2212bb
	if(is_tree) {
Packit Service 2212bb
		display_tree();
Packit Service 2212bb
	}
Packit Service 2212bb
	free(setup_data);
Packit Service 54b776
	free(irqbalance_data);
Packit Service 2212bb
	return TRUE;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
gboolean key_loop(gpointer data __attribute__((unused)))
Packit Service 2212bb
{
Packit Service 2212bb
	int c = getch();
Packit Service 2212bb
	switch(c) {
Packit Service 2212bb
	case 'q':
Packit Service 2212bb
		close_window(0);
Packit Service 2212bb
		break;
Packit Service 2212bb
	case KEY_F(3):
Packit Service 2212bb
		is_tree = 1;
Packit Service 2212bb
		display_tree();
Packit Service 2212bb
		break;
Packit Service 2212bb
	case KEY_F(4):
Packit Service 2212bb
		is_tree = 0;
Packit Service 2212bb
		settings();
Packit Service 2212bb
		break;
Packit Service 2212bb
	case KEY_F(5):
Packit Service 2212bb
		is_tree = 0;
Packit Service 2212bb
		setup_irqs();
Packit Service 2212bb
		break;
Packit Service 2212bb
	default:
Packit Service 2212bb
		break;
Packit Service 2212bb
	}
Packit Service 2212bb
	return TRUE;
Packit Service 2212bb
}
Packit Service 2212bb
Packit Service 2212bb
int main(int argc, char **argv)
Packit Service 2212bb
{
Packit Service 2212bb
	if(getuid() != 0) {
Packit Service 2212bb
		printf("This program needs to be executed with root priviledges\n");
Packit Service 2212bb
		return EACCES;
Packit Service 2212bb
	}
Packit Service 2212bb
	if(argc > 1) {
Packit Service 2212bb
		/* PID of irqbalance specified */
Packit Service 2212bb
		irqbalance_pid = strtol(argv[1], NULL, 10);
Packit Service 2212bb
		if(!irqbalance_pid) {
Packit Service 2212bb
			printf("PID must be a number\n");
Packit Service 2212bb
			return EINVAL;
Packit Service 2212bb
		}
Packit Service 2212bb
	} else {
Packit Service 2212bb
		/* We need to find irqbalance's PID */
Packit Service 2212bb
		DIR *dir = opendir("/proc");
Packit Service 2212bb
		if(dir) {
Packit Service 2212bb
			struct dirent *entry;
Packit Service 2212bb
			char cmdfile[512];
Packit Service 2212bb
			char cmdstring[256];
Packit Service 2212bb
			cmdstring[255] = '\0';
Packit Service 2212bb
			do {
Packit Service 2212bb
				entry = readdir(dir);
Packit Service 2212bb
				if(entry) {
Packit Service 2212bb
					snprintf(cmdfile, 512, "/proc/%s/cmdline", entry->d_name);
Packit Service 2212bb
					FILE *f = fopen(cmdfile, "r");
Packit Service 2212bb
					if(f == NULL) {
Packit Service 2212bb
						continue;
Packit Service 2212bb
					}
Packit Service 2212bb
					fgets(cmdstring, 255, f);
Packit Service 2212bb
					if((strstr(cmdstring, "irqbalance") != NULL) &&
Packit Service 2212bb
							(strstr(cmdstring, "irqbalance-ui") == NULL)) {
Packit Service 2212bb
						irqbalance_pid = strtol(entry->d_name, NULL, 10);
Packit Service 2212bb
					}
Packit Service 2212bb
					fclose(f);
Packit Service 2212bb
				}
Packit Service 2212bb
			} while((entry) && (irqbalance_pid == -1));
Packit Service 2212bb
		}
Packit Service 2212bb
		if(irqbalance_pid == -1) {
Packit Service 2212bb
			printf("Unable to determine irqbalance PID\n");
Packit Service 2212bb
			return EINVAL;
Packit Service 2212bb
		}
Packit Service 2212bb
	}
Packit Service 2212bb
Packit Service 2212bb
	init();
Packit Service 2212bb
Packit Service 2212bb
	main_loop = g_main_loop_new(NULL, FALSE);
Packit Service 2212bb
	g_timeout_add_seconds(5, rescan_tree, NULL);
Packit Service 2212bb
	g_timeout_add_seconds(1, key_loop, NULL);
Packit Service 2212bb
	g_main_loop_run(main_loop);
Packit Service 2212bb
Packit Service 2212bb
Packit Service 2212bb
	g_main_loop_quit(main_loop);
Packit Service 2212bb
	close_window(0);
Packit Service 2212bb
	return 0;
Packit Service 2212bb
}