summaryrefslogtreecommitdiff
path: root/devel/libgtop/files/patch-sysdeps_freebsd_open.c
diff options
context:
space:
mode:
authorJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
committerJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
commit610ae5681637c1051a0c17b54e29d97f53da2f3a (patch)
treec231a1eb74b07e444fa7363012cb84bf23d83ce0 /devel/libgtop/files/patch-sysdeps_freebsd_open.c
parentAdd a new framework for browser plugins, USE_WEBPLUGINS. It is for which foo (diff)
Presenting GNOME 2.24 for FreeBSD.
See http://library.gnome.org/misc/release-notes/2.24/ for the general release notes. On the FreeBSD front, this release introduces Fuse support in HAL, adds multi-CPU support to libgtop, WebKit updates, and fixes some long-standing seahorse and gnome-keyring bugs. The documentation updates to the website are forthcoming. This release features commits by adamw, ahze, kwm, mezz, and myself. It would not have been possible without are contributors and testers: Alexander Loginov Craig Butler [1] Dmitry Marakasov [6] Eric L. Chen Joseph S. Atkinson Kris Moore Lapo Luchini [7] Nikos Ntarmos Pawel Worach Romain Tartiere TAOKA Fumiyoshi [3] Yasuda Keisuke Zyl aZ [4] bf [2] [5] Florent Thoumie Peter Wemm pluknet PR: 125857 [1] 126993 [2] 130031 [3] 127399 [4] 127661 [5] 124302 [6] 129570 [7] 129936 123790
Notes
Notes: svn path=/head/; revision=225629
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_open.c')
-rw-r--r--devel/libgtop/files/patch-sysdeps_freebsd_open.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_open.c b/devel/libgtop/files/patch-sysdeps_freebsd_open.c
new file mode 100644
index 000000000000..f7bf0e3b1488
--- /dev/null
+++ b/devel/libgtop/files/patch-sysdeps_freebsd_open.c
@@ -0,0 +1,91 @@
+--- sysdeps/freebsd/open.c.orig 2008-05-23 18:13:23.000000000 -0400
++++ sysdeps/freebsd/open.c 2008-09-29 17:23:22.000000000 -0400
+@@ -20,76 +20,33 @@
+ */
+
+ #include <config.h>
++#include <sys/types.h>
++#include <sys/sysctl.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);
++#include <glibtop/cpu.h>
++#include <glibtop/error.h>
+
+- for (init_fkt = _glibtop_init_hook_p; *init_fkt; init_fkt++)
+- (*init_fkt) (server);
++#include <glibtop_private.h>
+
+- server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS;
+- }
+-}
+
+ void
+-glibtop_open_p (glibtop *server, const char *program_name,
++glibtop_open_s (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
++ int ncpus;
++ size_t len;
+
+- /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */
++ len = sizeof (ncpus);
++ sysctlbyname ("hw.ncpu", &ncpus, &len, NULL, 0);
++ server->real_ncpu = ncpus - 1;
++ server->ncpu = MIN(GLIBTOP_NCPU - 1, server->real_ncpu);
+
+- server->machine.uid = getuid ();
+- server->machine.euid = geteuid ();
+- server->machine.gid = getgid ();
+- server->machine.egid = getegid ();
+ #if defined(__FreeBSD_kernel__)
+ server->os_version_code = __FreeBSD_kernel_version;
+ #else
+ server->os_version_code = __FreeBSD_version;
+ #endif
+- /* 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);
+-
+- /* !!! 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. */
+ }