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. Ifis 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); }