⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lscdlib.c

📁 此程序运行在Tornado环境中,里面包含了tornado入门的基本程序,也是Vxworks入门非常好的资料,里面包括信号量,消息,队列,中断,事件,等等的示例,还有tornado环境工具如windv
💻 C
字号:
/* lscdLib.c - ls(), ll(), cd(), and pwd() from usrLib.c */

#include "vxWorks.h"
#include "fioLib.h"
#include "dirent.h"
#include "stat.h"
#include "private/funcBindP.h"
#include "string.h"
#include "stdio.h"
#include "pathLib.h"
#include "time.h"
#include "ioLib.h"
#include "netDrv.h"
#include "errno.h"

#define MAX_DATE_STRING 21

/*******************************************************************************
*
* ls - list the contents of a directory
*
* This command is similar to UNIX ls.  It lists the contents of a directory
* in one of two formats.  If <doLong> is FALSE, only the names of the files
* (or subdirectories) in the specified directory are displayed.  If <doLong>
* is TRUE, then the file name, size, date, and time are displayed.  For 
* a long listing, any entries that describe subdirectories are also flagged
* with the label "DIR".
*
* The <dirName> parameter specifies which directory to list.  If
* <dirName> is omitted or NULL, the current working directory is listed.
*
* Empty directory entries and dosFs volume label entries are not reported.
*
* NOTE: When used with netDrv devices (FTP or RSH), <doLong> has no effect.
*
* RETURNS: OK or ERROR.
*
* SEE ALSO: ll(), lsOld(), stat(),
* .pG "Target Shell"
*/

STATUS ls
    (
    FAST char	*dirName,	/* name of dir to list */
    BOOL	doLong 		/* if TRUE, do long listing */
    )
    {
    FAST STATUS		status;		/* return status */
    FAST DIR		*pDir;		/* ptr to directory descriptor */
    FAST struct dirent	*pDirEnt;	/* ptr to dirent */
    struct stat		fileStat;	/* file status info    (long listing) */
    STATUS		statResult;     /* return value of stat () call */
    char		*pDirComment;	/* dir comment         (long listing) */
    BOOL		firstFile;	/* first file flag     (long listing) */
    struct tm 	        fileDate;       /* file date in time.h format */
    char		dateString [MAX_DATE_STRING];
    char 		fileName [MAX_FILENAME_LENGTH];
					/* buffer for building file name */

    if (dirName == NULL)
	dirName = ".";

    /* try to do a netDrv listing first */ 

    if (_func_netLsByName != NULL)
	{
	if ((*_func_netLsByName) (dirName) == OK)
	    return (OK);
	else if (errno != S_netDrv_UNKNOWN_REQUEST)
	    return (ERROR);
	}
	    
    if ((pDir = opendir (dirName)) == NULL)
        {
	printf ("Can't open \"%s\".\n", dirName);
	return (ERROR);
        }

    status = OK;
    firstFile = TRUE;

    while (TRUE)
	{
	errno = OK;
	pDirComment = "";

    	pDirEnt = readdir (pDir);

	if (pDirEnt == NULL)
	    {
	    if (errno != OK)
		{
		printf ("error reading entry (errno=%#x)\n", errno);
		status = ERROR;
		}

	    break;
	    }

	if (!doLong)
	    printf ("%s\n", pDirEnt->d_name);
	else
	    {
	    if (firstFile)
		{
		printf ("  size          date       time       name\n");
		printf ("--------       ------     ------    --------\n");

		firstFile = FALSE;
		}

	    /* Construct path/filename for stat */

	    (void) pathCat (dirName, pDirEnt->d_name, fileName);

	    /* Get and print file status info */

	    if ((statResult = (stat (fileName, &fileStat))) != OK)
		{
		/* 
		 * Since we got this file from a readdir call, we know
		 * something is there.  A failed stat() is probably
		 * a symlink that can't be resolved.  Continue with the
		 * listing.
		 */

		memset (&fileStat, 0, sizeof (fileStat));
		perror ("IO Error - can\'t stat file");
		pDirComment = "<IO Error>";
		}
	    else if (S_ISDIR (fileStat.st_mode))
	        pDirComment = "<DIR>";

	    /* zero out the fileDate struct */
	    
	    memset (&fileDate, 0, sizeof (fileDate));

	    /* use the results of the stat() call to fill in the fileDate */
	    
	    localtime_r (&fileStat.st_mtime, &fileDate);

	    if (statResult == OK)
	        strftime (dateString, MAX_DATE_STRING, "%b-%d-%Y  %H:%M:%S",
			  &fileDate);
	    else
		{
	        memset (dateString, ' ', MAX_DATE_STRING);
		dateString [MAX_DATE_STRING] = EOS;
		}

	    printf ("%8d    %s   %-16s  %s\n",
		    fileStat.st_size,
		    dateString,
		    pDirEnt->d_name, pDirComment);
	    }
	}

    status |= closedir (pDir);

    return (status);
    }

/*******************************************************************************
*
* ll - do a long listing of directory contents
*
* This command causes a long listing of a directory's contents to be
* displayed.  It is equivalent to:
* .CS
*     -> ls dirName, TRUE
* .CE
*
* NOTE: When used with netDrv devices (FTP or RSH), ll() does not give
* directory information.  It is equivalent to an ls() call with no 
* long-listing option.
*
* RETURNS: OK or ERROR.
*
* SEE ALSO: ls(), stat(),
* .pG "Target Shell"
*/

STATUS ll
    (
    char *dirName		/* name of directory to list */
    )
    {
    return (ls (dirName, TRUE));
    }

/*******************************************************************************
*
* cd - change the default directory
*
* This command sets the default directory to <name>.  The default directory
* is a device name, optionally followed by a directory local to that
* device.
*
* To change to a different directory, specify one of the following:
* .iP "" 4
* an entire path name with a device name, possibly followed by a directory
* name.  The entire path name will be changed.
* .iP
* a directory name starting with a `~' or `/' or `$'.  The directory part
* of the path, immediately after the device name, will be replaced with the new
* directory name.
* .iP
* a directory name to be appended to the current default directory.
* The directory name will be appended to the current default directory.
* .LP
*
* An instance of ".." indicates one level up in the directory tree.
*
* Note that when accessing a remote file system via RSH or FTP, the
* VxWorks network device must already have been created using
* netDevCreate().
*
* WARNING
* The cd() command does very little checking that <name> represents a valid
* path.  If the path is invalid, cd() may return OK, but subsequent
* calls that depend on the default path will fail.
* 
* EXAMPLES
* The following example changes the directory to device `/fd0/':
* .CS
*     -> cd "/fd0/"
* .CE
* This example changes the directory to device `wrs:' with the local
* directory `~leslie/target':
* .CS
*     -> cd "wrs:~leslie/target"
* .CE
* After the previous command, the following changes the directory to
* `wrs:~leslie/target/config':
* .CS
*     -> cd "config"
* .CE
* After the previous command, the following changes the directory to
* `wrs:~leslie/target/demo':
* .CS
*     -> cd "../demo"
* .CE
* After the previous command, the following changes the directory to
* `wrs:/etc'.
* .CS
*     -> cd "/etc"
* .CE
* Note that `~' can be used only on network devices (RSH or FTP).
*
* RETURNS: OK or ERROR.
*
* SEE ALSO: pwd(),
* .pG "Target Shell"
*/

STATUS cd
    (
    char *name 		/* new directory name */
    )
    {
    if (ioDefPathCat (name) != OK)
	{
	printf ("cd: error = %#x.\n", errno);
	return (ERROR);
	}

    return (OK);
    }

/*******************************************************************************
*
* pwd - print the current default directory
*
* This command displays the current working device/directory.
*
* RETURNS: N/A
*
* SEE ALSO: cd(),
* .pG "Target Shell,"
* windsh,
* .tG "Shell"
*/

void pwd (void)

    {
    char name [MAX_FILENAME_LENGTH];

    ioDefPathGet (name);
    printf ("%s\n", name);
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -