[PATCH] Finish the task 'sysctl reporting current working directory'
Mateusz Guzik
mjguzik at gmail.com
Mon Nov 3 08:05:32 UTC 2014
On Mon, Nov 03, 2014 at 02:40:52PM +0800, Tiwei Bie wrote:
Kernel patch is ok.
>
> #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.
> + return (wd);
> +}
> +#else /* !KERN_PROC_CWD */
> char *
> osdep_get_cwd(int fd)
> {
> @@ -157,6 +197,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
>
--
Mateusz Guzik <mjguzik gmail.com>
More information about the freebsd-hackers
mailing list