#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;
}