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>