X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Finit_src%2Fmain.c;h=e9c3ef9166a21b703e755375af8a2c6102d6bc71;hb=41f95269c94e847647f0e986b4999a29ef07025e;hp=87eccde4a11c8cee17569d89a70cf97ff0347dbd;hpb=b806b8f55067584cb90fe20277235369a1111c66;p=tpg%2Facess2.git diff --git a/Usermode/Applications/init_src/main.c b/Usermode/Applications/init_src/main.c index 87eccde4..e9c3ef91 100644 --- a/Usermode/Applications/init_src/main.c +++ b/Usermode/Applications/init_src/main.c @@ -27,7 +27,7 @@ void RespawnProgam(tInitProgram *Program); int AddSerialTerminal(const char *DevPathSegment, const char *ModeStr, char **Command); int AddDaemon(char *StdoutPath, char *StderrPath, char **Command); - int SpawnCommand(int c_stdin, int c_stdout, int c_stderr, char **ArgV); + int SpawnCommand(int c_stdin, int c_stdout, int c_stderr, char **ArgV, const char **EnvP); int SpawnKTerm(tInitProgram *Program); int SpawnSTerm(tInitProgram *Program); int SpawnDaemon(tInitProgram *Program); @@ -57,7 +57,9 @@ int main(int argc, char *argv[]) #if 1 for( ;; ) { - int pid = SpawnCommand(0, 1, 1, (char *[]){DEFAULT_SHELL, NULL}); + char *args[] = {DEFAULT_SHELL, NULL}; + const char *env[] = {"TERM=screen", NULL}; + int pid = SpawnCommand(0, 1, 1, args, env); // TODO: Detect errors _SysWaitTID(pid, NULL); } @@ -252,7 +254,6 @@ int ProcessInittab(const char *Path) goto lineError; } AddKTerminal(id, command); - free(command); } else if(strcmp(cmdbuf, "stty") == 0 ) { // stty [78][NOE][012][bB] @@ -290,7 +291,7 @@ int ProcessInittab(const char *Path) if(!command) goto lineError; - int handles[] = {0, 1, 2}; + int handles[] = {0, 1, 1}; int pid = _SysSpawn(command[0], (const char **)command, NULL, 3, handles, NULL); int retstatus; _SysWaitTID(pid, &retstatus); @@ -388,7 +389,7 @@ int AddSerialTerminal(const char *DevPathSegment, const char *ModeStr, char **Co modeword |= (sbit - '0') << 3; // Create info - const char DEVPREFIX[] = "/Devices/"; + const char DEVPREFIX[] = "/Devices/pts/serial"; int pathlen = sizeof(DEVPREFIX) + strlen(DevPathSegment); tInitProgram *ent = AllocateProgram(Command, PT_STERM, sizeof(struct sSTerm)+pathlen); ent->TypeInfo.STerm.FormatBits = modeword; @@ -410,11 +411,26 @@ int AddDaemon(char *StdoutPath, char *StderrPath, char **Command) return 0; } -int SpawnCommand(int c_stdin, int c_stdout, int c_stderr, char **ArgV) +int SpawnCommand(int c_stdin, int c_stdout, int c_stderr, char **ArgV, const char **EnvP) { int handles[] = {c_stdin, c_stdout, c_stderr}; - int rv = _SysSpawn(ArgV[0], (const char **)ArgV, NULL, 3, handles, NULL); + _SysDebug("Spawning '%s'", ArgV[0]); + + if( c_stdin < 0 ) { + _SysDebug("SpawnCommand: stdin is invalid"); + return 1; + } + if( c_stdout < 0 ) { + _SysDebug("SpawnCommand: stdout is invalid"); + return 1; + } + if( c_stderr < 0 ) { + _SysDebug("SpawnCommand: stderr is invalid"); + return 1; + } + + int rv = _SysSpawn(ArgV[0], (const char **)ArgV, EnvP, 3, handles, NULL); _SysClose(c_stdin); if( c_stdout != c_stdin ) @@ -427,7 +443,8 @@ int SpawnCommand(int c_stdin, int c_stdout, int c_stderr, char **ArgV) int SpawnKTerm(tInitProgram *Program) { - const char fmt[] = "/Devices/VTerm/%i"; + const char fmt[] = "/Devices/pts/vt%i"; + const char *env[] = {"TERM=screen", NULL}; char path[sizeof(fmt)]; snprintf(path, sizeof(path), fmt, Program->TypeInfo.KTerm.ID); @@ -435,7 +452,9 @@ int SpawnKTerm(tInitProgram *Program) int in = _SysOpen(path, OPENFLAG_READ); int out = _SysOpen(path, OPENFLAG_WRITE); - return SpawnCommand(in, out, out, Program->Command); + _SysDebug("Spawning virtual terminal '%s' with term '%s'", + path, Program->Command[0]); + return SpawnCommand(in, out, out, Program->Command, env); } int SpawnSTerm(tInitProgram *Program) @@ -444,7 +463,7 @@ int SpawnSTerm(tInitProgram *Program) int out = _SysOpen(Program->TypeInfo.STerm.Path, OPENFLAG_WRITE); if(in == -1 || out == -1 ) { - _SysDebug("Unable to open serial '%s' for '%s'", Program->TypeInfo.STerm.Path, Program->Command); + _SysDebug("Unable to open serial port '%s'", Program->TypeInfo.STerm.Path); return -1; } @@ -458,7 +477,9 @@ int SpawnSTerm(tInitProgram *Program) _SysIOCtl(in, SERIAL_IOCTL_GETSETFORMAT, &Program->TypeInfo.STerm.FormatBits); #endif - return SpawnCommand(in, out, out, Program->Command); + _SysDebug("Spawning serial terminal '%s' with term '%s'", + Program->TypeInfo.STerm.Path, Program->Command[0]); + return SpawnCommand(in, out, out, Program->Command, NULL); } int SpawnDaemon(tInitProgram *Program) @@ -467,7 +488,8 @@ int SpawnDaemon(tInitProgram *Program) int out = _SysOpen(Program->TypeInfo.Daemon.StdoutPath, OPENFLAG_WRITE); int err = _SysOpen(Program->TypeInfo.Daemon.StderrPath, OPENFLAG_WRITE); - if( in == -1 || out == -1 || err == -1 ) { + if( in < 0 || out < 0 || err < 0 ) { + perror("SpawnDaemon"); _SysClose(in); _SysClose(out); _SysClose(err); @@ -477,10 +499,17 @@ int SpawnDaemon(tInitProgram *Program) // Log spawn header { char buffer[101]; - size_t len = snprintf(buffer, 100, "[%i] init spawning '%s'\n", _SysTimestamp(), Program->Command); + size_t len = snprintf(buffer, 100, "[%lli] init spawning ", _SysTimestamp()); _SysWrite(out, buffer, len); + for( int i = 0; Program->Command[i]; i ++ ) + { + _SysWrite(out, "'", 1); + _SysWrite(out, Program->Command[i], strlen(Program->Command[i])); + _SysWrite(out, "'", 1); + } + _SysWrite(out, "\n", 1); } - return SpawnCommand(in, out, err, Program->Command); + return SpawnCommand(in, out, err, Program->Command, NULL); }