freebsd-ports/x11/mate-terminal/files/patch-src_terminal-screen.c
Koop Mast a236e2d0bf Say hello to Mate 1.6.
Mate is a lite desktop forked from gnome2.

Most of the work is done by Jeremy Messenger (mezz@). The only thing I did
was update a few ports to later 1.6 release and attempting to keep up with
ports infra changes. Resulting bugs are all mine.

Mate is a sort of replacement for Gnome 2. So people wanting to keep a
Gnome 2 like desktop should switch. Gnome 2 will be replaced by Gnome 3
in the near future. This switch will be announce with a transition time
so people have more time to switch if they haven't already.

This release was made possible by everyone that send friendly pokes to
keep mate on my mind.

Approved by:	portmgr (bapt)
2013-11-23 11:39:07 +00:00

98 lines
2.4 KiB
C

--- src/terminal-screen.c.orig 2012-07-27 16:58:59.000000000 -0500
+++ src/terminal-screen.c 2012-07-27 17:03:08.000000000 -0500
@@ -18,6 +18,15 @@
#include <config.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/param.h>
+#include <sys/user.h>
+#ifdef HAVE_KINFO_GETFILE
+#include <libutil.h>
+#endif
+#endif
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
@@ -190,16 +199,29 @@
static char *
cwd_of_pid (int pid)
{
+#ifndef __FreeBSD__
static const char patterns[][18] =
{
"/proc/%d/cwd", /* Linux */
"/proc/%d/path/cwd", /* Solaris >= 10 */
};
+#else
+#if __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104)
+ struct kinfo_file *freep, *kif;
+#ifndef HAVE_KINFO_GETFILE
+ size_t len;
+ int name[4];
+#else
+ int cnt;
+#endif /* HAVE_KINFO_GETFILE */
+#endif /* __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104) */
+#endif /* __FreeBSD__ */
guint i;
if (pid == -1)
return NULL;
+#ifndef __FreeBSD__
/* Try to get the working directory using various OS-specific mechanisms */
for (i = 0; i < G_N_ELEMENTS (patterns); ++i)
{
@@ -237,6 +259,49 @@
return working_dir;
}
}
+#else
+ int fgpid = pid;
+#if __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104)
+#ifndef HAVE_KINFO_GETFILE
+ name[0] = CTL_KERN;
+ name[1] = KERN_PROC;
+ name[2] = KERN_PROC_FILEDESC;
+ name[3] = fgpid;
+
+ if (sysctl (name, 4, NULL, &len, NULL, 0) < 0)
+ return NULL;
+ freep = kif = g_malloc (len);
+ if (sysctl (name, 4, kif, &len, NULL, 0) < 0)
+ {
+ g_free (freep);
+ return NULL;
+ }
+#else
+ freep = kinfo_getfile (fgpid, &cnt);
+#endif /* HAVE_KINFO_GETFILE */
+
+#ifndef HAVE_KINFO_GETFILE
+ for (i = 0; i < len / sizeof (*kif); i++, kif++)
+ {
+ if (kif->kf_structsize != sizeof (*kif))
+ continue;
+#else
+ for (i = 0; i < cnt; i++)
+ {
+ kif = &freep[i];
+#endif /* HAVE_KINFO_GETFILE */
+ if (kif->kf_fd == KF_FD_TYPE_CWD)
+ {
+ char *working_dir;
+
+ working_dir = g_strdup (kif->kf_path);
+ g_free (freep);
+ return working_dir;
+ }
+ }
+ g_free (freep);
+#endif /* __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104) */
+#endif /* __FreeBSD__ */
return NULL;
}