From 44016ac37172e9042e74236bfafcecd9ae531427 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Sun, 2 Jan 2000 14:50:49 +0000 Subject: [PATCH] New file. Automatically creates `demarshal.c'. This automatically created 2000-01-02 Martin Baulig * demarshal.pl: New file. Automatically creates `demarshal.c'. * demarshal.c: This automatically created file handles the demarshalling in the libgtop_server. * Makefile.am: Build the `libgtop_server' here. * server.c, server.h: New files. Copied here from `src/daemon'. --- backends/server/.cvsignore | 2 + backends/server/ChangeLog | 9 ++ backends/server/Makefile.am | 32 ++++- backends/server/demarshal.pl | 253 +++++++++++++++++++++++++++++++++++ backends/server/server.c | 110 +++++++++++++++ backends/server/server.h | 70 ++++++++++ 6 files changed, 474 insertions(+), 2 deletions(-) create mode 100644 backends/server/demarshal.pl create mode 100644 backends/server/server.c create mode 100644 backends/server/server.h diff --git a/backends/server/.cvsignore b/backends/server/.cvsignore index a081b16a..8a712463 100644 --- a/backends/server/.cvsignore +++ b/backends/server/.cvsignore @@ -5,3 +5,5 @@ Makefile.in *.lo *.la marshal.c +demarshal.c +libgtop_server diff --git a/backends/server/ChangeLog b/backends/server/ChangeLog index b875f1b4..706bc6f0 100644 --- a/backends/server/ChangeLog +++ b/backends/server/ChangeLog @@ -1,3 +1,12 @@ +2000-01-02 Martin Baulig + + * demarshal.pl: New file. Automatically creates `demarshal.c'. + * demarshal.c: This automatically created file handles the + demarshalling in the libgtop_server. + + * Makefile.am: Build the `libgtop_server' here. + * server.c, server.h: New files. Copied here from `src/daemon'. + 2000-01-01 Martin Baulig Initial version of the "glibtop-backend-server" backend. diff --git a/backends/server/Makefile.am b/backends/server/Makefile.am index 5781eb14..d199861f 100644 --- a/backends/server/Makefile.am +++ b/backends/server/Makefile.am @@ -1,6 +1,9 @@ LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -INCLUDES = @INCLUDES@ +INCLUDES = @INCLUDES@ -D_BSD \ + -DLIBGTOP_COMPILE_SYSTEM=\"`uname -s`\" \ + -DLIBGTOP_COMPILE_RELEASE=\"`uname -r`\" \ + -DLIBGTOP_COMPILE_MACHINE=\"`uname -m`\" noinst_HEADERS = \ glibtop-backend-private.h @@ -8,6 +11,12 @@ noinst_HEADERS = \ lib_LTLIBRARIES = \ libgtop_backend_server.la +bin_PROGRAMS = \ + @server_programs@ + +EXTRA_PROGRAMS = \ + libgtop_server + libgtop_backend_server_la_SOURCES = \ backend-server.c \ marshal.c \ @@ -19,8 +28,23 @@ libgtop_backend_server_la_SOURCES = \ libgtop_backend_server_la_LDFLAGS = \ $(LT_VERSION_INFO) +libgtop_server_SOURCES = \ + server.c \ + server.h \ + demarshal.c + +libgtop_server_LDADD = \ + $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps_suid.la \ + $(top_builddir)/sysdeps/common/libgtop_suid_common.la \ + @LIBSUPPORT@ + +if ENABLE_STATIC +libgtop_server_LDFLAGS = -static +endif + BUILT_SOURCES = \ - marshal.c + marshal.c \ + demarshal.c CLEANFILES = $(BUILT_SOURCES) @@ -28,3 +52,7 @@ marshal.c: marshal.pl $(top_builddir)/config.h $(top_srcdir)/features.def $(top_ $(PERL) -I $(top_srcdir)/scripts $(srcdir)/marshal.pl < $(top_srcdir)/features.def > tmp-t mv tmp-t marshal.c +demarshal.c: demarshal.pl $(top_builddir)/config.h $(top_srcdir)/features.def $(top_srcdir)/scripts/c_types.pl + $(PERL) -I $(top_srcdir)/scripts $(srcdir)/demarshal.pl < $(top_srcdir)/features.def > tmp-t + mv tmp-t demarshal.c + diff --git a/backends/server/demarshal.pl b/backends/server/demarshal.pl new file mode 100644 index 00000000..1051a931 --- /dev/null +++ b/backends/server/demarshal.pl @@ -0,0 +1,253 @@ +#!/usr/bin/perl + +require 'c_types.pl'; + +$[ = 1; # set array base to 1 +$, = ' '; # set output field separator +$\ = "\n"; # set output record separator + +$always_use_temp_storage = 0; + +sub toupper { + local($_) = @_; + tr/a-z/A-Z/; + return $_; +} + +sub tolower { + local($_) = @_; + tr/A-Z/a-z/; + return $_; +} + +print '/* demarshal.c */'; +print "/* This is a generated file. Please modify `demarshal.pl' */"; +print ''; + +print '#include '; +print '#include '; +print '#include '; +print ''; +print '#include '; +print '#include '; +print ''; +print '#include '; +print '#include '; +print ''; +print '#include '; +print ''; + +$feature_count = 0; + +while (<>) { + chop; # strip record separator + + if (/^[^\#]/) { + &output($_); + } +} + +sub output { + local($line) = @_; + @line_fields = split(/\|/, $line, 9999); + $retval = $line_fields[1]; + $element_def = $line_fields[3]; + $feature = $line_fields[2]; + $param_def = $line_fields[4]; + + return if $feature =~ /^@/; + $name = 'glibtop_'.$feature; + + $orig = $feature; + $feature =~ s/^@//; + $space = $feature; + $space =~ s/./ /g; + + $features{++$feature_count} = $feature; + + $orig_retval = $retval; + + if ($retval eq 'retval') { + $retval_param = '&retval'; + $call_prefix = ''; + $call_prefix_space = ''; + $prefix = 'retval = '; + $prefix_space = ' '; + $retval = 'int'; + } elsif ($retval !~ /^void$/) { + $retval_param = 'NULL'; + $prefix = 'retval = '; + $prefix_space = ' '; + $call_prefix = 'retval = '; + $call_prefix_space = ' '; + } else { + $retval_param = 'NULL'; + $call_prefix = ''; + $call_prefix_space = ''; + $prefix = ''; + $prefix_space = ''; + } + + if ($retval =~ /^(array|pointer)\((.*)\)$/) { + $retval = ($2 eq 'string') ? 'char **' : "$2 *"; + } + + $need_temp_storage = $always_use_temp_storage; + $first_param_name = ''; + $size_code = "\t_LIBGTOP_SEND_len = 0;\n"; + + $local_var_decl_code = ''; + $local_var_decl_code .= "\tsize_t _LIBGTOP_SEND_len;\n"; + $local_var_decl_code .= "\toff_t _LIBGTOP_SEND_offset;\n"; + $local_var_decl_code .= "\tconst char *_LIBGTOP_SEND_ptr;\n"; + $local_var_decl_code .= sprintf + (qq[\tglibtop_%s %s;\n], $feature, $feature); + if ($retval !~ /^void$/) { + $local_var_decl_code .= sprintf ("\t%s retval = (%s) 0;\n", + $retval, $retval); + } + + $init_local_var_code = ''; + $init_local_var_code .= sprintf + (qq[\tmemset (&%s, 0, sizeof (glibtop_%s));\n], $feature, $feature); + $init_local_var_code .= "\t_LIBGTOP_SEND_offset = 0;\n"; + $init_local_var_code .= "\t_LIBGTOP_SEND_ptr = ". + "(char *) send_ptr;\n"; + + $demarshal_code = ''; + + $call_param = ''; + $param_decl = ''; + $need_temp_len = 0; + $nr_params = (@params = split(/:/, $param_def, 9999)); + for ($param = 1; $param <= $nr_params; $param++) { + $list = $params[$param]; + $type = $params[$param]; + $type =~ s/\(.*//; + $list =~ s/^.*\(//; + $list =~ s/\)$//; + $count = (@fields = split(/,/, $list, 9999)); + for ($field = 1; $field <= $count; $field++) { + my $c_type = $typeinfo->{$type}->[1]; + + if ($first_param_name eq '') { + $first_param_name = $fields[$field]; + } + + if ($typeinfo->{$type}->[2]) { + $need_temp_storage = 1; + } + + if ($param_decl eq '') { + $param_decl = ",\n " . $space . ' '; + } else { + $param_decl = $param_decl . ', '; + } + $param_decl = $param_decl . $c_type . ' ' . $fields[$field]; + $call_param = $call_param . ', _LIBGTOP_demarshal_' . $fields[$field]; + + $size_code .= "\t_LIBGTOP_SEND_len += "; + if ($typeinfo->{$type}->[2]) { + $size_code .= sprintf ("sizeof (size_t)"); + } else { + $size_code .= sprintf ("sizeof (%s)", $c_type); + } + $size_code .= ";\n"; + + $local_var_decl_code .= sprintf + (qq[\t%s _LIBGTOP_demarshal_%s;\n], $c_type, $fields[$field]); + $init_local_var_code .= sprintf + (qq[\tmemset (&_LIBGTOP_demarshal_%s, 0, sizeof (%s));\n], + $fields[$field], $c_type); + + $demarshal_code .= "\t_LIBGTOP_SEND_ptr = ". + "(char *) send_ptr + _LIBGTOP_SEND_offset;\n"; + + if ($typeinfo->{$type}->[2]) { + $demarshal_code .= sprintf ("\tmemcpy (&_LIBGTOP_TEMP_len, _LIBGTOP_SEND_ptr, sizeof (size_t));\n"); + $demarshal_code .= sprintf + (qq[\t_LIBGTOP_DATA_len += _LIBGTOP_TEMP_len;\n]); + $demarshal_code .= sprintf + (qq[\tif (_LIBGTOP_DATA_len > data_size)\n\t\treturn -GLIBTOP_ERROR_DEMARSHAL_ERROR;\n]); + $demarshal_code .= sprintf + (qq[\t_LIBGTOP_DATA_offset += _LIBGTOP_TEMP_len;\n]); + } + + if (defined $demarshal_funcs->{$type}) { + $demarshal_code .= $demarshal_funcs->{$type}->($c_type, $fields[$field], "\t"); + } else { + $demarshal_code .= sprintf ("\tmemcpy (&_LIBGTOP_demarshal_%s, _LIBGTOP_SEND_ptr, %s);\n", + $fields[$field], "sizeof ($c_type)"); + } + + $demarshal_code .= "\t_LIBGTOP_SEND_offset += "; + if ($typeinfo->{$type}->[2]) { + $demarshal_code .= sprintf ("sizeof (size_t)"); + } else { + $demarshal_code .= sprintf ("sizeof (%s)", $c_type); + } + $demarshal_code .= ";\n"; + } + } + + if (!($demarshal_code eq '')) { + $demarshal_code .= "\n"; + } + + if ($need_temp_storage) { + $local_var_decl_code .= "\tsize_t _LIBGTOP_TEMP_len;\n"; + $local_var_decl_code .= "\tsize_t _LIBGTOP_DATA_len;\n"; + $local_var_decl_code .= "\toff_t _LIBGTOP_DATA_offset;\n"; + $local_var_decl_code .= "\tchar *_LIBGTOP_DATA_ptr;\n"; + + $init_local_var_code .= "\t_LIBGTOP_DATA_len = 0;\n"; + $init_local_var_code .= "\t_LIBGTOP_DATA_offset = 0;\n"; + $init_local_var_code .= "\t_LIBGTOP_DATA_ptr = ". + "(char *) data_ptr;\n"; + } + + if ($line_fields[3] eq '') { + $call_code = sprintf + ("\tretval = glibtop_get_%s_p (server%s);\n", + $feature, $call_param); + } elsif ($line_fields[3] eq 'array') { + $call_code = sprintf + ("\tretval = glibtop_get_%s_p (server, array%s);\n", + $feature, $call_param); + $local_var_decl_code .= sprintf (qq[\tglibtop_array *array;\n]); + } elsif ($line_fields[3] =~ /^array/) { + $call_code = sprintf + ("\tretval = glibtop_get_%s_p (server, array, &%s%s);\n", + $feature, $feature, $call_param); + $local_var_decl_code .= sprintf (qq[\tglibtop_array *array;\n]); + } else { + $call_code = sprintf + ("\tretval = glibtop_get_%s_p (server, &%s%s);\n", + $feature, $feature, $call_param); + } + + if ($orig_retval eq 'retval') { + $call_code .= sprintf + (qq[\tif (retval_ptr)\n\t\t*retval_ptr = retval;\n]); + } else { + $call_code .= sprintf + (qq[\tif (retval_ptr)\n\t\t*retval_ptr = server->glibtop_errno;\n]); + } + + $size_code .= sprintf + (qq[\tif (_LIBGTOP_SEND_len != send_size)\n\t\treturn -GLIBTOP_ERROR_DEMARSHAL_ERROR;\n\n]); + + $func_decl_code = sprintf + (qq[static int\n_glibtop_demarshal_%s_i (glibtop *server, glibtop_backend *backend, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, int *retval_ptr)\n], $feature); + + $func_body_code = sprintf + (qq[%s%s%s], $size_code, $demarshal_code, $call_code); + + $total_code = sprintf + (qq[%s{\n%s\n%s\n%s\n\treturn 0;\n}\n], + $func_decl_code, $local_var_decl_code, $init_local_var_code, + $func_body_code); + + print $total_code; +} + diff --git a/backends/server/server.c b/backends/server/server.c new file mode 100644 index 00000000..12e2ffaf --- /dev/null +++ b/backends/server/server.c @@ -0,0 +1,110 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig , April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "server.h" + +static glibtop _glibtop_global_server; +glibtop *glibtop_global_server = &_glibtop_global_server; + +#include +#include +#include + +#include + +const unsigned long glibtop_server_features = +GLIBTOP_SUID_CPU + +GLIBTOP_SUID_MEM + +GLIBTOP_SUID_SWAP + +GLIBTOP_SUID_UPTIME + +GLIBTOP_SUID_LOADAVG + +GLIBTOP_SUID_SHM_LIMITS + +GLIBTOP_SUID_MSG_LIMITS + +GLIBTOP_SUID_SEM_LIMITS + +GLIBTOP_SUID_PROCLIST + +GLIBTOP_SUID_PROC_STATE + +GLIBTOP_SUID_PROC_UID + +GLIBTOP_SUID_PROC_MEM + +GLIBTOP_SUID_PROC_TIME + +GLIBTOP_SUID_PROC_SIGNAL + +GLIBTOP_SUID_PROC_KERNEL + +GLIBTOP_SUID_PROC_SEGMENT + +GLIBTOP_SUID_PROC_ARGS + +GLIBTOP_SUID_PROC_MAP + +GLIBTOP_SUID_NETINFO + +GLIBTOP_SUID_NETLOAD + +GLIBTOP_SUID_INTERFACE_NAMES + +GLIBTOP_SUID_PPP; + +#include +#include + +int +main(int argc, char *argv[]) +{ + struct utsname uts; + int uid, euid, gid, egid; + glibtop *server; + + /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ + + uid = getuid (); euid = geteuid (); + gid = getgid (); egid = getegid (); + + if (uname (&uts) < 0) _exit (1); + + if (strcmp (uts.sysname, LIBGTOP_COMPILE_SYSTEM) || + strcmp (uts.release, LIBGTOP_COMPILE_RELEASE) || + strcmp (uts.machine, LIBGTOP_COMPILE_MACHINE)) { + fprintf (stderr, "Can only run on %s %s %s\n", + LIBGTOP_COMPILE_SYSTEM, + LIBGTOP_COMPILE_RELEASE, + LIBGTOP_COMPILE_MACHINE); + _exit (1); + } + + server = glibtop_global_server; + + if (!server->_priv) + server->_priv = glibtop_calloc_r + (server, 1, sizeof (glibtop_server_private)); + + glibtop_init_p (server, 0, 0); + + if (setreuid (euid, uid)) _exit (1); + + if (setregid (egid, gid)) _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + handle_slave_connection (0, 0); + + _exit (0); +} + +void +handle_slave_connection (int input, int output) +{ +} diff --git a/backends/server/server.h b/backends/server/server.h new file mode 100644 index 00000000..b71236cf --- /dev/null +++ b/backends/server/server.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig , April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GLIBTOP_DAEMON_H__ +#define __GLIBTOP_DAEMON_H__ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +BEGIN_LIBGTOP_DECLS + +/* Some don't have LOG_PERROR */ +#ifndef LOG_PERROR +#define LOG_PERROR 0 +#endif + +#if defined(HAVE_GETDTABLESIZE) +#define GET_MAX_FDS() getdtablesize() +#else +/* Fallthrough case - please add other #elif cases above + for different OS's as necessary */ +#define GET_MAX_FDS() 256 +#endif + +void handle_slave_connection (int input, int output); + +void syslog_message (int priority, char *format, ...); +void syslog_io_message (int priority, char *format, ...); + +extern int enable_debug; +extern int verbose_output; + +END_LIBGTOP_DECLS + +#endif