Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

From Chapter 3 in the text: 3.11 The ls2 bug Modify ls2. c so it works correctly when the name of a directory is given

From Chapter 3 in the text:

3.11 The ls2 bug Modify ls2. c so it works correctly when the name of a directory is given as a

command-line argument.

The new file name is ls3.c. The program must be modular, i.e. use separated functions to carry out the required functionalities. Furthermore, each function must be written in a separate .c file. Header files must be used and included in the header file to define the functions. Finally, write a makefile to compile the whole project.

CODE:

/*ls2.c * purpose list contents of directory or directories * action if no args, use . ele list files in args * note uses stat and pwd.h and grp.h * BUG: try ls2 /tmp */ #include #include #include #include

void do_ls(char[]); void dostat(char *); void show_file_info( char *, struct stat *); void mode_to_letters( int , char [] ); char *uid_to_name( uid_t ); char *gid_to_name( gid_t );

main(int ac, char *av[]) { if ( ac == 1 ) do_ls( "." ); else while ( --ac ){ printf("%s: ", *++av ); do_ls( *av ); } }

void do_ls( char dirname[] ) /* * list files in directory called dirname */ { DIR*dir_ptr; /* the directory */ struct dirent*direntp; /* each entry */

if ( ( dir_ptr = opendir( dirname ) ) == NULL ) fprintf(stderr,"ls1: cannot open %s ", dirname); else { while ( ( direntp = readdir( dir_ptr ) ) != NULL ) dostat( direntp->d_name ); closedir(dir_ptr); } }

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

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

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; }

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

More Books

Students also viewed these Databases questions