您的位置:首页 > 运维架构 > Linux

linux 函数实现ls -l命令

2013-09-16 20:49 387 查看

linux 函数实现ls -l命令

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <pwd.h>
#include <grp.h>

int mystat(char *str);
DIR *dir;
struct dirent *sd;
struct stat stbuf;

int main(int argc,char *argv[])
{
int cdir;
char *pwd=NULL;

if (argc != 2){
fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
}
if(stat(argv[1],&stbuf)==-1){
fprintf(stderr,"stat error");
return;
}
if((stbuf.st_mode & S_IFMT)!=S_IFDIR){
mystat(argv[1]);
printf("%s\n",argv[1]);
}
else{
cdir=chdir(argv[1]);
if(cdir!=-1)
pwd=getcwd(pwd,0);

dir=opendir(pwd);
if(dir==NULL){
fprintf(stderr,"can't open %s\n",argv[1]);
return;
}
while((sd=readdir(dir))!=NULL){
mystat(sd->d_name);
printf("%s\n",sd->d_name);
}
closedir(dir);
}
return 0;
}
int mystat(char *str)
{
struct stat sb;
struct passwd *pas;
struct group *gro;
char *time;
int n;
char bit[9];

if(stat(str,&sb)==-1){
perror("stat");
exit(EXIT_FAILURE);
}

switch (sb.st_mode & S_IFMT) {
case S_IFBLK:  printf("b");            break;
case S_IFCHR:  printf("c");        break;
case S_IFDIR:  printf("d");               break;
case S_IFIFO:  printf("p");               break;
case S_IFLNK:  printf("l");                 break;
case S_IFREG:  printf("-");            break;
case S_IFSOCK: printf("s");                  break;
default:        break;
}

pas=getpwuid(sb.st_uid);
gro=getgrgid(sb.st_gid);
time=ctime(&sb.st_atime);
n=strlen(time);
time[--n]='\0';

if(sb.st_mode & S_IRUSR) bit[0]='r';
else bit[0]='-';
if(sb.st_mode & S_IWUSR) bit[1]='w';
else bit[1]='-';
if(sb.st_mode & S_IXUSR) bit[2]='x';
else bit[2]='-';
if(sb.st_mode & S_IRGRP) bit[3]='r';
else bit[3]='-';
if(sb.st_mode & S_IWGRP) bit[4]='w';
else bit[4]='-';
if(sb.st_mode & S_IXGRP) bit[5]='x';
else bit[5]='-';
if(sb.st_mode & S_IROTH) bit[6]='r';
else bit[6]='-';
if(sb.st_mode & S_IWOTH) bit[7]='w';
else bit[7]='-';
if(sb.st_mode & S_IXOTH) bit[8]='x';
else bit[8]='-';

printf("%s ",bit);
printf("%ld ", (long) sb.st_nlink);
printf("%s %s ",pas->pw_name,gro->gr_name);
printf("%lld ",(long long) sb.st_size);
printf("%s ", time);

return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 ls -l linux