GNUnet  0.10.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)   GNUNET_log_from_strerror_file (kind, "util-os-installation", 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...
 

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 47 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 
)    GNUNET_log_from_strerror_file (kind, "util-os-installation", syscall, filename)

Definition at line 49 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 405 of file os_installation.c.

References buf, end, getenv(), GNUNET_asprintf(), 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().

406 {
407  char *path;
408  char *pos;
409  char *end;
410  char *buf;
411  const char *p;
412 
413  if (NULL == (p = getenv ("PATH")))
414  return NULL;
415 #if WINDOWS
416  /* On W32 look in CWD first. */
417  GNUNET_asprintf (&path, ".%c%s", PATH_SEPARATOR, p);
418 #else
419  path = GNUNET_strdup (p); /* because we write on it */
420 #endif
421  buf = GNUNET_malloc (strlen (path) + strlen (binary) + 1 + 1);
422  pos = path;
423  while (NULL != (end = strchr (pos, PATH_SEPARATOR)))
424  {
425  *end = '\0';
426  sprintf (buf, "%s/%s", pos, binary);
427  if (GNUNET_DISK_file_test (buf) == GNUNET_YES)
428  {
429  pos = GNUNET_strdup (pos);
430  GNUNET_free (buf);
431  GNUNET_free (path);
432  return pos;
433  }
434  pos = end + 1;
435  }
436  sprintf (buf, "%s/%s", pos, binary);
437  if (GNUNET_YES == GNUNET_DISK_file_test (buf))
438  {
439  pos = GNUNET_strdup (pos);
440  GNUNET_free (buf);
441  GNUNET_free (path);
442  return pos;
443  }
444  GNUNET_free (buf);
445  GNUNET_free (path);
446  return NULL;
447 }
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:669
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
static char buf[2048]
char * getenv()
#define PATH_SEPARATOR
Definition: plibc.h:633
#define GNUNET_YES
Definition: gnunet_common.h:80
#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 457 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().

458 {
459  const char *p;
460 
461  if ( (NULL != current_pd->env_varname) &&
462  (NULL != (p = getenv (current_pd->env_varname))) )
463  return GNUNET_strdup (p);
464  if ( (NULL != current_pd->env_varname_alt) &&
465  (NULL != (p = getenv (current_pd->env_varname_alt))) )
466  return GNUNET_strdup (p);
467  return NULL;
468 }
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 478 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().

479 {
480  char *ret;
481 
482  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
483  return ret;
484 #if LINUX
485  if (NULL != (ret = get_path_from_proc_maps ()))
486  return ret;
487  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
488  if ( (NULL != current_pd->binary_name) &&
489  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))) )
490  return ret;
491  if (NULL != (ret = get_path_from_proc_exe ()))
492  return ret;
493 #endif
494 #if WINDOWS
495  if (NULL != (ret = get_path_from_module_filename ()))
496  return ret;
497 #endif
498 #if DARWIN
499  if (NULL != (ret = get_path_from_dyld_image ()))
500  return ret;
501  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
502  return ret;
503 #endif
504  if ( (NULL != current_pd->binary_name) &&
505  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))) )
506  return ret;
507  /* other attempts here */
509  _("Could not determine installation path for %s. Set `%s' environment variable.\n"),
512  return NULL;
513 }
const char * project_dirname
Name of the project that is used in the "libexec" prefix, For example, "gnunet".
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
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 521 of file os_installation.c.

References ret.

Referenced by GNUNET_OS_installation_get_path().

522 {
523  char *ret = NULL;
524 
525 #if LINUX
526  if (NULL != (ret = get_path_from_proc_exe ()))
527  return ret;
528 #endif
529 #if WINDOWS
530  if (NULL != (ret = get_path_from_module_filename ()))
531  return ret;
532 #endif
533 #if DARWIN
534  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
535  return ret;
536 #endif
537  /* other attempts here */
538  return ret;
539 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
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",
.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",
}

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

Definition at line 56 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 72 of file os_installation.c.

Referenced by GNUNET_OS_project_data_get().