31#warning Please include config.h before dbus-sysdeps.h
41#ifdef HAVE_STDATOMIC_H
45#include <dbus/dbus-errors.h>
46#include <dbus/dbus-file.h>
47#include <dbus/dbus-string.h>
55#if !defined(BROKEN_POLL) && (defined(__APPLE__) || defined(__INTERIX))
95#include "dbus-sysdeps-wince-glue.h"
105#define _DBUS_PATH_SEPARATOR ";"
107#define _DBUS_PATH_SEPARATOR ":"
146#define DBUS_PID_UNSET ((dbus_pid_t) -1)
148#define DBUS_UID_UNSET ((dbus_uid_t) -1)
150#define DBUS_GID_UNSET ((dbus_gid_t) -1)
153#define DBUS_PID_FORMAT "%lu"
155#define DBUS_UID_FORMAT "%lu"
157#define DBUS_GID_FORMAT "%lu"
165# define DBUS_SOCKET_FORMAT "Iu"
166# define DBUS_SOCKET_INIT { INVALID_SOCKET }
168_DBUS_WARN_UNUSED_RESULT
170_dbus_socket_printable (
DBusSocket s) {
return s.sock; }
172_DBUS_WARN_UNUSED_RESULT
173static inline dbus_bool_t
174_dbus_socket_is_valid (
DBusSocket s) {
return s.sock != INVALID_SOCKET; }
177_dbus_socket_invalidate (
DBusSocket *s) { s->sock = INVALID_SOCKET; }
179_DBUS_WARN_UNUSED_RESULT
181_dbus_socket_get_int (
DBusSocket s) {
return (
int)s.sock; }
186# define DBUS_SOCKET_FORMAT "d"
187# define DBUS_SOCKET_INIT { -1 }
189_DBUS_WARN_UNUSED_RESULT
191_dbus_socket_printable (
DBusSocket s) {
return s.fd; }
193_DBUS_WARN_UNUSED_RESULT
194static inline dbus_bool_t
195_dbus_socket_is_valid (
DBusSocket s) {
return s.fd >= 0; }
198_dbus_socket_invalidate (
DBusSocket *s) { s->fd = -1; }
200_DBUS_WARN_UNUSED_RESULT
202_dbus_socket_get_int (
DBusSocket s) {
return s.fd; }
206_DBUS_WARN_UNUSED_RESULT
208_dbus_socket_get_invalid (
void)
242 unsigned int *n_fds);
244int _dbus_write_socket_with_unix_fds (
DBusSocket fd,
250int _dbus_write_socket_with_unix_fds_two (
DBusSocket fd,
264DBusSocket _dbus_connect_tcp_socket_with_nonce (
const char *host,
267 const char *noncefile,
273 const char **retfamily,
286 DBUS_CREDENTIALS_ADD_FLAGS_USER_DATABASE = (1 << 0),
287 DBUS_CREDENTIALS_ADD_FLAGS_NONE = 0
288} DBusCredentialsAddFlags;
292 DBusCredentialsAddFlags flags,
341#ifdef HAVE_STDATOMIC_H
343#elif defined(DBUS_WIN)
368# define DBUS_POLLABLE_FORMAT "Iu"
370static inline DBusPollable
371_dbus_socket_get_pollable (
DBusSocket s) {
return s; }
374_dbus_pollable_printable (DBusPollable p) {
return p.sock; }
376static inline dbus_bool_t
377_dbus_pollable_is_valid (DBusPollable p) {
return _dbus_socket_is_valid (p); }
380_dbus_pollable_invalidate (DBusPollable *p) { _dbus_socket_invalidate (p); }
382static inline dbus_bool_t
383_dbus_pollable_equals (DBusPollable a, DBusPollable b) {
return a.sock == b.sock; }
392typedef int DBusPollable;
393# define DBUS_POLLABLE_FORMAT "d"
395static inline DBusPollable
396_dbus_socket_get_pollable (
DBusSocket s) {
return s.fd; }
399_dbus_pollable_printable (DBusPollable p) {
return p; }
401static inline dbus_bool_t
402_dbus_pollable_is_valid (DBusPollable p) {
return p >= 0; }
405_dbus_pollable_invalidate (DBusPollable *p) { *p = -1; }
407static inline dbus_bool_t
408_dbus_pollable_equals (DBusPollable a, DBusPollable b) {
return a == b; }
412#if defined(HAVE_POLL) && !defined(BROKEN_POLL)
420#define _DBUS_POLLIN POLLIN
422#define _DBUS_POLLPRI POLLPRI
424#define _DBUS_POLLOUT POLLOUT
426#define _DBUS_POLLERR POLLERR
428#define _DBUS_POLLHUP POLLHUP
430#define _DBUS_POLLNVAL POLLNVAL
444#define _DBUS_POLLIN 0x0001
446#define _DBUS_POLLPRI 0x0002
448#define _DBUS_POLLOUT 0x0004
450#define _DBUS_POLLERR 0x0008
452#define _DBUS_POLLHUP 0x0010
454#define _DBUS_POLLNVAL 0x0020
460 int timeout_milliseconds);
522_DBUS_WARN_UNUSED_RESULT
539int _dbus_get_low_level_socket_errno (
void);
541int _dbus_save_socket_errno (
void);
542void _dbus_restore_socket_errno (
int saved_errno);
555void _dbus_exit (
int code) _DBUS_GNUC_NORETURN;
559 va_list args) _DBUS_GNUC_PRINTF (1, 0);
561#ifdef DBUS_ENABLE_VERBOSE_MODE
563void _dbus_print_thread (
void);
586 dbus_bool_t abstract,
589 dbus_bool_t abstract,
599 dbus_bool_t blocking,
608 dbus_bool_t keep_umask);
625 DBUS_LOG_FLAGS_STDERR = (1 << 0),
626 DBUS_LOG_FLAGS_SYSTEM_LOG = (1 << 1)
634 DBUS_SYSTEM_LOG_INFO,
635 DBUS_SYSTEM_LOG_WARNING,
636 DBUS_SYSTEM_LOG_SECURITY,
637 DBUS_SYSTEM_LOG_ERROR
638} DBusSystemLogSeverity;
641void _dbus_log (DBusSystemLogSeverity severity,
643 ...) _DBUS_GNUC_PRINTF (2, 3);
645void _dbus_logv (DBusSystemLogSeverity severity,
647 va_list args) _DBUS_GNUC_PRINTF (2, 0);
654#define _DBUS_DOUBLES_BITWISE_EQUAL(a, b) (memcmp (&(a), &(b), sizeof (double)) == 0)
672 dbus_bool_t create_if_not_found,
720#define DBUS_DEFAULT_MESSAGE_UNIX_FDS 16
722typedef struct DBusRLimit DBusRLimit;
724DBusRLimit *_dbus_rlimit_save_fd_limit (
DBusError *error);
725dbus_bool_t _dbus_rlimit_raise_fd_limit (
DBusError *error);
726dbus_bool_t _dbus_rlimit_restore_fd_limit (DBusRLimit *saved,
728void _dbus_rlimit_free (DBusRLimit *lim);
735dbus_bool_t _dbus_inet_sockaddr_to_string (
const void *sockaddr_pointer,
739 const char **family_name,
742void _dbus_set_error_with_inet_sockaddr (
DBusError *error,
743 const void *sockaddr_pointer,
745 const char *description,
747void _dbus_combine_tcp_errors (
DBusList **sources,
765#define _DBUS_MAX_SUN_PATH_LENGTH 99
773#include "dbus-sysdeps-win.h"
#define DBUS_BEGIN_DECLS
Macro used prior to declaring functions in the D-Bus header files.
#define DBUS_END_DECLS
Macro used after declaring functions in the D-Bus header files.
DBUS_PRIVATE_EXPORT void _dbus_logv(DBusSystemLogSeverity severity, const char *msg, va_list args)
Log a message to the system log file (e.g.
dbus_bool_t _dbus_stat(const DBusString *filename, DBusStat *statbuf, DBusError *error)
stat() wrapper.
DBUS_PRIVATE_EXPORT void _dbus_get_monotonic_time(dbus_int64_t *tv_sec, long *tv_usec)
Get current time, as in gettimeofday().
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_read_local_machine_uuid(DBusGUID *machine_id, dbus_bool_t create_if_not_found, DBusError *error)
Reads the uuid of the machine we're running on from the dbus configuration.
dbus_bool_t _dbus_get_standard_session_servicedirs(DBusList **dirs)
Returns the standard directories for a session bus to look for service activation files.
dbus_bool_t _dbus_get_is_errno_epipe(int e)
See if errno is EPIPE.
void _dbus_daemon_report_ready(void)
Report to a service manager that the daemon calling this function is ready for use.
dbus_bool_t _dbus_get_is_errno_etoomanyrefs(int e)
See if errno is ETOOMANYREFS.
dbus_bool_t _dbus_write_pid_to_file_and_pipe(const DBusString *pidfile, DBusPipe *print_pid_pipe, dbus_pid_t pid_to_write, DBusError *error)
Writes the given pid_to_write to a pidfile (if non-NULL) and/or to a pipe (if non-NULL).
void _dbus_directory_close(DBusDirIter *iter)
Closes a directory iteration.
unsigned long dbus_uid_t
A user ID.
dbus_bool_t _dbus_get_is_errno_eagain_or_ewouldblock(int e)
See if errno is EAGAIN or EWOULDBLOCK (this has to be done differently for Winsock so is abstracted)
_DBUS_WARN_UNUSED_RESULT dbus_bool_t _dbus_generate_random_bytes_buffer(char *buffer, int n_bytes, DBusError *error)
Random numbers.
unsigned long _dbus_pid_for_log(void)
The only reason this is separate from _dbus_getpid() is to allow it on Windows for logging but not fo...
dbus_bool_t _dbus_get_session_config_file(DBusString *str)
Get the absolute path of the session.conf file.
dbus_bool_t _dbus_clearenv(void)
Wrapper for clearenv().
unsigned long dbus_pid_t
A process ID.
DBUS_PRIVATE_EXPORT int _dbus_read_socket(DBusSocket fd, DBusString *buffer, int count)
Like _dbus_read(), but only works on sockets so is available on Windows.
void _dbus_daemon_report_reloading(void)
Report to a service manager that the daemon calling this function is reloading configuration.
DBUS_PRIVATE_EXPORT void _dbus_exit(int code) _DBUS_GNUC_NORETURN
Exit the process, returning the given value.
dbus_bool_t _dbus_socket_can_pass_unix_fd(DBusSocket fd)
Checks whether file descriptors may be passed via the socket.
DBUS_PRIVATE_EXPORT int _dbus_write_socket(DBusSocket fd, const DBusString *buffer, int start, int len)
Like _dbus_write(), but only supports sockets and is thus available on Windows.
DBUS_PRIVATE_EXPORT void _dbus_atomic_set_nonzero(DBusAtomic *atomic)
Atomically set the value of an integer to something nonzero.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_socketpair(DBusSocket *fd1, DBusSocket *fd2, dbus_bool_t blocking, DBusError *error)
Creates pair of connect sockets (as in socketpair()).
unsigned long dbus_gid_t
A group ID.
int _dbus_read_socket_with_unix_fds(DBusSocket fd, DBusString *buffer, int count, int *fds, unsigned int *n_fds)
Like _dbus_read_socket() but also tries to read unix fds from the socket.
dbus_bool_t _dbus_command_for_pid(unsigned long pid, DBusString *str, int max_len, DBusError *error)
Get a printable string describing the command used to execute the process with pid.
dbus_bool_t _dbus_get_system_config_file(DBusString *str)
Get the absolute path of the system.conf file (there is no system bus on Windows so this can just ret...
DBusDirIter * _dbus_directory_open(const DBusString *filename, DBusError *error)
Open a directory to iterate over.
dbus_bool_t _dbus_set_up_transient_session_servicedirs(DBusList **dirs, DBusError *error)
Returns the standard directories for a session bus to look for transient service activation files.
dbus_bool_t _dbus_append_keyring_directory_for_credentials(DBusString *directory, DBusCredentials *credentials)
Appends the directory in which a keyring for the given credentials should be stored.
char ** _dbus_get_environment(void)
Gets a NULL-terminated list of key=value pairs from the environment.
dbus_bool_t _dbus_parse_unix_user_from_config(const DBusString *username, dbus_uid_t *uid_p)
Parse a UNIX user from the bus config file.
DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_dec(DBusAtomic *atomic)
Atomically decrement an integer.
dbus_bool_t _dbus_verify_daemon_user(const char *user)
Verify that after the fork we can successfully change to this user.
dbus_bool_t _dbus_read_credentials_socket(DBusSocket client_fd, DBusCredentials *credentials, DBusError *error)
Reads a single byte which must be nul (an error occurs otherwise), and reads unix credentials if avai...
#define DBUS_PID_UNSET
an invalid PID used to represent an uninitialized dbus_pid_t field
const char * _dbus_getenv(const char *varname)
Wrapper for getenv().
DBusSocket _dbus_listen_unix_socket(const char *path, dbus_bool_t abstract, DBusError *error)
Creates a socket and binds it to the given path, then listens on the socket.
dbus_bool_t _dbus_get_standard_system_servicedirs(DBusList **dirs)
Returns the standard directories for a system bus to look for service activation files.
dbus_bool_t _dbus_get_local_system_servicedirs(DBusList **dirs)
Returns the local admin directories for a system bus to look for service activation files.
DBUS_PRIVATE_EXPORT dbus_pid_t _dbus_getpid(void)
Gets our process ID.
DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_get(DBusAtomic *atomic)
Atomically get the value of an integer.
dbus_bool_t _dbus_set_socket_nonblocking(DBusSocket fd, DBusError *error)
Sets a file descriptor to be nonblocking.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_lookup_session_address(dbus_bool_t *supported, DBusString *address, DBusError *error)
Determines the address of the session bus by querying a platform-specific method.
DBUS_PRIVATE_EXPORT const char * _dbus_error_from_system_errno(void)
Converts the current system errno value into a DBusError name.
dbus_bool_t _dbus_credentials_add_from_user(DBusCredentials *credentials, const DBusString *username, DBusCredentialsAddFlags flags, DBusError *error)
Adds the credentials corresponding to the given username.
DBusSocket _dbus_connect_tcp_socket(const char *host, const char *port, const char *family, DBusError *error)
Creates a socket and connects to a socket at the given host and port.
void _dbus_threads_lock_platform_specific(void)
Lock a static mutex used to protect _dbus_threads_init_platform_specific().
void _dbus_disable_sigpipe(void)
signal (SIGPIPE, SIG_IGN);
dbus_bool_t _dbus_check_setuid(void)
NOTE: If you modify this function, please also consider making the corresponding change in GLib.
void _dbus_daemon_report_reloaded(void)
Report to a service manager that the daemon calling this function is reloading configuration.
DBUS_PRIVATE_EXPORT void _dbus_sleep_milliseconds(int milliseconds)
Sleeps the given number of milliseconds.
DBUS_PRIVATE_EXPORT dbus_pid_t _dbus_resolve_pid_fd(int pid_fd)
Resolve the PID from the PID FD, if any.
dbus_bool_t _dbus_change_to_daemon_user(const char *user, DBusError *error)
Changes the user and group the bus is running as.
dbus_bool_t _dbus_unix_user_is_process_owner(dbus_uid_t uid)
Checks to see if the UNIX user ID matches the UID of the process.
DBUS_PRIVATE_EXPORT const char * _dbus_strerror_from_errno(void)
Get error message from errno.
dbus_bool_t _dbus_check_dir_is_private_to_user(DBusString *dir, DBusError *error)
Checks to make sure the given directory is private to the user.
DBUS_PRIVATE_EXPORT void _dbus_log(DBusSystemLogSeverity severity, const char *msg,...)
Log a message to the system log file (e.g.
dbus_bool_t _dbus_windows_user_is_process_owner(const char *windows_sid)
Checks to see if the Windows user SID matches the owner of the process.
dbus_bool_t _dbus_daemon_unpublish_session_bus_address(void)
Clear the platform-specific centralized location where the session bus address is published.
dbus_bool_t _dbus_parse_unix_group_from_config(const DBusString *groupname, dbus_gid_t *gid_p)
Parse a UNIX group from the bus config file.
int _dbus_listen_tcp_socket(const char *host, const char *port, const char *family, DBusString *retport, const char **retfamily, DBusSocket **fds_p, DBusError *error)
Creates a socket and binds it to the given path, then listens on the socket.
void _dbus_threads_unlock_platform_specific(void)
Undo _dbus_threads_lock_platform_specific().
dbus_bool_t _dbus_send_credentials_socket(DBusSocket server_fd, DBusError *error)
Sends a single nul byte with our UNIX credentials as ancillary data.
dbus_bool_t _dbus_unix_groups_from_uid(dbus_uid_t uid, dbus_gid_t **group_ids, int *n_group_ids, DBusError *error)
Gets all groups corresponding to the given UNIX user ID.
DBUS_PRIVATE_EXPORT dbus_uid_t _dbus_getuid(void)
Gets our UID.
dbus_bool_t _dbus_credentials_add_from_current_process(DBusCredentials *credentials)
Adds the most important credentials of the current process (the uid and pid) to the passed-in credent...
void _dbus_daemon_report_stopping(void)
Report to a service manager that the daemon calling this function is shutting down.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_close_socket(DBusSocket *fd, DBusError *error)
Closes a socket and invalidates it.
DBusSocket _dbus_connect_unix_socket(const char *path, dbus_bool_t abstract, DBusError *error)
Creates a socket and connects it to the UNIX domain socket at the given path.
DBUS_PRIVATE_EXPORT void _dbus_atomic_set_zero(DBusAtomic *atomic)
Atomically set the value of an integer to 0.
DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_inc(DBusAtomic *atomic)
Atomically increments an integer.
dbus_bool_t _dbus_generate_random_bytes(DBusString *str, int n_bytes, DBusError *error)
Generates the given number of securely random bytes, using the best mechanism we can come up with.
DBUS_PRIVATE_EXPORT int _dbus_printf_string_upper_bound(const char *format, va_list args)
Measure the length of the given format string and arguments, not including the terminating nul.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_delete_directory(const DBusString *filename, DBusError *error)
Removes a directory; Directory must be empty.
DBUS_PRIVATE_EXPORT const char * _dbus_error_from_errno(int error_number)
Converts a UNIX errno, or Windows errno or WinSock error value into a DBusError name.
void _dbus_abort(void)
Aborts the program with SIGABRT (dumping core).
dbus_bool_t _dbus_directory_get_next_file(DBusDirIter *iter, DBusString *filename, DBusError *error)
Get next file in the directory.
DBUS_PRIVATE_EXPORT int _dbus_poll(DBusPollFD *fds, int n_fds, int timeout_milliseconds)
Wrapper for poll().
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_generate_random_ascii(DBusString *str, int n_bytes, DBusError *error)
Generates the given number of random bytes, where the bytes are chosen from the alphanumeric ASCII su...
dbus_bool_t _dbus_get_autolaunch_address(const char *scope, DBusString *address, DBusError *error)
Returns the address of a new session bus.
int _dbus_write_socket_two(DBusSocket fd, const DBusString *buffer1, int start1, int len1, const DBusString *buffer2, int start2, int len2)
Like _dbus_write_two() but only works on sockets and is thus available on Windows.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_concat_dir_and_file(DBusString *dir, const DBusString *next_component)
Appends the given filename to the given directory.
dbus_bool_t _dbus_become_daemon(const DBusString *pidfile, DBusPipe *print_pid_pipe, DBusError *error, dbus_bool_t keep_umask)
Does the chdir, fork, setsid, etc.
DBusSocket _dbus_connect_exec(const char *path, char *const argv[], DBusError *error)
Creates a UNIX domain socket and connects it to the specified process to execute.
dbus_bool_t _dbus_split_paths_and_append(DBusString *dirs, const char *suffix, DBusList **dir_list)
Split paths into a list of char strings.
DBUS_PRIVATE_EXPORT void _dbus_print_backtrace(void)
On GNU libc systems, print a crude backtrace to stderr.
DBUS_PRIVATE_EXPORT void _dbus_get_real_time(dbus_int64_t *tv_sec, long *tv_usec)
Get current time, as in gettimeofday().
DBUS_PRIVATE_EXPORT void _dbus_init_system_log(const char *tag, DBusLogFlags flags)
Initialize the system log.
dbus_bool_t _dbus_replace_install_prefix(DBusString *path)
Replace the DBUS_PREFIX in the given path, in-place, by the current D-Bus installation directory.
DBusSocket _dbus_accept(DBusSocket listen_fd)
Accepts a connection on a listening socket.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_append_user_from_current_process(DBusString *str)
Append to the string the identity we would like to have when we authenticate, on UNIX this is the cur...
DBUS_PRIVATE_EXPORT void _dbus_flush_caches(void)
Called when the bus daemon is signaled to reload its configuration; any caches should be nuked.
dbus_bool_t _dbus_get_is_errno_eintr(int e)
See if errno is EINTR.
dbus_bool_t _dbus_threads_init_platform_specific(void)
Initialize threads as in dbus_threads_init_default(), appropriately for the platform.
dbus_bool_t _dbus_unix_user_is_at_console(dbus_uid_t uid, DBusError *error)
Checks to see if the UNIX user ID is at the console.
void _dbus_set_errno_to_zero(void)
Assign 0 to the global errno variable.
DBUS_PRIVATE_EXPORT const char * _dbus_get_tmpdir(void)
Gets the temporary files directory by inspecting the environment variables TMPDIR,...
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_ensure_directory(const DBusString *filename, DBusError *error)
Creates a directory; succeeds if the directory is created or already existed.
dbus_bool_t _dbus_get_is_errno_enomem(int e)
See if errno is ENOMEM.
dbus_bool_t _dbus_string_get_dirname(const DBusString *filename, DBusString *dirname)
Get the directory name from a complete filename.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_path_is_absolute(const DBusString *filename)
Checks whether the filename is an absolute path.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_create_directory(const DBusString *filename, DBusError *error)
directory interface
An atomic integer safe to increment or decrement from multiple threads.
volatile dbus_int32_t value
Value of the atomic integer.
Internals of directory iterator.
Object representing an exception.
short events
Events to poll for.
short revents
Events that occurred.
DBusPollable fd
File descriptor.
Portable struct with stat() results.
unsigned long nlink
Number of hard links.
unsigned long size
Size of file.
dbus_uid_t uid
User owning file.
unsigned long mode
File mode.
dbus_gid_t gid
Group owning file.
unsigned long atime
Access time.
unsigned long ctime
Creation time.
unsigned long mtime
Modify time.
A globally unique ID ; we have one for each DBusServer, and also one for each machine with libdbus in...