46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
#define HOOK_NAME "clienstate"
 | 
						|
 | 
						|
#include <dix-config.h>
 | 
						|
 | 
						|
#include "dix/registry_priv.h"
 | 
						|
#include "os/client_priv.h"
 | 
						|
#include "os/auth.h"
 | 
						|
 | 
						|
#include "namespace.h"
 | 
						|
#include "hooks.h"
 | 
						|
 | 
						|
void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata)
 | 
						|
{
 | 
						|
    XNS_HOOK_HEAD(NewClientInfoRec);
 | 
						|
 | 
						|
    switch (client->clientState) {
 | 
						|
    case ClientStateInitial:
 | 
						|
        // better assign *someting* than null -- clients can't do anything yet anyways
 | 
						|
        XnamespaceAssignClient(subj, &ns_anon);
 | 
						|
        break;
 | 
						|
 | 
						|
    case ClientStateRunning:
 | 
						|
        subj->authId = AuthorizationIDOfClient(client);
 | 
						|
 | 
						|
        short unsigned int name_len = 0, data_len = 0;
 | 
						|
        const char * name = NULL;
 | 
						|
        char * data = NULL;
 | 
						|
        if (AuthorizationFromID(subj->authId, &name_len, &name, &data_len, &data)) {
 | 
						|
            XnamespaceAssignClient(subj, XnsFindByAuth(name_len, name, data_len, data));
 | 
						|
        } else {
 | 
						|
            XNS_HOOK_LOG("no auth data - assuming anon\n");
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case ClientStateRetained:
 | 
						|
        XnamespaceAssignClient(subj, NULL);
 | 
						|
        break;
 | 
						|
    case ClientStateGone:
 | 
						|
        XnamespaceAssignClient(subj, NULL);
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        XNS_HOOK_LOG("unknown state =%d\n", client->clientState);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
}
 |