Mercurial > retraceit
diff src/util_linux.c @ 0:147b08bc7d64
Initial commit of a basic Application framework.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 23 Mar 2015 12:41:52 +0100 |
parents | |
children | 9daf778feaf1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/util_linux.c Mon Mar 23 12:41:52 2015 +0100 @@ -0,0 +1,70 @@ +#ifndef WIN32 +/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU GPL (v>=2) + * and comes with ABSOLUTELY NO WARRANTY! + * See LICENSE.txt for details. + */ + +/**@file Linux implementation of functions declared in util.h */ + +#include "util.h" +#include "string.h" +#include "strhelp.h" +#include "unistd.h" +#include <sys/types.h> +#include <pwd.h> + +char * +get_proc_install_dir(const char *proc) +{ + char *retval = NULL, + *procpath = NULL, + *p = NULL, + buf[MAX_PATH_LINUX]; + ssize_t ret; + size_t path_len = 0; + + if (!proc) + { + return NULL; + } + + xasprintf(&procpath, "/proc/%s/exe", proc); + + ret = readlink (procpath, buf, MAX_PATH_LINUX); + xfree(procpath); + procpath = NULL; + + if (ret <= 0) + { + return NULL; + } + + buf[ret] = '\0'; + + /* cut off the filename */ + p = strrchr (buf, '/'); + if (p == NULL) + { + return NULL; + } + *(p + 1) = '\0'; + + path_len = strlen (buf); + retval = xmalloc (path_len + 1); + strncpy (retval, buf, path_len); + retval[path_len] = '\0'; + + return retval; +} + +char * +get_install_dir() +{ + return get_proc_install_dir("self"); +} + + +#endif