tw_cli_fs.c.svn-base
上传用户:hujq123
上传日期:2016-04-10
资源大小:153k
文件大小:11k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* 
  2.  * Copyright (C) 2002 Koninklijke Philips Electronics N.V., 
  3.  * All Rights Reserved. 
  4.  *
  5.  * This source code and any compilation or derivative thereof is the 
  6.  * proprietary information of Koninklijke Philips Electronics N.V. 
  7.  * and is confidential in nature. 
  8.  * Under no circumstances is this software to be exposed to or placed 
  9.  * under an Open Source License of any type without the expressed 
  10.  * written permission of Koninklijke Philips Electronics N.V. 
  11.  * 
  12.  *###########################################################
  13.  */ 
  14. /*! 
  15.  *      file           tw_cli_fs.c 
  16.  * 
  17.  *      brief          - 
  18.  * 
  19.  */ 
  20. /*-----------------------------------------------------------*
  21.  * 
  22.  *      %version:       4 % 
  23.  *      instance:       DS_6 
  24.  *      %date_created:  Fri Feb 21 08:04:52 2003 % 
  25.  *
  26.  *###########################################################
  27.  */ 
  28. /****************************************************************************
  29. *
  30. * Filename   : tw_cli_fs.c
  31. * Purpose    : CLI command objects and functions to support FS commands. 
  32. *
  33. *
  34. *****************************************************************************/
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <unistd.h>
  38. #include <stdarg.h>
  39. #include <string.h>
  40. #include <errno.h>
  41. #include <tmtypes.h>
  42. #include <dirent.h>
  43. #include <sys/stat.h>
  44. #include <tw_cli.h>
  45. #include <crc32.h>
  46. #include "tm_common.h"
  47. /*** 2nd level CLI Command Option - fs "copy"
  48. ***/
  49. static int CliCoVoproc_FsCopy(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  50. Cli_CmdStruct_t  CliCo_FsCopy =
  51. {
  52.     "copy",
  53.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  54.     NULL,
  55.     "copy a file {FROM_FILENAME TO_FILENAME}",
  56.     NULL,
  57.     NULL,
  58.     CliCoVoproc_FsCopy
  59. };
  60. /*** 2nd level CLI Command Option - fs "crc"
  61. ***/
  62. static int CliCoVoproc_FsCrc(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  63. Cli_CmdStruct_t  CliCo_FsCrc =
  64. {
  65.     "crc",
  66.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  67.     NULL,
  68.     "calculate crc of {FILE}",
  69.     NULL,
  70.     NULL,
  71.     CliCoVoproc_FsCrc
  72. };
  73. /*** 2nd level CLI Command Option - fs "dir"
  74. ***/
  75. static int CliCoVoproc_FsDir(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  76. Cli_CmdStruct_t  CliCo_FsDir =
  77. {
  78.     "dir",
  79.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  80.     NULL,
  81.     "display directory {DIRECTORY}",
  82.     NULL,
  83.     NULL,
  84.     CliCoVoproc_FsDir
  85. };
  86. /*** 2nd level CLI Command Option - fs "delete"
  87. ***/
  88. static int CliCoVoproc_FsDelete(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  89. Cli_CmdStruct_t  CliCo_FsDelete =
  90. {
  91.     "delete",
  92.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  93.     NULL,
  94.     "delete a file {FILENAME}",
  95.     NULL,
  96.     NULL,
  97.     CliCoVoproc_FsDelete
  98. };
  99. /*** 2nd level CLI Command Option - fs "dump"
  100. ***/
  101. static int CliCoVoproc_FsDump(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  102. Cli_CmdStruct_t  CliCo_FsDump =
  103. {
  104.     "dump",
  105.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  106.     NULL,
  107.     "dump a file {FILENAME}",
  108.     NULL,
  109.     NULL,
  110.     CliCoVoproc_FsDump
  111. };
  112. /*** 2nd level CLI Command Option - fs "test"
  113. ***/
  114. static int CliCoVoproc_FsTest(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  115. Cli_CmdStruct_t  CliCo_FsTest =
  116. {
  117.     "test",
  118.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  119.     NULL,
  120.     "write/read test filesystem {FILECOUNT}",
  121.     NULL,
  122.     NULL,
  123.     CliCoVoproc_FsTest
  124. };
  125. /*** 2nd level CLI Command Option - fs "type"
  126. ***/
  127. static int CliCoVoproc_FsType(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  128. Cli_CmdStruct_t  CliCo_FsType =
  129. {
  130.     "type",
  131.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  132.     NULL,
  133.     "print the content of a file {FILENAME}",
  134.     NULL,
  135.     NULL,
  136.     CliCoVoproc_FsType
  137. };
  138. /*** 1st level CLI Command Option - "fs" 
  139. ***/
  140. Cli_CmdStruct_t *CliRcoOptionList_Fs[] = 
  141. {
  142.     &CliCo_FsCopy,
  143.     &CliCo_FsCrc,
  144.     &CliCo_FsDelete,
  145.     &CliCo_FsDir,
  146.     &CliCo_FsDump,
  147.     &CliCo_FsTest,
  148.     &CliCo_FsType,
  149.     NULL
  150. };
  151. Cli_CmdStruct_t  CliRco_Fs = 
  152. {
  153.     "fs",
  154.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  155.     CliRcoOptionList_Fs,
  156.     "File system manipulation command",
  157.     NULL,
  158.     NULL,
  159.     NULL
  160. };                       
  161. static int CliCoVoproc_FsType(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  162. {
  163.     char FileName[96];
  164.     if (sscanf(CmdStr + Ptr, "%s", FileName) != 1) 
  165.     {
  166.         Cli_Printf(pSess, badParamStr);
  167.         return 0;
  168.     }
  169.     Cli_PrintFileContent(pSess, FileName);
  170.     return 0;
  171. }
  172. #define COPY_BUFF_LEN 4096
  173. int CopyFile (const char *FileName, const char* NewFileName)
  174. {
  175.     FILE *InStream;
  176.     FILE *OutStream;
  177.     char *Line ;
  178.     int  ReadBytes ;
  179.     int  WriteBytes ;
  180.     int  TotalBytes ;
  181.     int  status ;
  182.     if ( (InStream = fopen ( FileName, "r")) == NULL) 
  183.     {
  184.         return 1 ;
  185.     }
  186.     if ( (OutStream = fopen ( NewFileName, "w")) == NULL)
  187.     {
  188.         return 1 ;
  189.     }
  190.     Line = malloc(COPY_BUFF_LEN) ;
  191.     if (Line == NULL)
  192.     {
  193.         return 1 ;
  194.     }
  195.     TotalBytes = 0 ;
  196.     status = 1 ;
  197.     while (True)
  198.     {
  199.         ReadBytes = fread(Line, 1, COPY_BUFF_LEN, InStream) ;
  200.         if (ReadBytes == 0)
  201.         {
  202.             break ;
  203.         }
  204.         WriteBytes = fwrite(Line, 1, ReadBytes, OutStream) ;
  205.         if (WriteBytes != ReadBytes)
  206.         {
  207.             status = 0 ;
  208.             break ;
  209.         }
  210.         TotalBytes += ReadBytes ;
  211.     }
  212.     fclose (OutStream);
  213.     fclose (InStream);
  214.     free(Line) ;
  215.     return status;
  216. }
  217. static int CliCoVoproc_FsCopy(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  218. {
  219.     char FromFileName[96], ToFileName[96];
  220.     if (sscanf(CmdStr + Ptr, "%s %s", 
  221.                FromFileName, ToFileName) != 2) 
  222.     {
  223.         Cli_Printf(pSess, badParamStr);
  224.         return 0;
  225.     }
  226.     if (CopyFile(FromFileName, ToFileName) != 0) 
  227.     {
  228.         Cli_Printf(pSess, Cli_FailedStr);
  229.         return 0;
  230.     }
  231.     Cli_Printf(pSess, "copied from %s to %sn", 
  232.                FromFileName, ToFileName); 
  233.     return 0;
  234. }
  235. static int CliCoVoproc_FsCrc(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  236. {
  237.     char  FileName[64] ;
  238.     UInt8 Data ;
  239.     FILE  *File ;
  240.     UInt  Bytes ;
  241.     crc_t Crc ;
  242.     if (sscanf(CmdStr + Ptr, "%s", FileName) != 1)
  243.     {
  244.         Cli_Printf(pSess, badParamStr);
  245.         return 0;
  246.     }
  247.     File = fopen(FileName, "rb") ;
  248.     if (File == NULL)
  249.     {
  250.         Cli_Printf(pSess, "Could not open file %sn", FileName) ;
  251.         return 0 ;
  252.     }
  253.     Bytes = 0 ;
  254.     crc32_init(&Crc) ;
  255.     while (!feof(File))
  256.     {
  257.         if (fread(&Data, 1, 1, File) != 1)
  258.         {
  259.             break ;
  260.         }
  261.         crc32_add(&Crc, Data) ;
  262.         Bytes++ ;
  263.     }
  264.     crc32_end(&Crc) ;
  265.     fclose(File) ;
  266.     printf("CRC %08x  Size %08x  File %sn", Crc, Bytes, FileName) ;
  267.     return 0;
  268. }
  269. static int CliCoVoproc_FsDump(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  270. {
  271.     char  FileName[64] ;
  272.     UInt8 Data ;
  273.     FILE  *File ;
  274.     UInt  Offset ;
  275.     if (sscanf(CmdStr + Ptr, "%s", FileName) != 1)
  276.     {
  277.         Cli_Printf(pSess, badParamStr);
  278.         return 0;
  279.     }
  280.     File = fopen(FileName, "rb") ;
  281.     if (File == NULL)
  282.     {
  283.         Cli_Printf(pSess, "Could not open file %sn", FileName) ;
  284.         return 0 ;
  285.     }
  286.     Offset = 0 ;
  287.     while (!feof(File))
  288.     {
  289.         if ((Offset & 0xf) == 0)
  290.         {
  291.             Cli_Printf(pSess, "%07o", Offset) ;
  292.         }
  293.         if (fread(&Data, 1, 1, File) != 1)
  294.         {
  295.             break ;
  296.         }
  297.         Cli_Printf(pSess, " %02x", Data) ;
  298.         Offset++ ;
  299.         if ((Offset & 0xf) == 0)
  300.         {
  301.             Cli_Printf(pSess, "n") ;
  302.         }
  303.     }
  304.     fclose(File) ;
  305.     if ((Offset & 0xf) != 0)
  306.     {
  307.         Cli_Printf(pSess, "n") ;
  308.     }
  309.     return 0;
  310. }
  311. static int CliCoVoproc_FsDir(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  312. {
  313.     DIR            *pDir;
  314.     struct dirent  *pDirEntry;
  315.     char           DirName[64], FullFileName[96];
  316.     struct stat    StatBuf;
  317.     if (sscanf(CmdStr + Ptr, "%s", DirName) != 1)
  318.     {
  319.         Cli_Printf(pSess, badParamStr);
  320.         return 0;
  321.     }
  322.     pDir = opendir(DirName);
  323.     if (pDir == NULL)
  324.     {
  325.         Cli_Printf(pSess, "opendir() of %s failed: %sn",
  326.                    DirName,
  327.                    _sys_errlist[errno]) ;
  328.         return 0;
  329.     }
  330.     while ((pDirEntry = readdir(pDir)) != NULL)
  331.     {
  332.         sprintf(FullFileName, "%s/%s", DirName, pDirEntry->d_name);
  333.         if (stat(FullFileName, &StatBuf) != 0)
  334.         {
  335.             continue;
  336.         }
  337.         Cli_Printf(pSess, "%-20s", pDirEntry->d_name);
  338.         if ((StatBuf.st_mode & S_IFMT) == S_IFDIR)
  339.         {
  340.             Cli_Printf(pSess, "<DIR>n");
  341.         }
  342.         else
  343.         {
  344.             Cli_Printf(pSess, "         %d bytesn", StatBuf.st_size);
  345.         }
  346.     }
  347.     closedir(pDir);
  348.     return 0;
  349. }
  350. static int CliCoVoproc_FsDelete(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  351. {
  352.     char FullFileName[96], Ans;
  353.     if (sscanf(CmdStr + Ptr, "%s", FullFileName) != 1)
  354.     {
  355.         Cli_Printf(pSess, badParamStr);
  356.         return 0;
  357.     }
  358.     Cli_Printf(pSess, "Press Y to confirm...n");
  359.     Ans = Cli_GetChar(pSess);
  360.     if ((Ans == 'y') || (Ans == 'Y')) 
  361.     {
  362.         if (unlink(FullFileName) == 0)
  363.         {
  364.             Cli_Printf(pSess, "%s removedn", FullFileName);
  365.         }
  366.         else
  367.         {
  368.             Cli_Printf(pSess, Cli_FailedStr);
  369.         }
  370.     }
  371.     else
  372.     {
  373.         Cli_Printf(pSess, "Delete operation abortedn");
  374.     }
  375.     return 0;
  376. }
  377. /*****************************************************************************
  378. * ffs_test_task - Flash file system test task
  379. *       
  380. * Returns:  nothing. 
  381. *
  382. * Description:      
  383. *       This routine runs a flash file system test
  384. *
  385. * History:
  386. *   11/27/99    jvs  Initial revision
  387. *
  388. *****************************************************************************/
  389. #define FFS_TEST_TASK_COUNT 4
  390. #define __FFS_TEST_IN_TW_CLI_FS__
  391. #include "ffs_tst.c"
  392. static void ffs_test_task(FfsTstPrintf_t Printf, void *Handle, int Task, int FileCount)
  393. {
  394.     srand(Task) ;
  395.     ffs_test(Printf, Handle, Task, FileCount) ;
  396.     t_delete(0) ;
  397. }
  398. /*****************************************************************************
  399. * ffs_test_start - Start flash file system test task
  400. *       
  401. * Returns:  nothing. 
  402. *
  403. * Description:      
  404. *       This routine starts a task to 
  405. *
  406. * History:
  407. *   11/27/99    jvs  Initial revision
  408. *
  409. *****************************************************************************/
  410. static void ffs_test_start(FfsTstPrintf_t Printf, void *Handle, int Task, int FileCount)
  411. {
  412.     char    TaskName[5] ;
  413.     ULONG   TaskId ;
  414.     ULONG   Status ;
  415.     ULONG   Args[4] ;
  416.     sprintf(TaskName, "fst%x", Task) ;
  417.     Status = t_create(TaskName, PRIORITY_NORMAL, 4096, 4096, T_LOCAL, &TaskId);
  418.     if (Status != 0)
  419.     {
  420.         Printf(Handle, "Could not start task '%s', error %08xn",
  421.                TaskName, Status) ;
  422.     }
  423.     else
  424.     {
  425.         Args[0] = (ULONG) Printf ;
  426.         Args[1] = (ULONG) Handle ;
  427.         Args[2] = (ULONG) Task ;
  428.         Args[3] = (ULONG) FileCount ;
  429.         Status = t_start(TaskId, T_PREEMPT | T_TSLICE, ffs_test_task, Args);
  430.     }
  431. }
  432. /*****************************************************************************
  433. * ffs_test - test flash file system
  434. *       
  435. * Returns:  nothing. 
  436. *
  437. * Description:      
  438. *       This runs a 100 file test of the flash file system.
  439. *
  440. * History:
  441. *   11/27/99    jvs  Initial revision
  442. *
  443. *****************************************************************************/
  444. static int CliCoVoproc_FsTest(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  445. {
  446.     UInt FileCount ;
  447.     UInt Task ;
  448.     if (sscanf(CmdStr + Ptr, "%d", &FileCount) != 1)
  449.     {
  450.         Cli_Printf(pSess, badParamStr);
  451.         return 0;
  452.     }
  453.     for (Task = 0; Task < FFS_TEST_TASK_COUNT; Task++)
  454.     {
  455.         ffs_test_start((FfsTstPrintf_t) Cli_Printf, pSess, Task, FileCount) ;
  456.     }
  457.     return 0;
  458. }
  459. /*****************************************************************************/