GNUnet  0.11.x
Macros | Functions | Variables
os_installation.c File Reference

get paths used by the program More...

#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <unistr.h>
#include "platform.h"
#include "gnunet_util_lib.h"
Include dependency graph for os_installation.c:

Go to the source code of this file.

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "util-os-installation", __VA_ARGS__)
 
#define LOG_STRERROR_FILE(kind, syscall, filename)
 

Functions

const struct GNUNET_OS_ProjectDataGNUNET_OS_project_data_default (void)
 Return default project data used by 'libgnunetutil' for GNUnet. More...
 
const struct GNUNET_OS_ProjectDataGNUNET_OS_project_data_get ()
 
void GNUNET_OS_init (const struct GNUNET_OS_ProjectData *pd)
 Setup OS subsystem with project data. More...
 
static char * get_path_from_PATH (const char *binary)
 Return the actual path to a file found in the current PATH environment variable. More...
 
static char * get_path_from_GNUNET_PREFIX ()
 Try to obtain the installation path using the "GNUNET_PREFIX" environment variable. More...
 
static char * os_get_gnunet_path ()
 get the path to GNUnet bin/ or lib/, prefering the lib/ path More...
 
static char * os_get_exec_path ()
 get the path to current app's bin/ More...
 
char * GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind)
 get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX, the current running apps installation directory More...
 
char * GNUNET_OS_get_libexec_binary_path (const char *progname)
 Given the name of a gnunet-helper, gnunet-service or gnunet-daemon binary, try to prefix it with the libexec/-directory to get the full path. More...
 
char * GNUNET_OS_get_suid_binary_path (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *progname)
 Given the name of a helper, service or daemon binary construct the full path to the binary using the SUID_BINARY_PATH in the PATHS section of the configuration. More...
 
int GNUNET_OS_check_helper_binary (const char *binary, int check_suid, const char *params)
 Check whether an executable exists and possibly if the suid bit is set on the file. More...
 

Variables

static const struct GNUNET_OS_ProjectData default_pd
 Default project data used for installation path detection for GNUnet (core). More...
 
static const struct GNUNET_OS_ProjectDatacurrent_pd = &default_pd
 Which project data do we currently use for installation path detection? Never NULL. More...
 
static int gettextinit = 0
 Wether or not gettext has been initialized for the library. More...
 

Detailed Description

get paths used by the program

Author
Milan
Christian Fuchs
Christian Grothoff
Matthias Wachs
Heikki Lindholm
LRN

Definition in file os_installation.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "util-os-installation", __VA_ARGS__)

Definition at line 45 of file os_installation.c.

Referenced by GNUNET_OS_check_helper_binary(), and os_get_gnunet_path().

◆ LOG_STRERROR_FILE

#define LOG_STRERROR_FILE (   kind,
  syscall,
  filename 
)
Value:
"util-os-installation", \
syscall, \
#define GNUNET_log_from_strerror_file(level, component, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
static char * filename

Definition at line 48 of file os_installation.c.

Referenced by GNUNET_OS_check_helper_binary(), and GNUNET_OS_init().

Function Documentation

◆ get_path_from_PATH()

static char* get_path_from_PATH ( const char *  binary)
static

Return the actual path to a file found in the current PATH environment variable.

Parameters
binarythe name of the file to find
Returns
path to binary, NULL if not found

Definition at line 310 of file os_installation.c.

References buf, end, getenv(), GNUNET_DISK_file_test(), GNUNET_free, GNUNET_malloc, GNUNET_strdup, GNUNET_YES, p, and PATH_SEPARATOR.

Referenced by GNUNET_OS_check_helper_binary(), and os_get_gnunet_path().

311 {
312  char *path;
313  char *pos;
314  char *end;
315  char *buf;
316  const char *p;
317 
318  if (NULL == (p = getenv ("PATH")))
319  return NULL;
320 
321  path = GNUNET_strdup (p); /* because we write on it */
322 
323  buf = GNUNET_malloc (strlen (path) + strlen (binary) + 1 + 1);
324  pos = path;
325  while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
326  {
327  *end = '\0';
328  sprintf (buf, "%s/%s", pos, binary);
329  if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
330  {
331  pos = GNUNET_strdup (pos);
332  GNUNET_free (buf);
333  GNUNET_free (path);
334  return pos;
335  }
336  pos = end + 1;
337  }
338  sprintf (buf, "%s/%s", pos, binary);
339  if (GNUNET_YES == GNUNET_DISK_file_test (buf))
340  {
341  pos = GNUNET_strdup (pos);
342  GNUNET_free (buf);
343  GNUNET_free (path);
344  return pos;
345  }
346  GNUNET_free (buf);
347  GNUNET_free (path);
348  return NULL;
349 }
int GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory)...
Definition: disk.c:544
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
#define PATH_SEPARATOR
Definition: platform.h:169
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
static char buf[2048]
char * getenv()
#define GNUNET_YES
Definition: gnunet_common.h:77
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_path_from_GNUNET_PREFIX()

static char* get_path_from_GNUNET_PREFIX ( )
static

Try to obtain the installation path using the "GNUNET_PREFIX" environment variable.

Returns
NULL on error (environment variable not set)

Definition at line 359 of file os_installation.c.

References GNUNET_OS_ProjectData::env_varname, GNUNET_OS_ProjectData::env_varname_alt, getenv(), GNUNET_strdup, and p.

Referenced by os_get_gnunet_path().

360 {
361  const char *p;
362 
363  if ((NULL != current_pd->env_varname) &&
364  (NULL != (p = getenv (current_pd->env_varname))))
365  return GNUNET_strdup (p);
366  if ((NULL != current_pd->env_varname_alt) &&
367  (NULL != (p = getenv (current_pd->env_varname_alt))))
368  return GNUNET_strdup (p);
369  return NULL;
370 }
const char * env_varname_alt
Alternative name of an environment variable that can be used to override installation path detection...
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
const char * env_varname
Name of an environment variable that can be used to override installation path detection, for example "GNUNET_PREFIX".
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
char * getenv()
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ os_get_gnunet_path()

static char* os_get_gnunet_path ( )
static

get the path to GNUnet bin/ or lib/, prefering the lib/ path

Author
Milan
Returns
a pointer to the executable path, or NULL on error

Definition at line 380 of file os_installation.c.

References _, GNUNET_OS_ProjectData::binary_name, GNUNET_OS_ProjectData::env_varname, get_path_from_GNUNET_PREFIX(), get_path_from_PATH(), GNUNET_ERROR_TYPE_ERROR, LOG, GNUNET_OS_ProjectData::project_dirname, and ret.

Referenced by GNUNET_OS_installation_get_path().

381 {
382  char *ret;
383 
384  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
385  return ret;
386 #if LINUX
387  if (NULL != (ret = get_path_from_proc_maps ()))
388  return ret;
389  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
390  if ((NULL != current_pd->binary_name) &&
391  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
392  return ret;
393  if (NULL != (ret = get_path_from_proc_exe ()))
394  return ret;
395 #endif
396 #if DARWIN
397  if (NULL != (ret = get_path_from_dyld_image ()))
398  return ret;
399  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
400  return ret;
401 #endif
402  if ((NULL != current_pd->binary_name) &&
403  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
404  return ret;
405  /* other attempts here */
407  _ (
408  "Could not determine installation path for %s. Set `%s' environment variable.\n"),
411  return NULL;
412 }
const char * project_dirname
Name of the project that is used in the "libexec" prefix, For example, "gnunet".
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
const char * env_varname
Name of an environment variable that can be used to override installation path detection, for example "GNUNET_PREFIX".
#define LOG(kind,...)
const char * binary_name
Name of a project-specific binary that should be in "$PREFIX/bin/".
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
static char * get_path_from_PATH(const char *binary)
Return the actual path to a file found in the current PATH environment variable.
static char * get_path_from_GNUNET_PREFIX()
Try to obtain the installation path using the "GNUNET_PREFIX" environment variable.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ os_get_exec_path()

static char* os_get_exec_path ( )
static

get the path to current app's bin/

Returns
a pointer to the executable path, or NULL on error

Definition at line 420 of file os_installation.c.

References ret.

Referenced by GNUNET_OS_installation_get_path().

421 {
422  char *ret = NULL;
423 
424 #if LINUX
425  if (NULL != (ret = get_path_from_proc_exe ()))
426  return ret;
427 #endif
428 #if DARWIN
429  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
430  return ret;
431 #endif
432  /* other attempts here */
433  return ret;
434 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
Here is the caller graph for this function:

Variable Documentation

◆ default_pd

const struct GNUNET_OS_ProjectData default_pd
static
Initial value:
= {
.libname = "libgnunetutil",
.project_dirname = "gnunet",
.binary_name = "gnunet-arm",
.version = PACKAGE_VERSION " " VCS_VERSION,
.env_varname = "GNUNET_PREFIX",
.base_config_varname = "GNUNET_BASE_CONFIG",
.bug_email = "gnunet-developers@gnu.org",
.homepage = "http://www.gnu.org/s/gnunet/",
.config_file = "gnunet.conf",
.user_config_file = "~/.config/gnunet.conf",
.is_gnu = 1,
.gettext_domain = PACKAGE,
.gettext_path = NULL,
}

Default project data used for installation path detection for GNUnet (core).

Definition at line 59 of file os_installation.c.

Referenced by GNUNET_OS_project_data_default().

◆ current_pd

const struct GNUNET_OS_ProjectData* current_pd = &default_pd
static

Which project data do we currently use for installation path detection? Never NULL.

Definition at line 79 of file os_installation.c.

Referenced by GNUNET_OS_project_data_get().

◆ gettextinit

int gettextinit = 0
static

Wether or not gettext has been initialized for the library.

Note that the gettext initialization done within GNUNET_PROGRAM_run2 is for the specific application.

Definition at line 86 of file os_installation.c.

Referenced by GNUNET_OS_init(), and GNUNET_OS_project_data_get().