GNUnet  0.17.6
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 (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 45 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 48 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 322 of file os_installation.c.

323 {
324  char *path;
325  char *pos;
326  char *end;
327  char *buf;
328  const char *p;
329 
330  if (NULL == (p = getenv ("PATH")))
331  return NULL;
332 
333  path = GNUNET_strdup (p); /* because we write on it */
334 
335  buf = GNUNET_malloc (strlen (path) + strlen (binary) + 1 + 1);
336  pos = path;
337  while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
338  {
339  *end = '\0';
340  sprintf (buf, "%s/%s", pos, binary);
342  {
343  pos = GNUNET_strdup (pos);
344  GNUNET_free (buf);
345  GNUNET_free (path);
346  return pos;
347  }
348  pos = end + 1;
349  }
350  sprintf (buf, "%s/%s", pos, binary);
352  {
353  pos = GNUNET_strdup (pos);
354  GNUNET_free (buf);
355  GNUNET_free (path);
356  return pos;
357  }
358  GNUNET_free (buf);
359  GNUNET_free (path);
360  return NULL;
361 }
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:37
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:166

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

372 {
373  const char *p;
374 
375  if ((NULL != current_pd->env_varname) &&
376  (NULL != (p = getenv (current_pd->env_varname))))
377  return GNUNET_strdup (p);
378  if ((NULL != current_pd->env_varname_alt) &&
379  (NULL != (p = getenv (current_pd->env_varname_alt))))
380  return GNUNET_strdup (p);
381  return NULL;
382 }
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 392 of file os_installation.c.

393 {
394  char *ret;
395 
396  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
397  return ret;
398 #ifdef __linux__
399  if (NULL != (ret = get_path_from_proc_maps ()))
400  return ret;
401  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
402  if ((NULL != current_pd->binary_name) &&
403  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
404  return ret;
405  if (NULL != (ret = get_path_from_proc_exe ()))
406  return ret;
407 #endif
408 #if DARWIN
409  if (NULL != (ret = get_path_from_dyld_image ()))
410  return ret;
411  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
412  return ret;
413 #endif
414  if ((NULL != current_pd->binary_name) &&
415  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
416  return ret;
417  /* other attempts here */
419  _ (
420  "Could not determine installation path for %s. Set `%s' environment variable.\n"),
423  return NULL;
424 }
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:177
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 432 of file os_installation.c.

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

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

Referenced by GNUNET_OS_init(), and GNUNET_OS_project_data_get().