模仿ls修改(有问题)

    技术2022-05-20  56

    #include <sys/stat.h>

    #include <sys/types.h>

    #include <dirent.h>

    #include <stddef.h>

    #include <stdio.h>

    #include <time.h>

    #include <unistd.h>

    #include <stdlib.h>

    #include <pwd.h>

    #include <grp.h>

    char input_type = 0x00;//全局变量

    int GetFileType(mode_t mode){//返回文件类型

        if(S_ISBLK(mode))    return 'b';

        if(S_ISCHR(mode))    return 'c';

        if(S_ISDIR(mode))    return 'd';

        if(S_ISFIFO(mode))   return 'p';

        if(S_ISREG(mode))    return '-';

        if(S_ISLNK(mode))    return 'l';

        return 1;

    }

     

    void setmem(void *ps, char ch, size_t sz){

        register n = 0;

        for(; n<sz; ++n){

            *((char*)ps+n) = ch;

        }

    }

    int GetFileMode(mode_t mode, char *resp){//处理文件权限

        if(resp == NULL) return 0;

        setmem(resp,'-',9);

        if(mode & S_IRUSR) resp[0]='r';

        if(mode & S_IWUSR) resp[1]='w';

        if(mode & S_IXUSR) resp[2]='x';

        if(mode & S_IRGRP) resp[3]='r';

        if(mode & S_IWGRP) resp[4]='w';

        if(mode & S_IXGRP) resp[5]='x';

        if(mode & S_IROTH) resp[6]='r';

        if(mode & S_IWOTH) resp[7]='w';

        if(mode & S_IXOTH) resp[8]='x';

        return 9;

    }

    int GetFileUID(struct stat mode){return mode.st_uid;}

    int GetFileGID(struct stat mode){return mode.st_gid;}

    int GetFileLINK(struct stat mode){return mode.st_nlink;}

    int GetFileSIZE(struct stat mode){return mode.st_size;}

     

    int do_ls_l(int , char* []);    //显示文件所有信息

     

     

     

    int main(int argc, char *argv[]){

    int i,j,k=0;

    for(i=1;i<argc;i++){//遍历所有参数取得位标志

    if(argv[i][0] == '-'){//-开头的文件为参数

    for(j=0;;j++){//获取参数

    if( argv[i][j] == '/0' ){break;}

    switch(argv[i][j]){

    case 'a' : input_type |= 0x01;

    case 'l' : input_type |= 0x02;

    case 'f' : input_type |= 0x04;

    }

    }

    }

    }

    do_ls_l(argc,argv);

        return 0;

    }

    int do_ls_l( int argc, char *argv[]){

    int i,fgid;

    char mode[10];mode[9] = 0;

        DIR *dir_ptr;

        struct dirent *direntp;

        struct stat statbuf;

    struct passwd *upw;

    struct group *fg;

    struct tm *ft;

    if(argc == 1) argv[1][0]='.';argv[1][1]='/0';

    printf("%s/n",argv[1]);

    for(i=1;i<argc;i++){

    if(argv[i][0] == '-')continue;

    if( lstat(argv[i],&statbuf) == -1){//如果不是文件返回1

    fprintf(stderr,"ls: cannot open %s/n", argv[i]);

    return 1;

    }

    if(!S_ISDIR(statbuf.st_mode)){//如果不是目录

    upw = getpwuid(GetFileUID(statbuf));

    fgid = GetFileGID(statbuf);

    fg = getgrgid(fgid);

    ft = localtime(&statbuf.st_mtime);

    GetFileMode(statbuf.st_mode,mode);

    printf("%c%s/t%d/t%s/t%s/t%d/t%d-%d-%d/t%d:%d/t%s/n",

    GetFileType(statbuf.st_mode),

    mode,GetFileLINK(statbuf),

    upw->pw_name,fg->gr_name,

    GetFileSIZE(statbuf),ft->tm_year + 1900,

    ft->tm_mon,ft->tm_mday,

    ft->tm_hour,ft->tm_min,direntp->d_name);

     

    }else{//如果是目录

    if((dir_ptr = opendir(argv[i])) == NULL){

    fprintf(stderr,"ls: cannot open %s/n", argv[i]);

    }else{

    while((direntp = readdir(dir_ptr)) != NULL){

    if(direntp->d_name[0] == '.' && (input_type & 0x01) == 0x00 )continue;

    lstat(direntp->d_name,&statbuf);

    upw = getpwuid(GetFileUID(statbuf));

    fgid = GetFileGID(statbuf);

    fg = getgrgid(fgid);

    ft = localtime(&statbuf.st_mtime);

    GetFileMode(statbuf.st_mode,mode);

    printf("%c%s/t%d/t%s/t%s/t%d/t%d-%d-%d/t%d:%d/t%s/n",

    GetFileType(statbuf.st_mode),

    mode,GetFileLINK(statbuf),

    upw->pw_name,fg->gr_name,

    GetFileSIZE(statbuf),ft->tm_year + 1900,

    ft->tm_mon,ft->tm_mday,ft->tm_hour,

    ft->tm_min,direntp->d_name);

    }

    closedir(dir_ptr);

    }

    }

    }

    return 0;

    }

     


    最新回复(0)