summaryrefslogblamecommitdiff
path: root/src/user/test/main.c
blob: eb289ca18c1fdc95a41f9c931f8534ae240ad236 (plain) (tree)
1
2
3
4
5
6
7
8
9
                        
                   


                  
 
                              

                       

                   
                     
                                                                   
                            

                            
                                                                    
                                    

                                  
                                                                    
                                    
                 
                                             
                            
                                                           
                                             
                            
                                                           
                                                                   
                            
         










                                                



                                                                      
                                                      
                            
                                             








                                                               
                                         



                                                                                 
                                


                                                                             





                                     

 












                                                                                   



                                  










                                              


                                           
 

                                                                          
 
                                                    
                   



                                                        
                    
 
                                      


                                                                                        
                                                                                               
                           
                                         




                                                        






                                                                                                                            
                                                                                         


                                                                              











                                                                                                        
                                        
                                                                        
                                                          
                                                        
                                 
                                
                                                           

                         
         
 

                 
#include <tce/syscall.h>
#include <stdlib.h>
#include <stdio.h>

int threads = 0;

void thread_cascade(void* d) {
	int n = (int)d;

	threads ++;

	if (d == 0) {
		//printk("{#} 0 cascade element started => end\n");
		printk("*");
	} else {
		if (n < 0) {
			//printk("{#} - cascade element started\n");
			printk("-");
			n = 0 - n;
		} else {
			//printk("{#} + cascade element started\n");
			printk("+");
		}
		//printk("{#} FORK + ...\n");
		printk(">");
		thread_new(thread_cascade, (void*)(n - 1));
		//printk("{#} FORK - ...\n");
		printk("<");
		thread_new(thread_cascade, (void*)(1 - n));
		//printk("{#} Thread cascade element finished.\n");
		printk(".");
	}

	threads--;
}

void list_dir(FILE f, int lv) {
	char buf[256];
	int i = 0, k;
	int r;
	file_info info;
	
	while ((r = read(f, i, 256, buf)) > 0) {
		if (strcmp(buf, ".") == 0 || strcmp(buf, "..") == 0) {
			i++;
			continue;
		}
		for (k = 0; k < lv; k++) printk("  ");
		printk(buf);
		stat_relative(f, buf, &info);
		if (info.type & FT_DIR) printk("/");
		printk("    \t");

		if (info.type & FT_FILE) printk("file ");
		if (info.type & FT_DIR) printk("dir ");
		if (info.type & FT_SYMLINK) printk("symlink ");
		if (info.type & FT_DEV) printk("dev ");
		if (info.type & FT_TERMINAL) printk("term ");

		if (info.type & FT_DIR) {
			printk("  \t");
			FILE ff = open_relative(f, buf, 0);
			if (ff <= 0) {
				printk("error: "); printk_int(ff); printk("\n"); 
			} else {
				printk("fd: "); printk_int(ff); printk("\n");
				list_dir(ff, lv+1);
				close(ff);
			}
		} else {
			printk("\n");
		}
		i++;
	}
}

void list_root() {
	FILE f = open("/", 0);
	if (f <= 0) {
		printk(" -> Could not open '/', error #");
		printk_int(f);
		printk("...\n");
	} else {
		printk("Now enumerating '/' (fd "); printk_int(f); printk(") :\n");
		list_dir(f, 1);
		close(f);
	}
}

void fprint(FILE f, char *s) {
	write(f, 0, strlen(s), s);
}

int main(char** args) {
	char**a;
	if (args != 0) {
		printk("args");
		for (a = args; *a != 0; a++) {
			printk(" - ");
			printk(*a);
		}
		printk("\n");
	}

	printk("(test app) malloc(42) = ");
	printk_hex((uint32_t)malloc(42));
	printk("\n");

	printk(" -> Creating thread cascade (total 2**4 = 16 threads)\n");
	thread_new(thread_cascade, (void*)4);

	printk(" -> Main thread now sleeping...\n");
	while (1) {
		thread_sleep(100);
		if (threads == 0) break;
	}
	printk("\n -> Ok, let's try something else.\n");
	list_root();

	FILE f = open("/.ui/klog", 0);
	if (f <= 0) {
		printk(" -> Error #"); printk_int(f);  printk(" - too bad. Exiting.\n");
	} else {
		fprint(f, " -> Now reading && writing from/to virtual terminal '/.ui/klog'\n");
		while (1) {
			fprint(f, " > ");

			char buffer[256];
			int l = read(f, 0, 255, buffer);
			buffer[l] = 0;
			if (buffer[l-1] == '\n') {
				buffer[l-1] = 0; l--;

				if (strcmp(buffer, "about") == 0) {
					fprint(f, "Trivial/Computing Environment v0.1.0 - useless shell, first ediiton.\n");
				} else if (strcmp(buffer, "help") == 0) {
					fprint(f, "Available commands: about, help, exit.\n");
				} else if (strcmp(buffer, "exit") == 0) {
					fprint(f, "Exiting the shell. See you later!\n");
					break;
				} else if (strcmp(buffer, "gotosleep") == 0) {
					while (1) thread_sleep(1000);
				} else if (strcmp(buffer, "spawn") == 0) {
					char *args[] = {"hello", "world", 0};
					int pid = run("/somewhere/bin/test", args);
					if (pid < 0) {
						printk("Error "); printk_int(pid); printk("\n");
					} else {
						printk("Launched, pid="); printk_int(pid); printk("\n");
						int ret = waitpid(pid);
						printk("Exited, ret="); printk_int(ret); printk("\n");
					}
				} else if (strcmp(buffer, "root") == 0) {
					list_root();
				} else {
					fprint(f, "Unknown command : ");
					fprint(f, buffer);
					fprint(f, "\n");
				}
			} else {
				fprint(f, " - - - oops\n");
			}
		}
	}

	return 0;
}