linux环境编程之——ls -al

#include <stdio.h>                                                                   
#include <sys/types.h>                                                               
#include <sys/stat.h>                                                                
#include <dirent.h>                                                                  
#include <pwd.h>                                                                     
#include <grp.h>                                                                     
                                                                                     
#ifndef S_ISFIFO                                                                     
    #define S_ISFIFO(m) (((m) & (0170000)) == (0010000))                             
#endif                                                                               
#ifndef S_ISDIR                                                                      
    #define S_ISDIR(m) (((m) & (0170000)) == (0040000))                              
#endif                                                                               
#ifndef S_ISCHR                                                                      
    #define S_ISCHR(m) (((m) & (0170000)) == (0020000))                              
#endif                                                                               
#ifndef S_ISBLK                                                                      
    #define S_ISBLK(m) (((m) & (0170000)) == (0060000))                              
#endif                                                                               
#ifndef S_ISREG                                                                      
    #define S_ISREG(m) (((m) & (0170000)) == (0100000))                              
#endif                                                                               
                                                                                     
                                                                                     
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("\n%s:\n", *++av);                                                
            do_ls(*av);                                                              
        }                                                                            
    }                                                                                
                                                                                     
    return 0;                                                                        
}                                                                                    
                                                                                     
void do_ls(char dirname[]) {                                                         
    DIR* dir_ptr;                                                                    
    struct dirent* direntp;                                                          
                                                                                     
    if ((dir_ptr = opendir(dirname)) == NULL)                                        
        fprintf(stderr, "ls1: connot open %s\n", dirname);                           
    else {                                                                           
        while ((direntp= readdir(dir_ptr)) != NULL)                                  
            dostat(direntp->d_name);                                                 
        closedir(dir_ptr);                                                           
    }                                                                                
}                                                                                    
                                                                                     
void dostat(char* filename) {                                                        
    struct stat info;                                                                
    if (stat(filename, &info) == -1)                                                 
        perror(filename);                                                            
    else                                                                             
        show_file_info(filename, &info);                                             
}                                                                                    
                                                                                     
void show_file_info(char* filename, struct stat* info_p) {                           
    char *uid_to_name(), *ctime(), *gid_to_name(), *filenode();                      
    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("%15.12s", 4 + ctime(&info_p->st_mtime));                                 
    printf("%14s\n", filename);                                                      
}                                                                                    
                                                                                     
void mode_to_letters(int mode, char str[]) {                                         
    strcpy(str, "----------");                                                       
                                                                                     
    if (S_ISDIR(mode))      str[0] = 'd';                                            
    else if (S_ISCHR(mode)) str[0] = 'c';                                            
    else if (S_ISBLK(mode)) str[0] = 'b';                                            
                                                                                     
    if (mode & S_IRUSR) str[1] = 'r';                                                
    if (mode & S_IWUSR) str[2] = 'w';                                                
    if (mode & S_IXUSR) str[3] = 'x';                                                
                                                                                     
    if (mode & S_IRGRP) str[4] = 'r';                                                
    if (mode & S_IWGRP) str[5] = 'w';                                                
    if (mode & S_IXGRP) str[6] = 'x';                                                
                                                                                     
    if (mode & S_IROTH) str[7] = 'r';                                                
    if (mode & S_IWOTH) str[8] = 'w';                                                
    if (mode & S_IXOTH) str[9] = 'x';                                                
}                                                                                    
                                                                                     
                                                                                     
char* uid_to_name(uid_t uid) {                                                       
    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;                                                      
}                                                                                    
                                                                                     
char* gid_to_name(gid_t gid) {                                                       
    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;                                                     
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值