static void nukeSock(struct cmdsock *cs) { unregisterInput(cs->sock.fd); closeNclearCloseOnFork(cs->sock.fd); free(cs->sock.buffer); free(cs); }
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; } }