2025-08-08 20:00:36 +02:00

179 lines
5.0 KiB
C

/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com) */
/* Copyright (c) 2008-2017 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> */
/* Copyright (c) 2011-2022 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
/* Copyright (c) 2014-2019 Mihai Moldovan <ionic@ionic.de> */
/* Copyright (c) 2014-2022 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. */
/* */
/**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <nx/NX.h>
#include "Binder.h"
#include "Options.h"
/*
* Set here the required log level.
*/
#define PANIC
#define WARNING
#undef TEST
#undef DEBUG
int nxagentCheckBinder(int argc, char *argv[], int i)
{
if (++i < argc)
{
char *display = argv[i];
/*
* Check if a display specification follows the -B switch.
*/
char *found = rindex(display, ':');
if (found == NULL || *(found + 1) == '\0' ||
isdigit(*(found + 1)) == 0)
{
fprintf(stderr, "Error: Can't identify the display port in string '%s'.\n",
display);
return 0;
}
int port = atoi(found + 1);
#ifdef TEST
fprintf(stderr, "nxagentCheckBinder: Identified agent display port [%d].\n",
port);
#endif
/*
* The NX options must be specified in the DISPLAY
* environment. Check if the display specified on the command line
* matches the NX virtual display.
*/
display = getenv("DISPLAY");
if (display == NULL || *display == '\0')
{
fprintf(stderr, "Error: No DISPLAY environment found.\n");
return 0;
}
found = rindex(display, ':');
if (found == NULL || *(found + 1) == '\0' ||
isdigit(*(found + 1)) == 0 || atoi(found + 1) != port)
{
fprintf(stderr, "Error: The NX display doesn't match the agent display :%d.\n",
port);
return 0;
}
#ifdef TEST
fprintf(stderr, "nxagentCheckBinder: Identified NX display port [%d].\n",
atoi(found + 1));
#endif
/*
* Save the proxy options. They will be later used to create the
* transport.
*/
nxagentChangeOption(Rootless, False);
nxagentChangeOption(Desktop, False);
nxagentChangeOption(Binder, True);
/*
* FIXME: This now points to the buffer that was returned by
* getenv(). It is to be decided how to handle the values of type
* string in the Options repository.
*/
nxagentChangeOption(BinderOptions, display);
return 2;
}
fprintf(stderr, "Error: No display port specified in command.\n");
return 0;
}
int nxagentBinderLoop(void)
{
struct timeval timeout;
char *options = nxagentOption(BinderOptions);
#ifdef TEST
fprintf(stderr, "nxagentBinderLoop: Creating the NX transport.\n");
#endif
if (NXTransCreate(NX_FD_ANY, NX_MODE_CLIENT, options) < 0)
{
#ifdef TEST
fprintf(stderr, "nxagentBinderLoop: PANIC! Error creating the NX transport.\n");
#endif
return -1;
}
#ifdef TEST
fprintf(stderr, "nxagentBinderLoop: Yielding control to the NX entry point.\n");
#endif
while (NXTransRunning(NX_FD_ANY))
{
#ifdef DEBUG
fprintf(stderr, "nxagentBinderLoop: Going to run a new NX proxy loop.\n");
#endif
timeout.tv_sec = 10;
timeout.tv_usec = 0;
NXTransContinue(&timeout);
#ifdef DEBUG
fprintf(stderr, "nxagentBinderLoop: Completed execution of the NX loop.\n");
#endif
}
#ifdef TEST
fprintf(stderr, "nxagentBinderLoop: Exiting the NX proxy binder loop.\n");
#endif
return 1;
}
void nxagentBinderExit(int code)
{
NXTransExit(code);
}