From 1ef8e0bf367fb25db5c0320e8531b437b736901f Mon Sep 17 00:00:00 2001 From: DRC Date: Tue, 2 Jul 2024 13:50:04 -0400 Subject: [PATCH] Server: Further logging improvements 1. When possible, prefix log entries related to a specific viewer with the viewer's ID. 2. Do not report the IP address from which the viewer connection originated, except at connection time. (1) makes it unnecessary to report that information at any other time. 3. At connection time, report the port from which the viewer connection originated. (This information might be useful in conjunction with netstat, lsof, or other tools.) 4. Assign a unique ID to every viewer connection, regardless of whether the connection is successfully authenticated and initialized. This makes it easier to distinguish failed connections from successful ones. --- ChangeLog.md | 12 +- unix/Xvnc/programs/Xserver/hw/vnc/auth.c | 69 ++-- unix/Xvnc/programs/Xserver/hw/vnc/authpam.c | 30 +- .../programs/Xserver/hw/vnc/flowcontrol.c | 36 +- unix/Xvnc/programs/Xserver/hw/vnc/hextile.c | 4 +- unix/Xvnc/programs/Xserver/hw/vnc/randr.c | 14 +- unix/Xvnc/programs/Xserver/hw/vnc/rfb.h | 8 +- unix/Xvnc/programs/Xserver/hw/vnc/rfbserver.c | 357 +++++++++--------- .../programs/Xserver/hw/vnc/rfbssl_openssl.c | 14 +- unix/Xvnc/programs/Xserver/hw/vnc/sockets.c | 11 +- unix/Xvnc/programs/Xserver/hw/vnc/stats.c | 42 +-- unix/Xvnc/programs/Xserver/hw/vnc/tight.c | 8 +- unix/Xvnc/programs/Xserver/hw/vnc/translate.c | 56 +-- .../Xvnc/programs/Xserver/hw/vnc/websockets.c | 47 +-- unix/Xvnc/programs/Xserver/hw/vnc/zlib.c | 5 +- 15 files changed, 348 insertions(+), 365 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3f098a74f..2945cfe51 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -43,14 +43,10 @@ until F10, left Alt, or Esc was pressed to dismiss the menu. running in a TurboVNC session attempted to display to a local Wayland session if one was active. -8. The TurboVNC Server now assigns an ordinal ID to every VNC viewer after the -viewer successfully connects, and the viewer's ID is reported in the TurboVNC -session log along with the IP address from which the viewer connection -originated. This makes it easier to distinguish log entries related to a -specific viewer, especially when using SSH tunneling (which makes it appear as -if all viewer connections originate from the loopback IP address.) The -TurboVNC Server now also logs the total number of simultaneously connected -viewers. +8. The TurboVNC Server now assigns an ordinal ID to every VNC viewer when the +viewer connects, and when possible, log entries related to a specific viewer +are prefixed by the viewer's ID. The TurboVNC Server now also logs the total +number of simultaneously connected viewers. 9. The TurboVNC Viewer now sends horizontal scroll wheel events to the VNC server. (These events can be generated with horizontal scroll gestures on a diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/auth.c b/unix/Xvnc/programs/Xserver/hw/vnc/auth.c index 1fe78db8c..233085811 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/auth.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/auth.c @@ -199,7 +199,7 @@ static void AuthPAMUserPwdRspFunc(rfbClientPtr cl) UserList *p = userACL; if (p == NULL) - rfbLog("WARNING: User ACL is empty. No users will be allowed to log in with Unix Login authentication.\n"); + RFBLOGID("WARNING: User ACL is empty. No users will be allowed to log in with Unix Login authentication.\n"); while (p != NULL) { if (!strcmp(p->name, userBuf)) @@ -208,8 +208,8 @@ static void AuthPAMUserPwdRspFunc(rfbClientPtr cl) } if (p == NULL) { - rfbLog("User '%s' is not in the ACL and has been denied access\n", - userBuf); + RFBLOGID("User '%s' is not in the ACL and has been denied access\n", + userBuf); rfbClientAuthFailed(cl, "User denied access"); return; } @@ -225,8 +225,8 @@ static void AuthPAMUserPwdRspFunc(rfbClientPtr cl) strerror(errno)); if (strcmp(pbuf.pw_name, userBuf)) { - rfbLog("User '%s' denied access (not the session owner)\n", userBuf); - rfbLog(" Enable user ACL to grant access to other users.\n"); + RFBLOGID("User '%s' denied access (not the session owner)\n", userBuf); + RFBLOGID(" Enable user ACL to grant access to other users.\n"); rfbClientAuthFailed(cl, "User denied access"); return; } @@ -234,9 +234,9 @@ static void AuthPAMUserPwdRspFunc(rfbClientPtr cl) if (rfbPAMAuthenticate(cl, pamServiceName, userBuf, pwdBuf, &emsg)) { rfbClientAuthSucceeded(cl, rfbAuthUnixLogin); - rfbLog("PAM authentication succeeded for user '%s'\n", userBuf); + RFBLOGID("PAM authentication succeeded for user '%s'\n", userBuf); } else { - rfbLog("PAM authentication failed for user '%s'\n", userBuf); + RFBLOGID("PAM authentication failed for user '%s'\n", userBuf); rfbClientAuthFailed(cl, (char *)emsg); } } @@ -797,7 +797,7 @@ void rfbAuthProcessResponse(rfbClientPtr cl) } } - rfbLog("rfbAuthProcessResponse: authType assertion failed\n"); + RFBLOGID("rfbAuthProcessResponse: authType assertion failed\n"); rfbCloseClient(cl); } @@ -815,7 +815,7 @@ void rfbAuthNewClient(rfbClientPtr cl) RFBSecTypeData *r; if (rfbAuthIsBlocked(cl->host)) { - rfbLog("Too many authentication failures - client rejected\n"); + RFBLOGID("Too many authentication failures - client rejected\n"); rfbClientConnFailed(cl, "Too many authentication failures. Client temporarily blocked"); return; } @@ -833,7 +833,7 @@ void rfbAuthNewClient(rfbClientPtr cl) } if (*p == NULL) { - rfbLog("VNC authentication disabled - RFB 3.3 client rejected\n"); + RFBLOGID("VNC authentication disabled - RFB 3.3 client rejected\n"); rfbClientConnFailed(cl, "Your viewer cannot handle required security types"); return; } @@ -898,8 +898,8 @@ static void rfbSendSecurityTypeList(rfbClientPtr cl) continue; if (cl->reverseConnection && !strncmp(s->name, "x509", 4)) { - rfbLog("Security type \'%s\' disabled for reverse connections\n", - s->name); + RFBLOGID("Security type \'%s\' disabled for reverse connections\n", + s->name); continue; } @@ -939,7 +939,7 @@ static void rfbSendSecurityTypeList(rfbClientPtr cl) if (n > MAX_SECURITY_TYPES) FatalError("rfbSendSecurityTypeList: # enabled security types > MAX_SECURITY_TYPES"); - rfbLog("rfbSendSecurityTypeList: advertise sectype tight\n"); + RFBLOGID("rfbSendSecurityTypeList: advertise sectype tight\n"); cl->securityTypes[++n] = rfbSecTypeTight; } @@ -986,7 +986,7 @@ static void rfbSendSecurityTypeList(rfbClientPtr cl) rfbCloseClient(cl); \ return; \ } else if (ret == 1) { \ - rfbLog("Deferring TLS handshake\n"); \ + RFBLOGID("Deferring TLS handshake\n"); \ cl->state = RFB_TLS_HANDSHAKE; \ return; \ } @@ -1091,9 +1091,9 @@ void rfbVeNCryptAuthenticate(rfbClientPtr cl) if (chosenType == subTypes[i]) break; } - rfbLog("Client requested VeNCrypt sub-type %d\n", chosenType); + RFBLOGID("Client requested VeNCrypt sub-type %d\n", chosenType); if (chosenType == 0 || chosenType == rfbSecTypeVeNCrypt || i >= count) { - rfbLog("Requested VeNCrypt sub-type not supported\n"); + RFBLOGID("Requested VeNCrypt sub-type not supported\n"); rfbCloseClient(cl); return; } @@ -1166,7 +1166,7 @@ void rfbProcessClientSecurityType(rfbClientPtr cl) n = ReadExact(cl, (char *)&chosenType, 1); if (n <= 0) { if (n == 0) - rfbLog("rfbProcessClientSecurityType: client gone\n"); + RFBLOGID("rfbProcessClientSecurityType: client gone\n"); else rfbLogPerror("rfbProcessClientSecurityType: read"); rfbCloseClient(cl); @@ -1180,7 +1180,7 @@ void rfbProcessClientSecurityType(rfbClientPtr cl) break; } if (i > count) { - rfbLog("rfbProcessClientSecurityType: wrong security type requested\n"); + RFBLOGID("rfbProcessClientSecurityType: wrong security type requested\n"); rfbCloseClient(cl); return; } @@ -1197,7 +1197,7 @@ void rfbProcessClientSecurityType(rfbClientPtr cl) break; case rfbSecTypeTight: /* The viewer supports TightVNC extensions */ - rfbLog("Enabling TightVNC protocol extensions\n"); + RFBLOGID("Enabling TightVNC protocol extensions\n"); /* Switch to protocol 3.7t/3.8t */ cl->protocol_tightvnc = TRUE; /* Advertise our tunneling capabilities */ @@ -1205,11 +1205,11 @@ void rfbProcessClientSecurityType(rfbClientPtr cl) break; case rfbSecTypeVeNCrypt: /* The viewer supports VeNCrypt extensions */ - rfbLog("Enabling VeNCrypt protocol extensions\n"); + RFBLOGID("Enabling VeNCrypt protocol extensions\n"); rfbVeNCryptAuthenticate(cl); break; default: - rfbLog("rfbProcessClientSecurityType: unknown authentication scheme\n"); + RFBLOGID("rfbProcessClientSecurityType: unknown authentication scheme\n"); rfbCloseClient(cl); break; } @@ -1250,7 +1250,7 @@ static void rfbSendTunnelingCaps(rfbClientPtr cl) void rfbProcessClientTunnelingType(rfbClientPtr cl) { /* If we were called, then something's really wrong. */ - rfbLog("rfbProcessClientTunnelingType: not implemented\n"); + RFBLOGID("rfbProcessClientTunnelingType: not implemented\n"); rfbCloseClient(cl); } @@ -1311,7 +1311,7 @@ static void rfbSendAuthCaps(rfbClientPtr cl) cl->authCaps[count] = c->authType; strncpy(tempstr, (char *)pcap->nameSignature, 8); tempstr[8] = 0; - rfbLog("Advertising Tight auth cap '%s'\n", tempstr); + RFBLOGID("Advertising Tight auth cap '%s'\n", tempstr); count++; } } @@ -1358,7 +1358,7 @@ void rfbProcessClientAuthType(rfbClientPtr cl) n = ReadExact(cl, (char *)&auth_type, sizeof(auth_type)); if (n <= 0) { if (n == 0) - rfbLog("rfbProcessClientAuthType: client gone\n"); + RFBLOGID("rfbProcessClientAuthType: client gone\n"); else rfbLogPerror("rfbProcessClientAuthType: read"); rfbCloseClient(cl); @@ -1372,7 +1372,7 @@ void rfbProcessClientAuthType(rfbClientPtr cl) break; } if (i >= cl->nAuthCaps) { - rfbLog("rfbProcessClientAuthType: wrong authentication type requested\n"); + RFBLOGID("rfbProcessClientAuthType: wrong authentication type requested\n"); rfbCloseClient(cl); return; } @@ -1386,7 +1386,7 @@ void rfbProcessClientAuthType(rfbClientPtr cl) } } - rfbLog("rfbProcessClientAuthType: unknown authentication scheme\n"); + RFBLOGID("rfbProcessClientAuthType: unknown authentication scheme\n"); rfbCloseClient(cl); } @@ -1428,14 +1428,12 @@ static Bool CheckResponse(rfbClientPtr cl, int numPasswords, memset(passwdViewOnly, 0, MAXPWLEN + 1); if (memcmp(encryptedChallenge1, response, CHALLENGESIZE) == 0) { - rfbLog("Full-control authentication enabled for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Full-control authentication enabled\n"); ok = TRUE; cl->viewOnly = FALSE; } else if (memcmp(encryptedChallenge2, response, CHALLENGESIZE) == 0) { - rfbLog("View-only authentication enabled for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("View-only authentication enabled\n"); ok = TRUE; cl->viewOnly = TRUE; } @@ -1503,8 +1501,8 @@ void rfbVncAuthProcessResponse(rfbClientPtr cl) passwdFullControl, passwdViewOnly); if (numPasswords == 0) { - rfbLog("rfbVncAuthProcessResponse: could not get password from %s\n", - rfbAuthPasswdFile); + RFBLOGID("rfbVncAuthProcessResponse: could not get password from %s\n", + rfbAuthPasswdFile); if (nSecTypesEnabled == 1) { rfbClientAuthFailed(cl, "The server could not read the VNC password file"); @@ -1523,8 +1521,8 @@ void rfbVncAuthProcessResponse(rfbClientPtr cl) if (!cl->reverseConnection && rfbNeverShared && !rfbDisconnect) { for (otherCl = rfbClientHead; otherCl; otherCl = otherCl->next) { if ((otherCl != cl) && (otherCl->state == RFB_NORMAL)) { - rfbLog("-dontdisconnect: Not shared & existing client\n"); - rfbLog(" refusing new client %d (%s)\n", cl->id, cl->host); + RFBLOGID("-dontdisconnect: Not shared & existing client\n"); + RFBLOGID(" refusing new client\n"); rfbClientAuthFailed(cl, "Authentication failed. The server is already in use."); return; } @@ -1532,8 +1530,7 @@ void rfbVncAuthProcessResponse(rfbClientPtr cl) } rfbClientAuthSucceeded(cl, rfbAuthVNC); } else { - rfbLog("rfbVncAuthProcessResponse: authentication failed from Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("rfbVncAuthProcessResponse: authentication failed\n"); if (rfbAuthConsiderBlocking(cl->host)) rfbClientAuthFailed(cl, "Authentication failed. Client temporarily blocked"); else diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/authpam.c b/unix/Xvnc/programs/Xserver/hw/vnc/authpam.c index 1f030a0b9..f4be022be 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/authpam.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/authpam.c @@ -129,39 +129,39 @@ Bool rfbPAMAuthenticate(rfbClientPtr cl, const char *svc, const char *user, pamConv.conv = conv; pamConv.appdata_ptr = 0; if ((r = pam_start(svc, user, &pamConv, &pamHandle)) != PAM_SUCCESS) { - rfbLog("PAMAuthenticate: pam_start: %s\n", pam_strerror(pamHandle, r)); + RFBLOGID("PAMAuthenticate: pam_start: %s\n", pam_strerror(pamHandle, r)); return FALSE; } if ((r = pam_set_item(pamHandle, PAM_RHOST, cl->host)) != PAM_SUCCESS) { - rfbLog("PAMAuthenticate: pam_set_item PAM_RHOST: %s\n", - pam_strerror(pamHandle, r)); + RFBLOGID("PAMAuthenticate: pam_set_item PAM_RHOST: %s\n", + pam_strerror(pamHandle, r)); return FALSE; } authStatus = pam_authenticate(pamHandle, PAM_DISALLOW_NULL_AUTHTOK); if (authStatus != PAM_SUCCESS) { - rfbLog("PAMAuthenticate: pam_authenticate: %s\n", - pam_strerror(pamHandle, authStatus)); + RFBLOGID("PAMAuthenticate: pam_authenticate: %s\n", + pam_strerror(pamHandle, authStatus)); } else { /* Authentication was successful. Validate the user's account status. */ authStatus = pam_acct_mgmt(pamHandle, PAM_DISALLOW_NULL_AUTHTOK); if (authStatus != PAM_SUCCESS) { - rfbLog("PAMAuthenticate: pam_acct_mgmt: %s\n", - pam_strerror(pamHandle, authStatus)); + RFBLOGID("PAMAuthenticate: pam_acct_mgmt: %s\n", + pam_strerror(pamHandle, authStatus)); } else if (pamSession) { if ((authStatus = pam_open_session(pamHandle, 0)) != PAM_SUCCESS) { - rfbLog("PAMAuthenticate: pam_open_session: %s\n", - pam_strerror(pamHandle, authStatus)); + RFBLOGID("PAMAuthenticate: pam_open_session: %s\n", + pam_strerror(pamHandle, authStatus)); } else { - rfbLog("Opened PAM session for Client %d (%s)\n", cl->id, cl->host); + RFBLOGID("Opened PAM session\n"); } } } if (authStatus != PAM_SUCCESS || !pamSession) { if ((r = pam_end(pamHandle, authStatus)) != PAM_SUCCESS) - rfbLog("PAMAuthenticate: pam_end: %s\n", pam_strerror(pamHandle, r)); + RFBLOGID("PAMAuthenticate: pam_end: %s\n", pam_strerror(pamHandle, r)); } else cl->pamHandle = pamHandle; @@ -207,13 +207,13 @@ void rfbPAMEnd(rfbClientPtr cl) if (cl->pamHandle) { if ((r = pam_close_session(cl->pamHandle, 0)) != PAM_SUCCESS) - rfbLog("PAMEnd: pam_close_session: %s\n", - pam_strerror(cl->pamHandle, r)); + RFBLOGID("PAMEnd: pam_close_session: %s\n", + pam_strerror(cl->pamHandle, r)); if ((r = pam_end(cl->pamHandle, PAM_SUCCESS)) != PAM_SUCCESS) - rfbLog("PAMEnd: pam_end: %s\n", pam_strerror(cl->pamHandle, r)); + RFBLOGID("PAMEnd: pam_end: %s\n", pam_strerror(cl->pamHandle, r)); - rfbLog("Closed PAM session for Client %d (%s)\n", cl->id, cl->host); + RFBLOGID("Closed PAM session\n"); cl->pamHandle = 0; } } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/flowcontrol.c b/unix/Xvnc/programs/Xserver/hw/vnc/flowcontrol.c index b33a6451e..a6696d709 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/flowcontrol.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/flowcontrol.c @@ -2,8 +2,8 @@ * flowcontrol.c - implement RFB flow control extensions */ -/* Copyright (C) 2012, 2014, 2017-2018, 2021, 2023 D. R. Commander. - * All Rights Reserved. +/* Copyright (C) 2012, 2014, 2017-2018, 2021, 2023-2024 D. R. Commander. + * All Rights Reserved. * Copyright (C) 2018 Peter Åstrand for Cendio AB. All Rights Reserved. * Copyright (C) 2011, 2015 Pierre Ossman for Cendio AB. All Rights Reserved. * @@ -143,8 +143,8 @@ void rfbUpdatePosition(rfbClientPtr cl, unsigned pos) if (msBetween(&cl->lastSent, &now) > max(cl->baseRTT * 2, 100)) { #ifdef CONGESTION_DEBUG - rfbLog("Connection idle for %d ms. Resetting congestion control.\n", - msBetween(&cl->lastSent, &now)); + RFBLOGID("Connection idle for %d ms. Resetting congestion control.\n", + msBetween(&cl->lastSent, &now)); #endif /* Close congestion window and redo wire latency measurement. */ @@ -487,7 +487,7 @@ static void UpdateCongestion(rfbClientPtr cl) means packet loss. Adjust the window and go directly to congestion avoidance. */ #ifdef CONGESTION_DEBUG - rfbLog("Latency spike! Backing off...\n"); + RFBLOGID("Latency spike! Backing off...\n"); #endif cl->congWindow = cl->congWindow * cl->baseRTT / cl->minRTT; cl->inSlowStart = FALSE; @@ -538,18 +538,18 @@ static void UpdateCongestion(rfbClientPtr cl) cl->congWindow = MAXIMUM_WINDOW; #ifdef CONGESTION_DEBUG - rfbLog("RTT: %d/%d ms (%d ms), Window: %d KB, Offset: %d KB, Bandwidth: %g Mbps%s\n", - cl->minRTT, cl->minCongestedRTT, cl->baseRTT, cl->congWindow / 1024, - cl->sockOffset / 1024, cl->congWindow * 8.0 / cl->baseRTT / 1000.0, - cl->inSlowStart ? " (slow start)" : ""); + RFBLOGID("RTT: %d/%d ms (%d ms), Window: %d KB, Offset: %d KB, Bandwidth: %g Mbps%s\n", + cl->minRTT, cl->minCongestedRTT, cl->baseRTT, cl->congWindow / 1024, + cl->sockOffset / 1024, cl->congWindow * 8.0 / cl->baseRTT / 1000.0, + cl->inSlowStart ? " (slow start)" : ""); #ifdef TCP_INFO tcp_info_length = sizeof(tcp_info); if (getsockopt(cl->sock, SOL_TCP, TCP_INFO, (void *)&tcp_info, &tcp_info_length) == 0) { - rfbLog("Socket: RTT: %d ms (+/- %d ms) Window %d KB\n", - tcp_info.tcpi_rtt / 1000, tcp_info.tcpi_rttvar / 1000, - tcp_info.tcpi_snd_mss * tcp_info.tcpi_snd_cwnd / 1024); + RFBLOGID("Socket: RTT: %d ms (+/- %d ms) Window %d KB\n", + tcp_info.tcpi_rtt / 1000, tcp_info.tcpi_rttvar / 1000, + tcp_info.tcpi_snd_mss * tcp_info.tcpi_snd_cwnd / 1024); } #endif @@ -570,15 +570,15 @@ Bool rfbSendFence(rfbClientPtr cl, CARD32 flags, unsigned len, rfbFenceMsg f; if (!cl->enableFence) { - rfbLog("ERROR in rfbSendFence: Client does not support fence extension\n"); + RFBLOGID("ERROR in rfbSendFence: Client does not support fence extension\n"); return FALSE; } if (len > 64) { - rfbLog("ERROR in rfbSendFence: Fence payload is too large\n"); + RFBLOGID("ERROR in rfbSendFence: Fence payload is too large\n"); return FALSE; } if ((flags & ~rfbFenceFlagsSupported) != 0) { - rfbLog("ERROR in rfbSendFence: Unknown fence flags\n"); + RFBLOGID("ERROR in rfbSendFence: Unknown fence flags\n"); return FALSE; } @@ -633,7 +633,7 @@ void HandleFence(rfbClientPtr cl, CARD32 flags, unsigned len, const char *data) } if (len < 1) - rfbLog("Fence of unusual size received\n"); + RFBLOGID("Fence of unusual size received\n"); type = data[0]; @@ -647,7 +647,7 @@ void HandleFence(rfbClientPtr cl, CARD32 flags, unsigned len, const char *data) break; default: - rfbLog("Fence of unusual size received\n"); + RFBLOGID("Fence of unusual size received\n"); } } @@ -661,7 +661,7 @@ Bool rfbSendEndOfCU(rfbClientPtr cl) CARD8 type = rfbEndOfContinuousUpdates; if (!cl->enableCU) { - rfbLog("ERROR in rfbSendEndOfCU: Client does not support Continuous Updates\n"); + RFBLOGID("ERROR in rfbSendEndOfCU: Client does not support Continuous Updates\n"); return FALSE; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/hextile.c b/unix/Xvnc/programs/Xserver/hw/vnc/hextile.c index c3f372293..5e60a6cf6 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/hextile.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/hextile.c @@ -4,7 +4,7 @@ * Routines to implement Hextile Encoding */ -/* Copyright (C) 2012, 2017 D. R. Commander. All Rights Reserved. +/* Copyright (C) 2012, 2017, 2024 D. R. Commander. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This is free software; you can redistribute it and/or modify @@ -65,7 +65,7 @@ Bool rfbSendRectEncodingHextile(rfbClientPtr cl, int x, int y, int w, int h) return sendHextiles32(cl, x, y, w, h); } - rfbLog("rfbSendRectEncodingHextile: bpp %d?\n", cl->format.bitsPerPixel); + RFBLOGID("rfbSendRectEncodingHextile: bpp %d?\n", cl->format.bitsPerPixel); return FALSE; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/randr.c b/unix/Xvnc/programs/Xserver/hw/vnc/randr.c index 87ad5e575..e17d31c73 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/randr.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/randr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2013-2019, 2021 D. R. Commander. All Rights Reserved. +/* Copyright (C) 2013-2019, 2021, 2024 D. R. Commander. All Rights Reserved. * Copyright 2012-2015 Pierre Ossman for Cendio AB * * This is free software; you can redistribute it and/or modify @@ -551,13 +551,13 @@ int ResizeDesktop(ScreenPtr pScreen, rfbClientPtr cl, int w, int h, rfbClientPtr cl2; if (rfbAuthDisableRemoteResize) { - rfbLog("WARNING: Remote desktop resizing disabled per system policy.\n"); + RFBLOGID("WARNING: Remote desktop resizing disabled per system policy.\n"); return rfbEDSResultProhibited; } for (cl2 = rfbClientHead; cl2; cl2 = cl2->next) { if (!cl2->enableDesktopSize && !cl2->enableExtDesktopSize) { - rfbLog("ERROR: Not resizing desktop because one or more clients doesn't support it.\n"); + RFBLOGID("ERROR: Not resizing desktop because one or more clients doesn't support it.\n"); return rfbEDSResultProhibited; } } @@ -565,19 +565,19 @@ int ResizeDesktop(ScreenPtr pScreen, rfbClientPtr cl, int w, int h, /* First check that we don't have any active clone modes. That's just too messy to deal with. */ if (vncHasOutputClones(pScreen)) { - rfbLog("Desktop resize ERROR: Cannot change screen layout when clone mode is active\n"); + RFBLOGID("Desktop resize ERROR: Cannot change screen layout when clone mode is active\n"); return rfbEDSResultInvalid; } if (w > rfbMaxWidth || h > rfbMaxHeight) { w = min(w, rfbMaxWidth); h = min(h, rfbMaxHeight); - rfbLog("NOTICE: desktop size clamped to %dx%d per system policy\n", w, h); + RFBLOGID("NOTICE: desktop size clamped to %dx%d per system policy\n", w, h); } rfbClipScreens(clientScreens, w, h); if (xorg_list_is_empty(clientScreens)) { - rfbLog("Desktop resize ERROR: All screens are outside of the framebuffer (%dx%d)\n", - w, h); + RFBLOGID("Desktop resize ERROR: All screens are outside of the framebuffer (%dx%d)\n", + w, h); return rfbEDSResultInvalid; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/rfb.h b/unix/Xvnc/programs/Xserver/hw/vnc/rfb.h index 9050759b2..1a0393184 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/rfb.h +++ b/unix/Xvnc/programs/Xserver/hw/vnc/rfb.h @@ -610,6 +610,13 @@ extern int traceLevel; } +/* + * Print a time-stamped message, prefixed by the client ID, to the log file + * (stderr.) + */ +#define RFBLOGID(format, ...) rfbLog("[%u] " format, cl->id, ##__VA_ARGS__) + + /* auth.c */ void rfbAuthInit(void); @@ -889,7 +896,6 @@ extern Bool rfbGIIDebug; extern int rfbInterframe; extern int rfbMaxClipboard; extern Bool rfbVirtualTablet; -extern CARD16 rfbClientNumber; /* Multithreading params specified on the command line or in the environment */ extern Bool rfbMT; diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/rfbserver.c b/unix/Xvnc/programs/Xserver/hw/vnc/rfbserver.c index 9e6fc4ef0..e9b0459bf 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/rfbserver.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/rfbserver.c @@ -78,7 +78,7 @@ Bool rfbGIIDebug = FALSE; int rfbMaxWidth = MAXSHORT, rfbMaxHeight = MAXSHORT; int rfbMaxClipboard = MAX_CUTTEXT_LEN; Bool rfbVirtualTablet = FALSE; -CARD16 rfbClientNumber = 1; +static CARD16 rfbClientNumber = 1; #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) Bool rfbMT = TRUE; #else @@ -266,7 +266,7 @@ Bool InterframeOn(rfbClientPtr cl) memset(cl->compareFB, 0, rfbFB.paddedWidthInBytes * rfbFB.height); REGION_INIT(pScreen, &cl->ifRegion, NullBox, 0); cl->firstCompare = TRUE; - rfbLog("Interframe comparison enabled\n"); + RFBLOGID("Interframe comparison enabled\n"); } cl->fb = cl->compareFB; return TRUE; @@ -277,7 +277,7 @@ void InterframeOff(rfbClientPtr cl) if (cl->compareFB) { free(cl->compareFB); REGION_UNINIT(pScreen, &cl->ifRegion); - rfbLog("Interframe comparison disabled\n"); + RFBLOGID("Interframe comparison disabled\n"); } cl->compareFB = NULL; cl->fb = rfbFB.pfbMemory; @@ -372,22 +372,25 @@ static rfbClientPtr rfbNewClient(int sock) cl = (rfbClientPtr)rfbAlloc0(sizeof(rfbClientRec)); + cl->sock = sock; + getpeername(sock, &addr.u.sa, &addrlen); + cl->host = strdup(sockaddr_string(&addr, addrStr, INET6_ADDRSTRLEN)); + cl->id = rfbClientNumber++; + if (rfbClientNumber == 0) rfbClientNumber = 1; + + RFBLOGID("Got connection from %s on port %d\n", cl->host, + ntohs(addr.u.sin.sin_port)); + if (rfbClientHead == NULL && captureFile) { cl->captureFD = open(captureFile, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR); if (cl->captureFD < 0) rfbLogPerror("Could not open capture file"); else - rfbLog("Opened capture file %s\n", captureFile); + RFBLOGID("Opened capture file %s\n", captureFile); } else cl->captureFD = -1; - cl->sock = sock; - getpeername(sock, &addr.u.sa, &addrlen); - cl->host = strdup(sockaddr_string(&addr, addrStr, INET6_ADDRSTRLEN)); - cl->id = rfbClientNumber++; - if (rfbClientNumber == 0) rfbClientNumber = 1; - /* Dispatch client input to rfbProcessClientProtocolVersion(). */ cl->state = RFB_PROTOCOL_VERSION; @@ -541,7 +544,7 @@ void rfbClientConnectionGone(rfbClientPtr cl) #ifdef XVNC_AuthPAM rfbPAMEnd(cl); #endif - rfbLog("Client %d (%s) gone\n", cl->id, cl->host); + RFBLOGID("Client gone\n"); free(cl->host); ShutdownTightThreads(); @@ -667,7 +670,7 @@ static void rfbProcessClientProtocolVersion(rfbClientPtr cl) if ((n = ReadExact(cl, pv, sz_rfbProtocolVersionMsg)) <= 0) { if (n == 0) - rfbLog("rfbProcessClientProtocolVersion: client gone\n"); + RFBLOGID("rfbProcessClientProtocolVersion: client gone\n"); else rfbLogPerror("rfbProcessClientProtocolVersion: read"); rfbCloseClient(cl); @@ -676,12 +679,12 @@ static void rfbProcessClientProtocolVersion(rfbClientPtr cl) pv[sz_rfbProtocolVersionMsg] = 0; if (sscanf(pv, rfbProtocolVersionFormat, &major, &minor) != 2) { - rfbLog("rfbProcessClientProtocolVersion: not a valid RFB client\n"); + RFBLOGID("rfbProcessClientProtocolVersion: not a valid RFB client\n"); rfbCloseClient(cl); return; } if (major != 3) { - rfbLog("Unsupported protocol version %d.%d\n", major, minor); + RFBLOGID("Unsupported protocol version %d.%d\n", major, minor); rfbCloseClient(cl); return; } @@ -697,10 +700,10 @@ static void rfbProcessClientProtocolVersion(rfbClientPtr cl) cl->protocol_minor_ver = 3; if (cl->protocol_minor_ver != minor) - rfbLog("Non-standard protocol version 3.%d, using 3.%d instead\n", minor, - cl->protocol_minor_ver); + RFBLOGID("Non-standard protocol version 3.%d, using 3.%d instead\n", minor, + cl->protocol_minor_ver); else - rfbLog("Using protocol version 3.%d\n", cl->protocol_minor_ver); + RFBLOGID("Using protocol version 3.%d\n", cl->protocol_minor_ver); /* TightVNC protocol extensions are not enabled yet. */ cl->protocol_tightvnc = FALSE; @@ -724,7 +727,7 @@ static void rfbProcessClientInitMessage(rfbClientPtr cl) if ((n = ReadExact(cl, (char *)&ci, sz_rfbClientInitMsg)) <= 0) { if (n == 0) - rfbLog("rfbProcessClientInitMessage: client gone\n"); + RFBLOGID("rfbProcessClientInitMessage: client gone\n"); else rfbLogPerror("rfbProcessClientInitMessage: read"); rfbCloseClient(cl); @@ -764,10 +767,9 @@ static void rfbProcessClientInitMessage(rfbClientPtr cl) if (!rfbDisconnect) { for (otherCl = rfbClientHead; otherCl; otherCl = otherCl->next) { if ((otherCl != cl) && (otherCl->state == RFB_NORMAL)) { - rfbLog("-dontdisconnect: Not shared & existing client\n"); - rfbLog(" refusing new client %d (%s)\n", cl->id, cl->host); + RFBLOGID("-dontdisconnect: Not shared & existing client\n"); + RFBLOGID(" refusing new client\n"); rfbCloseClient(cl); - rfbClientNumber--; return; } } @@ -775,8 +777,8 @@ static void rfbProcessClientInitMessage(rfbClientPtr cl) for (otherCl = rfbClientHead; otherCl; otherCl = nextCl) { nextCl = otherCl->next; if ((otherCl != cl) && (otherCl->state == RFB_NORMAL)) { - rfbLog("Not shared - closing connection to Client %d (%s)\n", - otherCl->id, otherCl->host); + RFBLOGID("Not shared - closing connection to Client %d (%s)\n", + otherCl->id, otherCl->host); rfbCloseClient(otherCl); } } @@ -934,7 +936,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) case rfbFixColourMapEntries: READ(((char *)&msg) + 1, sz_rfbFixColourMapEntriesMsg - 1) - rfbLog("rfbProcessClientNormalMessage: FixColourMapEntries unsupported\n"); + RFBLOGID("rfbProcessClientNormalMessage: FixColourMapEntries unsupported\n"); rfbCloseClient(cl); return; @@ -973,63 +975,54 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) case rfbEncodingRaw: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using raw encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using raw encoding\n"); } break; case rfbEncodingRRE: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using rre encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using rre encoding\n"); } break; case rfbEncodingCoRRE: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using CoRRE encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using CoRRE encoding\n"); } break; case rfbEncodingHextile: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using hextile encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using hextile encoding\n"); } break; case rfbEncodingZlib: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using zlib encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using zlib encoding\n"); } break; case rfbEncodingZRLE: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using ZRLE encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using ZRLE encoding\n"); } break; case rfbEncodingZYWRLE: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using ZYWRLE encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using ZYWRLE encoding\n"); } break; case rfbEncodingTight: if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; - rfbLog("Using tight encoding for Client %d (%s)\n", cl->id, - cl->host); + RFBLOGID("Using tight encoding\n"); } break; case rfbEncodingXCursor: if (!cl->enableCursorShapeUpdates) { - rfbLog("Enabling X-style cursor updates for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling X-style cursor updates\n"); cl->enableCursorShapeUpdates = TRUE; cl->useRichCursorEncoding = FALSE; cl->cursorWasChanged = TRUE; @@ -1037,8 +1030,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) break; case rfbEncodingRichCursor: if (!cl->enableCursorShapeUpdates) { - rfbLog("Enabling full-color cursor updates for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling full-color cursor updates\n"); cl->enableCursorShapeUpdates = TRUE; cl->useRichCursorEncoding = TRUE; cl->cursorWasChanged = TRUE; @@ -1046,8 +1038,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) break; case rfbEncodingPointerPos: if (!cl->enableCursorPosUpdates) { - rfbLog("Enabling cursor position updates for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling cursor position updates\n"); cl->enableCursorPosUpdates = TRUE; cl->cursorWasMoved = TRUE; cl->cursorX = -1; @@ -1056,49 +1047,43 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) break; case rfbEncodingLastRect: if (!cl->enableLastRectEncoding) { - rfbLog("Enabling LastRect protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling LastRect protocol extension\n"); cl->enableLastRectEncoding = TRUE; } break; case rfbEncodingFence: if (!cl->enableFence) { - rfbLog("Enabling Fence protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling Fence protocol extension\n"); cl->enableFence = TRUE; } break; case rfbEncodingContinuousUpdates: if (!cl->enableCU) { - rfbLog("Enabling Continuous Updates protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling Continuous Updates protocol extension\n"); cl->enableCU = TRUE; } break; case rfbEncodingNewFBSize: if (!cl->enableDesktopSize) { if (!rfbAuthDisableRemoteResize) { - rfbLog("Enabling Desktop Size protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling Desktop Size protocol extension\n"); cl->enableDesktopSize = TRUE; } else - rfbLog("WARNING: Remote desktop resizing disabled per system policy.\n"); + RFBLOGID("WARNING: Remote desktop resizing disabled per system policy.\n"); } break; case rfbEncodingExtendedDesktopSize: if (!cl->enableExtDesktopSize) { if (!rfbAuthDisableRemoteResize) { - rfbLog("Enabling Extended Desktop Size protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling Extended Desktop Size protocol extension\n"); cl->enableExtDesktopSize = TRUE; } else - rfbLog("WARNING: Remote desktop resizing disabled per system policy.\n"); + RFBLOGID("WARNING: Remote desktop resizing disabled per system policy.\n"); } break; case rfbEncodingGII: if (!cl->enableGII) { - rfbLog("Enabling GII protocol extension for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Enabling GII protocol extension\n"); cl->enableGII = TRUE; } break; @@ -1110,8 +1095,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) if (cl->preferredEncoding == rfbEncodingTight) logTightCompressLevel = TRUE; else - rfbLog("Using compression level %d for Client %d (%s)\n", - cl->tightCompressLevel, cl->id, cl->host); + RFBLOGID("Using compression level %d\n", + cl->tightCompressLevel); if (rfbInterframe == -1) { if (cl->tightCompressLevel >= 5) { if (!InterframeOn(cl)) { @@ -1124,28 +1109,25 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } else if (enc >= (CARD32)rfbEncodingSubsamp1X && enc <= (CARD32)rfbEncodingSubsampGray) { cl->tightSubsampLevel = enc & 0xFF; - rfbLog("Using JPEG subsampling %d for Client %d (%s)\n", - cl->tightSubsampLevel, cl->id, cl->host); + RFBLOGID("Using JPEG subsampling %d\n", cl->tightSubsampLevel); } else if (enc >= (CARD32)rfbEncodingQualityLevel0 && enc <= (CARD32)rfbEncodingQualityLevel9) { cl->tightQualityLevel = JPEG_QUAL[enc & 0x0F]; cl->tightSubsampLevel = JPEG_SUBSAMP[enc & 0x0F]; cl->imageQualityLevel = enc & 0x0F; if (cl->preferredEncoding == rfbEncodingTight) - rfbLog("Using JPEG subsampling %d, Q%d for Client %d (%s)\n", - cl->tightSubsampLevel, cl->tightQualityLevel, cl->id, - cl->host); + RFBLOGID("Using JPEG subsampling %d, Q%d\n", + cl->tightSubsampLevel, cl->tightQualityLevel); else - rfbLog("Using image quality level %d for Client %d (%s)\n", - cl->imageQualityLevel, cl->id, cl->host); + RFBLOGID("Using image quality level %d\n", + cl->imageQualityLevel); } else if (enc >= (CARD32)rfbEncodingFineQualityLevel0 + 1 && enc <= (CARD32)rfbEncodingFineQualityLevel100) { cl->tightQualityLevel = enc & 0xFF; - rfbLog("Using JPEG quality %d for Client %d (%s)\n", - cl->tightQualityLevel, cl->id, cl->host); + RFBLOGID("Using JPEG quality %d\n", cl->tightQualityLevel); } else { - rfbLog("rfbProcessClientNormalMessage: ignoring unknown encoding %d (%x)\n", - (int)enc, (int)enc); + RFBLOGID("rfbProcessClientNormalMessage: ignoring unknown encoding %d (%x)\n", + (int)enc, (int)enc); } } /* switch (enc) */ } /* for (i = 0; i < msg.se.nEncodings; i++) */ @@ -1154,12 +1136,11 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) cl->preferredEncoding = rfbEncodingTight; if (cl->preferredEncoding == rfbEncodingTight && logTightCompressLevel) - rfbLog("Using Tight compression level %d for Client %d (%s)\n", - rfbTightCompressLevel(cl), cl->id, cl->host); + RFBLOGID("Using Tight compression level %d\n", + rfbTightCompressLevel(cl)); if (cl->enableCursorPosUpdates && !cl->enableCursorShapeUpdates) { - rfbLog("Disabling cursor position updates for Client %d (%s)\n", - cl->id, cl->host); + RFBLOGID("Disabling cursor position updates\n"); cl->enableCursorPosUpdates = FALSE; } @@ -1294,8 +1275,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) msg.cct.length = Swap32IfLE(msg.cct.length); if (msg.cct.length > rfbMaxClipboard) { - rfbLog("Truncating %d-byte incoming clipboard update to %d bytes.\n", - msg.cct.length, rfbMaxClipboard); + RFBLOGID("Truncating %d-byte incoming clipboard update to %d bytes.\n", + msg.cct.length, rfbMaxClipboard); ignoredBytes = msg.cct.length - rfbMaxClipboard; msg.cct.length = rfbMaxClipboard; } @@ -1343,8 +1324,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) READ(((char *)&msg) + 1, sz_rfbEnableContinuousUpdatesMsg - 1) if (!cl->enableFence || !cl->enableCU) { - rfbLog("Ignoring request to enable continuous updates because the client does not\n"); - rfbLog("support the flow control extensions.\n"); + RFBLOGID("Ignoring request to enable continuous updates because the client does not\n"); + RFBLOGID("support the flow control extensions.\n"); return; } @@ -1364,8 +1345,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) return; } - rfbLog("Continuous updates %s\n", - cl->continuousUpdates ? "enabled" : "disabled"); + RFBLOGID("Continuous updates %s\n", + cl->continuousUpdates ? "enabled" : "disabled"); return; } @@ -1379,8 +1360,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) flags = Swap32IfLE(msg.f.flags); if (msg.f.length > sizeof(data)) { - rfbLog("Ignoring fence. Payload of %d bytes is too large.\n", - msg.f.length); + RFBLOGID("Ignoring fence. Payload of %d bytes is too large.\n", + msg.f.length); SKIP(msg.f.length) } else { READ(data, msg.f.length) @@ -1392,7 +1373,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) #define EDSERROR(format, args...) { \ if (!strlen(errMsg)) \ - snprintf(errMsg, 256, "Desktop resize ERROR: "format"\n", args); \ + snprintf(errMsg, 256, "[%u] Desktop resize ERROR: "format"\n", \ + cl->id, args); \ result = rfbEDSResultInvalid; \ } @@ -1445,7 +1427,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (cl->viewOnly) { - rfbLog("NOTICE: Ignoring remote desktop resize request from a view-only client.\n"); + RFBLOGID("NOTICE: Ignoring remote desktop resize request from a view-only client.\n"); result = rfbEDSResultProhibited; } else if (result == rfbEDSResultSuccess) { result = ResizeDesktop(pScreen, cl, msg.sds.w, msg.sds.h, &newScreens); @@ -1491,11 +1473,11 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (msg.giicv.length != sz_rfbGIIClientVersionMsg - 4 || msg.giicv.version < 1) { - rfbLog("ERROR: Malformed GII client version message\n"); + RFBLOGID("ERROR: Malformed GII client version message\n"); rfbCloseClient(cl); return; } - rfbLog("Client supports GII version %d\n", msg.giicv.version); + RFBLOGID("Client supports GII version %d\n", msg.giicv.version); break; case rfbGIIDeviceCreate: @@ -1520,32 +1502,32 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) msg.giidc.numButtons = Swap32(msg.giidc.numButtons); } - rfbLog("GII Device Create: %s\n", msg.giidc.deviceName); + RFBLOGID("GII Device Create: %s\n", msg.giidc.deviceName); if (rfbGIIDebug) { - rfbLog(" Vendor ID: %d\n", msg.giidc.vendorID); - rfbLog(" Product ID: %d\n", msg.giidc.productID); - rfbLog(" Event mask: %.8x\n", msg.giidc.canGenerate); - rfbLog(" Registers: %d\n", msg.giidc.numRegisters); - rfbLog(" Valuators: %d\n", msg.giidc.numValuators); - rfbLog(" Buttons: %d\n", msg.giidc.numButtons); + RFBLOGID(" Vendor ID: %d\n", msg.giidc.vendorID); + RFBLOGID(" Product ID: %d\n", msg.giidc.productID); + RFBLOGID(" Event mask: %.8x\n", msg.giidc.canGenerate); + RFBLOGID(" Registers: %d\n", msg.giidc.numRegisters); + RFBLOGID(" Valuators: %d\n", msg.giidc.numValuators); + RFBLOGID(" Buttons: %d\n", msg.giidc.numButtons); } if (msg.giidc.length != sz_rfbGIIDeviceCreateMsg - 4 + msg.giidc.numValuators * sz_rfbGIIValuator) { - rfbLog("ERROR: Malformed GII device create message\n"); + RFBLOGID("ERROR: Malformed GII device create message\n"); rfbCloseClient(cl); return; } if (msg.giidc.numButtons > MAX_BUTTONS) { - rfbLog("GII device create ERROR: %d buttons exceeds max of %d\n", - msg.giidc.numButtons, MAX_BUTTONS); + RFBLOGID("GII device create ERROR: %d buttons exceeds max of %d\n", + msg.giidc.numButtons, MAX_BUTTONS); SKIP(msg.giidc.numValuators * sz_rfbGIIValuator); goto sendMessage; } if (msg.giidc.numValuators > MAX_VALUATORS) { - rfbLog("GII device create ERROR: %d valuators exceeds max of %d\n", - msg.giidc.numValuators, MAX_VALUATORS); + RFBLOGID("GII device create ERROR: %d valuators exceeds max of %d\n", + msg.giidc.numValuators, MAX_VALUATORS); SKIP(msg.giidc.numValuators * sz_rfbGIIValuator); goto sendMessage; } @@ -1560,7 +1542,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) dev.productID = msg.giidc.productID; if (dev.mode == Relative) { - rfbLog("GII device create ERROR: relative valuators not supported (yet)\n"); + RFBLOGID("GII device create ERROR: relative valuators not supported (yet)\n"); SKIP(msg.giidc.numValuators * sz_rfbGIIValuator); goto sendMessage; } @@ -1581,22 +1563,22 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (rfbGIIDebug) { - rfbLog(" Valuator: %s (%s)\n", v->longName, v->shortName); - rfbLog(" Index: %d\n", v->index); - rfbLog(" Range: min = %d, center = %d, max = %d\n", - v->rangeMin, v->rangeCenter, v->rangeMax); - rfbLog(" SI unit: %d\n", v->siUnit); - rfbLog(" SI add: %d\n", v->siAdd); - rfbLog(" SI multiply: %d\n", v->siMul); - rfbLog(" SI divide: %d\n", v->siDiv); - rfbLog(" SI shift: %d\n", v->siShift); + RFBLOGID(" Valuator: %s (%s)\n", v->longName, v->shortName); + RFBLOGID(" Index: %d\n", v->index); + RFBLOGID(" Range: min = %d, center = %d, max = %d\n", + v->rangeMin, v->rangeCenter, v->rangeMax); + RFBLOGID(" SI unit: %d\n", v->siUnit); + RFBLOGID(" SI add: %d\n", v->siAdd); + RFBLOGID(" SI multiply: %d\n", v->siMul); + RFBLOGID(" SI divide: %d\n", v->siDiv); + RFBLOGID(" SI shift: %d\n", v->siShift); } } for (i = 0; i < cl->numDevices; i++) { if (!strcmp(dev.name, cl->devices[i].name)) { - rfbLog("Device \'%s\' already exists with GII device ID %d\n", - dev.name, i + 1); + RFBLOGID("Device \'%s\' already exists with GII device ID %d\n", + dev.name, i + 1); dcmsg.deviceOrigin = Swap32IfLE(i + 1); goto sendMessage; } @@ -1623,9 +1605,9 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) dev.multitouch_uvnc = TRUE; dev.numTouches = dev.numButtons; if (dev.numTouches > UVNCGII_MAX_TOUCHES) { - rfbLog("WARNING: Requested number of simultaneous touches (%d) exceeds maximum of 10.\n", - dev.numTouches); - rfbLog(" Additional touches will be ignored.\n"); + RFBLOGID("WARNING: Requested number of simultaneous touches (%d) exceeds maximum of 10.\n", + dev.numTouches); + RFBLOGID(" Additional touches will be ignored.\n"); } dev.numButtons = 7; dev.numValuators = 4; @@ -1668,7 +1650,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) cl->numDevices++; dcmsg.deviceOrigin = Swap32IfLE(cl->numDevices); } - rfbLog("GII device ID = %d\n", cl->numDevices); + RFBLOGID("GII device ID = %d\n", cl->numDevices); sendMessage: /* Send back a GII device created message */ @@ -1695,7 +1677,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) msg.giidd.deviceOrigin = Swap32(msg.giidd.deviceOrigin); } if (msg.giidd.length != sz_rfbGIIDeviceDestroyMsg - 4) { - rfbLog("ERROR: Malformed GII device create message\n"); + RFBLOGID("ERROR: Malformed GII device create message\n"); rfbCloseClient(cl); return; } @@ -1733,19 +1715,19 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (eventSize != sz_rfbGIIButtonEvent || b.deviceOrigin <= 0 || b.buttonNumber < 1) { - rfbLog("ERROR: Malformed GII button event\n"); + RFBLOGID("ERROR: Malformed GII button event\n"); rfbCloseClient(cl); return; } if (eventSize > length) { - rfbLog("ERROR: Malformed GII event message\n"); + RFBLOGID("ERROR: Malformed GII event message\n"); rfbCloseClient(cl); return; } length -= eventSize; if (b.deviceOrigin < 1 || b.deviceOrigin > cl->numDevices) { - rfbLog("ERROR: GII button event from non-existent device %d\n", - b.deviceOrigin); + RFBLOGID("ERROR: GII button event from non-existent device %d\n", + b.deviceOrigin); rfbCloseClient(cl); return; } @@ -1754,21 +1736,22 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) (dev->eventMask & rfbGIIButtonPressMask) == 0) || (eventType == rfbGIIButtonRelease && (dev->eventMask & rfbGIIButtonReleaseMask) == 0)) { - rfbLog("ERROR: Device %d can't generate GII button events\n", - b.deviceOrigin); + RFBLOGID("ERROR: Device %d can't generate GII button events\n", + b.deviceOrigin); rfbCloseClient(cl); return; } if (b.buttonNumber > dev->numButtons) { - rfbLog("ERROR: GII button %d event for device %d exceeds button count (%d)\n", - b.buttonNumber, b.deviceOrigin, dev->numButtons); + RFBLOGID("ERROR: GII button %d event for device %d exceeds button count (%d)\n", + b.buttonNumber, b.deviceOrigin, dev->numButtons); rfbCloseClient(cl); return; } if (rfbGIIDebug) { - rfbLog("Device %d button %d %s\n", b.deviceOrigin, - b.buttonNumber, - eventType == rfbGIIButtonPress ? "PRESS" : "release"); + RFBLOGID("Device %d button %d %s\n", b.deviceOrigin, + b.buttonNumber, + eventType == rfbGIIButtonPress ? "PRESS" : + "release"); fflush(stderr); } ExtInputAddEvent(dev, eventType == rfbGIIButtonPress ? @@ -1791,19 +1774,19 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (eventSize != sz_rfbGIIValuatorEvent + sizeof(int) * v.count) { - rfbLog("ERROR: Malformed GII valuator event\n"); + RFBLOGID("ERROR: Malformed GII valuator event\n"); rfbCloseClient(cl); return; } if (eventSize > length) { - rfbLog("ERROR: Malformed GII event message\n"); + RFBLOGID("ERROR: Malformed GII event message\n"); rfbCloseClient(cl); return; } length -= eventSize; if (v.deviceOrigin < 1 || v.deviceOrigin > cl->numDevices) { - rfbLog("ERROR: GII valuator event from non-existent device %d\n", - v.deviceOrigin); + RFBLOGID("ERROR: GII valuator event from non-existent device %d\n", + v.deviceOrigin); rfbCloseClient(cl); return; } @@ -1817,8 +1800,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) (dev->eventMask & rfbGIIValuatorRelativeMask) == 0) || (eventType == rfbGIIValuatorAbsolute && (dev->eventMask & rfbGIIValuatorAbsoluteMask) == 0)) { - rfbLog("ERROR: Device %d cannot generate GII valuator events\n", - v.deviceOrigin); + RFBLOGID("ERROR: Device %d cannot generate GII valuator events\n", + v.deviceOrigin); rfbCloseClient(cl); return; } @@ -1835,8 +1818,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) }; if (rfbGIIDebug) - rfbLog("Device %d count=%d:\n", v.deviceOrigin, - numTouchEvents); + RFBLOGID("Device %d count=%d:\n", v.deviceOrigin, + numTouchEvents); for (i = 0; i < numTouchEvents; i++) { CARD32 formatFlags, expectedValues = 1, dummy; CARD64 dummy64; @@ -1845,7 +1828,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) if (littleEndian != *(const char *)&rfbEndianTest) formatFlags = Swap32(formatFlags); if (rfbGIIDebug) - rfbLog(" %d: format flags = 0x%.8x\n", i, formatFlags); + RFBLOGID(" %d: format flags = 0x%.8x\n", i, + formatFlags); if ((formatFlags & 0xFF) == 0x11) expectedValues += 2; if (formatFlags & UVNCGII_S1_FLAG) expectedValues++; if (formatFlags & UVNCGII_PR_FLAG) expectedValues++; @@ -1861,9 +1845,9 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) if (expectedValues * numTouchEvents != numValues) { static int alreadyWarned = 0; if (!alreadyWarned) { - rfbLog("WARNING: Malformed GII valuator event\n"); - rfbLog(" (Count should be %d, not %d.)\n", - expectedValues * numTouchEvents, numValues); + RFBLOGID("WARNING: Malformed GII valuator event\n"); + RFBLOGID(" (Count should be %d, not %d.)\n", + expectedValues * numTouchEvents, numValues); alreadyWarned = 1; } } @@ -1889,13 +1873,15 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) else dev->values[3] = rfbGIITouchEnd; if (rfbGIIDebug) { - rfbLog(" %d: touch ID = %d\n", i, dev->values[2]); - rfbLog(" %d: touch position = %d, %d\n", i, - dev->values[0], dev->values[1]); - rfbLog(" %d: touch type = %d [%s]\n", i, - dev->values[3], - dev->values[3] >= 0 && dev->values[3] < 6 ? - touch_type_string[dev->values[3]] : ""); + RFBLOGID(" %d: touch ID = %d\n", i, + dev->values[2]); + RFBLOGID(" %d: touch position = %d, %d\n", i, + dev->values[0], dev->values[1]); + RFBLOGID(" %d: touch type = %d [%s]\n", i, + dev->values[3], + dev->values[3] >= 0 && + dev->values[3] < 6 ? + touch_type_string[dev->values[3]] : ""); } ExtInputAddEvent(dev, MotionNotify, 0); dev->active_touches_uvnc[t][2] = -1; @@ -1903,7 +1889,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } continue; } else if ((formatFlags & 0xFF) != 0x11) { - rfbLog("ERROR: Unsupported multitouch event format\n"); + RFBLOGID("ERROR: Unsupported multitouch event format\n"); rfbCloseClient(cl); return; } @@ -1912,7 +1898,7 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) if (littleEndian != *(const char *)&rfbEndianTest) dev->values[2] = Swap32(dev->values[2]); if (rfbGIIDebug) - rfbLog(" %d: touch ID = %d\n", i, dev->values[2]); + RFBLOGID(" %d: touch ID = %d\n", i, dev->values[2]); if (formatFlags & 0x10) { CARD32 touchPos; @@ -1929,8 +1915,8 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) (int)round((double)dev->values[1] * 65535.0 / (double)rfbFB.height); if (rfbGIIDebug) - rfbLog(" %d: touch position = %d, %d\n", i, - dev->values[0], dev->values[1]); + RFBLOGID(" %d: touch position = %d, %d\n", i, + dev->values[0], dev->values[1]); } /* Ignore touch area */ @@ -1980,9 +1966,10 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } } if (rfbGIIDebug) - rfbLog(" %d: touch type = %d [%s]\n", i, dev->values[3], - dev->values[3] >= 0 && dev->values[3] < 6 ? - touch_type_string[dev->values[3]] : ""); + RFBLOGID(" %d: touch type = %d [%s]\n", i, + dev->values[3], + dev->values[3] >= 0 && dev->values[3] < 6 ? + touch_type_string[dev->values[3]] : ""); dev->valFirst = 0; dev->valCount = 4; @@ -1992,16 +1979,16 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) } if (v.first + v.count > dev->numValuators) { - rfbLog("ERROR: GII valuator event for device %d exceeds valuator count (%d)\n", - v.deviceOrigin, dev->numValuators); + RFBLOGID("ERROR: GII valuator event for device %d exceeds valuator count (%d)\n", + v.deviceOrigin, dev->numValuators); rfbCloseClient(cl); return; } if (rfbGIIDebug) - rfbLog("Device %d Valuator %s first=%d count=%d:\n", - v.deviceOrigin, - eventType == rfbGIIValuatorRelative ? "rel" : "ABS", - v.first, v.count); + RFBLOGID("Device %d Valuator %s first=%d count=%d:\n", + v.deviceOrigin, + eventType == rfbGIIValuatorRelative ? "rel" : "ABS", + v.first, v.count); for (i = v.first; i < v.first + v.count; i++) { READ((char *)&dev->values[i], sizeof(int)); if (littleEndian != *(const char *)&rfbEndianTest) @@ -2021,14 +2008,14 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) break; } default: - rfbLog("ERROR: This server cannot handle GII event type %d\n", - eventType); + RFBLOGID("ERROR: This server cannot handle GII event type %d\n", + eventType); rfbCloseClient(cl); return; } /* switch (eventType) */ } /* while (length > 0) */ if (length != 0) { - rfbLog("ERROR: Malformed GII event message\n"); + RFBLOGID("ERROR: Malformed GII event message\n"); rfbCloseClient(cl); return; } @@ -2040,9 +2027,9 @@ static void rfbProcessClientNormalMessage(rfbClientPtr cl) default: - rfbLog("rfbProcessClientNormalMessage: unknown message type %d\n", - msg.type); - rfbLog(" ... closing connection\n"); + RFBLOGID("rfbProcessClientNormalMessage: unknown message type %d\n", + msg.type); + RFBLOGID(" ... closing connection\n"); rfbCloseClient(cl); return; } /* switch (msg.type) */ @@ -2230,10 +2217,10 @@ Bool rfbSendFramebufferUpdate(rfbClientPtr cl) if ((updateRegion->extents.x2 > pScreen->width || updateRegion->extents.y2 > pScreen->height) && REGION_NUM_RECTS(updateRegion) > 0) { - rfbLog("WARNING: Framebuffer update at %d,%d with dimensions %dx%d has been clipped to the screen boundaries\n", - updateRegion->extents.x1, updateRegion->extents.y1, - updateRegion->extents.x2 - updateRegion->extents.x1, - updateRegion->extents.y2 - updateRegion->extents.y1); + RFBLOGID("WARNING: Framebuffer update at %d,%d with dimensions %dx%d has been clipped to the screen boundaries\n", + updateRegion->extents.x1, updateRegion->extents.y1, + updateRegion->extents.x2 - updateRegion->extents.x1, + updateRegion->extents.y2 - updateRegion->extents.y1); ClipToScreen(pScreen, updateRegion); } @@ -2500,15 +2487,15 @@ Bool rfbSendFramebufferUpdate(rfbClientPtr cl) updates++; if (tElapsed > 5.) { - rfbLog("%.2f updates/sec, %.2f Mpixels/sec, %.3f Mbits/sec\n", - (double)updates / tElapsed, mpixels / tElapsed, - (double)sendBytes / 125000. / tElapsed); - rfbLog("Time/update: Encode = %.3f ms, Other = %.3f ms\n", - tUpdate / (double)updates * 1000., - (tElapsed - tUpdate) / (double)updates * 1000.); + RFBLOGID("%.2f updates/sec, %.2f Mpixels/sec, %.3f Mbits/sec\n", + (double)updates / tElapsed, mpixels / tElapsed, + (double)sendBytes / 125000. / tElapsed); + RFBLOGID("Time/update: Encode = %.3f ms, Other = %.3f ms\n", + tUpdate / (double)updates * 1000., + (tElapsed - tUpdate) / (double)updates * 1000.); if (cl->compareFB) { - rfbLog("Identical Mpixels/sec: %.2f (%f %%)\n", - (double)idmpixels / tElapsed, idmpixels / mpixels * 100.0); + RFBLOGID("Identical Mpixels/sec: %.2f (%f %%)\n", + (double)idmpixels / tElapsed, idmpixels / mpixels * 100.0); idmpixels = 0.; } tUpdate = 0.; @@ -2610,10 +2597,10 @@ static Bool rfbSendCopyRegion(rfbClientPtr cl, RegionPtr reg, int dx, int dy) } if (reg->extents.x2 > pScreen->width || reg->extents.y2 > pScreen->height) - rfbLog("WARNING: CopyRect dest at %d,%d with dimensions %dx%d exceeds screen boundaries\n", - reg->extents.x1, reg->extents.y1, - reg->extents.x2 - reg->extents.x1, - reg->extents.y2 - reg->extents.y1); + RFBLOGID("WARNING: CopyRect dest at %d,%d with dimensions %dx%d exceeds screen boundaries\n", + reg->extents.x1, reg->extents.y1, + reg->extents.x2 - reg->extents.x1, + reg->extents.y2 - reg->extents.y1); while (nrects > 0) { @@ -2750,8 +2737,8 @@ Bool rfbSendRectEncodingRaw(rfbClientPtr cl, int x, int y, int w, int h) nlines = (UPDATE_BUF_SIZE - ublen) / bytesPerLine; if (nlines == 0) { - rfbLog("rfbSendRectEncodingRaw: send buffer too small for %d bytes per line\n", - bytesPerLine); + RFBLOGID("rfbSendRectEncodingRaw: send buffer too small for %d bytes per line\n", + bytesPerLine); rfbCloseClient(cl); return FALSE; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/rfbssl_openssl.c b/unix/Xvnc/programs/Xserver/hw/vnc/rfbssl_openssl.c index 5eb81fd4e..4d3a038f9 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/rfbssl_openssl.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/rfbssl_openssl.c @@ -2,7 +2,7 @@ * rfbssl_openssl.c - Secure socket funtions (openssl version) */ -/* Copyright (C) 2015, 2017-2020, 2022 D. R. Commander +/* Copyright (C) 2015, 2017-2020, 2022, 2024 D. R. Commander * Copyright (C) 2011 Gernot Tenchio * * This is free software; you can redistribute it and/or modify @@ -399,7 +399,7 @@ rfbSslCtx *rfbssl_init(rfbClientPtr cl, Bool anon) rfbssl_error("DH_generate_key()"); goto bailout; } - rfbLog("Anonymous TLS key length: %d bits\n", crypto.DH_size(dh) * 8); + RFBLOGID("Anonymous TLS key length: %d bits\n", crypto.DH_size(dh) * 8); if (!ssl.SSL_CTX_ctrl(ctx->ssl_ctx, SSL_CTRL_SET_TMP_DH, 0, (char *)dh)) { rfbssl_error("SSL_CTX_set_tmp_dh()"); goto bailout; @@ -422,13 +422,13 @@ rfbSslCtx *rfbssl_init(rfbClientPtr cl, Bool anon) rfbErr("Unable to load X.509 certificate file %s\n", rfbAuthX509Cert); goto bailout; } - rfbLog("Using X.509 certificate file %s\n", rfbAuthX509Cert); + RFBLOGID("Using X.509 certificate file %s\n", rfbAuthX509Cert); if (ssl.SSL_CTX_use_PrivateKey_file(ctx->ssl_ctx, keyfile, SSL_FILETYPE_PEM) <= 0) { rfbErr("Unable to load X.509 private key file %s\n", keyfile); goto bailout; } - rfbLog("Using X.509 private key file %s\n", keyfile); + RFBLOGID("Using X.509 private key file %s\n", keyfile); if (rfbAuthCipherSuites) { if (!ssl.SSL_CTX_set_cipher_list(ctx->ssl_ctx, rfbAuthCipherSuites)) { rfbssl_error("SSL_CTX_set_cipher_list()"); @@ -441,7 +441,7 @@ rfbSslCtx *rfbssl_init(rfbClientPtr cl, Bool anon) rfbssl_error("SSL_new()"); goto bailout; } - rfbLog("Available cipher suites: "); + RFBLOGID("Available cipher suites: "); list = ssl.SSL_get_cipher_list(ctx->ssl, priority++); while (list) { fprintf(stderr, "%s", list); @@ -490,8 +490,8 @@ int rfbssl_accept(rfbClientPtr cl) rfbssl_error("SSL_accept()"); return -1; } - rfbLog("Negotiated cipher suite: %s\n", - ssl.SSL_CIPHER_get_name(ssl.SSL_get_current_cipher(ctx->ssl))); + RFBLOGID("Negotiated cipher suite: %s\n", + ssl.SSL_CIPHER_get_name(ssl.SSL_get_current_cipher(ctx->ssl))); return 0; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/sockets.c b/unix/Xvnc/programs/Xserver/hw/vnc/sockets.c index 419eeec00..f3ace5526 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/sockets.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/sockets.c @@ -179,7 +179,7 @@ static void rfbSockNotify(int fd, int ready, void *data) if (!hosts_ctl("Xvnc", STRING_UNKNOWN, sockaddr_string(&addr, addrStr, INET6_ADDRSTRLEN), STRING_UNKNOWN)) { - rfbLog("Rejected connection from client %s\n", + rfbLog("Rejected connection from %s\n", sockaddr_string(&addr, addrStr, INET6_ADDRSTRLEN)) close(sock); return; @@ -211,9 +211,6 @@ static void rfbSockNotify(int fd, int ready, void *data) return; } - rfbLog("Got connection from client (%s)\n", - sockaddr_string(&addr, addrStr, INET6_ADDRSTRLEN)); - SetNotifyFd(sock, rfbSockNotify, X_NOTIFY_READ, NULL); rfbNewClientConnection(sock); @@ -292,10 +289,6 @@ void rfbCloseClient(rfbClientPtr cl) { int sock = cl->sock; - /* Reuse the client number if initialization failed. */ - if (cl->state < RFB_NORMAL) - rfbClientNumber--; - #if USETLS if (cl->sslctx) { shutdown(sock, SHUT_RDWR); @@ -526,7 +519,7 @@ int WriteExact(rfbClientPtr cl, char *buf, int len) if (cl->wsctx) { char *tmp = NULL; if ((len = webSocketsEncode(cl, buf, len, &tmp)) < 0) { - rfbLog("WriteExact: WebSockets encode error\n"); + RFBLOGID("WriteExact: WebSockets encode error\n"); return -1; } buf = tmp; diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/stats.c b/unix/Xvnc/programs/Xserver/hw/vnc/stats.c index d2853cf28..c4db1b86f 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/stats.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/stats.c @@ -2,7 +2,7 @@ * stats.c */ -/* Copyright (C) 2014 D. R. Commander. All Rights Reserved. +/* Copyright (C) 2014, 2024 D. R. Commander. All Rights Reserved. * Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * @@ -61,11 +61,11 @@ void rfbPrintStats(rfbClientPtr cl) int totalRectanglesSent = 0; long long totalBytesSent = 0; - rfbLog("Statistics:\n"); + RFBLOGID("Statistics:\n"); if ((cl->rfbKeyEventsRcvd != 0) || (cl->rfbPointerEventsRcvd != 0)) - rfbLog(" key events received %d, pointer events %d\n", - cl->rfbKeyEventsRcvd, cl->rfbPointerEventsRcvd); + RFBLOGID(" key events received %d, pointer events %d\n", + cl->rfbKeyEventsRcvd, cl->rfbPointerEventsRcvd); for (i = 0; i < MAX_ENCODINGS; i++) { totalRectanglesSent += cl->rfbRectanglesSent[i]; @@ -78,34 +78,34 @@ void rfbPrintStats(rfbClientPtr cl) cl->rfbCursorPosBytesSent + cl->rfbLastRectBytesSent); - rfbLog(" framebuffer updates %d, rectangles %d, bytes %d\n", - cl->rfbFramebufferUpdateMessagesSent, totalRectanglesSent, - totalBytesSent); + RFBLOGID(" framebuffer updates %d, rectangles %d, bytes %d\n", + cl->rfbFramebufferUpdateMessagesSent, totalRectanglesSent, + totalBytesSent); if (cl->rfbLastRectMarkersSent != 0) - rfbLog(" LastRect markers %d, bytes %d\n", cl->rfbLastRectMarkersSent, - cl->rfbLastRectBytesSent); + RFBLOGID(" LastRect markers %d, bytes %d\n", cl->rfbLastRectMarkersSent, + cl->rfbLastRectBytesSent); if (cl->rfbCursorShapeUpdatesSent != 0) - rfbLog(" cursor shape updates %d, bytes %d\n", - cl->rfbCursorShapeUpdatesSent, cl->rfbCursorShapeBytesSent); + RFBLOGID(" cursor shape updates %d, bytes %d\n", + cl->rfbCursorShapeUpdatesSent, cl->rfbCursorShapeBytesSent); if (cl->rfbCursorPosUpdatesSent != 0) - rfbLog(" cursor position updates %d, bytes %d\n", - cl->rfbCursorPosUpdatesSent, cl->rfbCursorPosBytesSent); + RFBLOGID(" cursor position updates %d, bytes %d\n", + cl->rfbCursorPosUpdatesSent, cl->rfbCursorPosBytesSent); for (i = 0; i < MAX_ENCODINGS; i++) { if (cl->rfbRectanglesSent[i] != 0) - rfbLog(" %s rectangles %d, bytes %d\n", encNames[i], - cl->rfbRectanglesSent[i], cl->rfbBytesSent[i]); + RFBLOGID(" %s rectangles %d, bytes %d\n", encNames[i], + cl->rfbRectanglesSent[i], cl->rfbBytesSent[i]); } if ((totalBytesSent - cl->rfbBytesSent[rfbEncodingCopyRect]) != 0) { - rfbLog(" raw equivalent %f Mbytes, compression ratio %f\n", - (double)cl->rfbRawBytesEquivalent / 1000000., - (double)cl->rfbRawBytesEquivalent / - (double)(totalBytesSent - cl->rfbBytesSent[rfbEncodingCopyRect] - - cl->rfbCursorShapeBytesSent - cl->rfbCursorPosBytesSent - - cl->rfbLastRectBytesSent)); + RFBLOGID(" raw equivalent %f Mbytes, compression ratio %f\n", + (double)cl->rfbRawBytesEquivalent / 1000000., + (double)cl->rfbRawBytesEquivalent / + (double)(totalBytesSent - cl->rfbBytesSent[rfbEncodingCopyRect] - + cl->rfbCursorShapeBytesSent - cl->rfbCursorPosBytesSent - + cl->rfbLastRectBytesSent)); } } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/tight.c b/unix/Xvnc/programs/Xserver/hw/vnc/tight.c index 6d4f6283f..d41e84e80 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/tight.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/tight.c @@ -4,8 +4,8 @@ * Routines to implement Tight Encoding */ -/* Copyright (C) 2010-2012, 2014, 2017, 2022 D. R. Commander. - * All Rights Reserved. +/* Copyright (C) 2010-2012, 2014, 2017, 2022, 2024 D. R. Commander. + * All Rights Reserved. * Copyright (C) 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * Copyright (C) 2004 Landmark Graphics Corporation. All Rights Reserved. * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved. @@ -1691,7 +1691,7 @@ static Bool SendJpegRect(threadparam *t, int x, int y, int w, int h, } if (!t->j) { if ((t->j = tjInitCompress()) == NULL) { - rfbLog("JPEG Error: %s\n", tjGetErrorStr()); + RFBLOGID("JPEG Error: %s\n", tjGetErrorStr()); return 0; } } @@ -1727,7 +1727,7 @@ static Bool SendJpegRect(threadparam *t, int x, int y, int w, int h, if (tjCompress(t->j, srcbuf, w, pitch, h, ps, (unsigned char *)t->tightAfterBuf, &size, subsamp, quality, flags) == -1) { - rfbLog("JPEG Error: %s\n", tjGetErrorStr()); + RFBLOGID("JPEG Error: %s\n", tjGetErrorStr()); free(tmpbuf); tmpbuf = NULL; return 0; } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/translate.c b/unix/Xvnc/programs/Xserver/hw/vnc/translate.c index 1f2be8e67..3d5c00b06 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/translate.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/translate.c @@ -25,7 +25,7 @@ #include #include "rfb.h" -static void PrintPixelFormat(rfbPixelFormat *pf); +static void PrintPixelFormat(rfbClientPtr cl); static Bool rfbSetClientColourMapBGR233(rfbClientPtr cl); Bool rfbEconomicTranslate = FALSE; @@ -178,8 +178,8 @@ void rfbTranslateNone(char *table, rfbPixelFormat *in, rfbPixelFormat *out, Bool rfbSetTranslateFunction(rfbClientPtr cl) { - rfbLog("Pixel format for Client %d (%s):\n", cl->id, cl->host); - PrintPixelFormat(&cl->format); + RFBLOGID("Pixel format:\n"); + PrintPixelFormat(cl); /* * Check that bits per pixel values are valid @@ -188,7 +188,7 @@ Bool rfbSetTranslateFunction(rfbClientPtr cl) if ((rfbServerFormat.bitsPerPixel != 8) && (rfbServerFormat.bitsPerPixel != 16) && (rfbServerFormat.bitsPerPixel != 32)) { - rfbLog("rfbSetTranslateFunction: server bits per pixel not 8, 16 or 32\n"); + RFBLOGID("rfbSetTranslateFunction: server bits per pixel not 8, 16 or 32\n"); rfbCloseClient(cl); return FALSE; } @@ -196,23 +196,23 @@ Bool rfbSetTranslateFunction(rfbClientPtr cl) if ((cl->format.bitsPerPixel != 8) && (cl->format.bitsPerPixel != 16) && (cl->format.bitsPerPixel != 32)) { - rfbLog("rfbSetTranslateFunction: client bits per pixel not 8, 16 or 32\n"); + RFBLOGID("rfbSetTranslateFunction: client bits per pixel not 8, 16 or 32\n"); rfbCloseClient(cl); return FALSE; } if (!rfbServerFormat.trueColour && (rfbServerFormat.bitsPerPixel != 8)) { - rfbLog("rfbSetTranslateFunction: server has colour map " - "but %d-bit - can only cope with 8-bit colour maps\n", - rfbServerFormat.bitsPerPixel); + RFBLOGID("rfbSetTranslateFunction: server has colour map " + "but %d-bit - can only cope with 8-bit colour maps\n", + rfbServerFormat.bitsPerPixel); rfbCloseClient(cl); return FALSE; } if (!cl->format.trueColour && (cl->format.bitsPerPixel != 8)) { - rfbLog("rfbSetTranslateFunction: client has colour map " - "but %d-bit - can only cope with 8-bit colour maps\n", - cl->format.bitsPerPixel); + RFBLOGID("rfbSetTranslateFunction: client has colour map " + "but %d-bit - can only cope with 8-bit colour maps\n", + cl->format.bitsPerPixel); rfbCloseClient(cl); return FALSE; } @@ -229,8 +229,8 @@ Bool rfbSetTranslateFunction(rfbClientPtr cl) /* colour map -> colour map */ - rfbLog("rfbSetTranslateFunction: both 8-bit colour map: " - "no translation needed\n"); + RFBLOGID("rfbSetTranslateFunction: both 8-bit colour map: " + "no translation needed\n"); cl->translateFn = rfbTranslateNone; return rfbSetClientColourMap(cl, 0, 0); } @@ -254,8 +254,8 @@ Bool rfbSetTranslateFunction(rfbClientPtr cl) /* colour map -> truecolour */ - rfbLog("rfbSetTranslateFunction: client is %d-bit trueColour," - " server has colour map\n", cl->format.bitsPerPixel); + RFBLOGID("rfbSetTranslateFunction: client is %d-bit trueColour," + " server has colour map\n", cl->format.bitsPerPixel); cl->translateFn = rfbTranslateWithSingleTableFns [rfbServerFormat.bitsPerPixel / 16] @@ -270,7 +270,7 @@ Bool rfbSetTranslateFunction(rfbClientPtr cl) /* client & server the same */ - rfbLog(" no translation needed\n"); + RFBLOGID(" no translation needed\n"); cl->translateFn = rfbTranslateNone; return TRUE; } @@ -318,7 +318,7 @@ static Bool rfbSetClientColourMapBGR233(rfbClientPtr cl) int r, g, b; if (cl->format.bitsPerPixel != 8) { - rfbLog("rfbSetClientColourMapBGR233: client not 8 bits per pixel\n"); + RFBLOGID("rfbSetClientColourMapBGR233: client not 8 bits per pixel\n"); rfbCloseClient(cl); return FALSE; } @@ -401,20 +401,22 @@ void rfbSetClientColourMaps(int firstColour, int nColours) } -static void PrintPixelFormat(rfbPixelFormat *pf) +static void PrintPixelFormat(rfbClientPtr cl) { + rfbPixelFormat *pf = &cl->format; + if (pf->bitsPerPixel == 1) { - rfbLog(" 1 bpp, %s sig bit in each byte is leftmost on the screen.\n", - (pf->bigEndian ? "most" : "least")); + RFBLOGID(" 1 bpp, %s sig bit in each byte is leftmost on the screen.\n", + (pf->bigEndian ? "most" : "least")); } else { - rfbLog(" %d bpp, depth %d%s\n", pf->bitsPerPixel, pf->depth, - ((pf->bitsPerPixel == 8) ? "" : - (pf->bigEndian ? ", big endian" : ", little endian"))); + RFBLOGID(" %d bpp, depth %d%s\n", pf->bitsPerPixel, pf->depth, + ((pf->bitsPerPixel == 8) ? "" : + (pf->bigEndian ? ", big endian" : ", little endian"))); if (pf->trueColour) - rfbLog(" true colour: max r %d g %d b %d, shift r %d g %d b %d\n", - pf->redMax, pf->greenMax, pf->blueMax, - pf->redShift, pf->greenShift, pf->blueShift); + RFBLOGID(" true colour: max r %d g %d b %d, shift r %d g %d b %d\n", + pf->redMax, pf->greenMax, pf->blueMax, + pf->redShift, pf->greenShift, pf->blueShift); else - rfbLog(" uses a colour map (not true colour).\n"); + RFBLOGID(" uses a colour map (not true colour).\n"); } } diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/websockets.c b/unix/Xvnc/programs/Xserver/hw/vnc/websockets.c index 57c7ce23a..2932e310a 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/websockets.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/websockets.c @@ -6,7 +6,7 @@ * http://www.whatwg.org/specs/web-socket-protocol/ */ -/* Copyright (C) 2018-2020 D. R. Commander +/* Copyright (C) 2018-2020, 2024 D. R. Commander * Copyright (C) 2010 Joel Martin * * This is free software; you can redistribute it and/or modify @@ -108,29 +108,30 @@ Bool webSocketsCheck(rfbClientPtr cl) ret = PeekExactTimeout(cl, bbuf, 4, WEBSOCKETS_CLIENT_CONNECT_WAIT_MS); if ((ret < 0) && (errno == ETIMEDOUT)) { - rfbLog("Normal socket connection\n"); + RFBLOGID("Normal socket connection\n"); return TRUE; } else if (ret <= 0) { - rfbLog("webSocketsHandshake: unknown connection error\n"); + RFBLOGID("webSocketsHandshake: unknown connection error\n"); return FALSE; } if (strncmp(bbuf, "RFB ", 4) == 0) { - rfbLog("Normal socket connection\n"); + RFBLOGID("Normal socket connection\n"); return TRUE; #ifdef USETLS } else if (strncmp(bbuf, "\x16", 1) == 0 || strncmp(bbuf, "\x80", 1) == 0) { rfbSslCtx *ctx = NULL; - rfbLog("Got TLS/SSL WebSockets connection\n"); + RFBLOGID("Got TLS/SSL WebSockets connection\n"); if (!(ctx = rfbssl_init(cl, FALSE))) { - rfbLog("webSocketsHandshake: rfbssl_init failed: %s\n", rfbssl_geterr()); + RFBLOGID("webSocketsHandshake: rfbssl_init failed: %s\n", + rfbssl_geterr()); return FALSE; } cl->sslctx = ctx; if ((ret = rfbssl_accept(cl)) < 0) { - rfbLog("webSocketsHandshake: rfbssl_accept failed: %s\n", - rfbssl_geterr()); + RFBLOGID("webSocketsHandshake: rfbssl_accept failed: %s\n", + rfbssl_geterr()); return FALSE; } ret = PeekExactTimeout(cl, bbuf, 4, WEBSOCKETS_CLIENT_CONNECT_WAIT_MS); @@ -141,11 +142,11 @@ Bool webSocketsCheck(rfbClientPtr cl) } if (strncmp(bbuf, "GET ", 4) != 0) { - rfbLog("webSocketsHandshake: invalid client header\n"); + RFBLOGID("webSocketsHandshake: invalid client header\n"); return FALSE; } - rfbLog("Got '%s' WebSockets handshake\n", scheme); + RFBLOGID("Got '%s' WebSockets handshake\n", scheme); if (!webSocketsHandshake(cl, scheme)) return FALSE; @@ -176,7 +177,7 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) if ((n < 0) && (errno == ETIMEDOUT)) break; if (n == 0) - rfbLog("webSocketsHandshake: client gone\n"); + RFBLOGID("webSocketsHandshake: client gone\n"); else rfbLogPerror("webSocketsHandshake: read"); free(response); @@ -194,14 +195,14 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) if ((n < 0) && (errno == ETIMEDOUT)) break; if (n == 0) - rfbLog("webSocketsHandshake: client gone\n"); + RFBLOGID("webSocketsHandshake: client gone\n"); else rfbLogPerror("webSocketsHandshake: read"); free(response); free(buf); return FALSE; } - rfbLog("Got key3\n"); + RFBLOGID("Got key3\n"); len += 8; } else { buf[len] = '\0'; @@ -232,7 +233,7 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) min(llen, 24))) == 0) { protocol = line + 24; buf[len - 2] = '\0'; - rfbLog("Got protocol: %s\n", protocol); + RFBLOGID("Got protocol: %s\n", protocol); } else if ((strncasecmp("sec-websocket-origin: ", line, min(llen, 22))) == 0) { sec_ws_origin = line + 22; @@ -254,25 +255,25 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) /* older hixie handshake, this could be removed if * a final standard is established -- removed now */ if (!sec_ws_version) { - rfbLog("Hixie no longer supported\n"); + RFBLOGID("Hixie no longer supported\n"); free(response); free(buf); return FALSE; } if (!(path && host && (origin || sec_ws_origin))) { - rfbLog("webSocketsHandshake: incomplete client handshake\n"); + RFBLOGID("webSocketsHandshake: incomplete client handshake\n"); free(response); free(buf); return FALSE; } if ((protocol) && (strstr(protocol, "base64"))) { - rfbLog(" - webSocketsHandshake: using base64 encoding\n"); + RFBLOGID(" - webSocketsHandshake: using base64 encoding\n"); base64 = TRUE; protocol = "base64"; } else { - rfbLog(" - webSocketsHandshake: using binary/raw encoding\n"); + RFBLOGID(" - webSocketsHandshake: using binary/raw encoding\n"); if ((protocol) && (strstr(protocol, "binary"))) protocol = "binary"; else @@ -283,7 +284,7 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) * Generate the WebSockets server response based on the the headers sent * by the client. */ - rfbLog(" - WebSockets client version hybi-%02d\n", sec_ws_version); + RFBLOGID(" - WebSockets client version hybi-%02d\n", sec_ws_version); webSocketsGenSha1Key(accept, sizeof(accept), sec_ws_key); if (strlen(protocol) > 0) @@ -294,12 +295,12 @@ static Bool webSocketsHandshake(rfbClientPtr cl, char *scheme) SERVER_HANDSHAKE_HYBI_NO_PROTOCOL, accept); if (WriteExact(cl, response, len) < 0) { - rfbLog("webSocketsHandshake: failed sending WebSockets response\n"); + RFBLOGID("webSocketsHandshake: failed sending WebSockets response\n"); free(response); free(buf); return FALSE; } - /* rfbLog("webSocketsHandshake: %s\n", response); */ + /* RFBLOGID("webSocketsHandshake: %s\n", response); */ free(response); free(buf); @@ -390,10 +391,10 @@ static int webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, if (-1 == (ret = rfbBase64NtoP((unsigned char *)src, len, wsctx->codeBufEncode + sz, wsctx->codeBufEncodeLen - sz))) { - rfbLog("%s: Base 64 encode failed\n", __func__); + RFBLOGID("%s: Base 64 encode failed\n", __func__); } else { if (ret != blen) - rfbLog("%s: Base 64 encode; something weird happened\n", __func__); + RFBLOGID("%s: Base 64 encode; something weird happened\n", __func__); ret += sz; } } else { diff --git a/unix/Xvnc/programs/Xserver/hw/vnc/zlib.c b/unix/Xvnc/programs/Xserver/hw/vnc/zlib.c index c2cd0241a..c773c68a1 100644 --- a/unix/Xvnc/programs/Xserver/hw/vnc/zlib.c +++ b/unix/Xvnc/programs/Xserver/hw/vnc/zlib.c @@ -4,7 +4,8 @@ * Routines to implement zlib based encoding (deflate). */ -/* Copyright (C) 2012, 2014, 2017, 2019 D. R. Commander. All Rights Reserved. +/* Copyright (C) 2012, 2014, 2017, 2019, 2024 D. R. Commander. + * All Rights Reserved. * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * @@ -155,7 +156,7 @@ static Bool rfbSendOneRectEncodingZlib(rfbClientPtr cl, int x, int y, int w, zlibAfterBufLen = cl->compStream.total_out - previousOut; if (deflateResult != Z_OK) { - rfbLog("zlib deflation error: %s\n", cl->compStream.msg); + RFBLOGID("zlib deflation error: %s\n", cl->compStream.msg); return FALSE; }