模仿ls修改(有问题)

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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值