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; }
static void displayStr( int lv, const char *msg ) { prepareErrorGreet(); gSendInt( lv ); gSendStr( msg ); gRecvInt(); }
static void sendStr( int lv, const char *msg ) { gSet( &ctltalk ); gSendInt( lv ); gSendStr( msg ); gRecvInt(); }
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 ); } }
int getCfgInt( int id ) { reqCfg( id ); return gRecvInt(); }
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; } } }
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; } }