Blame src/daemon/slave.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 "daemon.h"
Packit d37888
#include <glibtop/error.h>
Packit d37888
Packit d37888
void
Packit d37888
handle_slave_connection (int input, int output)
Packit d37888
{
Packit d37888
	glibtop *server G_GNUC_UNUSED = glibtop_global_server;
Packit d37888
	const void *ptr G_GNUC_UNUSED;
Packit d37888
Packit d37888
	unsigned short max_len G_GNUC_UNUSED;
Packit d37888
	pid_t pid G_GNUC_UNUSED;
Packit d37888
	gint64 proc_which G_GNUC_UNUSED;
Packit d37888
	gint64 proc_arg G_GNUC_UNUSED;
Packit d37888
Packit d37888
	glibtop_response _resp, *resp = &_resp;
Packit d37888
	glibtop_command _cmnd, *cmnd = &_cmnd;
Packit d37888
	char parameter [BUFSIZ];
Packit d37888
Packit d37888
	glibtop_send_version (glibtop_global_server, output);
Packit d37888
Packit d37888
	while (do_read (input, cmnd, sizeof (glibtop_command))) {
Packit d37888
		glibtop_debug ("Slave %d received command "
Packit d37888
			 "%llu from client.", getpid (), cmnd->command);
Packit d37888
Packit d37888
		if (cmnd->data_size >= BUFSIZ)
Packit d37888
			glibtop_error ("Client sent %llu bytes, "
Packit d37888
				       "but buffer is %lu",
Packit d37888
				       cmnd->size, (unsigned long)BUFSIZ);
Packit d37888
Packit d37888
		memset (resp, 0, sizeof (glibtop_response));
Packit d37888
Packit d37888
		memset (parameter, 0, sizeof (parameter));
Packit d37888
Packit d37888
		if (cmnd->data_size) {
Packit d37888
			glibtop_debug ("Client has %llu bytes of data.",
Packit d37888
				 cmnd->data_size);
Packit d37888
Packit d37888
			do_read (input, parameter, cmnd->data_size);
Packit d37888
Packit d37888
		} else if (cmnd->size) {
Packit d37888
			memcpy (parameter, cmnd->parameter, cmnd->size);
Packit d37888
		}
Packit d37888
Packit d37888
		switch (cmnd->command) {
Packit d37888
		case GLIBTOP_CMND_QUIT:
Packit d37888
			do_output (output, resp, 0, 0, NULL);
Packit d37888
			return;
Packit d37888
#if GLIBTOP_SUID_PROCLIST
Packit d37888
		case GLIBTOP_CMND_PROCLIST:
Packit d37888
			memcpy(&proc_which, parameter, sizeof proc_which);
Packit d37888
			memcpy(&proc_arg, parameter + sizeof proc_which, sizeof proc_arg);
Packit d37888
			ptr = glibtop_get_proclist_p
Packit d37888
				(server, &resp->u.data.proclist,
Packit d37888
				 proc_which, proc_arg);
Packit d37888
			do_output (output, resp, _offset_data (proclist),
Packit d37888
				   resp->u.data.proclist.total, ptr);
Packit d37888
			g_free (ptr);
Packit d37888
			break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_ARGS
Packit d37888
		case GLIBTOP_CMND_PROC_ARGS:
Packit d37888
			memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
			memcpy (&max_len, parameter + sizeof (pid_t),
Packit d37888
				sizeof (max_len));
Packit d37888
			ptr = glibtop_get_proc_args_p (server,
Packit d37888
						       &resp->u.data.proc_args,
Packit d37888
						       pid, max_len);
Packit d37888
			do_output (output, resp, _offset_data (proc_args),
Packit d37888
				   ptr ? resp->u.data.proc_args.size+1 : 0,
Packit d37888
				   ptr);
Packit d37888
			g_free (ptr);
Packit d37888
			break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_MAP
Packit d37888
		case GLIBTOP_CMND_PROC_MAP:
Packit d37888
			memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
			ptr = glibtop_get_proc_map_p (server,
Packit d37888
						      &resp->u.data.proc_map,
Packit d37888
						      pid);
Packit d37888
			do_output (output, resp, _offset_data (proc_map),
Packit d37888
				   resp->u.data.proc_map.total, ptr);
Packit d37888
			g_free (ptr);
Packit d37888
			break;
Packit d37888
#endif
Packit d37888
		default:
Packit d37888
			handle_slave_command (cmnd, resp, parameter);
Packit d37888
			do_output (output, resp, resp->offset, 0, NULL);
Packit d37888
			break;
Packit d37888
		}
Packit d37888
	}
Packit d37888
}
Packit d37888
Packit d37888
void
Packit d37888
handle_slave_command (glibtop_command *cmnd, glibtop_response *resp,
Packit d37888
		      const void *parameter)
Packit d37888
{
Packit d37888
	glibtop *server = glibtop_global_server;
Packit d37888
	unsigned device G_GNUC_UNUSED;
Packit d37888
	pid_t pid G_GNUC_UNUSED;
Packit d37888
Packit d37888
	switch (cmnd->command) {
Packit d37888
	case GLIBTOP_CMND_SYSDEPS:
Packit d37888
		memcpy (&resp->u.sysdeps, &server->sysdeps,
Packit d37888
			sizeof (glibtop_sysdeps));
Packit d37888
		resp->u.sysdeps.features = glibtop_server_features;
Packit d37888
		resp->u.sysdeps.flags = glibtop_server_features |
Packit d37888
		  (1L << GLIBTOP_SYSDEPS_FEATURES);
Packit d37888
		resp->offset = _offset_union (sysdeps);
Packit d37888
		break;
Packit d37888
#if GLIBTOP_SUID_CPU
Packit d37888
	case GLIBTOP_CMND_CPU:
Packit d37888
		glibtop_get_cpu_p (server, &resp->u.data.cpu);
Packit d37888
		resp->offset = _offset_data (cpu);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_MEM
Packit d37888
	case GLIBTOP_CMND_MEM:
Packit d37888
		glibtop_get_mem_p (server, &resp->u.data.mem);
Packit d37888
		resp->offset = _offset_data (mem);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_SWAP
Packit d37888
	case GLIBTOP_CMND_SWAP:
Packit d37888
		glibtop_get_swap_p (server, &resp->u.data.swap);
Packit d37888
		resp->offset = _offset_data (swap);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_UPTIME
Packit d37888
	case GLIBTOP_CMND_UPTIME:
Packit d37888
		glibtop_get_uptime_p (server, &resp->u.data.uptime);
Packit d37888
		resp->offset = _offset_data (uptime);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_LOADAVG
Packit d37888
	case GLIBTOP_CMND_LOADAVG:
Packit d37888
		glibtop_get_loadavg_p (server, &resp->u.data.loadavg);
Packit d37888
		resp->offset = _offset_data (loadavg);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_SHM_LIMITS
Packit d37888
	case GLIBTOP_CMND_SHM_LIMITS:
Packit d37888
		glibtop_get_shm_limits_p (server, &resp->u.data.shm_limits);
Packit d37888
		resp->offset = _offset_data (shm_limits);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_MSG_LIMITS
Packit d37888
	case GLIBTOP_CMND_MSG_LIMITS:
Packit d37888
		glibtop_get_msg_limits_p (server, &resp->u.data.msg_limits);
Packit d37888
		resp->offset = _offset_data (msg_limits);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_SEM_LIMITS
Packit d37888
	case GLIBTOP_CMND_SEM_LIMITS:
Packit d37888
		glibtop_get_sem_limits_p (server, &resp->u.data.sem_limits);
Packit d37888
		resp->offset = _offset_data (sem_limits);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_STATE
Packit d37888
	case GLIBTOP_CMND_PROC_STATE:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_state_p
Packit d37888
			(server, &resp->u.data.proc_state, pid);
Packit d37888
		resp->offset = _offset_data (proc_state);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_UID
Packit d37888
	case GLIBTOP_CMND_PROC_UID:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_uid_p
Packit d37888
			(server, &resp->u.data.proc_uid, pid);
Packit d37888
		resp->offset = _offset_data (proc_uid);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_MEM
Packit d37888
	case GLIBTOP_CMND_PROC_MEM:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_mem_p
Packit d37888
			(server, &resp->u.data.proc_mem, pid);
Packit d37888
		resp->offset = _offset_data (proc_mem);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_TIME
Packit d37888
	case GLIBTOP_CMND_PROC_TIME:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_time_p
Packit d37888
			(server, &resp->u.data.proc_time, pid);
Packit d37888
		resp->offset = _offset_data (proc_time);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_IO
Packit d37888
	case GLIBTOP_CMND_PROC_IO:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_io_p
Packit d37888
			(server, &resp->u.data.proc_io, pid);
Packit d37888
		resp->offset = _offset_data (proc_time);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_SIGNAL
Packit d37888
	case GLIBTOP_CMND_PROC_SIGNAL:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_signal_p
Packit d37888
			(server, &resp->u.data.proc_signal, pid);
Packit d37888
		resp->offset = _offset_data (proc_signal);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_KERNEL
Packit d37888
	case GLIBTOP_CMND_PROC_KERNEL:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_kernel_p
Packit d37888
			(server, &resp->u.data.proc_kernel, pid);
Packit d37888
		resp->offset = _offset_data (proc_kernel);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PROC_SEGMENT
Packit d37888
	case GLIBTOP_CMND_PROC_SEGMENT:
Packit d37888
		memcpy (&pid, parameter, sizeof (pid_t));
Packit d37888
		glibtop_get_proc_segment_p
Packit d37888
			(server, &resp->u.data.proc_segment, pid);
Packit d37888
		resp->offset = _offset_data (proc_segment);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_NETLOAD
Packit d37888
	case GLIBTOP_CMND_NETLOAD:
Packit d37888
		glibtop_get_netload_p (server, &resp->u.data.netload, parameter);
Packit d37888
		resp->offset = _offset_data (netload);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
#if GLIBTOP_SUID_PPP
Packit d37888
	case GLIBTOP_CMND_PPP:
Packit d37888
		memcpy (&device, parameter, sizeof (unsigned short));
Packit d37888
		glibtop_get_ppp_p (server, &resp->u.data.ppp, device);
Packit d37888
		resp->offset = _offset_data (ppp);
Packit d37888
		break;
Packit d37888
#endif
Packit d37888
	default:
Packit d37888
		glibtop_error ("Child received unknown command %llu",
Packit d37888
			       cmnd->command);
Packit d37888
		break;
Packit d37888
	}
Packit d37888
}