📄 lsl.c
字号:
#include <stdio.h>#include <sys/types.h>#include <dirent.h>#include <sys/stat.h>#include <string.h>void do_ls( char *,int );void dostat( char *,char * );void show_file_info( char *,struct stat *,char * );void mode_to_letters( int,char * );char * uid_to_name( uid_t );char * gid_to_name( gid_t );int main( int argc ,char *argv[] ){ if( argc==1 ) { do_ls( ".",0 ); } else { if(!strcmp(argv[1],"-a")) { if(argc==3) do_ls( argv[2],0 ); else if(argc==2) do_ls( ".",0 ); } else if(!strcmp(argv[1],"-l")) { if(argc==3) do_ls( argv[2],1 ); else if(argc==2) do_ls( ".",1 ); } } return 0;}void do_ls( char dirname[],int type ){ DIR * dir_ptr; struct dirent * direntp; char tmp[1024]={0}; if ( (dir_ptr = opendir(dirname))==NULL ) fprintf(stderr,"lsl : cannot open %s\n",dirname); else { while( (direntp = readdir(dir_ptr)) != NULL ) { if(direntp->d_name[0]=='.') continue; if(type) { strcpy(tmp,dirname); strcat(tmp,"/"); strcat(tmp,direntp->d_name); dostat( tmp,dirname ); strcpy(tmp,""); } else printf("%s\n",direntp->d_name); } closedir(dir_ptr); }}void dostat( char * filename,char *dirname ){ struct stat info; if (stat(filename,&info)==-1) { perror(filename); } else show_file_info(filename,&info,dirname);}void show_file_info(char *filename,struct stat * info_p,char *dirname){ 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\n",filename+strlen(dirname)+1);}void mode_to_letters( int mode,char *str ){ strcpy(str,"----------"); /* macro */ 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 bit for user */ if( mode&S_IWUSR ) str[2]='w'; if ( (mode & S_ISUID) && (mode & S_IXUSR) ) str[3] = 's'; else if ( (mode & S_ISUID) && !(mode & S_IXUSR) ) str[3] = 'S'; else if ( mode & S_IXUSR ) str[3] = 'x'; if( mode&S_IRGRP ) str[4]='r'; /* 3 bit for group */ if( mode&S_IWGRP ) str[5]='w'; if ( (mode & S_ISGID) && (mode & S_IXGRP) ) str[6] = 's'; else if ( (mode & S_ISGID) && !(mode & S_IXGRP) ) str[6] = 'S'; else if ( mode & S_IXGRP ) str[6] = 'x'; if( mode&S_IROTH ) str[7]='r'; /* 3 bit for other */ if( mode&S_IWOTH ) str[8]='w'; if ( (mode & S_ISVTX) && (mode & S_IXOTH) ) str[9] = 't'; else if ( (mode & S_ISVTX) && !(mode & S_IXOTH) ) str[9] = 'T'; else if ( mode & S_IXOTH ) str[9] = 'x';}#include <pwd.h>char * uid_to_name(uid_t uid){ struct passwd *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 <grp.h>char * gid_to_name(gid_t gid) { struct group *grp_ptr; static char numstr[10]; if((grp_ptr=getgrgid(gid))==NULL) { sprintf(numstr,"%d",gid); return numstr; } else return grp_ptr->gr_name;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -