GNUnet  0.10.x
Data Structures | Macros | Typedefs | Enumerations | Functions
OS library

Low level process routines. More...

Data Structures

struct  GNUNET_OS_ProjectData
 Project-specific data used to help the OS subsystem find installation paths. More...
 

Macros

#define GNUNET_OS_get_hostname_max_length()   255
 Get maximum string length returned by gethostname() More...
 

Typedefs

typedef int(* GNUNET_OS_NetworkInterfaceProcessor) (void *cls, const char *name, int isDefault, const struct sockaddr *addr, const struct sockaddr *broadcast_addr, const struct sockaddr *netmask, socklen_t addrlen)
 Callback function invoked for each interface found. More...
 
typedef void(* GNUNET_OS_LineProcessor) (void *cls, const char *line)
 Type of a function to process a line of output. More...
 

Enumerations

enum  GNUNET_OS_InheritStdioFlags {
  GNUNET_OS_INHERIT_STD_NONE = 0, GNUNET_OS_INHERIT_STD_IN = 1, GNUNET_OS_INHERIT_STD_OUT = 2, GNUNET_OS_INHERIT_STD_ERR = 4,
  GNUNET_OS_INHERIT_STD_OUT_AND_ERR = 6, GNUNET_OS_INHERIT_STD_ALL = 7
}
 Flags that determine which of the standard streams should be inherited by the child process. More...
 
enum  GNUNET_OS_InstallationPathKind {
  GNUNET_OS_IPK_PREFIX, GNUNET_OS_IPK_BINDIR, GNUNET_OS_IPK_LIBDIR, GNUNET_OS_IPK_DATADIR,
  GNUNET_OS_IPK_LOCALEDIR, GNUNET_OS_IPK_SELF_PREFIX, GNUNET_OS_IPK_ICONDIR, GNUNET_OS_IPK_DOCDIR,
  GNUNET_OS_IPK_LIBEXECDIR
}
 Possible installation paths to request. More...
 
enum  GNUNET_OS_ProcessStatusType {
  GNUNET_OS_PROCESS_UNKNOWN, GNUNET_OS_PROCESS_RUNNING, GNUNET_OS_PROCESS_STOPPED, GNUNET_OS_PROCESS_EXITED,
  GNUNET_OS_PROCESS_SIGNALED
}
 Process status types. More...
 

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)
 
void GNUNET_OS_init (const struct GNUNET_OS_ProjectData *pd)
 Setup OS subsystem with project data. 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...
 
void GNUNET_OS_network_interfaces_list (GNUNET_OS_NetworkInterfaceProcessor proc, void *proc_cls)
 Enumerate all network interfaces. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_process_current (void)
 Get process structure for current process. More...
 
int GNUNET_OS_process_kill (struct GNUNET_OS_Process *proc, int sig)
 Sends a signal to the process. More...
 
void GNUNET_OS_process_destroy (struct GNUNET_OS_Process *proc)
 Cleans up process structure contents (OS-dependent) and deallocates it. More...
 
pid_t GNUNET_OS_process_get_pid (struct GNUNET_OS_Process *proc)
 Get the pid of the process in question. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_start_process_vap (int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, char *const argv[])
 Start a process. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_start_process (int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename,...)
 Start a process. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_start_process_va (int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, va_list va)
 Start a process. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_start_process_v (int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, const SOCKTYPE *lsocks, const char *filename, char *const argv[])
 Start a process. More...
 
struct GNUNET_OS_ProcessGNUNET_OS_start_process_s (int pipe_control, unsigned int std_inheritance, const SOCKTYPE *lsocks, const char *filename,...)
 Start a process. More...
 
void GNUNET_OS_command_stop (struct GNUNET_OS_CommandHandle *cmd)
 Stop/kill a command. More...
 
struct GNUNET_OS_CommandHandleGNUNET_OS_command_run (GNUNET_OS_LineProcessor proc, void *proc_cls, struct GNUNET_TIME_Relative timeout, const char *binary,...)
 Run the given command line and call the given function for each line of the output. More...
 
int GNUNET_OS_process_status (struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
 Retrieve the status of a process, waiting on it if dead. More...
 
int GNUNET_OS_process_wait (struct GNUNET_OS_Process *proc)
 Wait for a process to terminate. More...
 
int GNUNET_OS_process_wait_status (struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
 Retrieve the status of a process, waiting on it if dead. More...
 
void GNUNET_OS_install_parent_control_handler (void *cls)
 Connects this process to its parent via pipe; essentially, the parent control handler will read signal numbers from the GNUNET_OS_CONTROL_PIPE (as given in an environment variable) and raise those signals. 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...
 

Detailed Description

Low level process routines.

This code manages child processes. We can communicate with child processes using signals. Because signals are not supported on W32 and Java (at least not nicely), we can alternatively use a pipe to send signals to the child processes (if the child process is a full-blown GNUnet process that supports reading signals from a pipe, of course). Naturally, this also only works for 'normal' termination via signals, and not as a replacement for SIGKILL. Thus using pipes to communicate signals should only be enabled if the child is a Java process OR if we are on Windoze.

Macro Definition Documentation

◆ GNUNET_OS_get_hostname_max_length

#define GNUNET_OS_get_hostname_max_length ( )    255

Get maximum string length returned by gethostname()

Definition at line 393 of file gnunet_os_lib.h.

Referenced by GNUNET_RESOLVER_hostname_resolve(), GNUNET_RESOLVER_local_fqdn_get(), GST_stats_init(), logger_run(), and run().

Typedef Documentation

◆ GNUNET_OS_NetworkInterfaceProcessor

typedef int(* GNUNET_OS_NetworkInterfaceProcessor) (void *cls, const char *name, int isDefault, const struct sockaddr *addr, const struct sockaddr *broadcast_addr, const struct sockaddr *netmask, socklen_t addrlen)

Callback function invoked for each interface found.

Parameters
clsclosure
namename of the interface (can be NULL for unknown)
isDefaultis this presumably the default interface
addraddress of this interface (can be NULL for unknown or unassigned)
broadcast_addrthe broadcast address (can be NULL for unknown or unassigned)
netmaskthe network mask (can be NULL for unknown or unassigned)
addrlenlength of the address
Returns
GNUNET_OK to continue iteration, GNUNET_SYSERR to abort

Definition at line 366 of file gnunet_os_lib.h.

◆ GNUNET_OS_LineProcessor

typedef void(* GNUNET_OS_LineProcessor) (void *cls, const char *line)

Type of a function to process a line of output.

Parameters
clsclosure
lineline of output from a command, NULL for the end

Definition at line 562 of file gnunet_os_lib.h.

Enumeration Type Documentation

◆ GNUNET_OS_InheritStdioFlags

Flags that determine which of the standard streams should be inherited by the child process.

Enumerator
GNUNET_OS_INHERIT_STD_NONE 

No standard streams should be inherited.

GNUNET_OS_INHERIT_STD_IN 

When this flag is set, the child process will inherit stdin of the parent.

GNUNET_OS_INHERIT_STD_OUT 

When this flag is set, the child process will inherit stdout of the parent.

GNUNET_OS_INHERIT_STD_ERR 

When this flag is set, the child process will inherit stderr of the parent.

GNUNET_OS_INHERIT_STD_OUT_AND_ERR 

When these flags are set, the child process will inherit stdout and stderr of the parent.

GNUNET_OS_INHERIT_STD_ALL 

Use this option to have all of the standard streams (stdin, stdout and stderror) be inherited.

Definition at line 68 of file gnunet_os_lib.h.

68  {
73 
79 
85 
91 
97 
103 };
When this flag is set, the child process will inherit stderr of the parent.
Definition: gnunet_os_lib.h:90
When this flag is set, the child process will inherit stdin of the parent.
Definition: gnunet_os_lib.h:78
Use this option to have all of the standard streams (stdin, stdout and stderror) be inherited...
No standard streams should be inherited.
Definition: gnunet_os_lib.h:72
When this flag is set, the child process will inherit stdout of the parent.
Definition: gnunet_os_lib.h:84
When these flags are set, the child process will inherit stdout and stderr of the parent...
Definition: gnunet_os_lib.h:96

◆ GNUNET_OS_InstallationPathKind

Possible installation paths to request.

Enumerator
GNUNET_OS_IPK_PREFIX 

Return the "PREFIX" directory given to configure.

GNUNET_OS_IPK_BINDIR 

Return the directory where the program binaries are installed.

(bin/)

GNUNET_OS_IPK_LIBDIR 

Return the directory where libraries are installed.

(lib/gnunet/)

GNUNET_OS_IPK_DATADIR 

Return the directory where data is installed (share/gnunet/)

GNUNET_OS_IPK_LOCALEDIR 

Return the directory where translations are installed (share/locale/)

GNUNET_OS_IPK_SELF_PREFIX 

Return the installation directory of this application, not the one of the overall GNUnet installation (in case they are different).

GNUNET_OS_IPK_ICONDIR 

Return the prefix of the path with application icons (share/icons/).

GNUNET_OS_IPK_DOCDIR 

Return the prefix of the path with documentation files, including the license (share/doc/gnunet/).

GNUNET_OS_IPK_LIBEXECDIR 

Return the directory where helper binaries are installed (lib/gnunet/libexec/)

Definition at line 115 of file gnunet_os_lib.h.

115  {
120 
125 
130 
135 
140 
147 
152 
158 
163 };
Return the directory where translations are installed (share/locale/)
Return the directory where libraries are installed.
Return the "PREFIX" directory given to configure.
Return the prefix of the path with documentation files, including the license (share/doc/gnunet/).
Return the directory where helper binaries are installed (lib/gnunet/libexec/)
Return the installation directory of this application, not the one of the overall GNUnet installation...
Return the directory where the program binaries are installed.
Return the prefix of the path with application icons (share/icons/).
Return the directory where data is installed (share/gnunet/)

◆ GNUNET_OS_ProcessStatusType

Process status types.

Enumerator
GNUNET_OS_PROCESS_UNKNOWN 

The process is not known to the OS (or at least not one of our children).

GNUNET_OS_PROCESS_RUNNING 

The process is still running.

GNUNET_OS_PROCESS_STOPPED 

The process is paused (but could be resumed).

GNUNET_OS_PROCESS_EXITED 

The process exited with a return code.

GNUNET_OS_PROCESS_SIGNALED 

The process was killed by a signal.

Definition at line 169 of file gnunet_os_lib.h.

169  {
175 
180 
185 
190 
195 };
The process exited with a return code.
The process was killed by a signal.
The process is still running.
The process is not known to the OS (or at least not one of our children).
The process is paused (but could be resumed).

Function Documentation

◆ GNUNET_OS_project_data_default()

const struct GNUNET_OS_ProjectData* GNUNET_OS_project_data_default ( void  )

Return default project data used by 'libgnunetutil' for GNUnet.

Definition at line 92 of file os_installation.c.

References default_pd.

93 {
94  return &default_pd;
95 }
static const struct GNUNET_OS_ProjectData default_pd
Default project data used for installation path detection for GNUnet (core).

◆ GNUNET_OS_project_data_get()

const struct GNUNET_OS_ProjectData* GNUNET_OS_project_data_get ( void  )
Returns
current (actual) project data.
current project data.

Definition at line 102 of file os_installation.c.

References bindtextdomain, current_pd, gettextinit, GNUNET_free, GNUNET_OS_installation_get_path(), and GNUNET_OS_IPK_LOCALEDIR.

Referenced by format_help(), GNUNET_CONFIGURATION_load(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_run_(), LEGACY_SERVICE_run(), run(), and set_cont().

103 {
104  if (0 == gettextinit)
105  {
107  if (NULL != path)
108  bindtextdomain(PACKAGE, path);
109  GNUNET_free(path);
110  gettextinit = 1;
111  }
112  return current_pd;
113 }
Return the directory where translations are installed (share/locale/)
#define bindtextdomain(Domainname, Dirname)
Definition: gettext.h:57
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
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
static int gettextinit
Wether or not gettext has been initialized for the library.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_init()

void GNUNET_OS_init ( const struct GNUNET_OS_ProjectData pd)

Setup OS subsystem with project data.

Parameters
pdproject data used to determine paths.
pdproject data used to determine paths

Definition at line 122 of file os_installation.c.

References bindtextdomain, buf, dir, removetrailingwhitespace::f, fn, gettextinit, GNUNET_asprintf(), GNUNET_assert, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_malloc, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_LOCALEDIR, GNUNET_snprintf(), GNUNET_strdup, len, GNUNET_OS_ProjectData::libname, line, LOG_STRERROR_FILE, p, GNUNET_OS_ProjectData::project_dirname, size, and zero.

123 {
124  if (0 == gettextinit)
125  {
127  if (NULL != path)
128  bindtextdomain(PACKAGE, path);
129  GNUNET_free(path);
130  gettextinit = 1;
131  }
132  GNUNET_assert(NULL != pd);
133  current_pd = pd;
134 }
Return the directory where translations are installed (share/locale/)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define bindtextdomain(Domainname, Dirname)
Definition: gettext.h:57
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
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
static int gettextinit
Wether or not gettext has been initialized for the library.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ GNUNET_OS_installation_get_path()

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.

Parameters
dirkindwhat kind of directory is desired?
Returns
a pointer to the dir path (to be freed by the caller)

Get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX, the current running apps installation directory.

Returns
a pointer to the dir path (to be freed by the caller)

Definition at line 439 of file os_installation.c.

References DIR_SEPARATOR, DIR_SEPARATOR_STR, GNUNET_asprintf(), GNUNET_DISK_directory_test(), GNUNET_free, GNUNET_free_non_null, GNUNET_OS_IPK_BINDIR, GNUNET_OS_IPK_DATADIR, GNUNET_OS_IPK_DOCDIR, GNUNET_OS_IPK_ICONDIR, GNUNET_OS_IPK_LIBDIR, GNUNET_OS_IPK_LIBEXECDIR, GNUNET_OS_IPK_LOCALEDIR, GNUNET_OS_IPK_PREFIX, GNUNET_OS_IPK_SELF_PREFIX, GNUNET_strdup, GNUNET_YES, os_get_exec_path(), os_get_gnunet_path(), and GNUNET_OS_ProjectData::project_dirname.

Referenced by GNUNET_CONFIGURATION_load(), GNUNET_OS_get_libexec_binary_path(), GNUNET_OS_init(), GNUNET_OS_project_data_get(), GNUNET_PLUGIN_load_all(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_run_(), hostkeys_load(), load_keys(), plugin_init(), and run().

440 {
441  size_t n;
442  char *dirname;
443  char *execpath = NULL;
444  char *tmp;
445  char *multiarch;
446  char *libdir;
447  int isbasedir;
448 
449  /* if wanted, try to get the current app's bin/ */
450  if (dirkind == GNUNET_OS_IPK_SELF_PREFIX)
451  execpath = os_get_exec_path();
452 
453  /* try to get GNUnet's bin/ or lib/, or if previous was unsuccessful some
454  * guess for the current app */
455  if (NULL == execpath)
456  execpath = os_get_gnunet_path();
457 
458  if (NULL == execpath)
459  return NULL;
460 
461  n = strlen(execpath);
462  if (0 == n)
463  {
464  /* should never happen, but better safe than sorry */
465  GNUNET_free(execpath);
466  return NULL;
467  }
468  /* remove filename itself */
469  while ((n > 1) && (DIR_SEPARATOR == execpath[n - 1]))
470  execpath[--n] = '\0';
471 
472  isbasedir = 1;
473  if ((n > 6) && ((0 == strcasecmp(&execpath[n - 6], "/lib32")) ||
474  (0 == strcasecmp(&execpath[n - 6], "/lib64"))))
475  {
476  if ((GNUNET_OS_IPK_LIBDIR != dirkind) &&
477  (GNUNET_OS_IPK_LIBEXECDIR != dirkind))
478  {
479  /* strip '/lib32' or '/lib64' */
480  execpath[n - 6] = '\0';
481  n -= 6;
482  }
483  else
484  isbasedir = 0;
485  }
486  else if ((n > 4) && ((0 == strcasecmp(&execpath[n - 4], "/bin")) ||
487  (0 == strcasecmp(&execpath[n - 4], "/lib"))))
488  {
489  /* strip '/bin' or '/lib' */
490  execpath[n - 4] = '\0';
491  n -= 4;
492  }
493  multiarch = NULL;
494  if (NULL != (libdir = strstr(execpath, "/lib/")))
495  {
496  /* test for multi-arch path of the form "PREFIX/lib/MULTIARCH/";
497  here we need to re-add 'multiarch' to lib and libexec paths later! */
498  multiarch = &libdir[5];
499  if (NULL == strchr(multiarch, '/'))
500  libdir[0] =
501  '\0'; /* Debian multiarch format, cut of from 'execpath' but preserve in multicarch */
502  else
503  multiarch =
504  NULL; /* maybe not, multiarch still has a '/', which is not OK */
505  }
506  /* in case this was a directory named foo-bin, remove "foo-" */
507  while ((n > 1) && (execpath[n - 1] == DIR_SEPARATOR))
508  execpath[--n] = '\0';
509  switch (dirkind)
510  {
513  dirname = GNUNET_strdup(DIR_SEPARATOR_STR);
514  break;
515 
518  break;
519 
521  if (isbasedir)
522  {
523  GNUNET_asprintf(&tmp,
524  "%s%s%s%s%s%s%s",
525  execpath,
526  DIR_SEPARATOR_STR "lib",
527  (NULL != multiarch) ? DIR_SEPARATOR_STR : "",
528  (NULL != multiarch) ? multiarch : "",
529  DIR_SEPARATOR_STR,
531  DIR_SEPARATOR_STR);
533  {
534  GNUNET_free(execpath);
535  return tmp;
536  }
537  GNUNET_free(tmp);
538  tmp = NULL;
539  dirname = NULL;
540  if (4 == sizeof(void *))
541  {
542  GNUNET_asprintf(&dirname,
543  DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR
544  "%s" DIR_SEPARATOR_STR,
546  GNUNET_asprintf(&tmp, "%s%s", execpath, dirname);
547  }
548  if (8 == sizeof(void *))
549  {
550  GNUNET_asprintf(&dirname,
551  DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR
552  "%s" DIR_SEPARATOR_STR,
554  GNUNET_asprintf(&tmp, "%s%s", execpath, dirname);
555  }
556 
557  if ((NULL != tmp) &&
559  {
560  GNUNET_free(execpath);
561  GNUNET_free_non_null(dirname);
562  return tmp;
563  }
564  GNUNET_free(tmp);
565  GNUNET_free_non_null(dirname);
566  }
567  GNUNET_asprintf(&dirname,
568  DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR,
570  break;
571 
573  GNUNET_asprintf(&dirname,
574  DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR
575  "%s" DIR_SEPARATOR_STR,
577  break;
578 
580  dirname = GNUNET_strdup(DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR
581  "locale" DIR_SEPARATOR_STR);
582  break;
583 
585  dirname = GNUNET_strdup(DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR
586  "icons" DIR_SEPARATOR_STR);
587  break;
588 
590  GNUNET_asprintf(&dirname,
591  DIR_SEPARATOR_STR "share" DIR_SEPARATOR_STR
592  "doc" DIR_SEPARATOR_STR
593  "%s" DIR_SEPARATOR_STR,
595  break;
596 
598  if (isbasedir)
599  {
600  GNUNET_asprintf(&dirname,
601  DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR
602  "libexec" DIR_SEPARATOR_STR,
604  GNUNET_asprintf(&tmp,
605  "%s%s%s%s",
606  execpath,
607  DIR_SEPARATOR_STR "lib" DIR_SEPARATOR_STR,
608  (NULL != multiarch) ? multiarch : "",
609  dirname);
611  {
612  GNUNET_free(execpath);
613  GNUNET_free(dirname);
614  return tmp;
615  }
616  GNUNET_free(tmp);
617  tmp = NULL;
618  dirname = NULL;
619  if (4 == sizeof(void *))
620  {
621  GNUNET_asprintf(&dirname,
622  DIR_SEPARATOR_STR "lib32" DIR_SEPARATOR_STR
623  "%s" DIR_SEPARATOR_STR
624  "libexec" DIR_SEPARATOR_STR,
626  GNUNET_asprintf(&tmp, "%s%s", execpath, dirname);
627  }
628  if (8 == sizeof(void *))
629  {
630  GNUNET_asprintf(&dirname,
631  DIR_SEPARATOR_STR "lib64" DIR_SEPARATOR_STR
632  "%s" DIR_SEPARATOR_STR
633  "libexec" DIR_SEPARATOR_STR,
635  GNUNET_asprintf(&tmp, "%s%s", execpath, dirname);
636  }
637  if ((NULL != tmp) &&
639  {
640  GNUNET_free(execpath);
641  GNUNET_free_non_null(dirname);
642  return tmp;
643  }
644  GNUNET_free(tmp);
645  GNUNET_free_non_null(dirname);
646  }
647  GNUNET_asprintf(&dirname,
648  DIR_SEPARATOR_STR "%s" DIR_SEPARATOR_STR
649  "libexec" DIR_SEPARATOR_STR,
651  break;
652 
653  default:
654  GNUNET_free(execpath);
655  return NULL;
656  }
657  GNUNET_asprintf(&tmp, "%s%s", execpath, dirname);
658  GNUNET_free(dirname);
659  GNUNET_free(execpath);
660  return tmp;
661 }
Return the directory where translations are installed (share/locale/)
Return the directory where libraries are installed.
const char * project_dirname
Name of the project that is used in the "libexec" prefix, For example, "gnunet".
static char * os_get_gnunet_path()
get the path to GNUnet bin/ or lib/, prefering the lib/ path
int GNUNET_DISK_directory_test(const char *fil, int is_readable)
Test if fil is a directory and listable.
Definition: disk.c:500
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Return the "PREFIX" directory given to configure.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
Return the prefix of the path with documentation files, including the license (share/doc/gnunet/).
#define DIR_SEPARATOR_STR
Definition: platform.h:168
Return the directory where helper binaries are installed (lib/gnunet/libexec/)
#define DIR_SEPARATOR
Definition: platform.h:167
static char * os_get_exec_path()
get the path to current app's bin/
static const struct GNUNET_OS_ProjectData * current_pd
Which project data do we currently use for installation path detection? Never NULL.
Return the installation directory of this application, not the one of the overall GNUnet installation...
Return the directory where the program binaries are installed.
#define GNUNET_YES
Definition: gnunet_common.h:77
Return the prefix of the path with application icons (share/icons/).
Return the directory where data is installed (share/gnunet/)
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_get_libexec_binary_path()

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.

Parameters
prognamename of the binary
Returns
full path to the binary, if possible, otherwise copy of 'progname'

Definition at line 673 of file os_installation.c.

References cache, DIR_SEPARATOR, GNUNET_asprintf(), GNUNET_NO, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_LIBEXECDIR, GNUNET_strdup, GNUNET_STRINGS_path_is_absolute(), and GNUNET_YES.

Referenced by communicator_start(), GNUNET_HELPER_start(), GNUNET_OS_get_suid_binary_path(), GNUNET_TESTBED_controller_start(), GNUNET_TESTBED_is_host_habitable(), GNUNET_TESTING_peer_configure(), GNUNET_TESTING_service_run(), LIBGNUNET_PLUGIN_TRANSPORT_INIT(), run(), start_arm_service(), start_process(), start_shared_service_instance(), test_icmp_client(), test_icmp_server(), and tokenizer_cb().

674 {
675  static char *cache;
676  char *libexecdir;
677  char *binary;
678 
679  if ((DIR_SEPARATOR == progname[0]) ||
680  (GNUNET_YES ==
681  GNUNET_STRINGS_path_is_absolute(progname, GNUNET_NO, NULL, NULL)))
682  return GNUNET_strdup(progname);
683  if (NULL != cache)
684  libexecdir = cache;
685  else
687  if (NULL == libexecdir)
688  return GNUNET_strdup(progname);
689  GNUNET_asprintf(&binary, "%s%s", libexecdir, progname);
690  cache = libexecdir;
691  return binary;
692 }
int GNUNET_STRINGS_path_is_absolute(const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
Check whether filename is absolute or not, and if it's an URI.
Definition: strings.c:1109
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
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
Return the directory where helper binaries are installed (lib/gnunet/libexec/)
#define DIR_SEPARATOR
Definition: platform.h:167
static struct GNUNET_CONTAINER_MultiHashMap32 * cache
Hashmap to maintain cache.
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_get_suid_binary_path()

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.

If that option is not present, fall back to GNUNET_OS_get_libexec_binary_path. If progname is an absolute path, a copy of this path is returned.

Parameters
cfgconfiguration to inspect
prognamename of the binary
Returns
full path to the binary, if possible, a copy of progname otherwise

Definition at line 708 of file os_installation.c.

References cache, DIR_SEPARATOR, DIR_SEPARATOR_STR, GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_NO, GNUNET_OS_get_libexec_binary_path(), GNUNET_strdup, GNUNET_STRINGS_path_is_absolute(), and GNUNET_YES.

Referenced by GN_request_connection_reversal(), restart_nat_server(), and run().

710 {
711  static char *cache;
712  char *binary = NULL;
713  char *path = NULL;
714  size_t path_len;
715 
716  if (GNUNET_YES ==
717  GNUNET_STRINGS_path_is_absolute(progname, GNUNET_NO, NULL, NULL))
718  {
719  return GNUNET_strdup(progname);
720  }
721  if (NULL != cache)
722  path = cache;
723  else
725  "PATHS",
726  "SUID_BINARY_PATH",
727  &path);
728  if ((NULL == path) || (0 == strlen(path)))
729  return GNUNET_OS_get_libexec_binary_path(progname);
730  path_len = strlen(path);
731  GNUNET_asprintf(&binary,
732  "%s%s%s",
733  path,
734  (path[path_len - 1] == DIR_SEPARATOR) ? ""
736  progname);
737  cache = path;
738  return binary;
739 }
int GNUNET_STRINGS_path_is_absolute(const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
Check whether filename is absolute or not, and if it's an URI.
Definition: strings.c:1109
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
#define DIR_SEPARATOR_STR
Definition: platform.h:168
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
#define DIR_SEPARATOR
Definition: platform.h:167
static struct GNUNET_CONTAINER_MultiHashMap32 * cache
Hashmap to maintain cache.
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 ...
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_network_interfaces_list()

void GNUNET_OS_network_interfaces_list ( GNUNET_OS_NetworkInterfaceProcessor  proc,
void *  proc_cls 
)

Enumerate all network interfaces.

Parameters
procthe callback function
proc_clsclosure for proc

Definition at line 388 of file os_network.c.

References GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_WARNING, GNUNET_OK, LOG, try_ifconfig(), and try_ip().

Referenced by do_broadcast(), get_addresses(), GNUNET_NT_scanner_init(), host_habitable_cb(), run_scan(), setup_broadcast(), and test_local_ip().

390 {
391 #if HAVE_GETIFADDRS && HAVE_FREEIFADDRS
392  struct ifaddrs *ifa_first;
393  struct ifaddrs *ifa_ptr;
394  socklen_t alen;
395 
396  if (getifaddrs(&ifa_first) == 0)
397  {
398  for (ifa_ptr = ifa_first; ifa_ptr != NULL; ifa_ptr = ifa_ptr->ifa_next)
399  {
400  if (ifa_ptr->ifa_name != NULL && ifa_ptr->ifa_addr != NULL &&
401  (ifa_ptr->ifa_flags & IFF_UP) != 0)
402  {
403  if ((ifa_ptr->ifa_addr->sa_family != AF_INET) &&
404  (ifa_ptr->ifa_addr->sa_family != AF_INET6))
405  continue;
406  if (ifa_ptr->ifa_addr->sa_family == AF_INET)
407  alen = sizeof(struct sockaddr_in);
408  else
409  alen = sizeof(struct sockaddr_in6);
410  if (GNUNET_OK !=
411  proc(proc_cls, ifa_ptr->ifa_name,
412  0 == strcmp(ifa_ptr->ifa_name, GNUNET_DEFAULT_INTERFACE),
413  ifa_ptr->ifa_addr, ifa_ptr->ifa_broadaddr,
414  ifa_ptr->ifa_netmask, alen))
415  break;
416  }
417  }
418  freeifaddrs(ifa_first);
419  }
420 #else
421  if (GNUNET_OK ==
422  try_ip(proc,
423  proc_cls))
424  return;
425  if (GNUNET_OK ==
426  try_ifconfig(proc,
427  proc_cls))
428  return;
430  "Failed to enumerate network interfaces\n");
431 #endif
432 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define LOG(kind,...)
Definition: os_network.c:34
static int try_ip(GNUNET_OS_NetworkInterfaceProcessor proc, void *proc_cls)
Try to enumerate all network interfaces using 'ip'.
Definition: os_network.c:238
static int try_ifconfig(GNUNET_OS_NetworkInterfaceProcessor proc, void *proc_cls)
Try to enumerate all network interfaces using 'ifconfig'.
Definition: os_network.c:47
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_process_current()

struct GNUNET_OS_Process* GNUNET_OS_process_current ( void  )

Get process structure for current process.

The pointer it returns points to static memory location and must not be deallocated/closed

Returns
pointer to the process sturcutre for this process

The pointer it returns points to static memory location and must not be deallocated/closed.

Returns
pointer to the process sturcutre for this process

Definition at line 209 of file os_priority.c.

References current_process, and GNUNET_OS_Process::pid.

210 {
211  current_process.pid = 0;
212  return &current_process;
213 }
pid_t pid
PID of the process.
Definition: os_priority.c:47
static struct GNUNET_OS_Process current_process
Handle for 'this' process.
Definition: os_priority.c:61

◆ GNUNET_OS_process_kill()

int GNUNET_OS_process_kill ( struct GNUNET_OS_Process proc,
int  sig 
)

Sends a signal to the process.

Parameters
procpointer to process structure
sigsignal
Returns
0 on success, -1 on error

Definition at line 224 of file os_priority.c.

References GNUNET_OS_Process::control_pipe, GNUNET_DISK_file_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_TERM_SIG, LOG, GNUNET_OS_Process::pid, and ret.

Referenced by do_stop_task(), GN_stop_gnunet_nat_server_(), GNUNET_HELPER_kill(), GNUNET_NAT_mini_get_external_ipv4_cancel_(), GNUNET_OS_command_stop(), GNUNET_TESTBED_is_host_habitable_cancel(), GNUNET_TESTING_peer_kill(), handle_stop(), maint_child_death(), nat_server_read(), shutdown_communicator(), shutdown_task(), stop_shared_service_instance(), and terminate_task().

225 {
226  int ret;
227  char csig;
228 
229  csig = (char)sig;
230  if (NULL != proc->control_pipe)
231  {
233  "Sending signal %d to pid: %u via pipe\n",
234  sig,
235  proc->pid);
236  ret = GNUNET_DISK_file_write(proc->control_pipe, &csig, sizeof(csig));
237  if (sizeof(csig) == ret)
238  return 0;
239  }
240  /* pipe failed or non-existent, try other methods */
241  switch (sig)
242  {
243  case SIGHUP:
244  case SIGINT:
245  case SIGKILL:
246  case SIGTERM:
247 #if (SIGTERM != GNUNET_TERM_SIG)
248  case GNUNET_TERM_SIG:
249 #endif
251  "Sending signal %d to pid: %u via system call\n",
252  sig,
253  proc->pid);
254  return kill(proc->pid, sig);
255  default:
257  "Sending signal %d to pid: %u via system call\n",
258  sig,
259  proc->pid);
260  return kill(proc->pid, sig);
261  }
262 }
pid_t pid
PID of the process.
Definition: os_priority.c:47
static int ret
Final status code.
Definition: gnunet-arm.c:89
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:817
struct GNUNET_DISK_FileHandle * control_pipe
Pipe we use to signal the process.
Definition: os_priority.c:54
#define GNUNET_TERM_SIG
The termination signal.
Definition: platform.h:242
#define LOG(kind,...)
Definition: os_priority.c:32
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_process_destroy()

void GNUNET_OS_process_destroy ( struct GNUNET_OS_Process proc)

Cleans up process structure contents (OS-dependent) and deallocates it.

Parameters
procpointer to process structure

Definition at line 286 of file os_priority.c.

References GNUNET_OS_Process::control_pipe, GNUNET_DISK_file_close(), and GNUNET_free.

Referenced by child_death_task(), GN_request_connection_reversal(), GN_stop_gnunet_nat_server_(), GNUNET_HELPER_wait(), GNUNET_NAT_mini_get_external_ipv4_cancel_(), GNUNET_OS_command_stop(), GNUNET_TESTBED_is_host_habitable_cancel(), GNUNET_TESTING_peer_wait(), habitability_check(), maint_child_death(), nat_server_read(), server_log(), shutdown_communicator(), shutdown_task(), start_arm_service(), and stop_shared_service_instance().

287 {
288  if (NULL != proc->control_pipe)
290 
291  GNUNET_free(proc);
292 }
int GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1339
struct GNUNET_DISK_FileHandle * control_pipe
Pipe we use to signal the process.
Definition: os_priority.c:54
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_process_get_pid()

pid_t GNUNET_OS_process_get_pid ( struct GNUNET_OS_Process proc)

Get the pid of the process in question.

Parameters
procthe process to get the pid of
Returns
the current process id

Definition at line 273 of file os_priority.c.

References GNUNET_OS_Process::pid.

Referenced by maint_child_death().

274 {
275  return proc->pid;
276 }
pid_t pid
PID of the process.
Definition: os_priority.c:47
Here is the caller graph for this function:

◆ GNUNET_OS_start_process_vap()

struct GNUNET_OS_Process* GNUNET_OS_start_process_vap ( int  pipe_control,
enum GNUNET_OS_InheritStdioFlags  std_inheritance,
struct GNUNET_DISK_PipeHandle pipe_stdin,
struct GNUNET_DISK_PipeHandle pipe_stdout,
struct GNUNET_DISK_PipeHandle pipe_stderr,
const char *  filename,
char *const  argv[] 
)

Start a process.

Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
pipe_stderrpipe to use to get error output from child process (or NULL)
filenamename of the binary
argvNULL-terminated array of arguments to the process
Returns
pointer to process structure of the new process, NULL on error
Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
pipe_stderrpipe to use to get output from child process (or NULL)
filenamename of the binary
argvNULL-terminated array of arguments to the process
Returns
pointer to process structure of the new process, NULL on error

Definition at line 607 of file os_priority.c.

References start_process().

Referenced by GNUNET_OS_start_process_va(), GNUNET_TESTBED_is_host_habitable(), main(), run(), start_helper(), and work().

614 {
615  return start_process(pipe_control,
616  std_inheritance,
617  pipe_stdin,
618  pipe_stdout,
619  pipe_stderr,
620  NULL,
621  filename,
622  argv);
623 }
static char * filename
static struct GNUNET_OS_Process * start_process(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const SOCKTYPE *lsocks, const char *filename, char *const argv[])
Start a process.
Definition: os_priority.c:344
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_start_process()

struct GNUNET_OS_Process* GNUNET_OS_start_process ( int  pipe_control,
enum GNUNET_OS_InheritStdioFlags  std_inheritance,
struct GNUNET_DISK_PipeHandle pipe_stdin,
struct GNUNET_DISK_PipeHandle pipe_stdout,
struct GNUNET_DISK_PipeHandle pipe_stderr,
const char *  filename,
  ... 
)

Start a process.

Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
pipe_stderrpipe to use to get error output from child process (or NULL)
filenamename of the binary
...NULL-terminated list of arguments to the process
Returns
pointer to process structure of the new process, NULL on error
Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
filenamename of the binary
...NULL-terminated list of arguments to the process
Returns
pointer to process structure of the new process, NULL on error

Definition at line 687 of file os_priority.c.

References GNUNET_OS_start_process_va(), and ret.

Referenced by communicator_start(), GN_request_connection_reversal(), GNUNET_NAT_mini_get_external_ipv4_(), gnunet_uri(), restart_nat_server(), run(), server_log(), start_shared_service_instance(), and tokenizer_cb().

694 {
695  struct GNUNET_OS_Process *ret;
696  va_list ap;
697 
698  va_start(ap, filename);
699  ret = GNUNET_OS_start_process_va(pipe_control,
700  std_inheritance,
701  pipe_stdin,
702  pipe_stdout,
703  pipe_stderr,
704  filename,
705  ap);
706  va_end(ap);
707  return ret;
708 }
struct GNUNET_OS_Process * GNUNET_OS_start_process_va(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, va_list va)
Start a process.
Definition: os_priority.c:639
static int ret
Final status code.
Definition: gnunet-arm.c:89
static char * filename
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_start_process_va()

struct GNUNET_OS_Process* GNUNET_OS_start_process_va ( int  pipe_control,
enum GNUNET_OS_InheritStdioFlags  std_inheritance,
struct GNUNET_DISK_PipeHandle pipe_stdin,
struct GNUNET_DISK_PipeHandle pipe_stdout,
struct GNUNET_DISK_PipeHandle pipe_stderr,
const char *  filename,
va_list  va 
)

Start a process.

Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
pipe_stderrpipe to use to get error output from child process (or NULL)
filenamename of the binary
vaNULL-terminated list of arguments to the process
Returns
pointer to process structure of the new process, NULL on error
Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
pipe_stdinpipe to use to send input to child process (or NULL)
pipe_stdoutpipe to use to get output from child process (or NULL)
pipe_stderrpipe to use to get output from child process (or NULL)
filenamename of the binary
vaNULL-terminated list of arguments to the process
Returns
pointer to process structure of the new process, NULL on error

Definition at line 639 of file os_priority.c.

References GNUNET_free, GNUNET_malloc, GNUNET_OS_start_process_vap(), and ret.

Referenced by GNUNET_OS_command_run(), GNUNET_OS_start_process(), and run_process_and_wait().

646 {
647  struct GNUNET_OS_Process *ret;
648  va_list ap;
649  char **argv;
650  int argc;
651 
652  argc = 0;
653  va_copy(ap, va);
654  while (NULL != va_arg(ap, char *))
655  argc++;
656  va_end(ap);
657  argv = GNUNET_malloc(sizeof(char *) * (argc + 1));
658  argc = 0;
659  va_copy(ap, va);
660  while (NULL != (argv[argc] = va_arg(ap, char *)))
661  argc++;
662  va_end(ap);
663  ret = GNUNET_OS_start_process_vap(pipe_control,
664  std_inheritance,
665  pipe_stdin,
666  pipe_stdout,
667  pipe_stderr,
668  filename,
669  argv);
670  GNUNET_free(argv);
671  return ret;
672 }
static int ret
Final status code.
Definition: gnunet-arm.c:89
struct GNUNET_OS_Process * GNUNET_OS_start_process_vap(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, char *const argv[])
Start a process.
Definition: os_priority.c:607
static char * filename
#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:

◆ GNUNET_OS_start_process_v()

struct GNUNET_OS_Process* GNUNET_OS_start_process_v ( int  pipe_control,
enum GNUNET_OS_InheritStdioFlags  std_inheritance,
const SOCKTYPE lsocks,
const char *  filename,
char *const  argv[] 
)

Start a process.

Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
lsocksarray of listen sockets to dup systemd-style (or NULL); must be NULL on platforms where dup is not supported
filenamename of the binary
argvNULL-terminated list of arguments to the process, including the process name as the first argument
Returns
pointer to process structure of the new process, NULL on error
Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags controlling which std handles of the parent are inherited by the child. pipe_stdin and pipe_stdout take priority over std_inheritance (when they are non-NULL).
lsocksarray of listen sockets to dup systemd-style (or NULL); must be NULL on platforms where dup is not supported
filenamename of the binary
argvNULL-terminated list of arguments to the process
Returns
process ID of the new process, -1 on error

Definition at line 726 of file os_priority.c.

References start_process().

Referenced by GNUNET_OS_start_process_s().

731 {
732  return start_process(pipe_control,
733  std_inheritance,
734  NULL,
735  NULL,
736  NULL,
737  lsocks,
738  filename,
739  argv);
740 }
static char * filename
static struct GNUNET_OS_Process * start_process(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const SOCKTYPE *lsocks, const char *filename, char *const argv[])
Start a process.
Definition: os_priority.c:344
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_start_process_s()

struct GNUNET_OS_Process* GNUNET_OS_start_process_s ( int  pipe_control,
unsigned int  std_inheritance,
const SOCKTYPE lsocks,
const char *  filename,
  ... 
)

Start a process.

This function is similar to the GNUNET_OS_start_process_* except that the filename and arguments can have whole strings which contain the arguments. These arguments are to be separated by spaces and are parsed in the order they appear. Arguments containing spaces can be used by quoting them with ".

Parameters
pipe_controlshould a pipe be used to send signals to the child?
std_inheritancea set of GNUNET_OS_INHERIT_STD_* flags
lsocksarray of listen sockets to dup systemd-style (or NULL); must be NULL on platforms where dup is not supported
filenamename of the binary. It is valid to have the arguments in this string when they are separated by spaces.
...more arguments. Should be of type char *. It is valid to have the arguments in these strings when they are separated by spaces. The last argument MUST be NULL.
Returns
pointer to process structure of the new process, NULL on error

Definition at line 762 of file os_priority.c.

References find_typedefs::arg, filename, GNUNET_free, GNUNET_malloc, GNUNET_OS_start_process_v(), GNUNET_strdup, and len.

Referenced by GNUNET_TESTING_peer_start(), start_arm_service(), and start_process().

767 {
768  va_list ap;
769  char **argv;
770  unsigned int argv_size;
771  const char *arg;
772  const char *rpos;
773  char *pos;
774  char *cp;
775  const char *last;
776  struct GNUNET_OS_Process *proc;
777  char *binary_path;
778  int quote_on;
779  unsigned int i;
780  size_t len;
781 
782  argv_size = 1;
783  va_start(ap, filename);
784  arg = filename;
785  last = NULL;
786  do
787  {
788  rpos = arg;
789  quote_on = 0;
790  while ('\0' != *rpos)
791  {
792  if ('"' == *rpos)
793  {
794  if (1 == quote_on)
795  quote_on = 0;
796  else
797  quote_on = 1;
798  }
799  if ((' ' == *rpos) && (0 == quote_on))
800  {
801  if (NULL != last)
802  argv_size++;
803  last = NULL;
804  rpos++;
805  while (' ' == *rpos)
806  rpos++;
807  }
808  if ((NULL == last) && ('\0' != *rpos)) // FIXME: == or !=?
809  last = rpos;
810  if ('\0' != *rpos)
811  rpos++;
812  }
813  if (NULL != last)
814  argv_size++;
815  }
816  while (NULL != (arg = (va_arg(ap, const char *))));
817  va_end(ap);
818 
819  argv = GNUNET_malloc(argv_size * sizeof(char *));
820  argv_size = 0;
821  va_start(ap, filename);
822  arg = filename;
823  last = NULL;
824  do
825  {
826  cp = GNUNET_strdup(arg);
827  quote_on = 0;
828  pos = cp;
829  while ('\0' != *pos)
830  {
831  if ('"' == *pos)
832  {
833  if (1 == quote_on)
834  quote_on = 0;
835  else
836  quote_on = 1;
837  }
838  if ((' ' == *pos) && (0 == quote_on))
839  {
840  *pos = '\0';
841  if (NULL != last)
842  argv[argv_size++] = GNUNET_strdup(last);
843  last = NULL;
844  pos++;
845  while (' ' == *pos)
846  pos++;
847  }
848  if ((NULL == last) && ('\0' != *pos)) // FIXME: == or !=?
849  last = pos;
850  if ('\0' != *pos)
851  pos++;
852  }
853  if (NULL != last)
854  argv[argv_size++] = GNUNET_strdup(last);
855  last = NULL;
856  GNUNET_free(cp);
857  }
858  while (NULL != (arg = (va_arg(ap, const char *))));
859  va_end(ap);
860  argv[argv_size] = NULL;
861 
862  for (i = 0; i < argv_size; i++)
863  {
864  len = strlen(argv[i]);
865  if ((argv[i][0] == '"') && (argv[i][len - 1] == '"'))
866  {
867  memmove(&argv[i][0], &argv[i][1], len - 2);
868  argv[i][len - 2] = '\0';
869  }
870  }
871  binary_path = argv[0];
872  proc = GNUNET_OS_start_process_v(pipe_control,
873  std_inheritance,
874  lsocks,
875  binary_path,
876  argv);
877  while (argv_size > 0)
878  GNUNET_free(argv[--argv_size]);
879  GNUNET_free(argv);
880  return proc;
881 }
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
static char * filename
struct GNUNET_OS_Process * GNUNET_OS_start_process_v(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, const SOCKTYPE *lsocks, const char *filename, char *const argv[])
Start a process.
Definition: os_priority.c:726
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_command_stop()

void GNUNET_OS_command_stop ( struct GNUNET_OS_CommandHandle cmd)

Stop/kill a command.

Parameters
cmdhandle to the process

Must ONLY be called either from the callback after 'NULL' was passed for 'line' OR from an independent task (not within the line processor).

Parameters
cmdhandle to the process

Definition at line 1075 of file os_priority.c.

References GNUNET_OS_CommandHandle::eip, GNUNET_assert, GNUNET_break, GNUNET_DISK_pipe_close(), GNUNET_free, GNUNET_OK, GNUNET_OS_process_destroy(), GNUNET_OS_process_kill(), GNUNET_OS_process_wait(), GNUNET_SCHEDULER_cancel(), GNUNET_OS_CommandHandle::opipe, GNUNET_OS_CommandHandle::proc, and GNUNET_OS_CommandHandle::rtask.

Referenced by do_refresh(), GNUNET_NAT_mini_map_stop(), process_map_output(), process_refresh_output(), and process_unmap_output().

1076 {
1077  if (NULL != cmd->proc)
1078  {
1079  GNUNET_assert(NULL != cmd->rtask);
1081  }
1082  (void)GNUNET_OS_process_kill(cmd->eip, SIGKILL);
1086  GNUNET_free(cmd);
1087 }
void GNUNET_OS_process_destroy(struct GNUNET_OS_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
Definition: os_priority.c:286
struct GNUNET_DISK_PipeHandle * opipe
Handle to the output pipe.
Definition: os_priority.c:1028
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_OS_Process * eip
Process handle.
Definition: os_priority.c:1023
struct GNUNET_SCHEDULER_Task * rtask
Task reading from pipe.
Definition: os_priority.c:1053
int GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
Definition: disk.c:1706
int GNUNET_OS_process_wait(struct GNUNET_OS_Process *proc)
Wait for a process to terminate.
Definition: os_priority.c:1000
GNUNET_OS_LineProcessor proc
Function to call on each line of output.
Definition: os_priority.c:1038
#define GNUNET_free(ptr)
Wrapper around free.
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
Definition: os_priority.c:224
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_command_run()

struct GNUNET_OS_CommandHandle* GNUNET_OS_command_run ( GNUNET_OS_LineProcessor  proc,
void *  proc_cls,
struct GNUNET_TIME_Relative  timeout,
const char *  binary,
  ... 
)

Run the given command line and call the given function for each line of the output.

Parameters
procfunction to call for each line of the output
proc_clsclosure for proc
timeoutwhen to time out
binarycommand to run
...arguments to command
Returns
NULL on error
Parameters
procfunction to call for each line of the output
proc_clsclosure for proc
timeoutwhen to time out
binarycommand to run
...arguments to command
Returns
NULL on error

Definition at line 1160 of file os_priority.c.

References cmd_read(), GNUNET_OS_CommandHandle::eip, GNUNET_DISK_pipe(), GNUNET_DISK_pipe_close(), GNUNET_DISK_pipe_close_end(), GNUNET_DISK_PIPE_END_READ, GNUNET_DISK_PIPE_END_WRITE, GNUNET_DISK_pipe_handle(), GNUNET_new, GNUNET_NO, GNUNET_OS_start_process_va(), GNUNET_SCHEDULER_add_read_file(), GNUNET_TIME_relative_to_absolute(), GNUNET_YES, GNUNET_OS_CommandHandle::opipe, GNUNET_OS_CommandHandle::proc, GNUNET_OS_CommandHandle::proc_cls, GNUNET_OS_CommandHandle::r, GNUNET_OS_CommandHandle::rtask, and GNUNET_OS_CommandHandle::timeout.

Referenced by do_refresh(), GNUNET_NAT_mini_map_stop(), and run_upnpc_r().

1165 {
1166  struct GNUNET_OS_CommandHandle *cmd;
1167  struct GNUNET_OS_Process *eip;
1168  struct GNUNET_DISK_PipeHandle *opipe;
1169  va_list ap;
1170 
1172  if (NULL == opipe)
1173  return NULL;
1174  va_start(ap, binary);
1175  /* redirect stdout, don't inherit stderr/stdin */
1176  eip =
1177  GNUNET_OS_start_process_va(GNUNET_NO, 0, NULL, opipe, NULL, binary, ap);
1178  va_end(ap);
1179  if (NULL == eip)
1180  {
1181  GNUNET_DISK_pipe_close(opipe);
1182  return NULL;
1183  }
1185  cmd = GNUNET_new(struct GNUNET_OS_CommandHandle);
1186  cmd->timeout = GNUNET_TIME_relative_to_absolute(timeout);
1187  cmd->eip = eip;
1188  cmd->opipe = opipe;
1189  cmd->proc = proc;
1190  cmd->proc_cls = proc_cls;
1192  cmd->rtask = GNUNET_SCHEDULER_add_read_file(timeout, cmd->r, &cmd_read, cmd);
1193  return cmd;
1194 }
const struct GNUNET_DISK_FileHandle * r
Read-end of output pipe.
Definition: os_priority.c:1033
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
struct GNUNET_DISK_PipeHandle * opipe
Handle to the output pipe.
Definition: os_priority.c:1028
#define GNUNET_NO
Definition: gnunet_common.h:78
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1615
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_OS_Process * GNUNET_OS_start_process_va(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, va_list va)
Start a process.
Definition: os_priority.c:639
struct GNUNET_TIME_Absolute timeout
When to time out.
Definition: os_priority.c:1058
void * proc_cls
Closure for proc.
Definition: os_priority.c:1043
const struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_handle(const struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd n)
Get the handle to a particular pipe end.
Definition: disk.c:1744
struct GNUNET_OS_Process * eip
Process handle.
Definition: os_priority.c:1023
static void cmd_read(void *cls)
Read from the process and call the line processor.
Definition: os_priority.c:1096
The writing-end of a pipe.
The reading-end of a pipe.
struct GNUNET_DISK_PipeHandle * GNUNET_DISK_pipe(int blocking_read, int blocking_write, int inherit_read, int inherit_write)
Creates an interprocess channel.
Definition: disk.c:1518
struct GNUNET_SCHEDULER_Task * rtask
Task reading from pipe.
Definition: os_priority.c:1053
int GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
Definition: disk.c:1706
int GNUNET_DISK_pipe_close_end(struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd end)
Closes one half of an interprocess channel.
Definition: disk.c:1635
Handle to a command.
Definition: os_priority.c:1019
GNUNET_OS_LineProcessor proc
Function to call on each line of output.
Definition: os_priority.c:1038
#define GNUNET_YES
Definition: gnunet_common.h:77
Handle used to manage a pipe.
Definition: disk.c:68
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_process_status()

int GNUNET_OS_process_status ( struct GNUNET_OS_Process proc,
enum GNUNET_OS_ProcessStatusType type,
unsigned long *  code 
)

Retrieve the status of a process, waiting on it if dead.

Nonblocking version.

Parameters
procpointer to process structure
typestatus type
codereturn code/signal number
Returns
GNUNET_OK on success, GNUNET_NO if the process is still running, GNUNET_SYSERR otherwise

Nonblocking version.

Parameters
procprocess ID
typestatus type
codereturn code/signal number
Returns
GNUNET_OK on success, GNUNET_NO if the process is still running, GNUNET_SYSERR otherwise

Definition at line 963 of file os_priority.c.

References process_status().

Referenced by child_death_task(), habitability_check(), main(), maint_child_death(), and run_process_and_wait().

966 {
967  return process_status(proc, type, code, WNOHANG);
968 }
static int process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code, int options)
Retrieve the status of a process, waiting on it if dead.
Definition: os_priority.c:895
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_process_wait()

int GNUNET_OS_process_wait ( struct GNUNET_OS_Process proc)

Wait for a process to terminate.

The return code is discarded. You must not use GNUNET_OS_process_status() on the same process after calling this function! This function is blocking and should thus only be used if the child process is known to have terminated or to terminate very soon.

Parameters
procpointer to process structure of the process to wait for
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

The return code is discarded. You must not use GNUNET_OS_process_status() on the same process after calling this function! This function is blocking and should thus only be used if the child process is known to have terminated or to terminate very soon.

Parameters
procpointer to process structure
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 1000 of file os_priority.c.

References GNUNET_ERROR_TYPE_WARNING, GNUNET_OK, GNUNET_SYSERR, LOG_STRERROR, GNUNET_OS_Process::pid, and ret.

Referenced by GN_request_connection_reversal(), GN_stop_gnunet_nat_server_(), GNUNET_HELPER_wait(), GNUNET_NAT_mini_get_external_ipv4_cancel_(), GNUNET_OS_command_stop(), GNUNET_TESTBED_is_host_habitable_cancel(), GNUNET_TESTING_peer_wait(), nat_server_read(), run_process_and_wait(), server_log(), shutdown_task(), and stop_shared_service_instance().

1001 {
1002  pid_t pid = proc->pid;
1003  pid_t ret;
1004 
1005  while ((pid != (ret = waitpid(pid, NULL, 0))) && (EINTR == errno))
1006  ;
1007  if (pid != ret)
1008  {
1010  return GNUNET_SYSERR;
1011  }
1012  return GNUNET_OK;
1013 }
#define LOG_STRERROR(kind, syscall)
Definition: os_priority.c:34
pid_t pid
PID of the process.
Definition: os_priority.c:47
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
Here is the caller graph for this function:

◆ GNUNET_OS_process_wait_status()

int GNUNET_OS_process_wait_status ( struct GNUNET_OS_Process proc,
enum GNUNET_OS_ProcessStatusType type,
unsigned long *  code 
)

Retrieve the status of a process, waiting on it if dead.

Blocking version.

Parameters
procpointer to process structure
typestatus type
codereturn code/signal number
Returns
GNUNET_OK on success, GNUNET_NO if the process is still running, GNUNET_SYSERR otherwise

Definition at line 981 of file os_priority.c.

References process_status().

984 {
985  return process_status(proc, type, code, 0);
986 }
static int process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code, int options)
Retrieve the status of a process, waiting on it if dead.
Definition: os_priority.c:895
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Here is the call graph for this function:

◆ GNUNET_OS_install_parent_control_handler()

void GNUNET_OS_install_parent_control_handler ( void *  cls)

Connects this process to its parent via pipe; essentially, the parent control handler will read signal numbers from the GNUNET_OS_CONTROL_PIPE (as given in an environment variable) and raise those signals.

Parameters
clsclosure (unused)

Connects this process to its parent via pipe; essentially, the parent control handler will read signal numbers from the GNUNET_OS_CONTROL_PIPE (as given in an environment variable) and raise those signals.

Parameters
clsclosure (unused)

Definition at line 140 of file os_priority.c.

References GNUNET_OS_Process::control_pipe, getenv(), GNUNET_break, GNUNET_DISK_get_handle_from_int_fd(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_OS_CONTROL_PIPE, GNUNET_SCHEDULER_add_read_file(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_TIME_UNIT_FOREVER_REL, LOG, LOG_STRERROR_FILE, parent_control_handler(), and shutdown_pch().

Referenced by install_parent_control_handler().

141 {
142  const char *env_buf;
143  char *env_buf_end;
144  struct GNUNET_DISK_FileHandle *control_pipe;
145  uint64_t pipe_fd;
146 
147  (void)cls;
148  if (NULL != pch)
149  {
150  /* already done, we've been called twice... */
151  GNUNET_break(0);
152  return;
153  }
154  env_buf = getenv(GNUNET_OS_CONTROL_PIPE);
155  if ((NULL == env_buf) || (strlen(env_buf) <= 0))
156  {
158  "Not installing a handler because $%s is empty\n",
160  putenv(GNUNET_OS_CONTROL_PIPE "=");
161  return;
162  }
163  errno = 0;
164  pipe_fd = strtoull(env_buf, &env_buf_end, 16);
165  if ((0 != errno) || (env_buf == env_buf_end))
166  {
167  LOG_STRERROR_FILE(GNUNET_ERROR_TYPE_WARNING, "strtoull", env_buf);
168  putenv(GNUNET_OS_CONTROL_PIPE "=");
169  return;
170  }
171  if (pipe_fd >= FD_SETSIZE)
172  {
174  "GNUNET_OS_CONTROL_PIPE `%s' contains garbage?\n",
175  env_buf);
176  putenv(GNUNET_OS_CONTROL_PIPE "=");
177  return;
178  }
179 
180  control_pipe = GNUNET_DISK_get_handle_from_int_fd((int)pipe_fd);
181 
182  if (NULL == control_pipe)
183  {
185  putenv(GNUNET_OS_CONTROL_PIPE "=");
186  return;
187  }
189  "Adding parent control handler pipe `%s' to the scheduler\n",
190  env_buf);
192  control_pipe,
194  control_pipe);
196  putenv(GNUNET_OS_CONTROL_PIPE "=");
197 }
#define GNUNET_OS_CONTROL_PIPE
Definition: os_priority.c:40
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1284
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1615
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_SCHEDULER_Task * spch
Handle for the shutdown_pch() Task.
Definition: os_priority.c:71
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
char * getenv()
#define LOG_STRERROR_FILE(kind, syscall, filename)
Definition: os_priority.c:37
static struct GNUNET_SCHEDULER_Task * pch
Handle for the parent_control_handler() Task.
Definition: os_priority.c:66
struct GNUNET_DISK_FileHandle * GNUNET_DISK_get_handle_from_int_fd(int fno)
Get a handle from a native integer FD.
Definition: disk.c:1369
static void shutdown_pch(void *cls)
This handler is called on shutdown to remove the pch.
Definition: os_priority.c:80
static void parent_control_handler(void *cls)
This handler is called when there are control data to be read on the pipe.
Definition: os_priority.c:97
Handle used to access files (and pipes).
#define LOG(kind,...)
Definition: os_priority.c:32
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_OS_check_helper_binary()

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.

Attempts to find the file using the current PATH environment variable as a search path.

Parameters
binarythe name of the file to check. W32: must not have an .exe suffix.
check_suidinput true if the binary should be checked for SUID (*nix) W32: checks if the program has sufficient privileges by executing this binary with the -d flag. -d omits a programs main loop and only executes all privileged operations in an binary.
paramsparameters used for w32 privilege checking (can be NULL for != w32, or when not checking for suid/permissions )
Returns
GNUNET_YES if the file is SUID (*nix) or can be executed with current privileges (W32), GNUNET_NO if not SUID (but binary exists), GNUNET_SYSERR on error (no such binary or not executable)

Attempts to find the file using the current PATH environment variable as a search path.

Parameters
binarythe name of the file to check. W32: must not have an .exe suffix.
check_suidinput true if the binary should be checked for SUID (*nix) W32: checks if the program has sufficient privileges by executing this binary with the -d flag. -d omits a programs main loop and only executes all privileged operations in an binary.
paramsparameters used for w32 privilege checking (can be NULL for != w32 )
Returns
GNUNET_YES if the file is SUID (*nix) or can be executed with current privileges (W32), GNUNET_NO if not SUID (but binary exists), GNUNET_SYSERR on error (no such binary or not executable)

Definition at line 759 of file os_installation.c.

References _, get_path_from_PATH(), GNUNET_asprintf(), GNUNET_ERROR_TYPE_INFO, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_strdup, GNUNET_STRINGS_path_is_absolute(), GNUNET_SYSERR, GNUNET_YES, LOG, LOG_STRERROR_FILE, and p.

Referenced by GNUNET_NAT_mini_get_external_ipv4_(), GNUNET_NAT_mini_map_start(), handle_autoconfig_request(), LIBGNUNET_PLUGIN_TRANSPORT_INIT(), restart_nat_server(), run(), start_process(), test_icmp_client(), test_icmp_server(), and test_upnpc().

762 {
763  struct stat statbuf;
764  char *p;
765  char *pf;
766 
767  if ((GNUNET_YES ==
768  GNUNET_STRINGS_path_is_absolute(binary, GNUNET_NO, NULL, NULL)) ||
769  (0 == strncmp(binary, "./", 2)))
770  {
771  p = GNUNET_strdup(binary);
772  }
773  else
774  {
775  p = get_path_from_PATH(binary);
776  if (NULL != p)
777  {
778  GNUNET_asprintf(&pf, "%s/%s", p, binary);
779  GNUNET_free(p);
780  p = pf;
781  }
782  }
783 
784  if (NULL == p)
785  {
787  _("Could not find binary `%s' in PATH!\n"),
788  binary);
789  return GNUNET_SYSERR;
790  }
791  if (0 != access(p, X_OK))
792  {
794  GNUNET_free(p);
795  return GNUNET_SYSERR;
796  }
797 
798  if (0 == getuid())
799  {
800  /* as we run as root, we don't insist on SUID */
801  GNUNET_free(p);
802  return GNUNET_YES;
803  }
804 
805  if (0 != stat(p, &statbuf))
806  {
808  GNUNET_free(p);
809  return GNUNET_SYSERR;
810  }
811  if (check_suid)
812  {
813  (void)params;
814  if ((0 != (statbuf.st_mode & S_ISUID)) && (0 == statbuf.st_uid))
815  {
816  GNUNET_free(p);
817  return GNUNET_YES;
818  }
820  _("Binary `%s' exists, but is not SUID\n"),
821  p);
822  /* binary exists, but not SUID */
823  }
824  GNUNET_free(p);
825  return GNUNET_NO;
826 }
int GNUNET_STRINGS_path_is_absolute(const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
Check whether filename is absolute or not, and if it&#39;s an URI.
Definition: strings.c:1109
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
#define LOG(kind,...)
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define LOG_STRERROR_FILE(kind, syscall, filename)
static char * get_path_from_PATH(const char *binary)
Return the actual path to a file found in the current PATH environment variable.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function: