Beispiel #1
0
QList<DpySpec>
fetchSessions(int flags)
{
    QList<DpySpec> sessions;
    DpySpec tsess;

    gSet(1);
    gSendInt(G_List);
    gSendInt(flags);
  next:
    while (!(tsess.display = qString(gRecvStr())).isEmpty()) {
        tsess.from = qString(gRecvStr());
#ifdef HAVE_VTS
        tsess.vt = gRecvInt();
#endif
        tsess.user = qString(gRecvStr());
        tsess.session = qString(gRecvStr());
        tsess.flags = gRecvInt();
        if ((tsess.flags & isTTY) && !tsess.from.isEmpty())
            for (int i = 0; i < sessions.size(); i++)
                if (!sessions[i].user.isEmpty() &&
                    sessions[i].user == tsess.user &&
                    sessions[i].from == tsess.from)
                {
                    sessions[i].count++;
                    goto next;
                }
        tsess.count = 1;
        sessions.append(tsess);
    }
    gSet(0);
    return sessions;
}
Beispiel #2
0
static void
displayStr( int lv, const char *msg )
{
	prepareErrorGreet();
	gSendInt( lv );
	gSendStr( msg );
	gRecvInt();
}
Beispiel #3
0
static void
sendStr( int lv, const char *msg )
{
	gSet( &ctltalk );
	gSendInt( lv );
	gSendStr( msg );
	gRecvInt();
}
Beispiel #4
0
static void
reqCfg( int id )
{
	gSendInt( G_GetCfg );
	gSendInt( id );
	switch (gRecvInt()) {
	case GE_NoEnt:
		logPanic( "Config value %#x not available\n", id );
	case GE_BadType:
		logPanic( "Core does not know type of config value %#x\n", id );
	}
}
Beispiel #5
0
int
getCfgInt( int id )
{
	reqCfg( id );
	return gRecvInt();
}
Beispiel #6
0
ARRAY8Ptr
getLocalAddress(void)
{
    static int haveLocalAddress;

    if (!haveLocalAddress) {
#if defined(IPv6) && defined(AF_INET6)
        struct addrinfo *ai;

        if (getaddrinfo(localHostname(), 0, 0, &ai)) {
            XdmcpAllocARRAY8(&localAddress, 4);
            localAddress.data[0] = 127;
            localAddress.data[1] = 0;
            localAddress.data[2] = 0;
            localAddress.data[3] = 1;
        } else {
            if (ai->ai_family == AF_INET) {
                XdmcpAllocARRAY8(&localAddress, sizeof(struct in_addr));
                memcpy(localAddress.data,
                       &((struct sockaddr_in *)ai->ai_addr)->sin_addr,
                       sizeof(struct in_addr));
            } else /* if (ai->ai_family == AF_INET6) */ {
                XdmcpAllocARRAY8(&localAddress, sizeof(struct in6_addr));
                memcpy(localAddress.data,
                       &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr,
                       sizeof(struct in6_addr));
            }
            freeaddrinfo(ai);
#else
        struct hostent *hostent;

        if ((hostent = gethostbyname(localHostname()))) {
            XdmcpAllocARRAY8(&localAddress, hostent->h_length);
            memmove(localAddress.data, hostent->h_addr, hostent->h_length);
#endif
            haveLocalAddress = True;
        }
    }
    return &localAddress;
}


void
scanAccessDatabase(int force)
{
    struct _displayAddress *da;
    char *cptr;
    int nChars, i;

    debug("scanAccessDatabase\n");
    if (Setjmp(cnftalk.errjmp))
        return; /* may memleak */
    if (startConfig(GC_gXaccess, &accData->dep, force) <= 0)
        return;
    free(accData->hostList);
    accData->nHosts = gRecvInt();
    accData->nListens = gRecvInt();
    accData->nAliases = gRecvInt();
    accData->nAcls = gRecvInt();
    nChars = gRecvInt();
    if (!(accData->hostList = (HostEntry *)
              Malloc(accData->nHosts * sizeof(HostEntry) +
                     accData->nListens * sizeof(ListenEntry) +
                     accData->nAliases * sizeof(AliasEntry) +
                     accData->nAcls * sizeof(AclEntry) +
                     nChars))) {
        closeGetter();
        return;
    }
    accData->listenList = (ListenEntry *)(accData->hostList + accData->nHosts);
    accData->aliasList = (AliasEntry *)(accData->listenList + accData->nListens);
    accData->acList = (AclEntry *)(accData->aliasList + accData->nAliases);
    cptr = (char *)(accData->acList + accData->nAcls);
    for (i = 0; i < accData->nHosts; i++) {
        switch ((accData->hostList[i].type = gRecvInt())) {
        case HOST_ALIAS:
            accData->hostList[i].entry.aliasPattern = cptr;
            cptr += gRecvStrBuf(cptr);
            break;
        case HOST_PATTERN:
            accData->hostList[i].entry.hostPattern = cptr;
            cptr += gRecvStrBuf(cptr);
            break;
        case HOST_ADDRESS:
            da = &accData->hostList[i].entry.displayAddress;
            da->hostAddress.data = (unsigned char *)cptr;
            cptr += (da->hostAddress.length = gRecvArrBuf(cptr));
            switch (gRecvInt()) {
#ifdef AF_INET
            case AF_INET:
                da->connectionType = FamilyInternet;
                break;
#endif
#if defined(IPv6) && defined(AF_INET6)
            case AF_INET6:
                da->connectionType = FamilyInternet6;
                break;
#endif
#ifdef AF_DECnet
            case AF_DECnet:
                da->connectionType = FamilyDECnet;
                break;
#endif
/*#ifdef AF_UNIX
            case AF_UNIX:
#endif*/
            default:
                da->connectionType = FamilyLocal;
                break;
            }
            break;
        case HOST_BROADCAST:
            break;
        default:
            logError("Received unknown host type %d from config reader\n", accData->hostList[i].type);
            return;
        }
    }
    for (i = 0; i < accData->nListens; i++) {
        accData->listenList[i].iface = gRecvInt();
        accData->listenList[i].mcasts = gRecvInt();
        accData->listenList[i].nmcasts = gRecvInt();
    }
    for (i = 0; i < accData->nAliases; i++) {
        accData->aliasList[i].name = cptr;
        cptr += gRecvStrBuf(cptr);
        accData->aliasList[i].hosts = gRecvInt();
        accData->aliasList[i].nhosts = gRecvInt();
    }
    for (i = 0; i < accData->nAcls; i++) {
        accData->acList[i].entries = gRecvInt();
        accData->acList[i].nentries = gRecvInt();
        accData->acList[i].hosts = gRecvInt();
        accData->acList[i].nhosts = gRecvInt();
        accData->acList[i].flags = gRecvInt();
    }
}


/* Returns True if string is matched by pattern.  Does case folding.
 */
static int
patternMatch(const char *string, const char *pattern)
{
    int p, s;

    if (!string)
        string = "";

    for (;;) {
        s = *string++;
        switch (p = *pattern++) {
        case '*':
            if (!*pattern)
                return True;
            for (string--; *string; string++)
                if (patternMatch(string, pattern))
                    return True;
            return False;
        case '?':
            if (s == '\0')
                return False;
            break;
        case '\0':
            return s == '\0';
        case '\\':
            p = *pattern++;
            /* fall through */
        default:
            if (tolower(p) != tolower(s))
                return False;
        }
    }
}
Beispiel #7
0
static void
processDPipe(struct display *d)
{
    char *user, *pass, *args;
    int cmd;
    GTalk dpytalk;
#ifdef XDMCP
    int ct, len;
    ARRAY8 ca, cp, ha;
#endif

    dpytalk.pipe = &d->pipe;
    if (Setjmp(dpytalk.errjmp)) {
        stopDisplay(d);
        return;
    }
    gSet(&dpytalk);
    if (!gRecvCmd(&cmd)) {
        /* process already exited */
        unregisterInput(d->pipe.fd.r);
        return;
    }
    switch (cmd) {
    case D_User:
        d->userSess = gRecvInt();
        d->userName = gRecvStr();
        d->sessName = gRecvStr();
        break;
    case D_UnUser:
        sessionDone(d);
        if (d->sdRec.how) {
            if (d->sdRec.force == SHUT_ASK &&
                (anyUserLogins(-1) || d->allowShutdown == SHUT_ROOT))
            {
                gSendInt(True);
            } else {
                if (!sdRec.how || sdRec.force != SHUT_FORCE ||
                    !((d->allowNuke == SHUT_NONE && sdRec.uid != d->sdRec.uid) ||
                      (d->allowNuke == SHUT_ROOT && d->sdRec.uid)))
                {
                    free(sdRec.osname);
                    sdRec = d->sdRec;
                } else {
                    free(d->sdRec.osname);
                }
                d->sdRec.how = 0;
                d->sdRec.osname = 0;
                gSendInt(False);
            }
        } else {
            gSendInt(False);
        }
        break;
    case D_ReLogin:
        user = gRecvStr();
        pass = gRecvStr();
        args = gRecvStr();
        setNLogin(d, user, pass, args, 1);
        free(args);
        free(pass);
        free(user);
        break;
#ifdef XDMCP
    case D_ChooseHost:
        ca.data = (unsigned char *)gRecvArr(&len);
        ca.length = (CARD16)len;
        cp.data = (unsigned char *)gRecvArr(&len);
        cp.length = (CARD16)len;
        ct = gRecvInt();
        ha.data = (unsigned char *)gRecvArr(&len);
        ha.length = (CARD16)len;
        registerIndirectChoice(&ca, &cp, ct, &ha);
        XdmcpDisposeARRAY8(&ha);
        XdmcpDisposeARRAY8(&cp);
        XdmcpDisposeARRAY8(&ca);
        break;
    case D_RemoteHost:
        free(d->remoteHost);
        d->remoteHost = gRecvStr();
        break;
#endif
    case D_XConnOk:
        startingServer = 0;
        break;
    default:
        logError("Internal error: unknown D_* command %d\n", cmd);
        stopDisplay(d);
        break;
    }
}