Question
/* cp.c * uses read and write with * tunable buffer size usage: cp1 src dest */ #include #include #include #define BUFFERSIZE 4096 #define COPYMODE
/* cp.c
* uses read and write with * tunable buffer size usage: cp1 src dest
*/
#include
#include
#include
#define BUFFERSIZE 4096
#define COPYMODE 0644
void oops(char *, char *);
main(int ac, char *av[]) {
int in_fd, out_fd, n_chars;
char buf[BUFFERSIZE];
/* check args */
if ( ac != 3 ){ fprintf( stderr, "usage: %s source destination ", *av);
exit(1); } /* open files */
if ( (in_fd=open(av[1], O_RDONLY)) == -1 )
oops("Cannot open ", av[1]);
if ( (out_fd=creat( av[2], COPYMODE)) == -1 )
oops( "Cannot creat", av[2]);
/* copy files */
while ( (n_chars = read(in_fd , buf, BUFFERSIZE)) > 0 ) if ( write( out_fd, buf, n_chars ) != n_chars )
oops("Write error to ", av[2]); if ( n_chars == -1 )
oops("Read error from ", av[1]);
/* close files */
if ( close(in_fd) == -1 || close(out_fd) == -1 )
oops("Error closing files",""); }
void oops(char *s1, char *s2) {
fprintf(stderr,"Error: %s ", s1); perror(s2);
exit(1);
}
/* ls.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 */ #include#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 ); int main(int ac, char *av[]) { if ( ac == 1 ) do_ls( "." ); else while ( --ac ){ printf("%s: ", *++av ); do_ls( *av ); } return 0; } 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,"ls2: cannot open %s ", dirname); else { while ( ( direntp = readdir( dir_ptr ) ) != NULL ) { if (strcmp(direntp->d_name,".")==0 || strcmp(direntp->d_name,"..")==0) continue; dostat( direntp->d_name ); } closedir(dir_ptr); } } void dostat( char *filename ) { struct stat info; if ( stat(filename, &info) == -1 ) /* cannot stat */ perror( filename ); /* say why */ else /* else show info */ show_file_info( filename, &info ); } void show_file_info( char *filename, struct stat *info_p ) /* * display the info about 'filename'. The info is stored in struct at *info_p */ { char *uid_to_name(), *ctime(), *gid_to_name(), *filemode(); void mode_to_letters(); char modestr[11]; mode_to_letters( info_p->st_mode, modestr ); printf( "%s" , modestr ); printf( "%4d " , (int) info_p->st_nlink); printf( "%-8s " , uid_to_name(info_p->st_uid) ); printf( "%-8s " , gid_to_name(info_p->st_gid) ); printf( "%8ld " , (long)info_p->st_size); printf( "%.12s ", 4+ctime(&info_p->st_mtime)); printf( "%s " , 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 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; }
Write a basic file managment system with following capabilities. Suppose the name of the program is myFS. When it executed as "$ myFS ls -l /home" The program should provide the file listing of the given directory. The program should list the filename, file size, and time last modified for each file within the directory. The program should provide the user with the option to sort the listing based on filename, on file size, or on time last modified. The program should run once and quit (it does not loop). The syntax (usage) for the program should be where -s indicates sort by file size and -t indicates sort by time last modified. For example: "$ myFS ls -l -t /home should be the time last modified. These flags are optional but mutually exclusive. The directory is also optional; if it is omitted, then a default directory of . (the current directory) should be assumed. Every possible combination of command line arguments from the above syntax should be tested. The output should be displayed with fixed-width columns for the size and date. Column orders should be size, then date, then filename. The time last modified should be printed as a 12-character string (e.g., Oct 10 11:37). This can be done by manipulating the returned string from the ctime() function and printing only a portion of it.
The file system program should be able to make a copy of the source file to the destination address. For example: "$myFS cp bing.c /home/bingocp.c" the command copies bing.c to the /home/bingocp.c
I have the ls.c already and the cp.c as copied above, all i need is how to do the ls -t, ls -s and the cp.
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started