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 311 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().

312 {
313  char *path;
314  char *pos;
315  char *end;
316  char *buf;
317  const char *p;
318 
319  if (NULL == (p = getenv ("PATH")))
320  return NULL;
321 
322  path = GNUNET_strdup (p); /* because we write on it */
323 
324  buf = GNUNET_malloc (strlen (path) + strlen (binary) + 1 + 1);
325  pos = path;
326  while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
327  {
328  *end = '\0';
329  sprintf (buf, "%s/%s", pos, binary);
330  if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
331  {
332  pos = GNUNET_strdup (pos);
333  GNUNET_free (buf);
334  GNUNET_free (path);
335  return pos;
336  }
337  pos = end + 1;
338  }
339  sprintf (buf, "%s/%s", pos, binary);
340  if (GNUNET_YES == GNUNET_DISK_file_test (buf))
341  {
342  pos = GNUNET_strdup (pos);
343  GNUNET_free (buf);
344  GNUNET_free (path);
345  return pos;
346  }
347  GNUNET_free (buf);
348  GNUNET_free (path);
349  return NULL;
350 }
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:172
#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_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 360 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().

361 {
362  const char *p;
363 
364  if ((NULL != current_pd->env_varname) &&
365  (NULL != (p = getenv (current_pd->env_varname))))
366  return GNUNET_strdup (p);
367  if ((NULL != current_pd->env_varname_alt) &&
368  (NULL != (p = getenv (current_pd->env_varname_alt))))
369  return GNUNET_strdup (p);
370  return NULL;
371 }
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 381 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().

382 {
383  char *ret;
384 
385  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
386  return ret;
387 #ifdef __linux__
388  if (NULL != (ret = get_path_from_proc_maps ()))
389  return ret;
390  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
391  if ((NULL != current_pd->binary_name) &&
392  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
393  return ret;
394  if (NULL != (ret = get_path_from_proc_exe ()))
395  return ret;
396 #endif
397 #if DARWIN
398  if (NULL != (ret = get_path_from_dyld_image ()))
399  return ret;
400  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
401  return ret;
402 #endif
403  if ((NULL != current_pd->binary_name) &&
404  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
405  return ret;
406  /* other attempts here */
408  _ (
409  "Could not determine installation path for %s. Set `%s' environment variable.\n"),
412  return NULL;
413 }
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:184
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 421 of file os_installation.c.

References ret.

Referenced by GNUNET_OS_installation_get_path().

422 {
423  char *ret = NULL;
424 
425 #ifdef __linux__
426  if (NULL != (ret = get_path_from_proc_exe ()))
427  return ret;
428 #endif
429 #if DARWIN
430  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
431  return ret;
432 #endif
433  /* other attempts here */
434  return ret;
435 }
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,
.agpl_url = GNUNET_AGPL_URL,
}
#define GNUNET_AGPL_URL
NOTE: You MUST adjust this URL to point to the location of a publicly accessible repository (or TGZ) ...

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 80 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 87 of file os_installation.c.

Referenced by GNUNET_OS_init(), and GNUNET_OS_project_data_get().