3 * - By John Hodge (thePowersGang)
6 * - Kernel-land emergency console/shell
16 void EmergencyConsole(void);
18 void Command_ls(const char* path);
19 void Command_hd(const char* path);
20 void Command_mount(const char *fs, const char *dev, const char *point);
22 static char **split_args(char *line);
23 static char *read_line(int fd);
24 static int dprintf(int fd, const char *fmt, ...);// __attribute__((printf(2,3)));
27 void EmergencyConsole(void)
31 dprintf(STDOUT, "(kernel)$ ");
32 char *line = read_line(STDIN);
34 // Explode line into args
35 char **args = split_args(line);
36 // Get command from first arg
39 if( strcmp(args[0], "help") == 0 ) {
42 "ls <path> - List the contents of a directory\n"
43 "hd <path> - Dump a file in a 16 bytes/line hex format\n"
44 "mount <fs> <device> <point> - Mount a filesystem\n"
47 else if( strcmp(args[0], "ls") == 0 ) {
50 else if( strcmp(args[0], "hd") == 0 ) {
53 else if( strcmp(args[0], "mount") == 0 ) {
54 Command_mount(args[1], args[2], args[3]);
58 dprintf(STDERR, "Unknown command '%s'\n", args[0]);
66 void Command_ls(const char* path)
68 dprintf(STDERR, "ls: TODO - Implement\n");
70 void Command_hd(const char* path)
72 dprintf(STDERR, "hd: TODO - Implement\n");
74 void Command_mount(const char *fs, const char *dev, const char *point)
76 dprintf(STDERR, "mount: TODO - Implement\n");
79 // Allocates return array (NUL terminated), but mangles input string
80 static int split_args_imp(char *line, char **buf)
90 for( char *chp = line; *chp; chp ++ )
93 if( mode != MODE_SPACE ) {
94 if(buf) buf[argc][pos] = '\0';
121 dprintf(STDERR, "err: Trailing '\\'\n");
126 if(buf) buf[argc][pos++] = *chp;
129 dprintf(STDERR, "err: Unkown escape '%c'\n", *chp);
134 if(buf) buf[argc][pos++] = *chp;
145 dprintf(STDERR, "err: Unterminated \' string\n");
148 if(buf) buf[argc][pos++] = *chp;
163 dprintf(STDERR, "err: Trailing '\\' in \" string\n");
167 if(buf) buf[argc][pos++] = *chp;
170 dprintf(STDERR, "err: Unkown escape '%c'\n", *chp);
175 dprintf(STDERR, "err: Unterminated \" string\n");
178 if(buf) buf[argc][pos++] = *chp;
185 if(buf) buf[argc][pos++] = '\0';
189 static char **split_args(char *line)
192 int count = split_args_imp(line, NULL);
193 char **ret = malloc( (count + 1) * sizeof(char*) );
195 split_args_imp(line, ret);
200 static char *read_line(int fd)
202 // Read line (or up to ~128 bytes)
203 // - This assumes a default PTY state (i.e. line buffered, echo on)
204 char *ret = malloc(128);
205 size_t len = VFS_Read(STDIN, 128, ret);
210 static int dprintf(int fd, const char *fmt, ...)
214 size_t len = vsnprintf(NULL, 0, fmt, args);
219 vsnprintf(buf, len+1, fmt, args);
222 VFS_Write(fd, len, buf);