GNUnet  0.20.0
os_installation.c File Reference

get paths used by the program More...

#include "platform.h"
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <unistr.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 (void)
 Try to obtain the installation path using the "GNUNET_PREFIX" environment variable. More...
 
static char * os_get_gnunet_path (void)
 get the path to GNUnet bin/ or lib/, preferring 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...
 
enum GNUNET_GenericReturnValue GNUNET_OS_check_helper_binary (const char *binary, bool 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 const struct GNUNET_OS_ProjectDatagettextinit
 PD for which gettext has been initialized last. 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 46 of file os_installation.c.

◆ LOG_STRERROR_FILE

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

Definition at line 49 of file os_installation.c.

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

319 {
320  char *path;
321  char *pos;
322  char *end;
323  char *buf;
324  const char *p;
325 
326  if (NULL == (p = getenv ("PATH")))
327  return NULL;
328 
329  path = GNUNET_strdup (p); /* because we write on it */
330 
331  buf = GNUNET_malloc (strlen (path) + strlen (binary) + 1 + 1);
332  pos = path;
333  while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
334  {
335  *end = '\0';
336  sprintf (buf, "%s/%s", pos, binary);
338  {
339  pos = GNUNET_strdup (pos);
340  GNUNET_free (buf);
341  GNUNET_free (path);
342  return pos;
343  }
344  pos = end + 1;
345  }
346  sprintf (buf, "%s/%s", pos, binary);
348  {
349  pos = GNUNET_strdup (pos);
350  GNUNET_free (buf);
351  GNUNET_free (path);
352  return pos;
353  }
354  GNUNET_free (buf);
355  GNUNET_free (path);
356  return NULL;
357 }
char * getenv()
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static char buf[2048]
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-uri.c:38
enum GNUNET_GenericReturnValue 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:482
@ GNUNET_YES
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
#define PATH_SEPARATOR
Definition: platform.h:167

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

Referenced by os_get_gnunet_path().

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 ( void  )
static

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

Returns
NULL on error (environment variable not set)

Definition at line 367 of file os_installation.c.

368 {
369  const char *p;
370 
371  if ((NULL != current_pd->env_varname) &&
372  (NULL != (p = getenv (current_pd->env_varname))))
373  return GNUNET_strdup (p);
374  if ((NULL != current_pd->env_varname_alt) &&
375  (NULL != (p = getenv (current_pd->env_varname_alt))))
376  return GNUNET_strdup (p);
377  return NULL;
378 }
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
const char * env_varname
Name of an environment variable that can be used to override installation path detection,...
const char * env_varname_alt
Alternative name of an environment variable that can be used to override installation path detection,...

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

Referenced by os_get_gnunet_path().

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 ( void  )
static

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

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

Definition at line 388 of file os_installation.c.

389 {
390  char *ret;
391 
392  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
393  return ret;
394 #ifdef __linux__
395  if (NULL != (ret = get_path_from_proc_maps ()))
396  return ret;
397  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
398  if ((NULL != current_pd->binary_name) &&
399  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
400  return ret;
401  if (NULL != (ret = get_path_from_proc_exe ()))
402  return ret;
403 #endif
404 #if DARWIN
405  if (NULL != (ret = get_path_from_dyld_image ()))
406  return ret;
407  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
408  return ret;
409 #endif
410  if ((NULL != current_pd->binary_name) &&
411  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
412  return ret;
413  /* other attempts here */
415  _ (
416  "Could not determine installation path for %s. Set `%s' environment variable.\n"),
419  return NULL;
420 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
@ GNUNET_ERROR_TYPE_ERROR
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(void)
Try to obtain the installation path using the "GNUNET_PREFIX" environment variable.
#define LOG(kind,...)
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
const char * binary_name
Name of a project-specific binary that should be in "$PREFIX/bin/".
const char * project_dirname
Name of the project that is used in the "libexec" prefix, For example, "gnunet".

References _, GNUNET_OS_ProjectData::binary_name, current_pd, 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().

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

429 {
430  char *ret = NULL;
431 
432 #ifdef __linux__
433  if (NULL != (ret = get_path_from_proc_exe ()))
434  return ret;
435 #endif
436 #if DARWIN
437  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
438  return ret;
439 #endif
440  /* other attempts here */
441  return ret;
442 }

References ret.

Referenced by GNUNET_OS_installation_get_path().

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 = "gnunet",
.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 1 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 81 of file os_installation.c.

Referenced by get_path_from_GNUNET_PREFIX(), GNUNET_OS_init(), GNUNET_OS_installation_get_path(), GNUNET_OS_project_data_get(), and os_get_gnunet_path().

◆ gettextinit

const struct GNUNET_OS_ProjectData* gettextinit
static

PD for which gettext has been initialized last.

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

Definition at line 88 of file os_installation.c.

Referenced by GNUNET_OS_init(), and GNUNET_OS_project_data_get().