aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/nxagent/Init.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Init.c')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Init.c581
1 files changed, 581 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Init.c b/nx-X11/programs/Xserver/hw/nxagent/Init.c
new file mode 100644
index 000000000..a35e3d5a8
--- /dev/null
+++ b/nx-X11/programs/Xserver/hw/nxagent/Init.c
@@ -0,0 +1,581 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com) */
+/* Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> */
+/* Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
+/* Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de> */
+/* Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de> */
+/* Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com) */
+/* */
+/* NXAGENT, NX protocol compression and NX extensions to this software */
+/* are copyright of the aforementioned persons and companies. */
+/* */
+/* Redistribution and use of the present software is allowed according */
+/* to terms specified in the file LICENSE which comes in the source */
+/* distribution. */
+/* */
+/* All rights reserved. */
+/* */
+/* NOTE: This software has received contributions from various other */
+/* contributors, only the core maintainers and supporters are listed as */
+/* copyright holders. Please contact us, if you feel you should be listed */
+/* as copyright holder, as well. */
+/* */
+/**************************************************************************/
+
+/*
+
+Copyright 1993 by Davor Matic
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. Davor Matic makes no representations about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+
+*/
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include "X.h"
+#include "Xproto.h"
+#include "screenint.h"
+#include "input.h"
+#include "misc.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "mi.h"
+#include <X11/fonts/fontstruct.h>
+#include "dixfontstr.h"
+
+#include "Agent.h"
+#include "Display.h"
+#include "Screen.h"
+#include "Pointer.h"
+#include "Keyboard.h"
+#include "Handlers.h"
+#include "Events.h"
+#include "Init.h"
+#include "Args.h"
+#include "Client.h"
+#include "Options.h"
+#include "Drawable.h"
+#include "Pixmaps.h"
+#include "GCs.h"
+#include "Font.h"
+#include "Millis.h"
+#include "Error.h"
+#include "Keystroke.h"
+
+#include <nx/NX.h>
+#include "compext/Compext.h"
+#include "Reconnect.h"
+/*
+ * Set here the required log level.
+ */
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+#undef DUMP
+
+#define NXAGENT_VERSION NX_VERSION_CURRENT
+#define NXAGENT_VERSION_STRING NX_VERSION_CURRENT_STRING
+
+/*
+ * ProcVector array defined in tables.c.
+ */
+
+extern int (*ProcVector[256])(ClientPtr);
+
+/*
+ * From the fb code.
+ */
+
+extern int fbGCPrivateIndex;
+
+/*
+ * Stubs for the DPMS extension.
+ */
+
+#ifdef DPMSExtension
+
+void DPMSSet(int level);
+int DPMSGet(int *level);
+Bool DPMSSupported(void);
+
+#endif
+
+/*
+ * Our error logging function.
+ */
+
+void OsVendorVErrorFFunction(const char *f, va_list args);
+
+/*
+ * True if this is a fatal error.
+ */
+
+extern int OsVendorVErrorFFatal;
+
+/*
+ * Redirect the error output to a
+ * different file
+ */
+
+extern void (*OsVendorStartRedirectErrorFProc)();
+extern void (*OsVendorEndRedirectErrorFProc)();
+
+extern void SetVendorRelease(int release);
+
+void OsVendorStartRedirectErrorFFunction();
+void OsVendorEndRedirectErrorFFunction();
+
+/*
+ * Called by InitGlobals() in the
+ * new X server tree.
+ */
+
+
+static void nxagentGrabServerCallback(CallbackListPtr *callbacks, void *data,
+ void *args);
+
+void ddxInitGlobals(void)
+{
+ /*
+ * Install our error logging function.
+ */
+
+ OsVendorVErrorFProc = OsVendorVErrorFFunction;
+
+ OsVendorStartRedirectErrorFProc = OsVendorStartRedirectErrorFFunction;
+ OsVendorEndRedirectErrorFProc = OsVendorEndRedirectErrorFFunction;
+}
+
+/*
+ * Set if the remote display supports
+ * backing store.
+ */
+/*
+FIXME: These, if not removed, should at least
+ be moved to Display.h and Display.c.
+*/
+int nxagentBackingStore;
+int nxagentSaveUnder;
+
+/*
+ * This is true at startup and set to the value of
+ * nxagentFullGeneration at the end of InitInput.
+ *
+ * InitOutput
+ * nxagentOpenDisplay (if nxagentDoFullGeneration)
+ * nxagentCloseDisplay (if (nxagentDoFullGeneration && nxagentDisplay))
+ * nxagentFree*
+ * nxagentListRemoteFonts
+ * AddScreen
+ * nxagentOpenScreen
+ * InitInput
+ */
+
+int nxagentDoFullGeneration = 1;
+
+ /*
+ * 1 if agent running as X2goAgent
+ * 0 if NX Agent
+ */
+int nxagentX2go;
+
+/*
+ * Checking if agent is x2go agent
+ */
+
+void checkX2goAgent()
+{
+ extern const char *__progname;
+ if( strcasecmp(__progname,"x2goagent") == 0)
+ {
+ fprintf(stderr, "\nrunning as X2Go Agent\n");
+ nxagentX2go=1;
+ }
+ else
+ nxagentX2go=0;
+}
+
+
+/*
+ * Called at X server's initialization.
+ */
+
+void InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
+{
+ char *authority;
+ int i;
+
+ #ifdef __sun
+
+ char *environment;
+
+ #endif
+
+ /*
+ * Check if we running as X2Go Agent
+ */
+ checkX2goAgent();
+
+ /*
+ * Print our pid and version information.
+ */
+
+ if (serverGeneration <= 1)
+ {
+ fprintf(stderr, "\nNXAGENT - Version " NXAGENT_VERSION_STRING "\n\n");
+ fprintf(stderr, "Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com)\n");
+ fprintf(stderr, "Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de>\n");
+ fprintf(stderr, "Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>\n");
+ fprintf(stderr, "Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de>\n");
+ fprintf(stderr, "Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de>\n");
+ fprintf(stderr, "Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com)\n");
+ fprintf(stderr, "See https://github.com/ArcticaProject/nx-libs for more information.\n\n");
+
+ fprintf(stderr, "Info: Agent running with pid '%d'.\n", getpid());
+
+ fprintf(stderr, "Session: Starting session at '%s'.\n", GetTimeAsString());
+ saveAgentState("STARTING");
+ }
+
+ /*
+ * Avoid slowness due to buggy_repeat workaround
+ * in libcairo versions >= 1.10.
+ */
+
+ SetVendorRelease(70000000);
+
+ /*
+ * Init the time count for image rate.
+ */
+
+ if (nxagentOption(ImageRateLimit) != 0)
+ {
+ fprintf(stderr, "Info: Image rate limit set to %u kB/s.\n", nxagentOption(ImageRateLimit));
+ }
+
+ /*
+ * Unset the LD_LIBRARY_PATH variable in
+ * Popen() before calling execl() in the
+ * child process.
+ */
+
+ NXUnsetLibraryPath(1);
+
+ if (serverGeneration == 1)
+ {
+ AddCallback(&ServerGrabCallback, nxagentGrabServerCallback, NULL);
+ }
+
+ if (nxagentUserDefinedFontPath == 0)
+ {
+ #ifdef TEST
+ fprintf(stderr, "InitOutput: Calling nxagentVerifyDefaultFontPath.\n");
+ #endif
+
+ nxagentVerifyDefaultFontPath();
+ }
+ #ifdef TEST
+ else
+ {
+ fprintf(stderr, "InitOutput: User defined font path. Skipping the check on the fonts dir.\n");
+ }
+ #endif
+
+ if ((authority = getenv("NX_XAUTHORITY")))
+ {
+ #ifdef __sun
+
+ environment = malloc(15 + strlen(authority));
+
+ sprintf(environment, "XAUTHORITY=%s", authority);
+
+ if (putenv(environment) < 0)
+
+ #else
+
+ if (setenv("XAUTHORITY", authority, True) < 0)
+
+ #endif
+
+ {
+ fprintf(stderr, "Warning: Couldn't set the XAUTHORITY environment to [%s]\n",
+ authority);
+ }
+ }
+
+ nxagentInitBSPixmapList();
+
+ /*
+ * Open the display. We are at the early startup and
+ * the information we'll get from the remote X server
+ * will mandate some of the characteristics of the
+ * session, like the screen depth. Note that this re-
+ * liance on the remote display at session startup
+ * should be removed. We should always operate at 32
+ * bpp, internally, and do the required translations
+ * as soon as the graphic operation needs to be real-
+ * ized on the remote display.
+ */
+
+ nxagentOpenDisplay(argc, argv);
+
+/*
+FIXME: These variables, if not removed at all because have probably
+ become useless, should be moved to Display.h and Display.c.
+*/
+ nxagentBackingStore = XDoesBackingStore(DefaultScreenOfDisplay(nxagentDisplay));
+
+ #ifdef TEST
+ fprintf(stderr, "InitOutput: Remote display backing store support [%d].\n",
+ nxagentBackingStore);
+ #endif
+
+ nxagentSaveUnder = XDoesSaveUnders(DefaultScreenOfDisplay(nxagentDisplay));
+
+ #ifdef TEST
+ fprintf(stderr, "InitOutput: Remote display save under support [%d].\n",
+ nxagentSaveUnder);
+ #endif
+
+ /*
+ * Initialize the basic screen info.
+ */
+
+ nxagentSetScreenInfo(screenInfo);
+
+ /*
+ * Initialize pixmap formats for this screen.
+ */
+
+ nxagentSetPixmapFormats(screenInfo);
+
+ /*
+ * Get our own privates' index.
+ */
+
+ nxagentWindowPrivateIndex = AllocateWindowPrivateIndex();
+ nxagentGCPrivateIndex = AllocateGCPrivateIndex();
+ RT_NX_GC = CreateNewResourceType(nxagentDestroyNewGCResourceType);
+#ifdef HAS_XFONT2
+ nxagentFontPrivateIndex = xfont2_allocate_font_private_index();
+#else
+ nxagentFontPrivateIndex = AllocateFontPrivateIndex();
+#endif /* HAS_XFONT2 */
+ RT_NX_FONT = CreateNewResourceType(nxagentDestroyNewFontResourceType);
+ nxagentClientPrivateIndex = AllocateClientPrivateIndex();
+ nxagentPixmapPrivateIndex = AllocatePixmapPrivateIndex();
+ RT_NX_PIXMAP = CreateNewResourceType(nxagentDestroyNewPixmapResourceType);
+
+ RT_NX_CORR_BACKGROUND = CreateNewResourceType(nxagentDestroyCorruptedBackgroundResource);
+ RT_NX_CORR_WINDOW = CreateNewResourceType(nxagentDestroyCorruptedWindowResource);
+ RT_NX_CORR_PIXMAP = CreateNewResourceType(nxagentDestroyCorruptedPixmapResource);
+
+ fbGCPrivateIndex = AllocateGCPrivateIndex();
+
+ if (nxagentNumScreens == 0)
+ {
+ nxagentNumScreens = 1;
+ }
+
+ for (i = 0; i < nxagentNumScreens; i++)
+ {
+ AddScreen(nxagentOpenScreen, argc, argv);
+ }
+
+ nxagentNumScreens = screenInfo->numScreens;
+
+ /*
+ * Initialize the GCs used by the synchro-
+ * nization put images. We do it here beca-
+ * use we use the nxagentDefaultScreen.
+ */
+
+ nxagentAllocateGraphicContexts();
+
+ nxagentDoFullGeneration = nxagentFullGeneration;
+
+ /*
+ * Use a solid black root window
+ * background.
+ */
+
+ blackRoot = TRUE;
+
+ nxagentInitKeystrokes(False);
+}
+
+void
+nxagentNotifyConnection(int fd, int ready, void *data)
+{
+ nxagentDispatchEvents(NULL);
+}
+
+void InitInput(argc, argv)
+ int argc;
+ char *argv[];
+{
+ void *ptr, *kbd;
+
+ ptr = AddInputDevice(nxagentPointerProc, True);
+ kbd = AddInputDevice(nxagentKeyboardProc, True);
+
+ RegisterPointerDevice(ptr);
+ RegisterKeyboardDevice(kbd);
+
+ mieqInit(kbd, ptr);
+
+ /*
+ * Add the display descriptor to the
+ * set of descriptors awaited by the
+ * dispatcher.
+ */
+
+ nxagentAddXConnection();
+
+ if (nxagentOption(Shadow))
+ {
+ RegisterBlockAndWakeupHandlers(nxagentShadowBlockHandler, nxagentShadowWakeupHandler, NULL);
+ }
+ else
+ {
+ RegisterBlockAndWakeupHandlers(nxagentBlockHandler, nxagentWakeupHandler, NULL);
+ }
+
+ /*
+ * We let the proxy flush the link on our behalf
+ * after having opened the display. We are now
+ * entering the dispatcher. From now on we'll
+ * flush the proxy link explicitly.
+ */
+
+ #ifdef TEST
+ fprintf(stderr, "InitInput: Setting the NX flush policy to deferred.\n");
+ #endif
+
+ NXSetDisplayPolicy(nxagentDisplay, NXPolicyDeferred);
+}
+
+/*
+ * DDX specific abort routine. This is called
+ * by AbortServer() that, in turn, is called
+ * by FatalError().
+ */
+
+void AbortDDX()
+{
+ nxagentDoFullGeneration = True;
+
+ nxagentCloseDisplay();
+
+ /*
+ * Do the required finalization if we
+ * are not going through the normal
+ * X server shutdown.
+ */
+
+ if ((dispatchException & DE_TERMINATE) == 0)
+ {
+ nxagentAbortDisplay();
+ }
+}
+
+/*
+ * Called by GiveUp().
+ */
+
+void ddxGiveUp()
+{
+ AbortDDX();
+}
+
+void ddxBeforeReset(void)
+{
+}
+
+void OsVendorInit()
+{
+ return;
+}
+
+void OsVendorFatalError()
+{
+ /*
+ * Let the session terminate gracely
+ * from an user's standpoint.
+ */
+
+ fprintf(stderr, "Session: Aborting session at '%s'.\n", GetTimeAsString());
+
+ fprintf(stderr, "Session: Session aborted at '%s'.\n", GetTimeAsString());
+}
+
+void OsVendorVErrorFFunction(const char *f, va_list args)
+{
+ if (OsVendorVErrorFFatal == 0)
+ {
+ char buffer[1024];
+
+ vsnprintf(buffer, sizeof(buffer), f, args);
+
+ nxagentStartRedirectToClientsLog();
+
+ fprintf(stderr, "%s", buffer);
+
+ nxagentEndRedirectToClientsLog();
+ }
+ else
+ {
+ LogVWrite(-1, f, args);
+ }
+}
+
+void OsVendorStartRedirectErrorFFunction()
+{
+ nxagentStartRedirectToClientsLog();
+}
+
+void OsVendorEndRedirectErrorFFunction()
+{
+ nxagentEndRedirectToClientsLog();
+}
+
+ServerGrabInfoRec nxagentGrabServerInfo;
+
+static void nxagentGrabServerCallback(CallbackListPtr *callbacks, void *data,
+ void *args)
+{
+ ServerGrabInfoRec *grab = (ServerGrabInfoRec*)args;
+
+ nxagentGrabServerInfo.client = grab->client;
+ nxagentGrabServerInfo.grabstate = grab->grabstate;
+}
+
+#ifdef DPMSExtension
+
+void DPMSSet(int level)
+{
+}
+
+int DPMSGet(int *level)
+{
+ return -1;
+}
+
+Bool DPMSSupported(void)
+{
+ return 1;
+}
+
+#endif