DBusSocket _dbus_accept_with_noncefile (DBusSocket listen_fd, const DBusNonceFile *noncefile) { DBusSocket fd = _dbus_socket_get_invalid (); DBusString nonce; _dbus_assert (noncefile != NULL); /* Make it valid to "free" this even if _dbus_string_init() runs * out of memory: see comment in do_check_nonce() */ _dbus_string_init_const (&nonce, ""); if (!_dbus_string_init (&nonce)) goto out; //PENDING(kdab): set better errors if (_dbus_read_nonce (_dbus_noncefile_get_path(noncefile), &nonce, NULL) != TRUE) goto out; fd = _dbus_accept (listen_fd); if (!_dbus_socket_is_valid (fd)) goto out; if (do_check_nonce(fd, &nonce, NULL) != TRUE) { _dbus_verbose ("nonce check failed. Closing socket.\n"); _dbus_close_socket(fd, NULL); _dbus_socket_invalidate (&fd); goto out; } out: _dbus_string_free (&nonce); return fd; }
int _dbus_accept_with_noncefile (int listen_fd, const DBusNonceFile *noncefile) { int fd; DBusString nonce; _dbus_assert (noncefile != NULL); if (!_dbus_string_init (&nonce)) return -1; //PENDING(kdab): set better errors if (_dbus_read_nonce (_dbus_noncefile_get_path(noncefile), &nonce, NULL) != TRUE) return -1; fd = _dbus_accept (listen_fd); if (_dbus_socket_is_invalid (fd)) return fd; if (do_check_nonce(fd, &nonce, NULL) != TRUE) { _dbus_verbose ("nonce check failed. Closing socket.\n"); _dbus_close_socket(fd, NULL); return -1; } return fd; }
static dbus_bool_t socket_handle_watch (DBusWatch *watch, unsigned int flags, void *data) { DBusServer *server = data; DBusServerSocket *socket_server = data; #ifndef DBUS_DISABLE_ASSERT int i; dbus_bool_t found = FALSE; #endif SERVER_LOCK (server); #ifndef DBUS_DISABLE_ASSERT for (i = 0 ; i < socket_server->n_fds ; i++) { if (socket_server->watch[i] == watch) found = TRUE; } _dbus_assert (found); #endif _dbus_verbose ("Handling client connection, flags 0x%x\n", flags); if (flags & DBUS_WATCH_READABLE) { int client_fd; int listen_fd; listen_fd = dbus_watch_get_socket (watch); if (socket_server->noncefile) client_fd = _dbus_accept_with_noncefile (listen_fd, socket_server->noncefile); else client_fd = _dbus_accept (listen_fd); if (client_fd < 0) { /* EINTR handled for us */ if (_dbus_get_is_errno_eagain_or_ewouldblock ()) _dbus_verbose ("No client available to accept after all\n"); else _dbus_verbose ("Failed to accept a client connection: %s\n", _dbus_strerror_from_errno ()); SERVER_UNLOCK (server); } else { if (!handle_new_client_fd_and_unlock (server, client_fd)) _dbus_verbose ("Rejected client connection due to lack of memory\n"); } } if (flags & DBUS_WATCH_ERROR) _dbus_verbose ("Error on server listening socket\n"); if (flags & DBUS_WATCH_HANGUP) _dbus_verbose ("Hangup on server listening socket\n"); return TRUE; }