www.pudn.com > vxWorks_Lab.rar > lscdLib.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  is FALSE, only the names of the files 
* (or subdirectories) in the specified directory are displayed.  If  
* 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  parameter specifies which directory to list.  If 
*  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),  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 = ""; 
		} 
	    else if (S_ISDIR (fileStat.st_mode)) 
	        pDirComment = ""; 
 
	    /* 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 .  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  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); 
    }