00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef DBUS_SYSDEPS_H
00026 #define DBUS_SYSDEPS_H
00027
00028 #ifndef VERSION
00029 #warning Please include config.h before dbus-sysdeps.h
00030 #include "config.h"
00031 #endif
00032
00033 #ifdef HAVE_STDINT_H
00034 #include <stdint.h>
00035 #endif
00036
00037 #ifdef HAVE_INTTYPES_H
00038 #include <inttypes.h>
00039 #endif
00040
00041 #include <dbus/dbus-errors.h>
00042 #include <dbus/dbus-file.h>
00043 #include <dbus/dbus-string.h>
00044
00045
00046
00047
00048 #include <string.h>
00049 #include <stdarg.h>
00050
00051
00052
00053
00054
00055 #ifdef HAVE_POLL
00056 #include <sys/poll.h>
00057 #endif
00058
00059 #ifdef DBUS_WINCE
00060
00061
00062 #include "dbus-sysdeps-wince-glue.h"
00063 #endif
00064
00065 #ifdef DBUS_WIN
00066 #include <ws2tcpip.h>
00067 #endif
00068
00069 DBUS_BEGIN_DECLS
00070
00071 #ifdef DBUS_WIN
00072 #define _DBUS_PATH_SEPARATOR ";"
00073 #else
00074 #define _DBUS_PATH_SEPARATOR ":"
00075 #endif
00076
00077
00078
00079
00081 typedef struct DBusList DBusList;
00082
00084 typedef struct DBusCredentials DBusCredentials;
00085
00087 typedef struct DBusPipe DBusPipe;
00088
00095 void _dbus_abort (void) _DBUS_GNUC_NORETURN;
00096
00097 dbus_bool_t _dbus_check_setuid (void);
00098 DBUS_PRIVATE_EXPORT
00099 const char* _dbus_getenv (const char *varname);
00100 DBUS_PRIVATE_EXPORT
00101 dbus_bool_t _dbus_clearenv (void);
00102 char ** _dbus_get_environment (void);
00103
00105 typedef unsigned long dbus_pid_t;
00107 typedef unsigned long dbus_uid_t;
00109 typedef unsigned long dbus_gid_t;
00110
00112 #define DBUS_PID_UNSET ((dbus_pid_t) -1)
00113
00114 #define DBUS_UID_UNSET ((dbus_uid_t) -1)
00115
00116 #define DBUS_GID_UNSET ((dbus_gid_t) -1)
00117
00119 #define DBUS_PID_FORMAT "%lu"
00120
00121 #define DBUS_UID_FORMAT "%lu"
00122
00123 #define DBUS_GID_FORMAT "%lu"
00124
00128 #ifdef DBUS_WIN
00129
00130 typedef struct { SOCKET sock; } DBusSocket;
00131 # define DBUS_SOCKET_FORMAT "Iu"
00132 # define DBUS_SOCKET_INIT { INVALID_SOCKET }
00133
00134 static inline SOCKET
00135 _dbus_socket_printable (DBusSocket s) { return s.sock; }
00136
00137 static inline dbus_bool_t
00138 _dbus_socket_is_valid (DBusSocket s) { return s.sock != INVALID_SOCKET; }
00139
00140 static inline void
00141 _dbus_socket_invalidate (DBusSocket *s) { s->sock = INVALID_SOCKET; }
00142
00143 static inline int
00144 _dbus_socket_get_int (DBusSocket s) { return (int)s.sock; }
00145
00146 #else
00147
00148 typedef struct { int fd; } DBusSocket;
00149 # define DBUS_SOCKET_FORMAT "d"
00150 # define DBUS_SOCKET_INIT { -1 }
00151
00152 static inline int
00153 _dbus_socket_printable (DBusSocket s) { return s.fd; }
00154
00155 static inline dbus_bool_t
00156 _dbus_socket_is_valid (DBusSocket s) { return s.fd >= 0; }
00157
00158 static inline void
00159 _dbus_socket_invalidate (DBusSocket *s) { s->fd = -1; }
00160
00161 static inline int
00162 _dbus_socket_get_int (DBusSocket s) { return s.fd; }
00163
00164 #endif
00165
00166 static inline DBusSocket
00167 _dbus_socket_get_invalid (void)
00168 {
00169 DBusSocket s = DBUS_SOCKET_INIT;
00170
00171 return s;
00172 }
00173
00174 dbus_bool_t _dbus_set_socket_nonblocking (DBusSocket fd,
00175 DBusError *error);
00176
00177 DBUS_PRIVATE_EXPORT
00178 dbus_bool_t _dbus_close_socket (DBusSocket fd,
00179 DBusError *error);
00180 DBUS_PRIVATE_EXPORT
00181 int _dbus_read_socket (DBusSocket fd,
00182 DBusString *buffer,
00183 int count);
00184 DBUS_PRIVATE_EXPORT
00185 int _dbus_write_socket (DBusSocket fd,
00186 const DBusString *buffer,
00187 int start,
00188 int len);
00189 int _dbus_write_socket_two (DBusSocket fd,
00190 const DBusString *buffer1,
00191 int start1,
00192 int len1,
00193 const DBusString *buffer2,
00194 int start2,
00195 int len2);
00196
00197 int _dbus_read_socket_with_unix_fds (DBusSocket fd,
00198 DBusString *buffer,
00199 int count,
00200 int *fds,
00201 int *n_fds);
00202 DBUS_PRIVATE_EXPORT
00203 int _dbus_write_socket_with_unix_fds (DBusSocket fd,
00204 const DBusString *buffer,
00205 int start,
00206 int len,
00207 const int *fds,
00208 int n_fds);
00209 int _dbus_write_socket_with_unix_fds_two (DBusSocket fd,
00210 const DBusString *buffer1,
00211 int start1,
00212 int len1,
00213 const DBusString *buffer2,
00214 int start2,
00215 int len2,
00216 const int *fds,
00217 int n_fds);
00218
00219 DBusSocket _dbus_connect_tcp_socket (const char *host,
00220 const char *port,
00221 const char *family,
00222 DBusError *error);
00223 DBusSocket _dbus_connect_tcp_socket_with_nonce (const char *host,
00224 const char *port,
00225 const char *family,
00226 const char *noncefile,
00227 DBusError *error);
00228 int _dbus_listen_tcp_socket (const char *host,
00229 const char *port,
00230 const char *family,
00231 DBusString *retport,
00232 DBusSocket **fds_p,
00233 DBusError *error);
00234 DBusSocket _dbus_accept (DBusSocket listen_fd);
00235
00236 dbus_bool_t _dbus_read_credentials_socket (DBusSocket client_fd,
00237 DBusCredentials *credentials,
00238 DBusError *error);
00239 dbus_bool_t _dbus_send_credentials_socket (DBusSocket server_fd,
00240 DBusError *error);
00241
00242 dbus_bool_t _dbus_credentials_add_from_user (DBusCredentials *credentials,
00243 const DBusString *username);
00244 dbus_bool_t _dbus_credentials_add_from_current_process (DBusCredentials *credentials);
00245 DBUS_PRIVATE_EXPORT
00246 dbus_bool_t _dbus_append_user_from_current_process (DBusString *str);
00247
00248 dbus_bool_t _dbus_parse_unix_user_from_config (const DBusString *username,
00249 dbus_uid_t *uid_p);
00250 dbus_bool_t _dbus_parse_unix_group_from_config (const DBusString *groupname,
00251 dbus_gid_t *gid_p);
00252 dbus_bool_t _dbus_unix_groups_from_uid (dbus_uid_t uid,
00253 dbus_gid_t **group_ids,
00254 int *n_group_ids);
00255 dbus_bool_t _dbus_unix_user_is_at_console (dbus_uid_t uid,
00256 DBusError *error);
00257 dbus_bool_t _dbus_unix_user_is_process_owner (dbus_uid_t uid);
00258 dbus_bool_t _dbus_windows_user_is_process_owner (const char *windows_sid);
00259
00260 dbus_bool_t _dbus_append_keyring_directory_for_credentials (DBusString *directory,
00261 DBusCredentials *credentials);
00262
00263 dbus_bool_t _dbus_daemon_is_session_bus_address_published (const char *scope);
00264
00265 dbus_bool_t _dbus_daemon_publish_session_bus_address (const char* address, const char* shm_name);
00266
00267 void _dbus_daemon_unpublish_session_bus_address (void);
00268
00269 dbus_bool_t _dbus_socket_can_pass_unix_fd(DBusSocket fd);
00270
00274 typedef struct DBusAtomic DBusAtomic;
00275
00279 struct DBusAtomic
00280 {
00281 #ifdef DBUS_WIN
00282 volatile long value;
00283 #else
00284 volatile dbus_int32_t value;
00285 #endif
00286 };
00287
00288
00289
00290
00291
00292 #if DBUS_HAVE_ATOMIC_INT_COND
00293 # define DBUS_HAVE_ATOMIC_INT 1
00294 #else
00295 # undef DBUS_HAVE_ATOMIC_INT
00296 #endif
00297
00298 DBUS_PRIVATE_EXPORT
00299 dbus_int32_t _dbus_atomic_inc (DBusAtomic *atomic);
00300 DBUS_PRIVATE_EXPORT
00301 dbus_int32_t _dbus_atomic_dec (DBusAtomic *atomic);
00302 DBUS_PRIVATE_EXPORT
00303 dbus_int32_t _dbus_atomic_get (DBusAtomic *atomic);
00304
00305 #ifdef DBUS_WIN
00306
00307
00308
00309
00310
00311 typedef DBusSocket DBusPollable;
00312 # define DBUS_POLLABLE_FORMAT "Iu"
00313
00314 static inline DBusPollable
00315 _dbus_socket_get_pollable (DBusSocket s) { return s; }
00316
00317 static inline SOCKET
00318 _dbus_pollable_printable (DBusPollable p) { return p.sock; }
00319
00320 static inline dbus_bool_t
00321 _dbus_pollable_is_valid (DBusPollable p) { return _dbus_socket_is_valid (p); }
00322
00323 static inline void
00324 _dbus_pollable_invalidate (DBusPollable *p) { _dbus_socket_invalidate (p); }
00325
00326 static inline dbus_bool_t
00327 _dbus_pollable_equals (DBusPollable a, DBusPollable b) { return a.sock == b.sock; }
00328
00329 #else
00330
00331
00332
00333
00334
00335
00336 typedef int DBusPollable;
00337 # define DBUS_POLLABLE_FORMAT "d"
00338
00339 static inline DBusPollable
00340 _dbus_socket_get_pollable (DBusSocket s) { return s.fd; }
00341
00342 static inline int
00343 _dbus_pollable_printable (DBusPollable p) { return p; }
00344
00345 static inline dbus_bool_t
00346 _dbus_pollable_is_valid (DBusPollable p) { return p >= 0; }
00347
00348 static inline void
00349 _dbus_pollable_invalidate (DBusPollable *p) { *p = -1; }
00350
00351 static inline dbus_bool_t
00352 _dbus_pollable_equals (DBusPollable a, DBusPollable b) { return a == b; }
00353
00354 #endif
00355
00356 #if defined(HAVE_POLL) && !defined(BROKEN_POLL)
00357
00361 typedef struct pollfd DBusPollFD;
00362
00364 #define _DBUS_POLLIN POLLIN
00365
00366 #define _DBUS_POLLPRI POLLPRI
00367
00368 #define _DBUS_POLLOUT POLLOUT
00369
00370 #define _DBUS_POLLERR POLLERR
00371
00372 #define _DBUS_POLLHUP POLLHUP
00373
00374 #define _DBUS_POLLNVAL POLLNVAL
00375 #else
00376
00377
00378
00379
00380 typedef struct
00381 {
00382 DBusPollable fd;
00383 short events;
00384 short revents;
00385 } DBusPollFD;
00386
00388 #define _DBUS_POLLIN 0x0001
00389
00390 #define _DBUS_POLLPRI 0x0002
00391
00392 #define _DBUS_POLLOUT 0x0004
00393
00394 #define _DBUS_POLLERR 0x0008
00395
00396 #define _DBUS_POLLHUP 0x0010
00397
00398 #define _DBUS_POLLNVAL 0x0020
00399 #endif
00400
00401 DBUS_PRIVATE_EXPORT
00402 int _dbus_poll (DBusPollFD *fds,
00403 int n_fds,
00404 int timeout_milliseconds);
00405
00406 DBUS_PRIVATE_EXPORT
00407 void _dbus_sleep_milliseconds (int milliseconds);
00408
00409 DBUS_PRIVATE_EXPORT
00410 void _dbus_get_monotonic_time (long *tv_sec,
00411 long *tv_usec);
00412
00413 DBUS_PRIVATE_EXPORT
00414 void _dbus_get_real_time (long *tv_sec,
00415 long *tv_usec);
00416
00420 DBUS_PRIVATE_EXPORT
00421 dbus_bool_t _dbus_create_directory (const DBusString *filename,
00422 DBusError *error);
00423 DBUS_PRIVATE_EXPORT
00424 dbus_bool_t _dbus_delete_directory (const DBusString *filename,
00425 DBusError *error);
00426
00427 DBUS_PRIVATE_EXPORT
00428 dbus_bool_t _dbus_concat_dir_and_file (DBusString *dir,
00429 const DBusString *next_component);
00430 dbus_bool_t _dbus_string_get_dirname (const DBusString *filename,
00431 DBusString *dirname);
00432 DBUS_PRIVATE_EXPORT
00433 dbus_bool_t _dbus_path_is_absolute (const DBusString *filename);
00434
00435 dbus_bool_t _dbus_get_standard_session_servicedirs (DBusList **dirs);
00436 dbus_bool_t _dbus_get_standard_system_servicedirs (DBusList **dirs);
00437
00438 dbus_bool_t _dbus_append_system_config_file (DBusString *str);
00439 dbus_bool_t _dbus_append_session_config_file (DBusString *str);
00440
00442 typedef struct DBusDirIter DBusDirIter;
00443
00444 DBusDirIter* _dbus_directory_open (const DBusString *filename,
00445 DBusError *error);
00446 dbus_bool_t _dbus_directory_get_next_file (DBusDirIter *iter,
00447 DBusString *filename,
00448 DBusError *error);
00449 void _dbus_directory_close (DBusDirIter *iter);
00450
00451 dbus_bool_t _dbus_check_dir_is_private_to_user (DBusString *dir,
00452 DBusError *error);
00453
00454 DBUS_PRIVATE_EXPORT
00455 const char* _dbus_get_tmpdir (void);
00456
00460 _DBUS_GNUC_WARN_UNUSED_RESULT
00461 dbus_bool_t _dbus_generate_random_bytes_buffer (char *buffer,
00462 int n_bytes,
00463 DBusError *error);
00464 dbus_bool_t _dbus_generate_random_bytes (DBusString *str,
00465 int n_bytes,
00466 DBusError *error);
00467 DBUS_PRIVATE_EXPORT
00468 dbus_bool_t _dbus_generate_random_ascii (DBusString *str,
00469 int n_bytes,
00470 DBusError *error);
00471
00472 DBUS_PRIVATE_EXPORT
00473 const char* _dbus_error_from_errno (int error_number);
00474 DBUS_PRIVATE_EXPORT
00475 const char* _dbus_error_from_system_errno (void);
00476
00477 int _dbus_save_socket_errno (void);
00478 void _dbus_restore_socket_errno (int saved_errno);
00479 void _dbus_set_errno_to_zero (void);
00480 dbus_bool_t _dbus_get_is_errno_eagain_or_ewouldblock (int e);
00481 dbus_bool_t _dbus_get_is_errno_enomem (int e);
00482 dbus_bool_t _dbus_get_is_errno_eintr (int e);
00483 dbus_bool_t _dbus_get_is_errno_epipe (int e);
00484 dbus_bool_t _dbus_get_is_errno_etoomanyrefs (int e);
00485 DBUS_PRIVATE_EXPORT
00486 const char* _dbus_strerror_from_errno (void);
00487
00488 void _dbus_disable_sigpipe (void);
00489
00490 DBUS_PRIVATE_EXPORT
00491 void _dbus_exit (int code) _DBUS_GNUC_NORETURN;
00492
00493 DBUS_PRIVATE_EXPORT
00494 int _dbus_printf_string_upper_bound (const char *format,
00495 va_list args);
00496
00497
00501 typedef struct
00502 {
00503 unsigned long mode;
00504 unsigned long nlink;
00505 dbus_uid_t uid;
00506 dbus_gid_t gid;
00507 unsigned long size;
00508 unsigned long atime;
00509 unsigned long mtime;
00510 unsigned long ctime;
00511 } DBusStat;
00512
00513 dbus_bool_t _dbus_stat (const DBusString *filename,
00514 DBusStat *statbuf,
00515 DBusError *error);
00516 DBUS_PRIVATE_EXPORT
00517 dbus_bool_t _dbus_socketpair (DBusSocket *fd1,
00518 DBusSocket *fd2,
00519 dbus_bool_t blocking,
00520 DBusError *error);
00521
00522 void _dbus_print_backtrace (void);
00523
00524 dbus_bool_t _dbus_become_daemon (const DBusString *pidfile,
00525 DBusPipe *print_pid_pipe,
00526 DBusError *error,
00527 dbus_bool_t keep_umask);
00528
00529 dbus_bool_t _dbus_verify_daemon_user (const char *user);
00530 dbus_bool_t _dbus_change_to_daemon_user (const char *user,
00531 DBusError *error);
00532
00533 dbus_bool_t _dbus_write_pid_to_file_and_pipe (const DBusString *pidfile,
00534 DBusPipe *print_pid_pipe,
00535 dbus_pid_t pid_to_write,
00536 DBusError *error);
00537
00538 dbus_bool_t _dbus_command_for_pid (unsigned long pid,
00539 DBusString *str,
00540 int max_len,
00541 DBusError *error);
00542
00544 typedef void (* DBusSignalHandler) (int sig);
00545
00546 void _dbus_set_signal_handler (int sig,
00547 DBusSignalHandler handler);
00548
00549 dbus_bool_t _dbus_user_at_console (const char *username,
00550 DBusError *error);
00551
00552 void _dbus_init_system_log (dbus_bool_t is_daemon);
00553
00554 typedef enum {
00555 DBUS_SYSTEM_LOG_INFO,
00556 DBUS_SYSTEM_LOG_WARNING,
00557 DBUS_SYSTEM_LOG_SECURITY,
00558 DBUS_SYSTEM_LOG_FATAL
00559 } DBusSystemLogSeverity;
00560
00561 void _dbus_system_log (DBusSystemLogSeverity severity, const char *msg, ...) _DBUS_GNUC_PRINTF (2, 3);
00562 void _dbus_system_logv (DBusSystemLogSeverity severity, const char *msg, va_list args);
00563
00564
00565
00566
00567 #if !defined (DBUS_VA_COPY)
00568 # if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
00569 # define DBUS_VA_COPY(ap1, ap2) (*(ap1) = *(ap2))
00570 # elif defined (DBUS_VA_COPY_AS_ARRAY)
00571 # define DBUS_VA_COPY(ap1, ap2) memcpy ((ap1), (ap2), sizeof (va_list))
00572 # else
00573 # define DBUS_VA_COPY(ap1, ap2) ((ap1) = (ap2))
00574 # endif
00575 #endif
00576
00577
00582 #define _DBUS_BYTE_OF_PRIMITIVE(p, i) \
00583 (((const char*)&(p))[(i)])
00584
00589 #define _DBUS_DOUBLES_BITWISE_EQUAL(a, b) \
00590 (_DBUS_BYTE_OF_PRIMITIVE (a, 0) == _DBUS_BYTE_OF_PRIMITIVE (b, 0) && \
00591 _DBUS_BYTE_OF_PRIMITIVE (a, 1) == _DBUS_BYTE_OF_PRIMITIVE (b, 1) && \
00592 _DBUS_BYTE_OF_PRIMITIVE (a, 2) == _DBUS_BYTE_OF_PRIMITIVE (b, 2) && \
00593 _DBUS_BYTE_OF_PRIMITIVE (a, 3) == _DBUS_BYTE_OF_PRIMITIVE (b, 3) && \
00594 _DBUS_BYTE_OF_PRIMITIVE (a, 4) == _DBUS_BYTE_OF_PRIMITIVE (b, 4) && \
00595 _DBUS_BYTE_OF_PRIMITIVE (a, 5) == _DBUS_BYTE_OF_PRIMITIVE (b, 5) && \
00596 _DBUS_BYTE_OF_PRIMITIVE (a, 6) == _DBUS_BYTE_OF_PRIMITIVE (b, 6) && \
00597 _DBUS_BYTE_OF_PRIMITIVE (a, 7) == _DBUS_BYTE_OF_PRIMITIVE (b, 7))
00598
00599 dbus_bool_t _dbus_get_autolaunch_address (const char *scope,
00600 DBusString *address,
00601 DBusError *error);
00602
00603 dbus_bool_t _dbus_lookup_session_address (dbus_bool_t *supported,
00604 DBusString *address,
00605 DBusError *error);
00606
00610 typedef union DBusGUID DBusGUID;
00611
00612 dbus_bool_t _dbus_read_local_machine_uuid (DBusGUID *machine_id,
00613 dbus_bool_t create_if_not_found,
00614 DBusError *error);
00615
00621 dbus_bool_t _dbus_threads_init_platform_specific (void);
00622
00626 void _dbus_threads_lock_platform_specific (void);
00627
00631 void _dbus_threads_unlock_platform_specific (void);
00632
00633 DBUS_PRIVATE_EXPORT
00634 dbus_bool_t _dbus_split_paths_and_append (DBusString *dirs,
00635 const char *suffix,
00636 DBusList **dir_list);
00637
00638 unsigned long _dbus_pid_for_log (void);
00639
00640
00641
00642
00643
00644 DBUS_PRIVATE_EXPORT
00645 dbus_pid_t _dbus_getpid (void);
00646
00647 DBUS_PRIVATE_EXPORT
00648 dbus_uid_t _dbus_getuid (void);
00649
00650 dbus_bool_t _dbus_change_to_daemon_user (const char *user,
00651 DBusError *error);
00652
00653 DBUS_PRIVATE_EXPORT
00654 void _dbus_flush_caches (void);
00655
00656
00657
00658
00659
00660
00661
00662
00663 const char *
00664 _dbus_replace_install_prefix (const char *configure_time_path);
00665
00666
00667
00668
00669
00670
00671
00672 #define DBUS_DEFAULT_MESSAGE_UNIX_FDS 16
00673
00674 typedef struct DBusRLimit DBusRLimit;
00675
00676 DBusRLimit *_dbus_rlimit_save_fd_limit (DBusError *error);
00677 dbus_bool_t _dbus_rlimit_raise_fd_limit_if_privileged (unsigned int desired,
00678 DBusError *error);
00679 dbus_bool_t _dbus_rlimit_restore_fd_limit (DBusRLimit *saved,
00680 DBusError *error);
00681 void _dbus_rlimit_free (DBusRLimit *lim);
00682
00685 DBUS_END_DECLS
00686
00687
00688 #ifdef DBUS_WIN
00689 #include "dbus-sysdeps-win.h"
00690 #endif
00691
00692 #endif