Blame lib/init.c

Packit d37888
/* Copyright (C) 1998-99 Martin Baulig
Packit d37888
   This file is part of LibGTop 1.0.
Packit d37888
Packit d37888
   Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
Packit d37888
Packit d37888
   LibGTop is free software; you can redistribute it and/or modify it
Packit d37888
   under the terms of the GNU General Public License as published by
Packit d37888
   the Free Software Foundation; either version 2 of the License,
Packit d37888
   or (at your option) any later version.
Packit d37888
Packit d37888
   LibGTop is distributed in the hope that it will be useful, but WITHOUT
Packit d37888
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit d37888
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit d37888
   for more details.
Packit d37888
Packit d37888
   You should have received a copy of the GNU General Public License
Packit d37888
   along with LibGTop; see the file COPYING. If not, write to the
Packit d37888
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d37888
   Boston, MA 02110-1301, USA.
Packit d37888
*/
Packit d37888
Packit d37888
#include <config.h>
Packit d37888
#include <glibtop.h>
Packit d37888
#include <glibtop/error.h>
Packit d37888
#include <glibtop/sysdeps.h>
Packit d37888
#include <glibtop/open.h>
Packit d37888
#include <glibtop/parameter.h>
Packit d37888
#include <glibtop/init_hooks.h>
Packit d37888
#include <glibtop/machine.h>
Packit d37888
Packit d37888
Packit d37888
#ifndef DEFAULT_PORT
Packit d37888
#define DEFAULT_PORT 42800
Packit d37888
#endif
Packit d37888
Packit d37888
static glibtop _glibtop_global_server;
Packit d37888
glibtop *glibtop_global_server = &_glibtop_global_server;
Packit d37888
Packit d37888
static void
Packit d37888
_init_server (glibtop *server, const unsigned features)
Packit d37888
{
Packit d37888
	char *command, *temp;
Packit d37888
Packit d37888
	/* Try to get server command, but don't override if already
Packit d37888
	 * set via glibtop_set_parameter () */
Packit d37888
Packit d37888
	if (server->server_command == NULL) {
Packit d37888
		const char *temp = getenv ("LIBGTOP_SERVER") ?
Packit d37888
			getenv ("LIBGTOP_SERVER") : LIBGTOP_SERVER;
Packit d37888
Packit d37888
		server->server_command = g_strdup (temp);
Packit d37888
	}
Packit d37888
Packit d37888
	if (server->server_rsh == NULL) {
Packit d37888
		const char *temp = getenv ("LIBGTOP_RSH") ?
Packit d37888
			getenv ("LIBGTOP_RSH") : "/usr/bin/ssh";
Packit d37888
Packit d37888
		server->server_rsh = g_strdup (temp);
Packit d37888
	}
Packit d37888
Packit d37888
	/* Try to get server method, but don't override if already
Packit d37888
	 * set via  glibtop_set_parameter () */
Packit d37888
Packit d37888
	if (server->method) return;
Packit d37888
Packit d37888
	/* If server->command doesn't start with a colon, then it is
Packit d37888
	 * the full pathname of the server executable. */
Packit d37888
Packit d37888
	if (server->server_command [0] != ':') {
Packit d37888
		if (features & glibtop_server_features) {
Packit d37888
			/* We really need the server. */
Packit d37888
			server->method = GLIBTOP_METHOD_PIPE;
Packit d37888
		} else {
Packit d37888
			/* Fine. No server is needed, so we call the
Packit d37888
			 * sysdeps functions directly. */
Packit d37888
			server->method = GLIBTOP_METHOD_DIRECT;
Packit d37888
		}
Packit d37888
Packit d37888
		return;
Packit d37888
	}
Packit d37888
Packit d37888
Packit d37888
	/* If the first character of 'server_command' is a colon,
Packit d37888
	 * the first field is the method to connect to the server. */
Packit d37888
Packit d37888
	/* Everything up to the next colon is the method. */
Packit d37888
Packit d37888
	command = g_strdup (server->server_command+1);
Packit d37888
	temp = strstr (command, ":");
Packit d37888
	if (temp) *temp = 0;
Packit d37888
Packit d37888
	/* Dispatch method. */
Packit d37888
Packit d37888
	if (!strcmp (command, "direct")) {
Packit d37888
		/* Use sysdeps dir instead of connecting to server
Packit d37888
		 * even if using the server would be required on
Packit d37888
		 * the current system. */
Packit d37888
		server->method = GLIBTOP_METHOD_DIRECT;
Packit d37888
Packit d37888
	} else if (!strcmp (command, "inet")) {
Packit d37888
Packit d37888
		server->method = GLIBTOP_METHOD_INET;
Packit d37888
Packit d37888
		/* Connect to internet server. */
Packit d37888
Packit d37888
		if (temp == NULL) {
Packit d37888
			/* If no value was set, we use 'localhost'. */
Packit d37888
			if (server->server_host == NULL)
Packit d37888
				server->server_host = g_strdup ("localhost");
Packit d37888
		} else {
Packit d37888
			char *temp2 = strstr (temp+1, ":");
Packit d37888
			if (temp2) *temp2 = 0;
Packit d37888
Packit d37888
			/* Override default. */
Packit d37888
			if (server->server_host)
Packit d37888
				g_free ((char *) server->server_host);
Packit d37888
Packit d37888
			server->server_host = g_strdup (temp+1);
Packit d37888
Packit d37888
			temp = temp2;
Packit d37888
		}
Packit d37888
Packit d37888
		if (temp == NULL) {
Packit d37888
			/* If no value was set, we use DEFAULT_PORT. */
Packit d37888
			if (server->server_port == 0)
Packit d37888
				server->server_port = DEFAULT_PORT;
Packit d37888
		} else {
Packit d37888
			char *temp2 = strstr (temp+1, ":");
Packit d37888
			if (temp2) *temp2 = 0;
Packit d37888
Packit d37888
			if (sscanf (temp+1, "%ld", &server->server_port) != 1)
Packit d37888
				server->server_port = DEFAULT_PORT;
Packit d37888
Packit d37888
			temp = temp2 ? temp2 + 1 : temp2;
Packit d37888
		}
Packit d37888
Packit d37888
	} else if (!strcmp (command, "unix")) {
Packit d37888
Packit d37888
		/* Connect to unix domain socket. */
Packit d37888
		server->method = GLIBTOP_METHOD_UNIX;
Packit d37888
Packit d37888
	} else if (!strcmp (command, "pipe")) {
Packit d37888
Packit d37888
		/* Open pipe to server. */
Packit d37888
		server->method = GLIBTOP_METHOD_PIPE;
Packit d37888
		server->server_command = g_strdup(LIBGTOP_SERVER);
Packit d37888
	} else {
Packit d37888
Packit d37888
		glibtop_error_r (server, "Unknown server method '%s'",
Packit d37888
				 server->server_command+1);
Packit d37888
Packit d37888
	}
Packit d37888
Packit d37888
	g_free (command);
Packit d37888
}
Packit d37888
Packit d37888
glibtop *
Packit d37888
glibtop_init_r (glibtop **server_ptr, unsigned long features, unsigned flags)
Packit d37888
{
Packit d37888
	glibtop *server;
Packit d37888
Packit d37888
	if (server_ptr == NULL)
Packit d37888
		return NULL;
Packit d37888
Packit d37888
	if (*server_ptr == NULL)
Packit d37888
		*server_ptr = glibtop_global_server;
Packit d37888
Packit d37888
	server = *server_ptr;
Packit d37888
Packit d37888
	/* Should we do the initialization? */
Packit d37888
Packit d37888
	if (flags & GLIBTOP_INIT_NO_INIT)
Packit d37888
		return server;
Packit d37888
Packit d37888
	/* Do the initialization, but only if not already initialized. */
Packit d37888
Packit d37888
	if ((server->flags & _GLIBTOP_INIT_STATE_INIT) == 0) {
Packit d37888
Packit d37888
		glibtop_machine_new (server);
Packit d37888
Packit d37888
		if (flags & GLIBTOP_FEATURES_EXCEPT)
Packit d37888
			features = ~features & GLIBTOP_SYSDEPS_ALL;
Packit d37888
Packit d37888
		if (features == 0)
Packit d37888
			features = GLIBTOP_SYSDEPS_ALL;
Packit d37888
Packit d37888
		if (flags & GLIBTOP_FEATURES_NO_SERVER) {
Packit d37888
			server->method = GLIBTOP_METHOD_DIRECT;
Packit d37888
			features = 0;
Packit d37888
		}
Packit d37888
Packit d37888
		server->features = features;
Packit d37888
Packit d37888
		_init_server (server, features);
Packit d37888
Packit d37888
		server->flags |= _GLIBTOP_INIT_STATE_INIT;
Packit d37888
Packit d37888
		switch (server->method) {
Packit d37888
		case GLIBTOP_METHOD_PIPE:
Packit d37888
		case GLIBTOP_METHOD_UNIX:
Packit d37888
			if (glibtop_server_features & features)
Packit d37888
				break;
Packit d37888
Packit d37888
			server->method = GLIBTOP_METHOD_DIRECT;
Packit d37888
			break;
Packit d37888
		}
Packit d37888
	}
Packit d37888
Packit d37888
	/* Should we open the server? */
Packit d37888
Packit d37888
	if (flags & GLIBTOP_INIT_NO_OPEN)
Packit d37888
		return server;
Packit d37888
Packit d37888
	/* Open server, but only if not already opened. */
Packit d37888
Packit d37888
	if ((server->flags & _GLIBTOP_INIT_STATE_OPEN) == 0)
Packit d37888
		glibtop_open_l (server, "glibtop",
Packit d37888
				features, flags);
Packit d37888
Packit d37888
	return server;
Packit d37888
}
Packit d37888
Packit d37888
glibtop *
Packit d37888
glibtop_init_s (glibtop **server_ptr, unsigned long features, unsigned flags)
Packit d37888
{
Packit d37888
	glibtop *server;
Packit d37888
	const _glibtop_init_func_t *init_fkt;
Packit d37888
Packit d37888
	glibtop_debug("init_s with features=%#0lx and flags=%#0x", features, flags);
Packit d37888
Packit d37888
	if (server_ptr == NULL)
Packit d37888
		return NULL;
Packit d37888
Packit d37888
	if (*server_ptr == NULL)
Packit d37888
		*server_ptr = glibtop_global_server;
Packit d37888
Packit d37888
	server = *server_ptr;
Packit d37888
Packit d37888
	/* Should we do the initialization? */
Packit d37888
Packit d37888
	if (flags & GLIBTOP_INIT_NO_INIT)
Packit d37888
		return server;
Packit d37888
Packit d37888
	/* Do the initialization, but only if not already initialized. */
Packit d37888
Packit d37888
	if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) {
Packit d37888
		glibtop_open_s (server, "glibtop", features, flags);
Packit d37888
Packit d37888
		for (init_fkt = _glibtop_init_hook_s; *init_fkt; init_fkt++)
Packit d37888
			(*init_fkt) (server);
Packit d37888
Packit d37888
		server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS;
Packit d37888
	}
Packit d37888
Packit d37888
	return server;
Packit d37888
}