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 (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...
 
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
 Whether 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 317 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().

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

367 {
368  const char *p;
369 
370  if ((NULL != current_pd->env_varname) &&
371  (NULL != (p = getenv (current_pd->env_varname))))
372  return GNUNET_strdup (p);
373  if ((NULL != current_pd->env_varname_alt) &&
374  (NULL != (p = getenv (current_pd->env_varname_alt))))
375  return GNUNET_strdup (p);
376  return NULL;
377 }
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 ( 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 387 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().

388 {
389  char *ret;
390 
391  if (NULL != (ret = get_path_from_GNUNET_PREFIX ()))
392  return ret;
393 #ifdef __linux__
394  if (NULL != (ret = get_path_from_proc_maps ()))
395  return ret;
396  /* try path *first*, before /proc/exe, as /proc/exe can be wrong */
397  if ((NULL != current_pd->binary_name) &&
398  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
399  return ret;
400  if (NULL != (ret = get_path_from_proc_exe ()))
401  return ret;
402 #endif
403 #if DARWIN
404  if (NULL != (ret = get_path_from_dyld_image ()))
405  return ret;
406  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
407  return ret;
408 #endif
409  if ((NULL != current_pd->binary_name) &&
410  (NULL != (ret = get_path_from_PATH (current_pd->binary_name))))
411  return ret;
412  /* other attempts here */
414  _ (
415  "Could not determine installation path for %s. Set `%s' environment variable.\n"),
418  return NULL;
419 }
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,...)
static char * get_path_from_GNUNET_PREFIX(void)
Try to obtain the installation path using the "GNUNET_PREFIX" environment variable.
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.
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 427 of file os_installation.c.

References ret.

Referenced by GNUNET_OS_installation_get_path().

428 {
429  char *ret = NULL;
430 
431 #ifdef __linux__
432  if (NULL != (ret = get_path_from_proc_exe ()))
433  return ret;
434 #endif
435 #if DARWIN
436  if (NULL != (ret = get_path_from_NSGetExecutablePath ()))
437  return ret;
438 #endif
439  /* other attempts here */
440  return ret;
441 }
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

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