X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Finit_src%2Fmain.c;h=31408e6211f78cc58953154d564f54fbfbf92793;hb=6afcf1f9b14d9ad0111daea549cb0db5bf7f9009;hp=0d8713d1bf40d1417eecf22cf2aa0f19b6024130;hpb=8c776690f72a3afb887a0e19751d9b7f5025bd1b;p=tpg%2Facess2.git diff --git a/Usermode/Applications/init_src/main.c b/Usermode/Applications/init_src/main.c index 0d8713d1..31408e62 100644 --- a/Usermode/Applications/init_src/main.c +++ b/Usermode/Applications/init_src/main.c @@ -10,7 +10,7 @@ // === CONSTANTS === #define DEFAULT_SHELL "/Acess/SBin/login" -#define INITTAB_FILE "/Acess/Config/inittab" +#define INITTAB_FILE "/Acess/Conf/inittab" #define ARRAY_SIZE(x) ((sizeof(x))/(sizeof((x)[0]))) @@ -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); @@ -54,19 +54,25 @@ int main(int argc, char *argv[]) // No inittab file found, default to: _SysDebug("inittab '%s' is invalid, falling back to one VT", gsInittabPath); + #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); } - // TODO: Detect errors + #else + return 41; + #endif } // TODO: Implement message watching for(;;) { int pid, status; - pid = _SysWaitTID(0, &status); + pid = _SysWaitTID(-1, &status); _SysDebug("PID %i died, looking for respawn entry", pid); } @@ -76,11 +82,13 @@ int main(int argc, char *argv[]) char *ReadQuotedString(FILE *FP) { char ch; + while( isblank(ch = fgetc(FP)) ) ; - if( ch == '\n' ) - return NULL; + if( ch == '\n' ) { + return NULL; + } char *retstr = NULL; int mode = 0; @@ -96,8 +104,10 @@ char *ReadQuotedString(FILE *FP) } else if( mode == 0 ) { - if( isspace(ch) ) + if( isspace(ch) ) { + fseek(FP, -1, SEEK_CUR); break; + } else if( ch == '\\' ) mode |= 4; else if( ch == '"' ) @@ -140,6 +150,7 @@ char *ReadQuotedString(FILE *FP) space += 32; void *tmp = realloc(retstr, space+1); if( !tmp ) { + _SysDebug("ReadQuotedString - realloc(%i) failure", space+1); free(retstr); return NULL; } @@ -148,7 +159,8 @@ char *ReadQuotedString(FILE *FP) retstr[pos++] = ch; } } - retstr[pos] = '\0'; + if( retstr ) + retstr[pos] = '\0'; return retstr; } @@ -160,13 +172,22 @@ char **ReadCommand(FILE *FP) char *arg; do { arg = ReadQuotedString(FP); + if(arg == NULL) + break; if( pos == space - 1 ) { + _SysDebug("Too many arguments %i", pos); ret[pos] = NULL; FreeCommand(ret); return NULL; } ret[pos++] = arg; } while(arg != NULL); + + if( pos == 0 ) + { + free(ret); + return NULL; + } ret[pos] = NULL; return ret; } @@ -184,6 +205,7 @@ void FreeCommand(char **Command) int ProcessInittab(const char *Path) { + int line_num = 0; FILE *fp = fopen(Path, "r"); if( !fp ) @@ -192,8 +214,14 @@ int ProcessInittab(const char *Path) while(!feof(fp)) { char cmdbuf[64+1]; - if( fscanf(fp, "%64s%*[ \t]", &cmdbuf) != 1 ) + + line_num ++; + + int rv; + if( (rv = fscanf(fp, "%64s%*[ \t]", cmdbuf)) != 1 ) { + _SysDebug("fscanf rv %i != exp 1", rv); break; + } // Clear comments if( cmdbuf[0] == '#' ) { @@ -202,31 +230,36 @@ int ProcessInittab(const char *Path) continue ; } if( cmdbuf[0] == '\0' ) { - if( fgetc(fp) != '\n' ) { + char ch = fgetc(fp); + if( ch != '\n' && ch != -1 ) { fclose(fp); + _SysDebug("Unexpected char 0x%x, expecting EOL", ch); return 2; // Unexpected character? } continue ; } - + // Check commands if( strcmp(cmdbuf, "ktty") == 0 ) { // ktty // - Spins off a console on the specified kernel TTY int id = 0; - if( fscanf(fp, "%d ", &id) != 1 ) + if( fscanf(fp, "%d ", &id) != 1 ) { + _SysDebug("init[ktty] - TTY ID read failed"); goto lineError; + } char **command = ReadCommand(fp); - if( !command ) + if( !command ) { + _SysDebug("init[ktty] - Command read failure"); goto lineError; + } AddKTerminal(id, command); - free(command); } else if(strcmp(cmdbuf, "stty") == 0 ) { // stty [78][NOE][012][bB] char path_seg[32+1]; char modespec[4+6+1]; - if( fscanf(fp, "%32s %6s ", &path_seg, &modespec) != 2 ) { + if( fscanf(fp, "%32s %10s ", path_seg, modespec) != 2 ) { goto lineError; } char **command = ReadCommand(fp); @@ -239,8 +272,14 @@ int ProcessInittab(const char *Path) // - Runs a daemon (respawning) that logs to the specified files // - Will append a header whenever the daemon starts char *stdout_path = ReadQuotedString(fp); + if( !stdout_path ) + goto lineError; char *stderr_path = ReadQuotedString(fp); + if( !stderr_path ) + goto lineError; char **command = ReadCommand(fp); + if( !command ) + goto lineError; AddDaemon(stdout_path, stderr_path, command); } @@ -252,23 +291,33 @@ 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); - _SysWaitTID(pid, NULL); + int retstatus; + _SysWaitTID(pid, &retstatus); + _SysDebug("Command '%s' returned %i", command[0], retstatus); FreeCommand(command); } else { // Unknown command. + _SysDebug("Unknown command '%s'", cmdbuf); + goto lineError; } + fscanf(fp, " "); continue; lineError: + _SysDebug("label lineError: goto'd - line %i, cmdbuf='%s'", line_num, cmdbuf); while( !feof(fp) && fgetc(fp) != '\n' ) ; continue ; } fclose(fp); + + if( gpInitPrograms == NULL ) + return 2; + return 0; } @@ -326,8 +375,9 @@ int AddSerialTerminal(const char *DevPathSegment, const char *ModeStr, char **Co int baud; // Parse mode string - if( sscanf(ModeStr, "%1[78]%1[NOE]%1[012]%*1[bB]%d", &dbit, &parity, &sbit, &baud) != 5 ) { + if( sscanf(ModeStr, "%1[78]%1[NOE]%1[012]%*1[bB]%d", &dbit, &parity, &sbit, &baud) != 4 ) { // Oops? + _SysDebug("Serial mode string is invalid ('%s')", ModeStr); return -1; } @@ -339,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; @@ -361,16 +411,31 @@ 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 ) _SysClose(c_stdout); - if( c_stderr != c_stdin && c_stderr != c_stdin ) + if( c_stderr != c_stdin && c_stderr != c_stdout ) _SysClose(c_stderr); return rv; @@ -378,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); @@ -386,7 +452,7 @@ int SpawnKTerm(tInitProgram *Program) int in = _SysOpen(path, OPENFLAG_READ); int out = _SysOpen(path, OPENFLAG_WRITE); - return SpawnCommand(in, out, out, Program->Command); + return SpawnCommand(in, out, out, Program->Command, env); } int SpawnSTerm(tInitProgram *Program) @@ -394,6 +460,11 @@ int SpawnSTerm(tInitProgram *Program) int in = _SysOpen(Program->TypeInfo.STerm.Path, OPENFLAG_READ); int out = _SysOpen(Program->TypeInfo.STerm.Path, OPENFLAG_WRITE); + if(in == -1 || out == -1 ) { + _SysDebug("Unable to open serial port '%s'", Program->TypeInfo.STerm.Path); + return -1; + } + #if 0 if( _SysIOCtl(in, 0, NULL) != DRV_TYPE_SERIAL ) { @@ -404,7 +475,7 @@ int SpawnSTerm(tInitProgram *Program) _SysIOCtl(in, SERIAL_IOCTL_GETSETFORMAT, &Program->TypeInfo.STerm.FormatBits); #endif - return SpawnCommand(in, out, out, Program->Command); + return SpawnCommand(in, out, out, Program->Command, NULL); } int SpawnDaemon(tInitProgram *Program) @@ -413,13 +484,28 @@ 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); return -2; } - return SpawnCommand(in, out, err, Program->Command); + // Log spawn header + { + char buffer[101]; + 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, NULL); }