Advertisement
captmicro

terminal for Sidon x86

Nov 18th, 2012
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.92 KB | None | 0 0
  1. #ifndef _term_h_
  2. #define _term_h_
  3.  
  4. #include "../../type.h"
  5. #include "../../def.h"
  6. #include "../../envvar/envvar.h"
  7. #include "../../vmem/vmem.h"
  8. #include "../../kvideo/kvideo.h"
  9. #include "../../dev/dev.h"
  10. #include "../../dev/kb/kb.h"
  11. #include "../../tickcounter/tickcounter.h"
  12.  
  13. uint32 term_main(void);
  14. uint32 term_process(char *string);
  15.  
  16. #endif
  17.  
  18. #include "term.h"
  19.  
  20. uint32 term_main(void)
  21. {
  22.     //setup screen and show welcome message
  23.     kvideo_setcolor(KVIDEO_NOBLINK(KVIDEO_FGBG(KVIDEO_LTGREEN, KVIDEO_BLACK)));
  24.     kvideo_clear();
  25.     kvideo_print("Sidon X86 Network Attack System. [Terminal v0.0]\n");
  26.     envvar_set("TERMPROMPT", "SIDON#"); //terminal string
  27.     envvar_seti("TERMPROMPTTD", 4); //key timeout divier
  28.    
  29.     //initalize keyboard
  30.     uint32 kbdev = dev_find_device("keyboard");
  31.     if (kbdev != UINT32_MAX)
  32.         dev_ioctl(kbdev, DEV_IOCTL_INITDEV, 0);
  33.     uint8 lsc = 0; //holder for last keyboard scan code
  34.    
  35.     //enter terminal loop
  36.     uint8 running = 1;
  37.     char *inputbuf = (char*)vmem_alloc_block();
  38.    
  39.     uint32 keytimeout = 0xFFFFFFFF;
  40. _term_prompt:;
  41.     uint32 inputidx = 0, timeoutdiv = (uint32)envvar_geti("TERMPROMPTTD");
  42.     uint8 kbBuf = 0, lastBuf = 0;
  43.     memset(inputbuf, 0, VMEM_BLOCK_SZ);
  44.     kvideo_print(envvar_get("TERMPROMPT")); kvideo_print(" ");
  45.     uint16 inpbuf_x = _kvideo_print_x;
  46.     uint16 inpbuf_y = _kvideo_print_y;
  47.     inputidx = 0; if (timeoutdiv == 0) timeoutdiv = 1;
  48.     for (lsc = 0; lsc != 0x81; dev_read(kbdev, (void*)&lsc, 1))
  49.     {
  50.         kbBuf = lsc;
  51.         if (lastBuf != kbBuf)
  52.         {
  53. _term_keytimeout_ok:
  54.             inputbuf[inputidx] = kb_scan2chr(kbBuf);
  55.             if (inputbuf[inputidx] == '\b') { inputidx--; continue; }
  56.             if ((inputidx == 0) && (inputbuf[inputidx] == '\n'))
  57.                 continue; // we just ran a command, lsc is newline so skip
  58.             if (inputbuf[inputidx] == 0) { lastBuf = kbBuf; continue; }
  59.            
  60.             kvideo_movecursor(inpbuf_x, inpbuf_y);
  61.             kvideo_print(inputbuf);
  62.             if (inputbuf[inputidx] == '\n') //execute commands
  63.             {
  64.                 inputbuf[inputidx] = '\0'; //replace newline with NULL
  65.                 if (term_process(inputbuf)) goto _term_exit; //exit if 1
  66.                 goto _term_prompt;
  67.             }
  68.             lastBuf = kbBuf;
  69.             keytimeout = tickcounter_gettickcount() +
  70.                 (tickcounter_tickspersec()/timeoutdiv);
  71.             inputidx++;
  72.         }
  73.         else if (tickcounter_gettickcount() > keytimeout)
  74.         {
  75.             goto _term_keytimeout_ok;
  76.         }
  77.     }
  78.    
  79. _term_exit:
  80.     vmem_free_block(inputbuf);
  81.    
  82.     //return no error
  83.     return 0;
  84. }
  85.  
  86. KFUNC uint32 term_atoui(char *s)
  87. {
  88.     uint32 i = 0;
  89.     while(*s >= '0' && *s <= '9')
  90.     {
  91.         i = (i<<3) + (i<<1) + (*s - '0');
  92.         s++;
  93.     }
  94.     return i;
  95. }
  96.  
  97. uint32 term_process(char *string)
  98. {
  99.     kvideo_print("RUNNING: ");
  100.     kvideo_print(string);
  101.     kvideo_print("\n");
  102.    
  103.     //do stuff
  104.     if (strncmp(string, "cls", 3) == 0) //cls
  105.     {
  106.         kvideo_clear();
  107.     }
  108.     else if (strncmp(string, "envs", 4) == 0) //envs (string variables)
  109.     {
  110.         char *key = string + 5;
  111.         char *space = strrchr(string, ' ');
  112.         if (key > space) //space before key, only one argument
  113.         {
  114.             kvideo_print(key);
  115.             kvideo_print(" = ");
  116.             kvideo_print(envvar_get(key));
  117.             kvideo_print("\n");
  118.         }
  119.         else
  120.         {
  121.             *space = '\0';
  122.             char *value = space + 1;
  123.             kvideo_print(key);
  124.             kvideo_print(" = ");
  125.             kvideo_print(value);
  126.             kvideo_print("\n");
  127.             envvar_set(key, value);
  128.             *space = ' ';
  129.         }
  130.     }
  131.     else if (strncmp(string, "envi", 4) == 0) //envs (number variables)
  132.     {
  133.         char *key = string + 5;
  134.         char *space = strrchr(string, ' ');
  135.         if (key > space) //space before key, only one argument
  136.         {
  137.             kvideo_print(key);
  138.             kvideo_print(" = ");
  139.             kvideo_printdec(envvar_geti(key));
  140.             kvideo_print("\n");
  141.         }
  142.         else
  143.         {
  144.             *space = '\0';
  145.             char *strvalue = space + 1;
  146.             int value = (int)term_atoui(strvalue);
  147.             kvideo_print(key);
  148.             kvideo_print(" = ");
  149.             kvideo_printdec(value);
  150.             kvideo_print("\n");
  151.             envvar_seti(key, value);
  152.             *space = ' ';
  153.         }
  154.     }
  155.     else if (strncmp(string, "exit", 4) == 0) //exit
  156.     {
  157.         return 1;
  158.     }
  159.     else if (strncmp(string, "launch", 6) == 0) //launch app (hardcoded list)
  160.     {
  161.         if (strncmp(string + 7, "xedit", 5) == 0)
  162.         {
  163.             kvideo_pushcursor();
  164.             memcpy((uint8*)0x00090000, (uint8*)VGA_TEXTCOLOR, KVIDEO_W * KVIDEO_H * 2);
  165.             xedit_main();
  166.             kvideo_popcursor();
  167.             memcpy((uint8*)VGA_TEXTCOLOR, (uint8*)0x00090000, KVIDEO_W * KVIDEO_H * 2);
  168.             uint32 kbdev = dev_find_device("keyboard");
  169.             if (kbdev != UINT32_MAX) //re-init keyboard
  170.                 dev_ioctl(kbdev, DEV_IOCTL_INITDEV, 0);
  171.         }
  172.     }
  173.     else if (strncmp(string, "help", 4) == 0) //help
  174.     {
  175.         kvideo_print("COMMANDS:\n");
  176.         kvideo_print("cls                 - Clear the screen\n");
  177.         kvideo_print("envs KEY [VALUE]    - Get [set] environment string\n");
  178.         kvideo_print("envi KEY [VALUE]    - Get [set] environment integer\n");
  179.         kvideo_print("exit                - Exit terminal (return to kernel)\n");
  180.         kvideo_print("launch [APP]        - Launch app (apps: xedit, )\n");
  181.         kvideo_print("help                - Show this information\n");
  182.     }
  183.    
  184.     kvideo_print("DONE.\n");
  185.     return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement