Esempio n. 1
0
/*
 * 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);
}
Esempio n. 2
0
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;
}