diff options
author | Benoît Dejean <bdejean@src.gnome.org> | 2007-06-25 21:43:20 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2007-06-25 21:43:20 +0000 |
commit | 6c95195787065cf65c161c7026869e3030ec6e07 (patch) | |
tree | 6a4b1401d6e7fba6ad040636f58c0efc012408ae | |
parent | ef34cfb38aa2870a454a4e5a76d3d3c1a9e8f701 (diff) | |
download | libgtop-linux_daemon.tar.gz |
Build daemon on linux.linux_daemon
svn path=/branches/linux_daemon/; revision=2615
-rw-r--r-- | libgtop-sysdeps.m4 | 4 | ||||
-rw-r--r-- | sysdeps/linux/Makefile.am | 6 | ||||
-rw-r--r-- | sysdeps/linux/suid.c | 94 |
3 files changed, 101 insertions, 3 deletions
diff --git a/libgtop-sysdeps.m4 b/libgtop-sysdeps.m4 index 03044626..157c6d95 100644 --- a/libgtop-sysdeps.m4 +++ b/libgtop-sysdeps.m4 @@ -63,9 +63,9 @@ AC_DEFUN([GNOME_LIBGTOP_SYSDEPS],[ case "$host_os" in linux*) libgtop_sysdeps_dir=linux - libgtop_use_machine_h=no + libgtop_use_machine_h=yes libgtop_have_sysinfo=yes - libgtop_need_server=no + libgtop_need_server=yes ;; netbsd*|openbsd*|bsdi*) libgtop_sysdeps_dir=bsd diff --git a/sysdeps/linux/Makefile.am b/sysdeps/linux/Makefile.am index 6b94337b..6776cfbf 100644 --- a/sysdeps/linux/Makefile.am +++ b/sysdeps/linux/Makefile.am @@ -1,6 +1,6 @@ INCLUDES = @INCLUDES@ -noinst_LTLIBRARIES = libgtop_sysdeps-2.0.la +noinst_LTLIBRARIES = libgtop_sysdeps-2.0.la libgtop_sysdeps_suid-2.0.la libgtop_sysdeps_2_0_la_SOURCES = open.c close.c cpu.c mem.c swap.c \ uptime.c loadavg.c shm_limits.c msg_limits.c \ @@ -18,3 +18,7 @@ libgtopinclude_HEADERS = glibtop_server.h glibtop_machine.h libgtopincludedir = $(includedir)/libgtop-2.0 noinst_HEADERS = glibtop_private.h + + +libgtop_sysdeps_suid_2_0_la_SOURCES = suid.c +libgtop_sysdeps_suid_2_0_la_LDFLAGS = $(LT_VERSION_INFO) diff --git a/sysdeps/linux/suid.c b/sysdeps/linux/suid.c new file mode 100644 index 00000000..903df19c --- /dev/null +++ b/sysdeps/linux/suid.c @@ -0,0 +1,94 @@ + +/* Copyright (C) 1998 Joshua Sled + This file is part of LibGTop 1.0. + + Contributed by Joshua Sled <jsled@xcf.berkeley.edu>, July 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 <config.h> +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/open.h> +#include <glibtop/init_hooks.h> + +/* !!! THIS FUNCTION RUNS SUID ROOT - CHANGE WITH CAUTION !!! */ + +void +glibtop_init_p (glibtop *server, const unsigned long features, + const unsigned flags) +{ + const _glibtop_init_func_t *init_fkt; + + if (server == NULL) + glibtop_error_r (NULL, "glibtop_init_p (server == NULL)"); + + /* Do the initialization, but only if not already initialized. */ + + if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) { + glibtop_open_p (server, "glibtop", features, flags); + + for (init_fkt = _glibtop_init_hook_p; *init_fkt; init_fkt++) + (*init_fkt) (server); + + server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS; + } +} + +void +glibtop_open_p (glibtop *server, const char *program_name, + const unsigned long features, + const unsigned flags) +{ +#ifdef DEBUG + fprintf (stderr, "DEBUG (%d): glibtop_open_p ()\n", getpid ()); +#endif +#if 0 + /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ + + server->machine.uid = getuid (); + server->machine.euid = geteuid (); + server->machine.gid = getgid (); + server->machine.egid = getegid (); + + server->os_version_code = __FreeBSD_version; + + /* Setup machine-specific data */ + server->machine.kd = kvm_open (NULL, NULL, NULL, O_RDONLY, "kvm_open"); + + if (server->machine.kd == NULL) + glibtop_error_io_r (server, "kvm_open"); + + /* Drop priviledges. */ + + if (setreuid (server->machine.euid, server->machine.uid)) + _exit (1); + + if (setregid (server->machine.egid, server->machine.gid)) + _exit (1); +#endif + /* !!! END OF SUID ROOT PART !!! */ + + /* Our effective uid is now those of the user invoking the server, + * so we do no longer have any priviledges. */ + + /* NOTE: On FreeBSD, we do not need to be suid root, we just need to + * be sgid kmem. + * + * The server will only use setegid() to get back it's priviledges, + * so it will fail if it is suid root and not sgid kmem. */ +} |