Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Nov 2014 18:00:32 +0800
From:      Tiwei Bie <btw@mail.ustc.edu.cn>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        freebsd-hackers@freebsd.org, Mateusz Guzik <mjguzik@gmail.com>
Subject:   Re: [PATCH] Finish the task 'sysctl reporting current working directory'
Message-ID:  <20141106100032.GA80996@freebsd>
In-Reply-To: <20141106092134.GL53947@kib.kiev.ua>
References:  <1414987325-23280-1-git-send-email-btw@mail.ustc.edu.cn> <20141103051908.GC29497@dft-labs.eu> <20141103064052.GA1739@freebsd> <20141103080526.GE29497@dft-labs.eu> <20141103085235.GA85851@freebsd> <20141106081330.GA12284@dft-labs.eu> <20141106085750.GA52132@freebsd> <20141106092134.GL53947@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Nov 06, 2014 at 11:21:34AM +0200, Konstantin Belousov wrote:
> On Thu, Nov 06, 2014 at 04:57:50PM +0800, Tiwei Bie wrote:
> > On Thu, Nov 06, 2014 at 09:13:31AM +0100, Mateusz Guzik wrote:
> > > On Mon, Nov 03, 2014 at 04:52:35PM +0800, Tiwei Bie wrote:
> > > 
> > > kernel changes got in in r274167
> > > 
> > > Please submit tmux patch to bugzilla.
> > > 
> > 
> > Thanks! I have submitted the tmux patch to bugzilla [1].
> > 
> > [1] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194858
> 
> This is incorrect way to use kern_proc_cwd.  You should try the new
> sysctl, and on ENOENT fall back to the kern_proc_file.  Expecting
> that the binary is run on the same machine where it was build is
> wrong.
> 

Yeah, you are right. Following is my new patch, maybe it needs some
style improvements.

diff --git a/osdep-freebsd.c b/osdep-freebsd.c
index d596eab..673ca98 100644
--- a/osdep-freebsd.c
+++ b/osdep-freebsd.c
@@ -133,7 +133,7 @@ error:
 }
 
 char *
-osdep_get_cwd(int fd)
+osdep_get_cwd_fallback(int fd)
 {
 	static char		 wd[PATH_MAX];
 	struct kinfo_file	*info = NULL;
@@ -158,6 +158,31 @@ osdep_get_cwd(int fd)
 	return (NULL);
 }
 
+#ifdef KERN_PROC_CWD
+char *
+osdep_get_cwd(int fd)
+{
+	static struct kinfo_file info;
+	int	name[] = { CTL_KERN, KERN_PROC, KERN_PROC_CWD, 0 };
+	size_t	len = sizeof info;
+
+	if ((name[3] = tcgetpgrp(fd)) == -1)
+		return (NULL);
+	if (sysctl(name, 4, &info, &len, NULL, 0) == -1) {
+		if (errno == ENOENT)
+			return (osdep_get_cwd_fallback(fd));
+		return (NULL);
+	}
+	return (info.kf_path);
+}
+#else /* !KERN_PROC_CWD */
+char *
+osdep_get_cwd(int fd)
+{
+	return (osdep_get_cwd_fallback(fd));
+}
+#endif /* KERN_PROC_CWD */
+
 struct event_base *
 osdep_event_init(void)
 {
-- 
2.1.0





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20141106100032.GA80996>