/* * Setup and teardown */ void dixResetRegistry(void) { ExtensionEntry extEntry; /* Free all memory */ while (nmajor--) { while (nminor[nmajor]) free(requests[nmajor][--nminor[nmajor]]); xfree(requests[nmajor]); } xfree(requests); xfree(nminor); while (nevent--) free(events[nevent]); xfree(events); while (nerror--) free(errors[nerror]); xfree(errors); xfree(resources); requests = NULL; nminor = NULL; events = NULL; errors = NULL; resources = NULL; nmajor = nevent = nerror = nresource = 0; /* Open the protocol file */ if (fh) fclose(fh); fh = fopen(FILENAME, "r"); if (!fh) LogMessage(X_WARNING, "Failed to open protocol names file " FILENAME); /* Add built-in resources */ RegisterResourceName(RT_NONE, "NONE"); RegisterResourceName(RT_WINDOW, "WINDOW"); RegisterResourceName(RT_PIXMAP, "PIXMAP"); RegisterResourceName(RT_GC, "GC"); RegisterResourceName(RT_FONT, "FONT"); RegisterResourceName(RT_CURSOR, "CURSOR"); RegisterResourceName(RT_COLORMAP, "COLORMAP"); RegisterResourceName(RT_CMAPENTRY, "COLORMAP ENTRY"); RegisterResourceName(RT_OTHERCLIENT, "OTHER CLIENT"); RegisterResourceName(RT_PASSIVEGRAB, "PASSIVE GRAB"); /* Add the core protocol */ memset(&extEntry, 0, sizeof(extEntry)); extEntry.name = CORE; RegisterExtensionNames(&extEntry); }
ExtensionEntry * AddExtension(const char *name, int NumEvents, int NumErrors, int (*MainProc)(ClientPtr c1), int (*SwappedMainProc)(ClientPtr c2), void (*CloseDownProc)(ExtensionEntry *e), unsigned short (*MinorOpcodeProc)(ClientPtr c3)) { int i; ExtensionEntry *ext, **newexts; if (!MainProc || !SwappedMainProc || !MinorOpcodeProc) return((ExtensionEntry *) NULL); if ((lastEvent + NumEvents > MAXEVENTS) || (unsigned)(lastError + NumErrors > LAST_ERROR)) { LogMessage(X_ERROR, "Not enabling extension %s: maximum number of " "events or errors exceeded.\n", name); return((ExtensionEntry *) NULL); } ext = calloc(sizeof (ExtensionEntry), 1); if (!ext) return NULL; if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION)) { free(ext); return NULL; } ext->name = strdup(name); ext->num_aliases = 0; ext->aliases = (char **)NULL; if (!ext->name) { dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION); free(ext); return((ExtensionEntry *) NULL); } i = NumExtensions; newexts = (ExtensionEntry **) realloc(extensions, (i + 1) * sizeof(ExtensionEntry *)); if (!newexts) { free(ext->name); dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION); free(ext); return((ExtensionEntry *) NULL); } NumExtensions++; extensions = newexts; extensions[i] = ext; ext->index = i; ext->base = i + EXTENSION_BASE; ext->CloseDown = CloseDownProc; ext->MinorOpcode = MinorOpcodeProc; ProcVector[i + EXTENSION_BASE] = MainProc; SwappedProcVector[i + EXTENSION_BASE] = SwappedMainProc; if (NumEvents) { ext->eventBase = lastEvent; ext->eventLast = lastEvent + NumEvents; lastEvent += NumEvents; } else { ext->eventBase = 0; ext->eventLast = 0; } if (NumErrors) { ext->errorBase = lastError; ext->errorLast = lastError + NumErrors; lastError += NumErrors; } else { ext->errorBase = 0; ext->errorLast = 0; } RegisterExtensionNames(ext); return ext; }