Exemplo n.º 1
0
static void
LoadResources( CfgArr *conf )
{
	char **vptr, **pptr, *cptr;
	long *iptr, i, id, nu, j, nptr, nint, nchr;

	if (conf->data)
		free( conf->data );
	conf->numCfgEnt = GRecvInt();
	nptr = GRecvInt();
	nint = GRecvInt();
	nchr = GRecvInt();
	if (!(conf->data = Malloc( conf->numCfgEnt *
	                             (sizeof(long) +
	                              sizeof(char *)) +
	                           nptr * sizeof(char *) +
	                           nint * sizeof(long) +
	                           nchr )))
	{
		CloseGetter();
		return;
	}
	vptr = (char **)conf->data;
	pptr = vptr + conf->numCfgEnt;
	conf->idx = (long *)(pptr + nptr);
	iptr = conf->idx + conf->numCfgEnt;
	cptr = (char *)(iptr + nint);
	for (i = 0; i < conf->numCfgEnt; i++) {
		id = GRecvInt();
		conf->idx[i] = id;
		switch (id & C_TYPE_MASK) {
		case C_TYPE_INT:
			vptr[i] = (char *)((unsigned long)GRecvInt());
			break;
		case C_TYPE_STR:
			vptr[i] = cptr;
			cptr += GRecvStrBuf( cptr );
			break;
		case C_TYPE_ARGV:
			nu = GRecvInt();
			vptr[i] = (char *)pptr;
			for (j = 0; j < nu; j++) {
				*pptr++ = cptr;
				cptr += GRecvStrBuf( cptr );
			}
			*pptr++ = (char *)0;
			break;
		default:
			LogError( "Config reader supplied unknown data type in id %#x\n",
			          id );
			break;
		}
	}
}
Exemplo n.º 2
0
static int
GetDeps()
{
	int ncf, i, dep, ret;
	CfgFile *cf;

	OpenGetter();
	GSendInt( GC_Files );
	ncf = GRecvInt();
	if (!(cf = Malloc( ncf * sizeof(*cf) ))) {
		CloseGetter();
		return 0;
	}
	for (i = 0; i < ncf; i++) {
		cf[i].name = newStr( GRecvStr() );
		if ((dep = cf[i].depidx = GRecvInt()) != -1)
			cf[i].deptime = mTime( cf[dep].name->str );
	}
	if (cfgFiles) {
		for (i = 0; i < numCfgFiles; i++)
			delStr( cfgFiles[i].name );
		free( cfgFiles );
	}
	ret = 1;
	cfgFiles = cf;
	numCfgFiles = ncf;
	for (i = 0; i < as(cfgMapT); i++) {
		GSendInt( cfgMapT[i] );
		if ((cfgMap[i] = GRecvInt()) < 0) {
			LogError( "Config reader does not support config cathegory %#x\n",
			          cfgMapT[i] );
			ret = 0;
		}
	}
	GSendInt( -1 );
	return ret;
}
Exemplo n.º 3
0
static void manage(struct sockaddr *from, int fromlen, int length, int fd)
{
    CARD32 sessionID;
    CARD16 displayNumber;
    ARRAY8 displayClass;
    int expectlen;
    struct protoDisplay *pdpy;
    struct display *d;
    char *name = NULL;
    char *class2 = NULL;
    XdmcpNetaddr from_save;
    ARRAY8 clientAddress, clientPort;
    CARD16 connectionType;

    Debug("<manage> %d\n", length);
    displayClass.data = 0;
    displayClass.length = 0;
    if(XdmcpReadCARD32(&buffer, &sessionID) && XdmcpReadCARD16(&buffer, &displayNumber) && XdmcpReadARRAY8(&buffer, &displayClass))
    {
        expectlen = 4 +                      /* session ID */
                    2 +                      /* displayNumber */
                    2 + displayClass.length; /* displayClass */
        if(expectlen != length)
        {
            Debug("<manage> length error got %d expect %d\n", length, expectlen);
            goto abort;
        }
        pdpy = FindProtoDisplay((XdmcpNetaddr)from, fromlen, displayNumber);
        Debug("<manage> session ID %ld, pdpy %p\n", (long)sessionID, pdpy);
        if(!pdpy || pdpy->sessionID != sessionID)
        {
            /*
             * We may have already started a session for this display
             * but it hasn't seen the response in the form of an
             * XOpenDisplay() yet. So check if it is in the list of active
             * displays, and if so check that the session id's match.
             * If all this is true, then we have a duplicate request that
             * can be ignored.
             */
            if(!pdpy && (d = FindDisplayByAddress((XdmcpNetaddr)from, fromlen, displayNumber)) && d->sessionID == sessionID)
            {
                Debug("manage: got duplicate pkt, ignoring\n");
                goto abort;
            }
            Debug("session ID %ld refused\n", (long)sessionID);
            if(pdpy)
                Debug("existing session ID %ld\n", (long)pdpy->sessionID);
            send_refuse(from, fromlen, sessionID, fd);
        }
        else
        {
            name = NetworkAddressToName(pdpy->connectionType, &pdpy->connectionAddress, from, pdpy->displayNumber);
            if(!name)
            {
                Debug("could not compute display name\n");
                send_failed(from, fromlen, "(no name)", sessionID, "out of memory", fd);
                goto abort;
            }
            Debug("computed display name: %s\n", name);
            if((d = FindDisplayByName(name)))
            {
                Debug("terminating active session for %s\n", d->name);
                StopDisplay(d);
            }
            if(displayClass.length)
            {
                if(!StrNDup(&class2, (char *)displayClass.data, displayClass.length))
                {
                    send_failed(from, fromlen, name, sessionID, "out of memory", fd);
                    goto abort;
                }
            }
            if(!(from_save = (XdmcpNetaddr)Malloc(fromlen)))
            {
                send_failed(from, fromlen, name, sessionID, "out of memory", fd);
                goto abort;
            }
            memmove(from_save, from, fromlen);
            if(!(d = NewDisplay(name)))
            {
                free((char *)from_save);
                send_failed(from, fromlen, name, sessionID, "out of memory", fd);
                goto abort;
            }
            d->class2 = class2;
            class2 = 0;
            d->displayType = dForeign | dTransient | dFromXDMCP;
            d->sessionID = pdpy->sessionID;
            d->from.data = (unsigned char *)from_save;
            d->from.length = fromlen;
            d->displayNumber = pdpy->displayNumber;
            ClientAddress(from, &clientAddress, &clientPort, &connectionType);
            d->useChooser = 0;
            d->xdmcpFd = fd;
            if(IsIndirectClient(&clientAddress, connectionType))
            {
                Debug("IsIndirectClient\n");
                ForgetIndirectClient(&clientAddress, connectionType);
                if(UseChooser(&clientAddress, connectionType))
                {
                    d->useChooser = 1;
                    Debug("use chooser for %s\n", d->name);
                }
            }
            d->clientAddr = clientAddress;
            d->connectionType = connectionType;
            d->remoteHost = NetworkAddressToHostname(pdpy->connectionType, &pdpy->connectionAddress);

            XdmcpDisposeARRAY8(&clientPort);
            if(pdpy->fileAuthorization)
            {
                d->authorizations = (Xauth **)Malloc(sizeof(Xauth *));
                if(!d->authorizations)
                {
                    free((char *)from_save);
                    free((char *)d);
                    send_failed(from, fromlen, name, sessionID, "out of memory", fd);
                    goto abort;
                }
                d->authorizations[0] = pdpy->fileAuthorization;
                d->authNum = 1;
                pdpy->fileAuthorization = 0;
            }
            DisposeProtoDisplay(pdpy);
            Debug("starting display %s,%s\n", d->name, d->class2);
            if(LoadDisplayResources(d) < 0)
            {
                LogError(
                    "Unable to read configuration for display %s; "
                    "stopping it.\n",
                    d->name);
                StopDisplay(d);
            }
            else
                StartDisplay(d);
            CloseGetter();
        }
    }
abort:
    XdmcpDisposeARRAY8(&displayClass);
    if(name)
        free((char *)name);
    if(class2)
        free((char *)class2);
}