ubuntu 編寫自己的ls命令

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….

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章