Commit 92239daf authored by Reinhard Tartler's avatar Reinhard Tartler

Imported nxcomp-3.2.0-6.tar.gz

Summary: Imported nxcomp-3.2.0-6.tar.gz Keywords: Imported nxcomp-3.2.0-6.tar.gz into Git repository
parent d7a8d67d
......@@ -55,6 +55,8 @@ Auth::Auth(char *display, char *cookie)
dataSize_ = 0;
generatedCookie_ = 0;
if (display == NULL || *display == '\0' || cookie == NULL ||
*cookie == '\0' || strlen(cookie) != 32)
{
......@@ -316,16 +318,20 @@ int Auth::getCookie()
<< "auth command.\n" << logofs_flush;
#endif
#ifdef TEST
cerr << "Warning" << ": Failed to read data from the X "
<< "auth command.\n";
#endif
#ifdef PANIC
*logofs << "Auth: WARNING! Generating a fake cookie for "
<< "X authentication.\n" << logofs_flush;
#endif
#ifdef TEST
cerr << "Warning" << ": Generating a fake cookie for "
<< "X authentication.\n";
#endif
generateCookie(realCookie_);
}
......@@ -621,6 +627,8 @@ void Auth::generateCookie(char *cookie)
data >>= 8;
}
generatedCookie_ = 1;
#ifdef TEST
*logofs << "Auth: Generated X cookie string '"
<< cookie << "'.\n" << logofs_flush;
......
......@@ -52,6 +52,11 @@ class Auth
realData_ != NULL && dataSize_ != 0);
}
int isFake() const
{
return generatedCookie_;
}
//
// Method called in the channel class to find if the
// provided cookie matches the fake one. If the data
......@@ -107,6 +112,8 @@ class Auth
char *realData_;
int dataSize_;
int generatedCookie_;
};
#endif /* Auth_H */
ChangeLog:
nxcomp-3.2.0-6
- Changes considering that unsetenv() returns void on Mac OS X.
nxcomp-3.2.0-5
- Fixed TR03F02024. Assume the launchd unix socket as X socket.
- Changed the authorization cookie retrieval when using the launchd
socket on MacOSX, in order to wait for the X server start.
nxcomp-3.2.0-4
- Fixed TR03F02026. Unset environment variable LD_LIBRARY_PATH before
calling the exec function running nxclient.
nxcomp-3.2.0-3
- Fix addMsTimestamp() and subMsTimestamp(). Remove the check for
a valid input in diffTimestamp() and diffUsTimestamp().
nxcomp-3.2.0-2
- Fixed TR12E01973. Now the correct number of bits are used for the
number of points in a X_FillPoly request.
nxcomp-3.2.0-1
- Opened the 3.2.0 branch based on nxcomp-3.1.0-6.
nxcomp-3.1.0-6
- Always use a timeout of 50 ms to update the congestion counter.
......@@ -36,7 +66,7 @@ nxcomp-3.1.0-2
nxcomp-3.1.0-1
- Opened the 3.0.1 branch based on nxcomp-3.0.0-46.
- Opened the 3.1.0 branch based on nxcomp-3.0.0-46.
nxcomp-3.0.0-46
......@@ -325,7 +355,7 @@ nxcomp-3.0.0-15
- Removed the pending_ flag from the proxy and channel class mem-
bers. If needed, the classes will query the transport buffers
to see whether there is data pending.B
to see whether there is data pending.
- Removed the additional parameter from NXTransFlush().
......
......@@ -71,6 +71,10 @@ extern char *GetClientPath();
extern int CheckParent(char *name, char *type, int parent);
#ifdef __sun
extern char **environ;
#endif
//
// Close all the unused descriptors and
// install any signal handler that might
......@@ -86,6 +90,12 @@ static void SystemCleanup(char *name);
static void MemoryCleanup(char *name);
//
// Remove 'name' from the environment.
//
static int UnsetEnv(char *name);
//
// Start a nxclient process in dialog mode.
//
......@@ -187,6 +197,8 @@ int NXTransDialog(const char *caption, const char *message,
parent[DEFAULT_STRING_LIMIT - 1] = '\0';
UnsetEnv("LD_LIBRARY_PATH");
for (int i = 0; i < 2; i++)
{
if (local != 0)
......@@ -409,6 +421,8 @@ int NXTransClient(const char* display)
#endif
UnsetEnv("LD_LIBRARY_PATH");
for (int i = 0; i < 2; i++)
{
execlp(command, command, NULL);
......@@ -962,3 +976,58 @@ void MemoryCleanup(char *name)
EnableSignals();
}
int UnsetEnv(char *name)
{
int result;
#ifdef __sun
char **pEnv = environ;
int nameLen = strlen(name) + 1;
char *varName = new char[nameLen + 1];
strcpy(varName, name);
strcat(varName, "=");
pEnv = environ;
while (*pEnv != NULL)
{
if (!strncmp(varName, *pEnv, nameLen))
{
break;
}
*pEnv++;
}
while (*pEnv != NULL)
{
*pEnv = *(pEnv + 1);
pEnv++;
}
result = 0;
#else
#ifdef __APPLE__
unsetenv(name);
result = 0;
#else
result = unsetenv(name);
#endif
#endif
return result;
}
......@@ -1139,8 +1139,18 @@ int ClientChannel::handleRead(EncodeBuffer &encodeBuffer, const unsigned char *m
}
unsigned int numPoints = ((inputLength - 16) >> 2);
encodeBuffer.encodeCachedValue(numPoints, 14,
clientCache_ -> fillPolyNumPointsCache, 4);
if (control -> isProtoStep10() == 1)
{
encodeBuffer.encodeCachedValue(numPoints, 16,
clientCache_ -> fillPolyNumPointsCache, 4);
}
else
{
encodeBuffer.encodeCachedValue(numPoints, 14,
clientCache_ -> fillPolyNumPointsCache, 4);
}
encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_),
clientCache_ -> drawableCache);
encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, bigEndian_),
......
......@@ -659,10 +659,11 @@ Control::Control()
// time the session is negotiated.
//
protoStep6_ = 0;
protoStep7_ = 0;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep6_ = 0;
protoStep7_ = 0;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep10_ = 0;
}
Control::~Control()
......@@ -734,37 +735,51 @@ void Control::setProtoStep(int step)
{
case 6:
{
protoStep6_ = 1;
protoStep7_ = 0;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep6_ = 1;
protoStep7_ = 0;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep10_ = 0;
break;
}
case 7:
{
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 0;
protoStep9_ = 0;
protoStep10_ = 0;
break;
}
case 8:
{
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 1;
protoStep9_ = 0;
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 1;
protoStep9_ = 0;
protoStep10_ = 0;
break;
}
case 9:
{
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 1;
protoStep9_ = 1;
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 1;
protoStep9_ = 1;
protoStep10_ = 0;
break;
}
case 10:
{
protoStep6_ = 1;
protoStep7_ = 1;
protoStep8_ = 1;
protoStep9_ = 1;
protoStep10_ = 1;
break;
}
......@@ -783,7 +798,11 @@ void Control::setProtoStep(int step)
int Control::getProtoStep()
{
if (protoStep9_ == 1)
if (protoStep10_ == 1)
{
return 10;
}
else if (protoStep9_ == 1)
{
return 9;
}
......
......@@ -719,6 +719,11 @@ class Control
return protoStep9_;
}
int isProtoStep10()
{
return protoStep10_;
}
private:
//
......@@ -736,6 +741,7 @@ class Control
int protoStep7_;
int protoStep8_;
int protoStep9_;
int protoStep10_;
};
#endif /* Control_H */
......@@ -888,6 +888,13 @@ static int useSlaveSocket = 0;
static int useAgentSocket = 0;
//
// Set if the launchd service is running
// and its socket must be used as X socket.
//
static int useLaunchdSocket = 0;
//
// Set by user if he/she wants to modify
// the default TCP_NODELAY option as set
// in control.
......@@ -3745,7 +3752,90 @@ int SetupAuthInstance()
{
if (authCookie != NULL && *authCookie != '\0')
{
auth = new Auth(displayHost, authCookie);
if (useLaunchdSocket == 1)
{
//
// If we are going to retrieve the X11 autho-
// rization through the launchd service, make
// a connection to its socket to trigger the
// X server starting.
//
sockaddr_un launchdAddrUnix;
unsigned int launchdAddrLength = sizeof(sockaddr_un);
int launchdAddrFamily = AF_UNIX;
launchdAddrUnix.sun_family = AF_UNIX;
const int launchdAddrNameLength = 108;
int success = -1;
strncpy(launchdAddrUnix.sun_path, displayHost, launchdAddrNameLength);
*(launchdAddrUnix.sun_path + launchdAddrNameLength - 1) = '\0';
#ifdef TEST
*logofs << "Loop: Connecting to launchd service "
<< "on Unix port '" << displayHost << "'.\n" << logofs_flush;
#endif
int launchdFd = socket(launchdAddrFamily, SOCK_STREAM, PF_UNSPEC);
if (launchdFd < 0)
{
#ifdef PANIC
*logofs << "Loop: PANIC! Call to socket failed. "
<< "Error is " << EGET() << " '" << ESTR()
<< "'.\n" << logofs_flush;
#endif
}
else if ((success = connect(launchdFd, (sockaddr *) &launchdAddrUnix, launchdAddrLength)) < 0)
{
#ifdef WARNING
*logofs << "Loop: WARNING! Connection to launchd service "
<< "on Unix port '" << displayHost << "' failed "
<< "with error " << EGET() << ", '" << ESTR() << "'.\n"
<< logofs_flush;
#endif
}
if (launchdFd >= 0)
{
close(launchdFd);
}
//
// The real cookie will not be available
// until the X server starts. Query for the
// cookie in a loop, unless the connection
// to the launchd service failed.
//
int attempts = (success < 0 ? 1 : 10);
for (int i = 0; i < attempts; i++)
{
delete auth;
auth = new Auth(displayHost, authCookie);
if (auth != NULL && auth -> isFake() == 1)
{
usleep(200000);
continue;
}
break;
}
}
else
{
auth = new Auth(displayHost, authCookie);
}
if (auth == NULL || auth -> isValid() != 1)
{
......@@ -3758,6 +3848,20 @@ int SetupAuthInstance()
HandleCleanup();
}
else if (auth -> isFake() == 1)
{
#ifdef WARNING
*logofs << "Loop: WARNING! Could not retrieve the X server "
<< "authentication cookie.\n"
<< logofs_flush;
#endif
cerr << "Warning" << ": Failed to read data from the X "
<< "auth command.\n";
cerr << "Warning" << ": Generated a fake cookie for X "
<< "authentication.\n";
}
}
else
{
......@@ -4068,6 +4172,20 @@ int SetupDisplaySocket(int &xServerAddrFamily, sockaddr *&xServerAddr,
strcpy(display, displayHost);
#ifdef __APPLE__
if (strncasecmp(display, "/tmp/launch", 11) == 0)
{
#ifdef TEST
*logofs << "Loop: Using launchd service on socket '"
<< display << "'.\n" << logofs_flush;
#endif
useLaunchdSocket = 1;
}
#endif
char *separator = rindex(display, ':');
if ((separator == NULL) || !isdigit(*(separator + 1)))
......@@ -4092,7 +4210,16 @@ int SetupDisplaySocket(int &xServerAddrFamily, sockaddr *&xServerAddr,
<< xPort << "'.\n" << logofs_flush;
#endif
#ifdef __APPLE__
if (separator == display || strcmp(display, "unix") == 0 ||
useLaunchdSocket == 1)
#else
if (separator == display || strcmp(display, "unix") == 0)
#endif
{
//
// UNIX domain port.
......@@ -4129,6 +4256,15 @@ int SetupDisplaySocket(int &xServerAddrFamily, sockaddr *&xServerAddr,
snprintf(unixSocketDir, DEFAULT_STRING_LENGTH - 1, "%s/.X11-unix",
control -> TempPath);
#ifdef __APPLE__
if (useLaunchdSocket == 1)
{
snprintf(unixSocketDir, DEFAULT_STRING_LENGTH - 1, "%s", display);
}
#endif
*(unixSocketDir + DEFAULT_STRING_LENGTH - 1) = '\0';
#ifdef TEST
......@@ -4160,6 +4296,15 @@ int SetupDisplaySocket(int &xServerAddrFamily, sockaddr *&xServerAddr,
sprintf(unixSocketName, "%s/X%d", unixSocketDir, xPort);
#ifdef __APPLE__
if (useLaunchdSocket == 1)
{
sprintf(unixSocketName, "%s:%d", unixSocketDir, xPort);
}
#endif
#ifdef TEST
*logofs << "Loop: Assuming X socket name '" << unixSocketName
<< "'.\n" << logofs_flush;
......@@ -12345,9 +12490,13 @@ int SetVersion()
{
step = 7;
}
else if (major >= 3)
else if (major == 3)
{
if (minor > 0 || patch > 0)
if (minor >= 2)
{
step = 10;
}
else if (minor > 0 || patch > 0)
{
step = 9;
}
......@@ -12356,6 +12505,10 @@ int SetVersion()
step = 8;
}
}
else if (major > 3)
{
step = 10;
}
if (step == 0)
{
......
......@@ -2753,8 +2753,18 @@ int ServerChannel::handleWrite(const unsigned char *message, unsigned int length
}
unsigned int numPoints;
decodeBuffer.decodeCachedValue(numPoints, 14,
clientCache_ -> fillPolyNumPointsCache, 4);
if (control -> isProtoStep10() == 1)
{
decodeBuffer.decodeCachedValue(numPoints, 16,
clientCache_ -> fillPolyNumPointsCache, 4);
}
else
{
decodeBuffer.decodeCachedValue(numPoints, 14,
clientCache_ -> fillPolyNumPointsCache, 4);
}
outputLength = 16 + (numPoints << 2);
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeXidValue(value, clientCache_ -> drawableCache);
......
......@@ -410,14 +410,14 @@ void Statistics::updateBitrate(int bytes)
if (diffStartInMs > control -> ShortBitrateTimeFrame)
{
addMsToTimestamp(startShortFrameTs_, diffStartInMs);
addMsTimestamp(startShortFrameTs_, diffStartInMs);
}
diffStartInMs = diffTimestamp(thisFrameTs, startLongFrameTs_);
if (diffStartInMs > control -> LongBitrateTimeFrame)
{
addMsToTimestamp(startLongFrameTs_, diffStartInMs);
addMsTimestamp(startLongFrameTs_, diffStartInMs);
}
startFrameTs_ = thisFrameTs;
......
......@@ -87,20 +87,13 @@ inline T_timestamp getTimestamp(long ms)
inline long diffTimestamp(const T_timestamp &ts1, const T_timestamp &ts2)
{
if (ts1.tv_sec == 0 && ts1.tv_usec == 0)
{
return -1;
}
//
// Add 500 microseconds to round up
// to the nearest millisecond.
//
long ms = ((ts2.tv_sec * 1000 + (ts2.tv_usec + 500) / 1000) -
(ts1.tv_sec * 1000 + (ts1.tv_usec + 500) / 1000));
return (ms < 0 ? -1 : ms);
return ((ts2.tv_sec * 1000 + (ts2.tv_usec + 500) / 1000) -
(ts1.tv_sec * 1000 + (ts1.tv_usec + 500) / 1000));
}
//
......@@ -110,20 +103,8 @@ inline long diffTimestamp(const T_timestamp &ts1, const T_timestamp &ts2)
inline long diffUsTimestamp(const T_timestamp &ts1, const T_timestamp &ts2)
{
if (ts1.tv_sec == 0 && ts1.tv_usec == 0)
{
return -1;
}
//
// Add 500 microseconds to round up
// to the nearest millisecond.
//
long ms = ((ts2.tv_sec * 1000000 + ts2.tv_usec) -
(ts1.tv_sec * 1000000 + ts1.tv_usec));
return (ms < 0 ? -1 : ms);
return ((ts2.tv_sec * 1000000 + ts2.tv_usec) -
(ts1.tv_sec * 1000000 + ts1.tv_usec));
}
//
......@@ -234,40 +215,16 @@ inline bool isTimestamp(const T_timestamp &ts)
return 1;
}
inline void subMsToTimestamp(T_timestamp &ts, long ms)
inline void subMsTimestamp(T_timestamp &ts, long ms)
{
long sec = ms / 1000;
ts.tv_sec -= sec;
long mod = ms % (ms * 1000);
if (ts.tv_usec >= (mod * 1000))
{
ts.tv_sec -= mod * 1000;
}
else
{
ts.tv_sec--;
ts.tv_usec = 1000000 - mod * 1000;
}
ts.tv_sec -= ms / 1000;
ts.tv_usec -= (ms % 1000) * 1000;
}
inline void addMsToTimestamp(T_timestamp &ts, long ms)
inline void addMsTimestamp(T_timestamp &ts, long ms)
{
long sec = ms / 1000;
ts.tv_sec += sec;
long mod = ms % (ms * 1000);
ts.tv_usec += mod * 1000;
if (ts.tv_usec > 1000000)
{
ts.tv_sec += 1;
}
ts.tv_sec += ms / 1000;
ts.tv_usec += (ms % 1000) * 1000;
}
//
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment