wlroots/backend/rdp/listener.c

62 lines
1.7 KiB
C

#include <stdlib.h>
#include <wlr/util/log.h>
#include "backend/rdp.h"
static int rdp_incoming_peer(
freerdp_listener *listener, freerdp_peer *client) {
struct wlr_rdp_backend *backend =
(struct wlr_rdp_backend *)listener->param4;
if (rdp_peer_init(client, backend) < 0) {
wlr_log(WLR_ERROR, "Error initializing incoming peer");
return false;
}
return true;
}
static int rdp_listener_activity(int fd, uint32_t mask, void *data) {
freerdp_listener *listener = data;
if (!(mask & WL_EVENT_READABLE)) {
return 0;
}
if (!listener->CheckFileDescriptor(listener)) {
wlr_log(WLR_ERROR, "Failed to check FreeRDP file descriptor");
return -1;
}
return 0;
}
bool rdp_configure_listener(struct wlr_rdp_backend *backend) {
backend->listener = freerdp_listener_new();
if (!backend->listener) {
wlr_log(WLR_ERROR, "Failed to allocate FreeRDP listener");
return false;
}
backend->listener->PeerAccepted = rdp_incoming_peer;
backend->listener->param4 = backend;
if (!backend->listener->Open(backend->listener,
backend->address, backend->port)) {
wlr_log(WLR_ERROR, "Failed to bind to RDP socket");
return false;
}
int rcount = 0;
void *rfds[MAX_FREERDP_FDS];
if (!backend->listener->GetFileDescriptor(
backend->listener, rfds, &rcount)) {
wlr_log(WLR_ERROR, "Failed to get FreeRDP file descriptors");
return false;
}
struct wl_event_loop *event_loop =
wl_display_get_event_loop(backend->display);
int i;
for (i = 0; i < rcount; ++i) {
int fd = (int)(long)(rfds[i]);
backend->listener_events[i] = wl_event_loop_add_fd(
event_loop, fd, WL_EVENT_READABLE, rdp_listener_activity,
backend->listener);
}
for (; i < MAX_FREERDP_FDS; ++i) {
backend->listener_events[i] = NULL;
}
return true;
}