Date: Mon, 3 Nov 2014 16:52:35 +0800 From: Tiwei Bie <btw@mail.ustc.edu.cn> To: Mateusz Guzik <mjguzik@gmail.com> Cc: freebsd-hackers@freebsd.org Subject: Re: [PATCH] Finish the task 'sysctl reporting current working directory' Message-ID: <20141103085235.GA85851@freebsd> In-Reply-To: <20141103080526.GE29497@dft-labs.eu> 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>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 03, 2014 at 09:05:26AM +0100, Mateusz Guzik wrote: > > > > #2. Patch for tmux: > > > > diff --git a/osdep-freebsd.c b/osdep-freebsd.c > > index d596eab..4178f01 100644 > > --- a/osdep-freebsd.c > > +++ b/osdep-freebsd.c > > @@ -132,6 +132,46 @@ error: > > return (NULL); > > } > > > > +#ifdef KERN_PROC_CWD > > +char * > > +osdep_get_cwd(int fd) > > +{ > > + static char wd[PATH_MAX]; > > + pid_t pgrp; > > + int mib[4]; > > + size_t len; > > + struct kinfo_file *info; > > + char *buf; > > + int error; > > + > > + if ((pgrp = tcgetpgrp(fd)) == -1) > > + return (NULL); > > + > > + mib[0] = CTL_KERN; > > + mib[1] = KERN_PROC; > > + mib[2] = KERN_PROC_CWD; > > Take a look at osdep-openbsd. This should be done along with > declaration. > > > + mib[3] = pgrp; > > + > > + error = sysctl(mib, 4, NULL, &len, NULL, 0); > > + if (error) > > + return (NULL); > > + > > + buf = malloc(len); > > + if (buf == NULL) > > + return (NULL); > > + error = sysctl(mib, 4, buf, &len, NULL, 0); > > + if (error) { > > + free(buf); > > + return (NULL); > > + } > > + > > + info = (struct kinfo_file *)buf; > > + strlcpy(wd, info->kf_path, sizeof wd); > > + > > + free(buf); > > Why? Just have static kinfo_file. There is no need to allocate or copy > anything, nor to query for size. > Sorry, my patch for tmux is messy... :-( My new patch: diff --git a/osdep-freebsd.c b/osdep-freebsd.c index d596eab..46f6f3f 100644 --- a/osdep-freebsd.c +++ b/osdep-freebsd.c @@ -132,6 +132,21 @@ error: 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) != 0) + return (NULL); + return (info.kf_path); +} +#else /* !KERN_PROC_CWD */ char * osdep_get_cwd(int fd) { @@ -157,6 +172,7 @@ osdep_get_cwd(int fd) free(info); return (NULL); } +#endif /* KERN_PROC_CWD */ struct event_base * osdep_event_init(void) -- 2.1.0 Tiwei Bie
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20141103085235.GA85851>