sh.c
上传用户:lyp3966
上传日期:2007-07-04
资源大小:1193k
文件大小:34k
源码类别:

Java编程

开发平台:

C/C++

  1. //
  2. // sh.c
  3. //
  4. // Shell
  5. //
  6. // Copyright (C) 2002 Michael Ringgaard. All rights reserved.
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions
  10. // are met:
  11. // 
  12. // 1. Redistributions of source code must retain the above copyright 
  13. //    notice, this list of conditions and the following disclaimer.  
  14. // 2. Redistributions in binary form must reproduce the above copyright
  15. //    notice, this list of conditions and the following disclaimer in the
  16. //    documentation and/or other materials provided with the distribution.  
  17. // 3. Neither the name of the project nor the names of its contributors
  18. //    may be used to endorse or promote products derived from this software
  19. //    without specific prior written permission. 
  20. // 
  21. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  22. // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. // ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  25. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  31. // SUCH DAMAGE.
  32. // 
  33. #include <os.h>
  34. #include <stdio.h>
  35. #include <string.h>
  36. #include <stdlib.h>
  37. #include <os/version.h>
  38. unsigned char buffer[4096];
  39. unsigned char orig[4096];
  40. unsigned char pattern[4096];
  41. static void list_file(char *filename)
  42. {
  43.   int count;
  44.   int file;
  45.   if ((file = open(filename, 0)) < 0)
  46.   {
  47.     printf("%s: %sn", filename, strerror(file));
  48.     return;
  49.   }
  50.   while ((count = read(file, buffer, 4096)) > 0)
  51.   {
  52.     write(fdout, buffer, count);
  53.   }
  54.   close(file);
  55. }
  56. static void copy_file(char *srcfn, char *dstfn)
  57. {
  58.   char *data;
  59.   int count;
  60.   int f1;
  61.   int f2;
  62.   if ((f1 = open(srcfn, 0)) < 0)
  63.   {
  64.     printf("%s: %sn", srcfn, strerror(f1));
  65.     return;
  66.   }
  67.   if ((f2 = open(dstfn, O_CREAT)) < 0)
  68.   {
  69.     close(f1);
  70.     printf("%s: %sn", dstfn, strerror(f2));
  71.     return;
  72.   }
  73.   data = malloc(64 * K);
  74.   while ((count = read(f1, data, 64 * K)) > 0)
  75.   {
  76.     if (write(f2, data, count) != count)
  77.     {
  78.       printf("%s: error writing datan", dstfn);
  79.       break;
  80.     }
  81.   }
  82.   free(data);
  83.   if (count < 0) printf("%s: %sn", srcfn, strerror(count));
  84.   
  85.   close(f1);
  86.   close(f2);
  87. }
  88. static void list_dir(int argc, char **argv)
  89. {
  90.   char *dirname;
  91.   int verbose;
  92.   int i;
  93.   int dir;
  94.   struct dirent dirp;
  95.   struct stat buf;
  96.   struct tm tm;
  97.   char path[MAXPATH];
  98.   char *arg;
  99.   int col;
  100.   verbose = 0;
  101.   dirname = ".";
  102.   for (i = 1; i < argc; i++)
  103.   {
  104.     arg = argv[i];
  105.     if (*arg == '-')
  106.     {
  107.       while (*++arg)
  108.       {
  109. if (*arg == 'l') verbose = 1;
  110. if (*arg == 'w') verbose = 2;
  111.       }
  112.     }
  113.     else
  114.       dirname = arg;
  115.   }
  116.   if ((dir = opendir(dirname)) < 0)
  117.   {
  118.     printf("%s: %sn", dirname, strerror(dir));
  119.     return;
  120.   }
  121.   col = 0;
  122.   while (readdir(dir, &dirp, 1) > 0)
  123.   {
  124.     strcpy(path, dirname);
  125.     strcat(path, "/");
  126.     strcat(path, dirp.name);
  127.     if (stat(path, &buf) < 0) memset(&buf, 0, sizeof(struct stat));
  128.     if (verbose == 2)
  129.     {
  130.       if (col == 4)
  131.       {
  132. col = 0;
  133. //printf("n");
  134.       }
  135.       if (buf.mode & FS_DIRECTORY) strcat(dirp.name, "/");
  136.       printf("%-20s", dirp.name);
  137.       col++;
  138.     }
  139.     else
  140.     {
  141.       strcpy(path, dirname);
  142.       strcat(path, "/");
  143.       strcat(path, dirp.name);
  144.       if (stat(path, &buf) < 0) memset(&buf, 0, sizeof(struct stat));
  145.       if (verbose)
  146.       {
  147. printf("%8d %4d %1d %2d ", buf.quad.size_low, buf.ino, buf.nlink, buf.devno);
  148. _gmtime(&buf.ctime, &tm);
  149. printf("%02d/%02d/%04d %02d:%02d:%02d ", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);
  150.       }
  151.       else
  152.       {
  153. if (buf.mode & FS_DIRECTORY)
  154.   printf("         ");
  155. else
  156. {
  157.   if (buf.quad.size_high == 0 && buf.quad.size_low < 1*K)
  158.     printf("%6d B ", buf.quad.size_low);
  159.   else if (buf.quad.size_high == 0 && buf.quad.size_low < 1*M)
  160.     printf("%6dKB ", buf.quad.size_low / K);
  161.   else if (buf.quad.size_high == 0)
  162.     printf("%6dMB ", buf.quad.size_low / M);
  163.   else
  164.     printf("%6dGB ", (buf.quad.size_high << 2) | (buf.quad.size_low >> 30));
  165. }
  166.       }
  167.       _gmtime(&buf.mtime, &tm);
  168.       printf("%02d/%02d/%04d %02d:%02d:%02d ", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);
  169.       printf("%s", dirp.name);
  170.       if (buf.mode & FS_DIRECTORY) printf("/", dirp.name);
  171.       printf("n");
  172.     }
  173.   }
  174.   if (verbose == 2) printf("n");
  175.   close(dir);
  176. }
  177. static void remove_file(char *filename)
  178. {
  179.   int rc;
  180.   rc = unlink(filename); 
  181.   if (rc < 0)
  182.   {
  183.     printf("%s: %sn", filename, strerror(rc));
  184.     return;
  185.   }
  186. }
  187. static void move_file(char *oldname, char *newname)
  188. {
  189.   int rc;
  190.   rc = rename(oldname, newname);
  191.   if (rc < 0)
  192.   {
  193.     printf("%s: %sn", oldname, strerror(rc));
  194.     return;
  195.   }
  196. }
  197. static void change_dir(char *filename)
  198. {
  199.   int rc;
  200.   rc = chdir(filename); 
  201.   if (rc < 0)
  202.   {
  203.     printf("%s: %sn", filename, strerror(rc));
  204.     return;
  205.   }
  206. }
  207. static void make_dir(char *filename)
  208. {
  209.   int rc;
  210.   rc = mkdir(filename); 
  211.   if (rc < 0)
  212.   {
  213.     printf("%s: %sn", filename, strerror(rc));
  214.     return;
  215.   }
  216. }
  217. static void remove_dir(char *filename)
  218. {
  219.   int rc;
  220.   rc = rmdir(filename); 
  221.   if (rc < 0)
  222.   {
  223.     printf("%s: %sn", filename, strerror(rc));
  224.     return;
  225.   }
  226. }
  227. static void display_buffer(int f, char *buffer, int size)
  228. {
  229.   char *p;
  230.   char *q;
  231.   char *end;
  232.   p = buffer;
  233.   end = buffer + size;
  234.   while (p < end)
  235.   {
  236.     q = p;
  237.     while (q < end && *q != 'n') q++;
  238.     if (p != q) write(f, p, q - p);
  239.     if (q < end) 
  240.     {
  241.       write(f, "rn", 2);
  242.       q++;
  243.     }
  244.     p = q;
  245.   }
  246. }
  247. static void display_file(char *filename)
  248. {
  249.   int count;
  250.   int file;
  251.   int line;
  252.   char *start;
  253.   char *end;
  254.   char ch;
  255.   if ((file = open(filename, 0)) < 0)
  256.   {
  257.     printf("%s: %sn", filename, strerror(file));
  258.     return;
  259.   }
  260.   line = 0;
  261.   while ((count = read(file, buffer, 4096)) > 0)
  262.   {
  263.     start = end = buffer;
  264.     while (end < buffer + count)
  265.     {
  266.       if (line == 24)
  267.       {
  268. display_buffer(fdout, start, end - start);
  269. while (read(fdin, &ch, 1) <= 0);
  270. if (ch == 'x')
  271. {
  272.   close(file);
  273.   return;
  274. }
  275. start = end;
  276.         line = 0;
  277.       }
  278.       if (*end++ == 'n') line++;
  279.     }
  280.     display_buffer(fdout, start, end - start);
  281.   }
  282.   close(file);
  283. }
  284. static void show_date(int argc, char *argv[])
  285. {
  286.   time_t t;
  287.   struct tm tm;
  288.   t = time(NULL);
  289.   _gmtime(&t, &tm);
  290.   if (argc > 1)
  291.   {
  292.     char buffer[256];
  293.     strftime(buffer, 256, argv[1], &tm);
  294.     printf("%sn", buffer);
  295.   }
  296.   else
  297.     printf("Time is %04d/%02d/%02d %02d:%02d:%02dn", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  298. }
  299. static void test_read_file(char *filename)
  300. {
  301.   int count;
  302.   int file;
  303.   char *data;
  304.   clock_t start;
  305.   clock_t time;
  306.   int bytes;
  307.   if ((file = open(filename, 0)) < 0)
  308.   {
  309.     printf("%s: %sn", filename, strerror(file));
  310.     return;
  311.   }
  312.   data = malloc(64 * K);
  313.   bytes = 0;
  314.   start = clock();
  315.   while ((count = read(file, data, 64 * K)) > 0)
  316.   {
  317.     bytes += count;
  318.   }
  319.   time = clock() - start;
  320.   if (time == 0) time = 1;
  321.   printf("%s: read %dKB in %d ms, %dKB/sn", filename, bytes / K, time, bytes / time);
  322.   
  323.   free(data);
  324.   if (count < 0) printf("%s: %sn", filename, strerror(count));
  325.   close(file);
  326. }
  327. static void test_write_file(char *filename, int size)
  328. {
  329.   int count;
  330.   int file;
  331.   char *data;
  332.   clock_t start;
  333.   clock_t time;
  334.   int bytes;
  335.   if ((file = open(filename, O_CREAT)) < 0)
  336.   {
  337.     printf("%s: %sn", filename, strerror(file));
  338.     return;
  339.   }
  340.   data = malloc(64 * K);
  341.   bytes = 0;
  342.   start = clock();
  343.   while (bytes < size)
  344.   {
  345.     if ((count = write(file, data, 64 * K)) <= 0)
  346.     {
  347.       printf("%s: error writing filen", filename);
  348.       break;
  349.     }
  350.     bytes += count;
  351.   }
  352.   time = clock() - start;
  353.   if (time == 0) time = 1;
  354.   printf("%s: wrote %dKB in %d ms, %dKB/sn", filename, bytes / K, time, bytes / time);
  355.   
  356.   free(data);
  357.   close(file);
  358. }
  359. struct critsect testcs;
  360. int count;
  361. int runs;
  362. long holdrand = 1L;
  363. static int rand()
  364. {
  365.   return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
  366. }
  367. static void __stdcall csthreadproc(void *arg)
  368. {
  369.   int n;
  370.   while (1)
  371.   {
  372.     enter(&testcs);
  373.     runs++;
  374.     n = count;
  375.     if (n != 0) printf("ERROR: count is %dn", n);
  376.     count++;
  377.     if (rand() < 100) sleep(rand() / 1000);
  378.     count--;
  379.     leave(&testcs);
  380.     //sleep(rand() / 10000);
  381.   }
  382. }
  383. static void cstest()
  384. {
  385.   int n;
  386.   mkcs(&testcs);
  387.   runs = 0;
  388.   for (n = 0; n < 10; n++)
  389.   {
  390.     beginthread(csthreadproc, 0, NULL, 0, NULL);
  391.   }
  392.   while (1)
  393.   {
  394.     sleep(1000);
  395.     printf("%d runsr", runs);
  396.   }
  397.   csfree(&testcs);
  398. }
  399. static void set_loglevel(char *arg, int level)
  400. {
  401.   int ll = 0;
  402.   while (*arg)
  403.   {
  404.     if (*arg == 'm') ll |= LOG_MODULE;
  405.     if (*arg == 'h') ll |= LOG_HEAP;
  406.     if (*arg == 't') ll |= LOG_APITRACE;
  407.     if (*arg == 'a') ll |= LOG_AUX;
  408.     if (*arg == 'x') ll |= LOG_SUBSYS_MASK;
  409.     arg++;
  410.   }
  411.   loglevel = ll | level;
  412. }
  413. static void idle_sleep(int ms)
  414. {
  415.   time_t t;
  416.   struct tm tm;
  417.   clock_t c;
  418.   t = time(NULL);
  419.   c = clock();
  420.   _gmtime(&t, &tm);
  421.   printf("Time is %04d/%02d/%02d %02d:%02d:%02d Clock is %dn", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, c);
  422.   printf("Sleep %d msn", ms);
  423.   sleep(ms);
  424.   t = time(NULL);
  425.   c = clock();
  426.   _gmtime(&t, &tm);
  427.   printf("Time is %04d/%02d/%02d %02d:%02d:%02d Clock is %dn", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, c);
  428. }
  429. static void busy_loop(int ms)
  430. {
  431.   time_t t;
  432.   struct tm tm;
  433.   clock_t c;
  434.   t = time(NULL);
  435.   c = clock();
  436.   _gmtime(&t, &tm);
  437.   printf("Time is %04d/%02d/%02d %02d:%02d:%02d Clock is %dn", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, c);
  438.   //while (clock() < c + ms);
  439.   {
  440.     int n;
  441.     for (n = 0; n < 100000000; n++) c += n;
  442.   }
  443.   t = time(NULL);
  444.   c = clock();
  445.   _gmtime(&t, &tm);
  446.   printf("Time is %04d/%02d/%02d %02d:%02d:%02d Clock is %dn", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, c);
  447. }
  448. static void exec_program(char *args)
  449. {
  450.   char pgm[MAXPATH];
  451.   char *p;
  452.   char *q;
  453.   hmodule_t hmod;
  454.   int rc;
  455.   int dotseen = 0;
  456.   p = args;
  457.   q = pgm;
  458.   while (*p != 0 && *p != ' ')
  459.   {
  460.     if (*p == '.') dotseen = 1;
  461.     if (*p == PS1 || *p == PS2) dotseen = 0;
  462.     *q++ = *p++;
  463.   }
  464.   *q++ = 0;
  465.   if (!dotseen) strcat(pgm, ".exe");
  466.   hmod = load(pgm);
  467.   if (hmod == NULL)
  468.   {
  469.     printf("%s: program not foundn", pgm);
  470.     return;
  471.   }
  472.   rc = exec(hmod, args);
  473.   if (rc != 0) printf("Exitcode: %dn", rc);
  474.   //unload(hmod);
  475. }
  476. static void __stdcall spawn_program(void *args)
  477. {
  478.   exec_program(args);
  479.   printf("%s: terminatedn", args);
  480.   free(args);
  481. }
  482. static void launch_program(char *args)
  483. {
  484.   while (*args != 0 && *args != ' ') args++;
  485.   while (*args == ' ') args++;
  486.   beginthread(spawn_program, 0, strdup(args), 0, NULL);
  487. }
  488. static void load_module(int argc, char **argv)
  489. {
  490.   char *pgm;
  491.   hmodule_t hmod;
  492.   if (argc < 2)
  493.   {
  494.     printf("usage: load <module>n");
  495.     return;
  496.   }
  497.   pgm = argv[1];
  498.   hmod = load(pgm);
  499.   if (hmod == NULL)
  500.   {
  501.     printf("%s: unable to load modulen", pgm);
  502.     return;
  503.   }
  504. }
  505. static void mount_device(int argc, char **argv)
  506. {
  507.   char *devname;
  508.   char *path;
  509.   char *type = "dfs";
  510.   char *opts = NULL;
  511.   int rc;
  512.   if (argc < 3)
  513.   {
  514.     printf("usage: mount <device> <path> [<type> [<options>]]n");
  515.     return;
  516.   }
  517.   devname = argv[1];
  518.   path = argv[2];
  519.   if (argc > 3) type = argv[3];
  520.   if (argc > 4) opts = argv[4];
  521.   rc = mount(type, path, devname, opts); 
  522.   if (rc < 0)
  523.   {
  524.     printf("%s: %sn", devname, strerror(rc));
  525.     return;
  526.   }
  527. }
  528. static void umount_device(int argc, char **argv)
  529. {
  530.   char *path;
  531.   int rc;
  532.   if (argc < 2)
  533.   {
  534.     printf("usage: umount <path>n");
  535.     return;
  536.   }
  537.   path = argv[1];
  538.   rc = umount(path);
  539.   if (rc < 0)
  540.   {
  541.     printf("%s: %sn", path, strerror(rc));
  542.     return;
  543.   }
  544. }
  545. static void format_device(int argc, char **argv)
  546. {
  547.   char *devname;
  548.   char *type = "dfs";
  549.   char *opts = NULL;
  550.   int rc;
  551.   if (argc < 2)
  552.   {
  553.     printf("usage: format <device> [<type> [<options>]]n");
  554.     return;
  555.   }
  556.   devname = argv[1];
  557.   if (argc > 2) type = argv[2];
  558.   if (argc > 3) opts = argv[3];
  559.   rc = format(devname, type, opts); 
  560.   printf("n");
  561.   if (rc < 0)
  562.   {
  563.     printf("%s: %sn", devname, strerror(rc));
  564.     return;
  565.   }
  566. }
  567. static void disk_usage(int argc, char **argv)
  568. {
  569.   int count;
  570.   int rc;
  571.   int n;
  572.   struct statfs *buf;
  573.   struct statfs *b;
  574.   count = getfsstat(NULL, 0);
  575.   if (count < 0)
  576.   {
  577.     printf("du: %sn", strerror(count));
  578.     return;
  579.   }
  580.   buf = (struct statfs *) malloc(count * sizeof(struct statfs));
  581.   rc = getfsstat(buf, count * sizeof(struct statfs));
  582.   if (rc < 0)
  583.   {
  584.     printf("du: %sn", strerror(rc));
  585.     return;
  586.   }
  587.   printf("type   mounted on mounted from          cache    total     used    avail filesn");
  588.   printf("------ ---------- -------------------- ------ -------- -------- -------- -----n");
  589.   for (n = 0; n < count; n++)
  590.   {
  591.     b = buf + n;
  592.     printf("%-7s%-11s%-20s", b->fstype, b->mntto, b->mntfrom);
  593.     if (b->blocks != -1)
  594.     {
  595.       printf("%6dK", b->cachesize / K);
  596.       if (b->blocks * (b->bsize / 512) / 2 > 10000)
  597. printf("%8dM", b->blocks * (b->bsize / 512) / 2000);
  598.       else
  599. printf("%8dK", b->blocks * (b->bsize / 512) / 2);
  600.       if ((b->blocks - b->bfree) * (b->bsize / 512) / 2 > 10000)
  601.         printf("%8dM", (b->blocks - b->bfree) * (b->bsize / 512) / 2000);
  602.       else
  603.         printf("%8dK", (b->blocks - b->bfree) * (b->bsize / 512) / 2);
  604.       if (b->bfree * (b->bsize / 512) / 2 > 10000)
  605.          printf("%8dM", b->bfree * (b->bsize / 512) / 2000);
  606.       else
  607.         printf("%8dK", b->bfree * (b->bsize / 512) / 2);
  608.       if (b->files != -1 && b->ffree != -1) printf(" %d/%d", b->files - b->ffree, b->files);
  609.     }
  610.     printf("n");
  611.   }
  612.   free(buf);
  613. }
  614. static void lookup(char *name)
  615. {
  616.   struct hostent *hp;
  617.   int i;
  618.   if (!name || !*name) return;
  619.   if (*name >= '0' && *name <= '9')
  620.   {
  621.     struct in_addr addr;
  622.     addr.s_addr = inet_addr(name);
  623.     if (addr.s_addr == INADDR_NONE)
  624.     {
  625.       printf("%s: %sn", name, strerror(errno));
  626.       return;
  627.     }
  628.     hp = gethostbyaddr((char *) &addr, sizeof(struct in_addr), AF_INET);
  629.   }
  630.   else
  631.     hp = gethostbyname(name);
  632.   if (!hp)
  633.   {
  634.     printf("%s: %sn", name, strerror(errno));
  635.     return;
  636.   }
  637.   if (hp->h_addrtype != AF_INET)
  638.   {
  639.     printf("unknown address type %dn", hp->h_addrtype);
  640.     return;
  641.   }
  642.   if (hp->h_length != sizeof(struct in_addr))
  643.   {
  644.     printf("unknown address length %dn", hp->h_length);
  645.     return;
  646.   }
  647.   printf("name: %sn", hp->h_name);
  648.   for (i = 0; hp->h_aliases[i] != NULL; i++) printf("alias: %sn", hp->h_aliases[i]);
  649.   for (i = 0; hp->h_addr_list[i] != NULL; i++) 
  650.   {
  651.     struct in_addr *addr = (struct in_addr *) (hp->h_addr_list[i]);
  652.     printf("address: %sn", inet_ntoa(*addr));
  653.   }
  654. }
  655. static int read_line(int f, char *buf)
  656. {
  657.   char c;
  658.   int rc;
  659.   int count;
  660.   count = 0;
  661.   while ((rc = read(f, &c, 1)) > 0)
  662.   {
  663.     if (c == 'r') continue;
  664.     if (c == 'n')
  665.     {
  666.       *buf++ = 0;
  667.       return count;
  668.     }
  669.     *buf++ = c;
  670.     count++;
  671.   }
  672.   *buf = 0;
  673.   return rc;
  674. }
  675. static int httpget(char *server, char *path, char *filename)
  676. {
  677.   struct hostent *hp;
  678.   struct sockaddr_in sin;
  679.   int s;
  680.   int rc;
  681.   int n;
  682.   int count;
  683.   int f;
  684.   char *buf;
  685.   hp = gethostbyname(server);
  686.   if (!hp) return errno;
  687.   s = socket(AF_INET, SOCK_STREAM, 0);
  688.   if (s < 0) return s;
  689.   memset(&sin, 0, sizeof(sin));
  690.   sin.sin_family = AF_INET;
  691.   memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);
  692.   sin.sin_port = htons(80);
  693.   rc = connect(s, (struct sockaddr *) &sin, sizeof(sin));
  694.   if (rc  < 0)
  695.   {
  696.     close(s);
  697.     return rc;
  698.   }
  699.   buf = malloc(8*K);
  700.   if (!buf) return -ENOMEM;
  701.   sprintf(buf, "GET %s HTTP/1.0rnHost: %srnrn", path, server);
  702.   rc = send(s, buf, strlen(buf), 0);
  703.   if (rc < 0)
  704.   {
  705.     close(s);
  706.     return rc;
  707.   }
  708.   while ((rc = read_line(s, buf)) > 0)
  709.   {
  710.     //printf("hdr %sn", buf);
  711.   }
  712.   if (rc < 0) return rc;
  713.   f = open(filename, O_CREAT);
  714.   if (f < 0)
  715.   {
  716.     close(s);
  717.     free(buf);
  718.     return f;
  719.   }
  720.   count = 0;
  721.   while ((n = recv(s, buf, 8*K, 0)) > 0)
  722.   {
  723.     write(f, buf, n);
  724.     count += n;
  725.     //printf("count %dn", count);
  726.   }
  727.   if (rc < 0)
  728.   {
  729.     close(s);
  730.     close(f);
  731.     free(buf);
  732.     return n;
  733.   }
  734.   close(s);
  735.   close(f);
  736.   free(buf);
  737.   return count;
  738. }
  739. static char *httpgetbuf(char *server, char *path)
  740. {
  741.   struct hostent *hp;
  742.   struct sockaddr_in sin;
  743.   int s;
  744.   int rc;
  745.   int n;
  746.   int len;
  747.   int left;
  748.   char *buf;
  749.   char *p;
  750.   hp = gethostbyname(server);
  751.   if (!hp) return NULL;
  752.   s = socket(AF_INET, SOCK_STREAM, 0);
  753.   if (s < 0) return NULL;
  754.   memset(&sin, 0, sizeof(sin));
  755.   sin.sin_family = AF_INET;
  756.   memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);
  757.   sin.sin_port = htons(80);
  758.   rc = connect(s, (struct sockaddr *) &sin, sizeof(sin));
  759.   if (rc  < 0)
  760.   {
  761.     close(s);
  762.     return NULL;
  763.   }
  764.   buf = malloc(4096);
  765.   if (!buf) return NULL;
  766.   sprintf(buf, "GET %s HTTP/1.0rnrn", path);
  767.   rc = send(s, buf, strlen(buf), 0);
  768.   if (rc < 0)
  769.   {
  770.     close(s);
  771.     return NULL;
  772.   }
  773.   len = 0;
  774.   while ((rc = read_line(s, buf)) > 0)
  775.   {
  776.     p = strchr(buf, ':');
  777.     if (p)
  778.     {
  779.       *p++ = 0;
  780.       while (*p == ' ') p++;
  781.       if (strcmp(buf, "Content-Length") == 0) len = atoi(p);
  782.     }
  783.   }
  784.   if (rc < 0) return NULL;
  785.   printf("length is %dn", len);
  786.   buf = realloc(buf, len + 1);
  787.   p = buf;
  788.   left = len;
  789.   while (left > 0 && (n = recv(s, p, left, 0)) > 0)
  790.   {
  791.     p += n;
  792.     left -= n;
  793.   }
  794.   *p = 0;
  795.   if (rc < 0)
  796.   {
  797.     close(s);
  798.     free(buf);
  799.     return NULL;
  800.   }
  801.   close(s);
  802.   return buf;
  803. }
  804. static void http(int argc, char **argv)
  805. {
  806.   char *server;
  807.   char *path;
  808.   char *filename;
  809.   int rc;
  810.   clock_t t;
  811.   server = "192.168.12.1";
  812.   path = "/";
  813.   filename = "/dev/null";
  814.   
  815.   if (argc >= 2) server = argv[1];
  816.   if (argc >= 3) path = argv[2];
  817.   if (argc >= 4) filename = argv[3];
  818.   
  819.   t = clock();
  820.   rc = httpget(server, path, filename);
  821.   if (rc < 0)
  822.     printf("error %d '%s' retrieving %s from %sn", rc, strerror(rc), path, server);
  823.   else
  824.   {
  825.     t = clock() - t;
  826.     if (t == 0) t = 1;
  827.     printf("received %d bytes in %d ms (%d KB/s)n", rc, t, rc / t);
  828.   }
  829. }
  830. static void download(int argc, char **argv)
  831. {
  832.   char *server;
  833.   char *src;
  834.   char *dst;
  835.   char fn[256];
  836.   char path[256];
  837.   char *files;
  838.   char *p, *q;
  839.   int dir;
  840.   int rc;
  841.   server = "192.168.12.1";
  842.   src = "/sanos";
  843.   dst = "/usr";
  844.   
  845.   if (argc >= 2) server = argv[1];
  846.   if (argc >= 3) src = argv[2];
  847.   if (argc >= 4) dst = argv[3];
  848.   sprintf(path, "%s/FILES", src);
  849.   files = httpgetbuf(server, path);
  850.   if (!files)
  851.   {
  852.     printf("error retrieving file list from %sn", server);
  853.     return;
  854.   }
  855.   p = files;
  856.   while (*p)
  857.   {
  858.     q = p;
  859.     while (*q)
  860.     {
  861.       if (q[0] == 'r') break;
  862.       if (q[0] == '/' && q[1] == 'r') break;
  863.       q++;
  864.     }
  865.     if (*q == '/')
  866.     {
  867.       dir = 1;
  868.       *q++ = 0;
  869.     }
  870.     else
  871.       dir = 0;
  872.     *q++ = 0;
  873.     if (dir)
  874.     {
  875.       printf("create directory %sn", p);
  876.       sprintf(fn, "%s/%s", dst, p);
  877.       rc = mkdir(fn);
  878.       if (rc < 0) printf("%s: error %d '%s' creating directoryn", fn, rc, strerror(rc));
  879.     }
  880.     else
  881.     {
  882.       printf("download file %sn", p);
  883.       sprintf(fn, "%s/%s", dst, p);
  884.       sprintf(path, "%s/%s", src, p);
  885.       rc = httpget(server, path, fn);
  886.       if (rc < 0) printf("%s: error %d '%s' downloading filen", fn, rc, strerror(rc));
  887.     }
  888.     if (*q == 'n') *q++ = 0;
  889.     p = q;
  890.   }
  891.   free(files);
  892. }
  893. static void heap_stat()
  894. {
  895.   struct mallinfo m;
  896.   m = mallinfo();
  897.   printf("Non-mmapped space allocated from system .. : %12dn", m.arena);
  898.   printf("Number of free chunks .................... : %12dn", m.ordblks);
  899.   printf("Number of fastbin blocks ................. : %12dn", m.smblks);
  900.   printf("Number of mmapped regions ................ : %12dn", m.hblks);
  901.   printf("Space in mmapped regions ................. : %12dn", m.hblkhd);
  902.   printf("Maximum total allocated space ............ : %12dn", m.usmblks);
  903.   printf("Space available in freed fastbin blocks .. : %12dn", m.fsmblks);
  904.   printf("Total allocated space .................... : %12dn", m.uordblks);
  905.   printf("Total free space ......................... : %12dn", m.fordblks);
  906.   printf("Top-most, releasable space ............... : %12dn", m.keepcost);
  907. }
  908. static void httpinit()
  909. {
  910. #if 0
  911.   struct httpd_server *server;
  912.   server = httpd_initialize(find_section(config, "httpd"));
  913.   httpd_add_file_context(server, "/", "/usr/www", find_section(config, "webroot"));
  914.   httpd_add_file_context(server, "/files", "/", find_section(config, "webfs"));
  915.   httpd_add_resource_context(server, "/icons", hmod, NULL);
  916.   httpd_start(server);
  917. #endif
  918. }
  919. static void test1(int argc, char **argv)
  920. {
  921.   struct servent *sp;
  922.   char **alias;
  923.   sp = getservbyname("echo", "tcp");
  924.   while (sp->s_name != NULL)
  925.   {
  926.     printf("%s %d/%s", sp->s_name, sp->s_port, sp->s_proto);
  927.     alias = sp->s_aliases;
  928.     while (*alias)
  929.     {
  930.       printf(" %s", *alias);
  931.       alias++;
  932.     }
  933.     printf("n");
  934.     sp++;
  935.   }
  936. }
  937. #if 0
  938. static void test(int argc, char **argv)
  939. {
  940.   char *server;
  941.   int port;
  942.   struct hostent *hp;
  943.   struct sockaddr_in sin;
  944.   int sock;
  945.   int rc;
  946.   //server = "20.45.152.54";
  947.   server = "192.168.123.190";
  948.   port = 999;
  949.   if (argc >= 2) server = argv[1];
  950.   if (argc >= 3) port = atoi(argv[2]);
  951.   hp = gethostbyname(server);
  952.   if (!hp) return;
  953.   sock = socket(AF_INET, SOCK_STREAM, 0);
  954.   if (sock < 0) return;
  955.   memset(&sin, 0, sizeof(sin));
  956.   sin.sin_family = AF_INET;
  957.   memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);
  958.   sin.sin_port = htons(port);
  959.   rc = connect(sock, (struct sockaddr *) &sin, sizeof(sin));
  960.   if (rc  < 0)
  961.   {
  962.     syslog(LOG_ERR, "error %d in connect: %sn", rc, strerror(rc));
  963.     close(sock);
  964.   }
  965.   close(sock);
  966. }
  967. #endif
  968. #if 0
  969. static void test(int argc, char **argv)
  970. {
  971.   char *fmt = "test %%f=[%f] %%g=[%g] %%e=[%e]";
  972.   if (argc > 1) fmt = argv[1];
  973.   printf(fmt, -1.2345, 12345.6789, 0.0987654321, -123456);
  974.   printf("n");
  975. }
  976. #endif
  977. void __stdcall pipereader(void *arg)
  978. {
  979.   int f = (int) arg;
  980.   char buf[128];
  981.   int rc;
  982.   while ((rc = read(f, buf, 128)) > 0)
  983.   {
  984.     printf("piperead: %d bytes [", rc);
  985.     write(fdout, buf, rc);
  986.     printf("]n");
  987.   }
  988.   printf("piperead: exit rc=%dn", rc);
  989.   close(f);
  990. }
  991. static void pipetest(int argc, char **argv)
  992. {
  993.   int fildes[2];
  994.   int hthread;
  995.   int rc;
  996.   int i;
  997.   rc = pipe(fildes);
  998.   if (rc < 0)
  999.   {
  1000.     printf("error %d in pipe()n", rc);
  1001.     return;
  1002.   }
  1003.   hthread = beginthread(pipereader, 0, (void *) fildes[0], 0, NULL);
  1004.   close(hthread);
  1005.   for (i = 0; i < argc; i++)
  1006.   {
  1007.     printf("pipewrite: %d bytes [", strlen(argv[i]));
  1008.     write(fdout, argv[i], strlen(argv[i]));
  1009.     printf("]n");
  1010.     write(fildes[1], argv[i], strlen(argv[i]));
  1011.   }
  1012.   close(fildes[1]);
  1013. }
  1014. static void disktest(int argc, char **argv)
  1015. {
  1016.   int dev;
  1017.   int n;
  1018.   int rc;
  1019.   dev = open(argv[1], O_RDWR | O_DIRECT);
  1020.   if (dev < 0) 
  1021.   {
  1022.     printf("Error %d opening devicen", dev);
  1023.     return;
  1024.   }
  1025.   for (n = 1; n < atoi(argv[2]); n++)
  1026.   {
  1027.     printf("checking block %dn", n);
  1028.     
  1029.     rc = lseek(dev, n * 4096, SEEK_SET);
  1030.     if (rc < 0) printf("lseek returned %dn", rc);
  1031.     rc = read(dev, orig, 4096);
  1032.     if (rc < 0) printf("read returned %dn", rc);
  1033.     rc = lseek(dev, n * 4096, SEEK_SET);
  1034.     if (rc < 0) printf("lseek returned %dn", rc);
  1035.     memset(pattern, n & 0xFF, 4096);
  1036.     rc = write(dev, pattern, 4096);
  1037.     if (rc < 0) printf("write returned %dn", rc);
  1038.     rc = lseek(dev, n * 4096, SEEK_SET);
  1039.     if (rc < 0) printf("lseek returned %dn", rc);
  1040.     memset(buffer, 0, 4096);
  1041.     rc = read(dev, buffer, 4096);
  1042.     if (rc < 0) printf("read returned %dn", rc);
  1043.     if (memcmp(pattern, buffer, 4096) != 0) printf("error in test patternn");
  1044.     rc = lseek(dev, n * 4096, SEEK_SET);
  1045.     if (rc < 0) printf("lseek returned %dn", rc);
  1046.     rc = write(dev, orig, 4096);
  1047.     if (rc < 0) printf("write returned %dn", rc);
  1048.   
  1049.     rc = lseek(dev, n * 4096, SEEK_SET);
  1050.     if (rc < 0) printf("lseek returned %dn", rc);
  1051.     memset(buffer, 0, 4096);
  1052.     rc = read(dev, buffer, 4096);
  1053.     if (rc < 0) printf("read returned %dn", rc);
  1054.     if (memcmp(orig, buffer, 4096) != 0) printf("error in verifyn");
  1055.   }
  1056.   close(dev);
  1057. }
  1058. __inline long __declspec(naked) rdtscl()
  1059. {
  1060.   __asm { rdtsc }
  1061.   __asm { ret }
  1062. }
  1063. static void nop()
  1064. {
  1065.   long before;
  1066.   long after;
  1067.   long cycles;
  1068.   int i;
  1069.   long min;
  1070.   long max;
  1071.   long sum;
  1072.   if (!peb->fast_syscalls_supported)
  1073.   {
  1074.     printf("error: processor does not support sysenter/sysexitn");
  1075.     return;
  1076.   }
  1077.   peb->fast_syscalls_supported = 0;
  1078.   min = 0x7FFFFFFF;
  1079.   max = 0;
  1080.   sum = 0;
  1081.   for (i = 0; i < 1000; i++)
  1082.   {
  1083.     before = rdtscl();
  1084.     syscall(0,0);
  1085.     after = rdtscl();
  1086.     cycles = after - before;
  1087.     if (cycles < min) min = cycles;
  1088.     if (cycles > max) max = cycles;
  1089.     sum += cycles;
  1090.   }
  1091.   printf("syscall(0,0) with int 48: min/avg/max %d/%d/%d cyclesn", min, sum / 1000, max);
  1092.   peb->fast_syscalls_supported = 1;
  1093.   min = 0x7FFFFFFF;
  1094.   max = 0;
  1095.   sum = 0;
  1096.   for (i = 0; i < 1000; i++)
  1097.   {
  1098.     before = rdtscl();
  1099.     syscall(0,0);
  1100.     after = rdtscl();
  1101.     cycles = after - before;
  1102.     if (cycles < min) min = cycles;
  1103.     if (cycles > max) max = cycles;
  1104.     sum += cycles;
  1105.   }
  1106.   printf("syscall(0,0) with sysenter: min/avg/max %d/%d/%d cyclesn", min, sum / 1000, max);
  1107. }
  1108. static void divtesthandler(int signum, struct siginfo *info)
  1109. {
  1110.   printf("in handlern");
  1111.   info->ctxt.ecx = 10;
  1112. }
  1113. static void test(int argc, char **argv)
  1114. {
  1115.   signal(SIGFPE, divtesthandler);
  1116.   printf("100/0=%dn", 100 / atoi(argv[1]));
  1117.   signal(SIGFPE, SIG_DFL);
  1118. }
  1119. static void set_kprint(int enabled)
  1120. {
  1121.   ioctl(1, IOCTL_KPRINT_ENABLED, &enabled, 4);
  1122. }
  1123. static void beep()
  1124. {
  1125.   ioctl(1, IOCTL_BEEP, NULL, 0);
  1126. }
  1127. static void sound(int freq)
  1128. {
  1129.   ioctl(1, IOCTL_SOUND, &freq, 4);
  1130. }
  1131. static void play_file(int argc, char **argv)
  1132. {
  1133.   extern void play(char *song);
  1134. #if 0
  1135.   char buffer[4096];
  1136.   FILE *f;
  1137.   f = fopen("tunes.txt", "r");
  1138.   while (fgets(buffer, sizeof buffer, f))
  1139.   {
  1140.     printf("%sn", buffer);
  1141.     play(buffer);
  1142.   }
  1143.   fclose(f);
  1144. #endif
  1145.   //play("AxelF:d=4, o=5, b=160:f#, 8a., 8f#, 16f#, 8a#, 8f#, 8e, f#, 8c.6, 8f#, 16f#, 8d6, 8c#6, 8a, 8f#, 8c#6, 8f#6, 16f#, 8e, 16e, 8c#, 8g#, f#.");
  1146.   //play("dualingbanjos:d=4, o=5, b=200:8c#, 8d, e, c#, d, b4, c#, d#4, b4, p, 16c#6, 16p, 16d6, 16p, 8e6, 8p, 8c#6, 8p, 8d6, 8p, 8b, 8p, 8c#6, 8p, 8a, 8p, b, p, a4, a4, b4, c#, d#4, c#, b4, p, 8a, 8p, 8a, 8p, 8b, 8p, 8c#6, 8p, 8a, 8p, 8c#6, 8p, 8b");
  1147.   play("Entertainer:d=4, o=5, b=140:8d, 8d#, 8e, c6, 8e, c6, 8e, 2c.6, 8c6, 8d6, 8d#6, 8e6, 8c6, 8d6, e6, 8b, d6, 2c6, p, 8d, 8d#, 8e, c6, 8e, c6, 8e, 2c.6, 8p, 8a, 8g, 8f#, 8a, 8c6, e6, 8d6, 8c6, 8a, 2d6");
  1148.   //play("Barbiegirl:d=4,o=5,b=125:8g#,8e,8g#,8c#6,a,p,8f#,8d#,8f#,8b,g#,8f#,8e,p,8e,8c#,f#,c#,p,8f#,8e,g#,f#");
  1149.   //play("Muppets:d=4, o=5, b=250:c6, c6, a, b, 8a, b, g, p, c6, c6, a, 8b, 8a, 8p, g., p, e, e, g, f, 8e, f, 8c6, 8c, 8d, e, 8e, 8e, 8p, 8e, g, 2p, c6, c6, a, b, 8a, b, g, p, c6, c6, a, 8b, a, g., p, e, e, g, f, 8e, f, 8c6, 8c, 8d, e, 8e, d, 8d, c");
  1150. }
  1151. static void reboot()
  1152. {
  1153.   ioctl(1, IOCTL_REBOOT, NULL, 0);
  1154. }
  1155. static void kbdtest()
  1156. {
  1157.   int escs;
  1158.   unsigned char ch;
  1159.   int rc;
  1160.   escs = 0;
  1161.   while (1)
  1162.   {
  1163.     rc = read(gettib()->in, &ch, 1);
  1164.     if (rc != 1)
  1165.     {
  1166.       printf("Error %d in readn", rc);
  1167.       break;
  1168.     }
  1169.     if (ch == 0x1B) 
  1170.       escs++;
  1171.     else
  1172.       escs = 0;
  1173.     if (escs == 3) break;
  1174.     printf("[0x%02X]", ch);
  1175.   }
  1176.   printf("n");
  1177. }
  1178. void shell()
  1179. {
  1180.   char cmd[256];
  1181.   int argc;
  1182.   char **argv;
  1183.   while (1)
  1184.   {
  1185.     printf("%s$ ", getcwd(cmd, 256));
  1186.     if (readline(fdin, cmd, 256) < 0) break;
  1187.     argc = parse_args(cmd, NULL);
  1188.     if (argc)
  1189.     {
  1190.       argv = (char **) malloc(argc * sizeof(char *));
  1191.       parse_args(cmd, argv);
  1192.     
  1193.       if (strcmp(argv[0], "exit") == 0) 
  1194. break;
  1195.       else if (strcmp(argv[0], "ls") == 0 || strcmp(argv[0], "dir") == 0)
  1196. list_dir(argc, argv);
  1197.       else if (strcmp(argv[0], "cat") == 0 || strcmp(argv[0], "type") == 0)
  1198. list_file(argv[1]);
  1199.       else if (strcmp(argv[0], "cp") == 0 || strcmp(argv[0], "copy") == 0)
  1200. copy_file(argv[1], argv[2]);
  1201.       else if (strcmp(argv[0], "rm") == 0 || strcmp(argv[0], "del") == 0)
  1202. remove_file(argv[1]);
  1203.       else if (strcmp(argv[0], "mv") == 0 || strcmp(argv[0], "move") == 0)
  1204. move_file(argv[1], argv[2]);
  1205.       else if (strcmp(argv[0], "chdir") == 0 || strcmp(argv[0], "cd") == 0)
  1206. change_dir(argv[1]);
  1207.       else if (strcmp(argv[0], "mkdir") == 0 || strcmp(argv[0], "md") == 0)
  1208. make_dir(argv[1]);
  1209.       else if (strcmp(argv[0], "rmdir") == 0 || strcmp(argv[0], "rd") == 0)
  1210. remove_dir(argv[1]);
  1211.       else if (strcmp(argv[0], "mount") == 0)
  1212. mount_device(argc, argv);
  1213.       else if (strcmp(argv[0], "format") == 0)
  1214. format_device(argc, argv);
  1215.       else if (strcmp(argv[0], "umount") == 0)
  1216. umount_device(argc, argv);
  1217.       else if (strcmp(argv[0], "du") == 0)
  1218. disk_usage(argc, argv);
  1219.       else if (strcmp(argv[0], "date") == 0)
  1220. show_date(argc, argv);
  1221.       else if (strcmp(argv[0], "read") == 0)
  1222. test_read_file(argv[1]);
  1223.       else if (strcmp(argv[0], "more") == 0)
  1224. display_file(argv[1]);
  1225.       else if (strcmp(argv[0], "write") == 0)
  1226. test_write_file(argv[1], atoi(argv[2]) * K);
  1227.       else if (strcmp(argv[0], "disktest") == 0)
  1228. disktest(argc, argv);
  1229.       else if (strcmp(argv[0], "cls") == 0)
  1230. printf("f");
  1231.       else if (strcmp(argv[0], "log") == 0)
  1232. set_loglevel(argv[1], atoi(argv[2]));
  1233.       else if (strcmp(argv[0], "heapstat") == 0)
  1234. heap_stat();
  1235.       else if (strcmp(argv[0], "kp") == 0)
  1236. set_kprint(atoi(argv[1]));
  1237.       else if (strcmp(argv[0], "start") == 0)
  1238.         launch_program(cmd);
  1239.       else if (strcmp(argv[0], "load") == 0)
  1240. load_module(argc, argv);
  1241.       else if (strcmp(argv[0], "break") == 0)
  1242. dbgbreak();
  1243.       else if (strcmp(argv[0], "nop") == 0)
  1244. nop();
  1245.       else if (strcmp(argv[0], "sleep") == 0)
  1246. idle_sleep(atoi(argv[1]));
  1247.       else if (strcmp(argv[0], "loop") == 0)
  1248. busy_loop(atoi(argv[1]));
  1249.       else if (strcmp(argv[0], "lookup") == 0 || strcmp(argv[0], "nslookup") == 0)
  1250. lookup(argv[1]);
  1251.       else if (strcmp(argv[0], "http") == 0)
  1252. http(argc, argv);
  1253.       else if (strcmp(argv[0], "download") == 0)
  1254. download(argc, argv);
  1255.       else if (strcmp(argv[0], "reboot") == 0)
  1256. reboot();
  1257.       else if (strcmp(argv[0], "beep") == 0)
  1258. beep();
  1259.       else if (strcmp(argv[0], "sound") == 0)
  1260. sound(atoi(argv[1]));
  1261.       else if (strcmp(argv[0], "play") == 0)
  1262. play_file(argc, argv);
  1263.       else if (strcmp(argv[0], "test") == 0)
  1264. test(argc, argv);
  1265.       else if (strcmp(argv[0], "kbd") == 0)
  1266. kbdtest();
  1267.       else if (strcmp(argv[0], "cstest") == 0)
  1268. cstest();
  1269.       else
  1270. exec_program(cmd);
  1271.       free_args(argc, argv);
  1272.     }
  1273.   }
  1274. }
  1275. void __stdcall ttyd(void *arg)
  1276. {
  1277.   char *devname = (char *) arg;
  1278.   handle_t f;
  1279.   struct serial_config cfg;
  1280.   f = open(devname, O_RDWR);
  1281.   if (f < 0) 
  1282.   {
  1283.     syslog(LOG_INFO, "Error %d starting shell on device %sn", f, devname);
  1284.     endthread(1);
  1285.   }
  1286.   cfg.speed = 115200;
  1287.   cfg.databits = 8;
  1288.   cfg.stopbits = 1;
  1289.   cfg.rx_timeout = INFINITE;
  1290.   cfg.tx_timeout = INFINITE;
  1291.   cfg.parity = PARITY_NONE;
  1292.   ioctl(f, IOCTL_SERIAL_SETCONFIG, &cfg, sizeof(struct serial_config));
  1293.   syslog(LOG_INFO, "sh: starting shell on device %sn", devname);
  1294.   gettib()->in = f;
  1295.   gettib()->out = f;
  1296.   gettib()->err = f;
  1297.   shell();
  1298.   close(f);
  1299. }
  1300. void __stdcall telnet_task(void *arg)
  1301. {
  1302.   int s = (int) arg;
  1303.   gettib()->in = s;
  1304.   gettib()->out = s;
  1305.   gettib()->err = s;
  1306. #ifdef DEBUG
  1307.   printf("%s version %s (Debug Build %s %s)n", OSNAME, OSVERSION, __DATE__, __TIME__);
  1308. #else
  1309.   printf("%s version %s (Build %s %s)n", OSNAME, OSVERSION, __DATE__, __TIME__);
  1310. #endif
  1311.   printf("%snn", COPYRIGHT);
  1312.   shell();
  1313.   close(s);
  1314. }
  1315. void __stdcall telnetd(void *arg)
  1316. {
  1317.   int s;
  1318.   int client;
  1319.   int rc;
  1320.   struct sockaddr_in sin;
  1321.   int hthread;
  1322.   s = socket(AF_INET, SOCK_STREAM, 0);
  1323.   if (s < 0)
  1324.   {
  1325.     printf("telnetd: error %d in socketn", s);
  1326.     return;
  1327.   }
  1328.   sin.sin_len = sizeof(struct sockaddr_in);
  1329.   sin.sin_family = AF_INET;
  1330.   sin.sin_addr.s_addr = INADDR_ANY;
  1331.   sin.sin_port = htons(23);
  1332.   rc = bind(s, (struct sockaddr *) &sin, sizeof sin);
  1333.   if (rc < 0)
  1334.   {
  1335.     printf("telnetd: error %d in bindn", rc);
  1336.     return;
  1337.   }
  1338.   rc = listen(s, 5);
  1339.   if (rc < 0)
  1340.   {
  1341.     printf("telnetd: error %d in listenn", rc);
  1342.     return;
  1343.   }
  1344.   while (1)
  1345.   {
  1346.     struct sockaddr_in sin;
  1347.     client = accept(s, (struct sockaddr *) &sin, NULL);
  1348.     if (client < 0)
  1349.     {
  1350.       printf("telnetd: error %d in acceptn", client);
  1351.       return;
  1352.     }
  1353.     syslog(LOG_INFO, "telnetd: client connected from %an", &sin.sin_addr);
  1354.     hthread = beginthread(telnet_task, 0, (void *) client, 0, NULL);
  1355.     close(hthread);
  1356.   }
  1357. }
  1358. int main(int argc, char *argv[])
  1359. {
  1360.   //beginthread(ttyd, 0, "/dev/com4", 0, NULL);
  1361.   if (peb->ipaddr.s_addr != INADDR_ANY) beginthread(telnetd, 0, NULL, 0, NULL);
  1362.   shell();
  1363.   return 0;
  1364. }