Refer: ubuntu 编写自己的ls命令
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include <time.h>
int cmp(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}
int display_file(char *path, char *filename)
{
struct stat st;
int i;
struct passwd *pw;
struct group *gr;
struct tm *tm;
stat(path, &st);
switch(st.st_mode &S_IFMT)
{
case S_IFREG: printf("-"); break;
case S_IFDIR: printf("d"); break;
case S_IFLNK: printf("l"); break;
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFIFO: printf("p"); break;
case S_IFSOCK: printf("s"); break;
}
for(i = 8; i >= 0; i--)
{
if(st.st_mode & (1 << i))
{
switch(i%3)
{
case 2: printf("r"); break;
case 1: printf("w"); break;
case 0: printf("x"); break;
}
}
else
printf("-");
}
pw = getpwuid(st.st_uid);
gr = getgrgid(st.st_gid);
printf("%2d %s %s %4ld", st.st_nlink, pw->pw_name, gr->gr_name, st.st_size);
tm = localtime(&st.st_ctime);
printf(" %04d-%02d-%02d %02d:%02d",tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min);
printf(" %s\n", filename);
return 0;
}
int do_ls(char dirname[])
{
DIR *dir_ptr;
struct dirent *direntp;
struct stat st;
if((dir_ptr = opendir(dirname))==NULL)
fprintf(stderr, "ls1:can not open %s\n", dirname);
else{
char res[500][256]; //buf[256];
int reslen = 0, i;
//strcpy(buf, dirname);
//strcat(buf, "/");
while((direntp = readdir(dir_ptr)) != NULL){
strcpy(res[reslen], direntp->d_name);
reslen++;
}
closedir(dir_ptr);
qsort(res, reslen, sizeof(res[0]), cmp);
//strcat(buf, dirent->d_name);
for(i = 0; i<reslen; i++)
{
char buf[256]={0};
strcpy(buf, dirname);
strcat(buf, "/");
strcat(buf, res[i]);
if(stat(buf, &st))
{
perror("stat");
return -1;
}
//if(res[i][0] != '.')
//display_file(buf, dirent->d_name);
display_file(buf, res[i]);
//printf("%s\n", res[i]);
}
}
}
int main(int argc, char* argv[])
{
struct stat st;
char buf[1024];
if (argc == 1){
do_ls(".");
return 0;
}
if(stat(argv[1], &st) < 0)
{
// do_ls(".");
perror("stat");
return 0;
}
if((st.st_mode & S_IFMT) == S_IFDIR)
do_ls(argv[1]);
else
display_file(argv[1], argv[1]);
//if(argc > 1){
// int i=1;
// for(i=1; i<argc; ++i)
// do_ls(argv[i]);
// }
// else do_ls(".");
return 0;
}
To be continue….