static void processDPipe( struct display *d ) { char *user, *pass, *args; int cmd; GTalk dpytalk; #ifdef XDMCP int ct, len; ARRAY8 ca, ha; #endif dpytalk.pipe = &d->pipe; if (Setjmp( dpytalk.errjmp )) { StopDisplay( d ); return; } GSet( &dpytalk ); if (!GRecvCmd( &cmd )) { /* process already exited */ UnregisterInput( d->pipe.rfd ); return; } switch (cmd) { case D_User: d->userSess = GRecvInt(); d->userName = GRecvStr(); d->sessName = GRecvStr(); 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; ct = GRecvInt(); ha.data = (unsigned char *)GRecvArr( &len ); ha.length = (CARD16)len; RegisterIndirectChoice( &ca, ct, &ha ); XdmcpDisposeARRAY8( &ha ); XdmcpDisposeARRAY8( &ca ); break; case D_RemoteHost: if (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; } }
int main( int argc ATTR_UNUSED, char **argv ) { DSpec dspec; ValArr va; char *ci, *disp, *dcls, *cfgfile; int what; if (!(ci = getenv( "CONINFO" ))) { fprintf( stderr, "This program is part of kdm and should not be run manually.\n" ); return 1; } if (sscanf( ci, "%d %d", &rfd, &wfd ) != 2) return 1; InitLog(); if ((debugLevel = GRecvInt()) & DEBUG_WCONFIG) sleep( 100 ); /* Debug ("parsing command line\n");*/ if (**++argv) kdmrc = *argv; /* while (*++argv) { } */ for (;;) { /* Debug ("Awaiting command ...\n");*/ if (!GRecvCmd( &what )) break; switch (what) { case GC_Files: /* Debug ("GC_Files\n");*/ ReadConf(); CopyValues( 0, &secGeneral, 0, C_CONFIG ); #ifdef XDMCP CopyValues( 0, &secXdmcp, 0, C_CONFIG ); GSendInt( 2 ); #else GSendInt( 1 ); #endif GSendStr( kdmrc ); GSendInt( -1 ); #ifdef XDMCP GSendNStr( VXaccess.ptr, VXaccess.len - 1 ); GSendInt( 0 ); #endif for (; (what = GRecvInt()) != -1; ) switch (what) { case GC_gGlobal: case GC_gDisplay: GSendInt( 0 ); break; #ifdef XDMCP case GC_gXaccess: GSendInt( 1 ); break; #endif default: GSendInt( -1 ); break; } break; case GC_GetConf: /* Debug( "GC_GetConf\n" );*/ memset( &va, 0, sizeof(va) ); what = GRecvInt(); cfgfile = GRecvStr(); switch (what) { case GC_gGlobal: /* Debug( "GC_gGlobal\n" );*/ Debug( "getting global config\n" ); ReadConf(); CopyValues( &va, &secGeneral, 0, 0 ); #ifdef XDMCP CopyValues( &va, &secXdmcp, 0, 0 ); #endif CopyValues( &va, &secShutdown, 0, 0 ); SendValues( &va ); break; case GC_gDisplay: /* Debug( "GC_gDisplay\n" );*/ disp = GRecvStr(); /* Debug( " Display %s\n", disp );*/ dcls = GRecvStr(); /* Debug( " Class %s\n", dcls );*/ Debug( "getting config for display %s, class %s\n", disp, dcls ); MkDSpec( &dspec, disp, dcls ? dcls : "" ); ReadConf(); CopyValues( &va, &sec_Core, &dspec, 0 ); CopyValues( &va, &sec_Greeter, &dspec, 0 ); free( disp ); if (dcls) free( dcls ); SendValues( &va ); break; #ifdef XDMCP case GC_gXaccess: ReadAccessFile( cfgfile ); break; #endif default: Debug( "Unsupported config category %#x\n", what ); } free( cfgfile ); break; default: Debug( "Unknown config command %#x\n", what ); } } /* Debug( "Config reader exiting ..." );*/ return EX_NORMAL; }