summaryrefslogtreecommitdiffstats
path: root/libvncserver/main.c
diff options
context:
space:
mode:
authordscho <dscho>2006-02-22 13:03:22 +0000
committerdscho <dscho>2006-02-22 13:03:22 +0000
commitd3599be1b822b2afa3d27c2eca50c08edb9e5622 (patch)
treed02fa15977b025c44841efa0c929fc38730520f6 /libvncserver/main.c
parent880035ad548917ca3dff47a056289691763486ff (diff)
downloadlibtdevnc-d3599be1b822b2afa3d27c2eca50c08edb9e5622.tar.gz
libtdevnc-d3599be1b822b2afa3d27c2eca50c08edb9e5622.zip
add functions to unregister extensions/security types
Diffstat (limited to 'libvncserver/main.c')
-rw-r--r--libvncserver/main.c73
1 files changed, 68 insertions, 5 deletions
diff --git a/libvncserver/main.c b/libvncserver/main.c
index ada1a7a..bf14062 100644
--- a/libvncserver/main.c
+++ b/libvncserver/main.c
@@ -59,10 +59,21 @@ char rfbEndianTest = -1;
static rfbProtocolExtension* rfbExtensionHead = NULL;
+/*
+ * This method registers a list of new extensions.
+ * It avoids same extension getting registered multiple times.
+ * The order is not preserved if multiple extensions are
+ * registered at one-go.
+ */
void
rfbRegisterProtocolExtension(rfbProtocolExtension* extension)
{
- rfbProtocolExtension* last;
+ rfbProtocolExtension *head = rfbExtensionHead, *next = NULL;
+
+ if(extension == NULL)
+ return;
+
+ next = extension->next;
if (! extMutex_initialized) {
INIT_MUTEX(extMutex);
@@ -70,14 +81,66 @@ rfbRegisterProtocolExtension(rfbProtocolExtension* extension)
}
LOCK(extMutex);
- last = extension;
- while(last->next)
- last = last->next;
+ while(head != NULL) {
+ if(head == extension) {
+ UNLOCK(extMutex);
+ rfbRegisterProtocolExtension(next);
+ return;
+ }
+
+ head = head->next;
+ }
- last->next = rfbExtensionHead;
+ extension->next = rfbExtensionHead;
rfbExtensionHead = extension;
+
+ UNLOCK(extMutex);
+ rfbRegisterProtocolExtension(next);
+}
+
+/*
+ * This method unregisters a list of extensions.
+ * These extensions won't be available for any new
+ * client connection.
+ */
+void
+rfbUnregisterProtocolExtension(rfbProtocolExtension* extension)
+{
+
+ rfbProtocolExtension *cur = NULL, *pre = NULL;
+
+ if(extension == NULL)
+ return;
+
+ if (! extMutex_initialized) {
+ INIT_MUTEX(extMutex);
+ extMutex_initialized = 1;
+ }
+
+ LOCK(extMutex);
+
+ if(rfbExtensionHead == extension) {
+ rfbExtensionHead = rfbExtensionHead->next;
+ UNLOCK(extMutex);
+ rfbUnregisterProtocolExtension(extension->next);
+ return;
+ }
+
+ cur = pre = rfbExtensionHead;
+
+ while(cur) {
+ if(cur == extension) {
+ pre->next = cur->next;
+ break;
+ }
+ pre = cur;
+ cur = cur->next;
+ }
+
UNLOCK(extMutex);
+
+ rfbUnregisterProtocolExtension(extension->next);
}
rfbProtocolExtension* rfbGetExtensionIterator()