GNUnet 0.22.0
os_installation.c File Reference
#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...
 

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:33
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:483
@ 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 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().

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) &&
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) &&
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
Final status code.
Definition: gnunet-arm.c:93
@ GNUNET_ERROR_TYPE_ERROR
static char * get_path_from_GNUNET_PREFIX(void)
Try to obtain the installation path using the "GNUNET_PREFIX" environment variable.
static char * get_path_from_PATH(const char *binary)
Return the actual path to a file found in the current PATH 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 60 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().