/* -- connections.c -- */ #include "x11vnc.h" #include "inet.h" #include "remote.h" #include "keyboard.h" #include "cleanup.h" #include "gui.h" #include "solid.h" #include "rates.h" #include "screen.h" #include "unixpw.h" #include "scan.h" #include "sslcmds.h" #include "sslhelper.h" /* * routines for handling incoming, outgoing, etc connections */ /* string for the VNC_CONNECT property */ char vnc_connect_str[VNC_CONNECT_MAX+1]; Atom vnc_connect_prop = None; char x11vnc_remote_str[X11VNC_REMOTE_MAX+1]; Atom x11vnc_remote_prop = None; rfbClientPtr inetd_client = NULL; int all_clients_initialized(void); char *list_clients(void); int new_fb_size_clients(rfbScreenInfoPtr s); void close_all_clients(void); void close_clients(char *str); void set_client_input(char *str); void set_child_info(void); void client_gone(rfbClientPtr client); void reverse_connect(char *str); void set_vnc_connect_prop(char *str); void read_vnc_connect_prop(int); void set_x11vnc_remote_prop(char *str); void read_x11vnc_remote_prop(int); void check_connect_inputs(void); void check_gui_inputs(void); enum rfbNewClientAction new_client(rfbClientPtr client); void start_client_info_sock(char *host_port_cookie); void send_client_info(char *str); void check_new_clients(void); static rfbClientPtr *client_match(char *str); static int run_user_command(char *cmd, rfbClientPtr client, char *mode); static void free_client_data(rfbClientPtr client); static int check_access(char *addr); static void ugly_geom(char *p, int *x, int *y); static int ugly_window(char *addr, char *userhost, int X, int Y, int timeout, char *mode, int accept); static int action_match(char *action, int rc); static int accept_client(rfbClientPtr client); static void check_connect_file(char *file); static void send_client_connect(void); /* * check that all clients are in RFB_NORMAL state */ int all_clients_initialized(void) { rfbClientIteratorPtr iter; rfbClientPtr cl; int ok = 1; if (! screen) { return ok; } iter = rfbGetClientIterator(screen); while( (cl = rfbClientIteratorNext(iter)) ) { if (cl->state != RFB_NORMAL) { ok = 0; break; } } rfbReleaseClientIterator(iter); return ok; } char *list_clients(void) { rfbClientIteratorPtr iter; rfbClientPtr cl; char *list, tmp[256]; int count = 0; if (!screen) { return strdup(""); } iter = rfbGetClientIterator(screen); while( (cl = rfbClientIteratorNext(iter)) ) { count++; } rfbReleaseClientIterator(iter); /* * each client: * ::::::::