Code:
/* ls2.c
* purpose list contents of directory or directories
* action if no args, use . else list files in args
* note uses stat and pwd.h and grp.h
* BUG: try ls2 /tmp
*/
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
void do_ls(char[], int);
void dostat(char *,char *,int);
void show_file_info( char *, struct stat *,char *,int);
void mode_to_letters( int , char [] );
char *uid_to_name( uid_t );
char *gid_to_name( gid_t );
//int flag
main(int ac, char *av[])
{
//char c;
//int flag=0;
int counter=0;
//if(ch == 's'){flag =1;}
if ( ac == 1 )
do_ls( ".",counter );
else
while ( --ac ){
++av;
do_ls( *av,counter );
}
}
void do_ls( char dirname[] ,int count)
/*
* list files in directory called dirname
*/
{
DIR *dir_ptr; /* the directory */
struct dirent *direntp; /* each entry */
char *cwd;
count++;
if ( ( dir_ptr = opendir( dirname ) ) == NULL )
fprintf(stderr,"ls1: cannot open %s\n", dirname);
else
{
if(dirname=="."){
if((cwd= getcwd(NULL,64))==NULL){
perror("pwd");
exit(2);
}
(void)printf("%s\n",cwd);
}
else{
if(dirname[0]=='.'){
dirname+=2;
printf("%s/\n", dirname);
dirname-=2;
}
else (void)printf("%s/\n", dirname);
}
while ( ( direntp = readdir( dir_ptr ) ) != NULL )
if ((strcmp(direntp->d_name,"."))!=0 && (strcmp(direntp->d_name,".."))!=0)
{
dostat(dirname, direntp->d_name,count );
}closedir(dir_ptr);
}
}
void dostat(char* directoryName, char *filename ,int count )
{
struct stat info;
char path[128];
sprintf(path, "%s/%s",directoryName,filename);
if ( stat(path, &info) == -1 ) /* cannot stat */
perror( path ); /* say why */
else /* else show info */
show_file_info( path, &info,filename);
}
void show_file_info( char *path, struct stat *info_p, char* fname2, int count )
/*
* display the info about 'filename'. The info is stored in struct at *info_p
*/
{
int sizetest;
int condition=count;
while(condition>0){
printf(" ");
condition--;
}
char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11];
mode_to_letters( info_p->st_mode, modestr );
//print file type
if(modestr[0]=='d')//dir
{do_ls(path,count);
}
else
{
printf( "%s" , fname2 );
//do_ls(path );
if(modestr[0]!='d' && (modestr[3]=='x' || modestr[6]=='x' || modestr[9]=='x'))
{
printf( "*");
}
//else(modestr[0]=='l')
//{ printf("%s\n" , filename );}
}
/*
* utility functions
*/
/*
* This function takes a mode value and a char array
* and puts into the char array the file type and the
* nine letters that correspond to the bits in mode.
* NOTE: It does not code setuid, setgid, and sticky
* codes
*/
void mode_to_letters( int mode, char str[] )
{
strcpy( str, "----------" ); /* default=no perms */
if ( S_ISDIR(mode) ) str[0] = 'd'; /* directory? */
if ( S_ISCHR(mode) ) str[0] = 'c'; /* char devices */
if ( S_ISBLK(mode) ) str[0] = 'b'; /* block device */
if ( mode & S_IRUSR ) str[1] = 'r'; /* 3 bits for user */
if ( mode & S_IWUSR ) str[2] = 'w';
if ( mode & S_IXUSR ) str[3] = 'x';
if ( mode & S_IRGRP ) str[4] = 'r'; /* 3 bits for group */
if ( mode & S_IWGRP ) str[5] = 'w';
if ( mode & S_IXGRP ) str[6] = 'x';
if ( mode & S_IROTH ) str[7] = 'r'; /* 3 bits for other */
if ( mode & S_IWOTH ) str[8] = 'w';
if ( mode & S_IXOTH ) str[9] = 'x';
}
#include <pwd.h>
char *uid_to_name( uid_t uid )
/*
* returns pointer to username associated with uid, uses getpw()
*/
{
struct passwd *getpwuid(), *pw_ptr;
static char numstr[10];
if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){
sprintf(numstr,"%d", uid);
return numstr;
}
else
return pw_ptr->pw_name ;
}
#include <grp.h>
char *gid_to_name( gid_t gid )
/*
* returns pointer to group number gid. used getgrgid(3)
*/
{
struct group *getgrgid(), *grp_ptr;
static char numstr[10];
if ( ( grp_ptr = getgrgid(gid) ) == NULL ){
sprintf(numstr,"%d", gid);
return numstr;
}
else
return grp_ptr->gr_name;
}