[sheepdog] [PATCH] add helper to get a self path
Liu Yuan
namei.unix at gmail.com
Sat Aug 31 15:38:41 CEST 2013
On Fri, Aug 30, 2013 at 11:05:18PM +0900, MORITA Kazutaka wrote:
> From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
>
> Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> ---
> include/util.h | 1 +
> lib/logger.c | 25 ++++++-------------------
> lib/util.c | 14 ++++++++++++++
> sheep/trace/trace.c | 5 +----
> 4 files changed, 22 insertions(+), 23 deletions(-)
>
> diff --git a/include/util.h b/include/util.h
> index ace763b..20ec104 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -113,6 +113,7 @@ void reraise_crash_signal(int signo, int status);
> pid_t gettid(void);
> int tkill(int tid, int sig);
> bool is_xattr_enabled(const char *path);
> +const char *get_self_path(void);
>
> void find_zero_blocks(const void *buf, uint64_t *poffset, uint32_t *plen);
> void trim_zero_blocks(void *buf, uint64_t *offset, uint32_t *len);
> diff --git a/lib/logger.c b/lib/logger.c
> index 1a31314..9685c8d 100644
> --- a/lib/logger.c
> +++ b/lib/logger.c
> @@ -668,14 +668,6 @@ void get_thread_name(char *name)
>
> #define SD_MAX_STACK_DEPTH 1024
>
> -static int get_my_path(char *path, size_t size)
> -{
> - /* readlink doesn't append '\0', so initialize here */
> - memset(path, 0, size);
> -
> - return readlink("/proc/self/exe", path, size);
> -}
> -
> static bool check_gdb(void)
> {
> return system("which gdb > /dev/null") == 0;
> @@ -683,7 +675,7 @@ static bool check_gdb(void)
>
> static int gdb_cmd(const char *cmd)
> {
> - char path[PATH_MAX], time_str[256], cmd_str[ARG_MAX];
> + char time_str[256], cmd_str[ARG_MAX];
> time_t ti;
> struct tm tm;
>
> @@ -692,9 +684,6 @@ static int gdb_cmd(const char *cmd)
> return -1;
> }
>
> - if (get_my_path(path, sizeof(path)) < 0)
> - return -1;
> -
> time(&ti);
> localtime_r(&ti, &tm);
> strftime(time_str, sizeof(time_str), "%b %2d %H:%M:%S ", &tm);
> @@ -710,7 +699,8 @@ static int gdb_cmd(const char *cmd)
> " -ex 'echo ==\\n'"
> " -ex '%s'"
> " -ex 'set logging off'",
> - path, getpid(), time_str, path, cmd, cmd);
> + get_self_path(), getpid(), time_str, get_self_path(), cmd,
> + cmd);
>
> return system(cmd_str);
> }
> @@ -737,7 +727,7 @@ void sd_backtrace(void)
>
> for (i = 1; i < n; i++) { /* addrs[0] is here, so skip it */
> void *addr = addrs[i];
> - char cmd[ARG_MAX], path[PATH_MAX], info[256], **str;
> + char cmd[ARG_MAX], info[256], **str;
> FILE *f;
>
> /*
> @@ -747,12 +737,9 @@ void sd_backtrace(void)
> addr = (void *)((char *)addr - 1);
>
> /* try to get a line number with addr2line if possible */
> - if (get_my_path(path, sizeof(path)) < 0)
> - goto fallback;
> -
> snprintf(cmd, sizeof(cmd), "addr2line -s -e %s -f -i %p | "
> - "perl -e '@a=<>; chomp @a; print \"$a[1]: $a[0]\"'",
> - path, addr);
> + "perl -e '@a=<>; chomp @a; print \"$a[1]: $a[0]\"'",
> + get_self_path(), addr);
> f = popen(cmd, "r");
> if (!f)
> goto fallback;
> diff --git a/lib/util.c b/lib/util.c
> index 346b6bd..135c57f 100644
> --- a/lib/util.c
> +++ b/lib/util.c
> @@ -558,6 +558,20 @@ bool is_xattr_enabled(const char *path)
> return !(ret == -1 && errno == ENOTSUP);
> }
>
> +const char *get_self_path(void)
> +{
> + static __thread char path[PATH_MAX];
> + int ret;
> +
> + if (path[0] == '\0') {
> + ret = readlink("/proc/self/exe", path, sizeof(path));
> + if (ret < -1)
> + panic("%m");
> + }
> +
> + return path;
> +}
> +
> /*
> * If force_create is true, this function create the file even when the
> * temporary file exists.
> diff --git a/sheep/trace/trace.c b/sheep/trace/trace.c
> index 1d3007b..9e2e94c 100644
> --- a/sheep/trace/trace.c
> +++ b/sheep/trace/trace.c
> @@ -311,12 +311,9 @@ static unsigned long find_mcount_call(unsigned long entry_addr)
>
> static bfd *get_bfd(void)
> {
> - char fname[PATH_MAX] = {0};
> + const char *fname = get_self_path();
my_exe_path() looks better.
Thanks
Yuan
More information about the sheepdog
mailing list