学习Linux,写了一个ls.c v1.0 基本上是照书抄!

来源:互联网 发布:网络售后服务方案 编辑:程序博客网 时间:2024/06/05 05:59
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
bool ParseParameters(int argc,char * argv[]);
void ls1(char * dir);
int PrintStatInfo(int argc,char * argv[]);
void ShowStatInfo(char * fname,struct stat * buf);
void mode_to_letters(int mode,char str[])
{
 strcpy(str,"----------");
 if(S_ISDIR(mode)) str[0] = 'd';
 if(S_ISCHR(mode)) str[0] = 'c';
 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)
{
 static char numstr[10];
 struct passwd * pw_ptr;
 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 * grp_ptr;
 static char numstr[10];
 if((grp_ptr = getgrgid(gid))==NULL)
 {
  sprintf(numstr,"%d",gid);
  return numstr;
 }
 else
 {
  return grp_ptr->gr_name;
 }
}
int main(int argc,char * argv[])
{
 if( argc == 1)
 {
  ls1(".");
 }
 else
 {
  while(--argc)
  {
   printf("%s:/n",*++argv);
   ls1(*argv);
  }
 }
 return 0;
}

bool ParseParameters(int argc,char * argv[])
{
 for(int i=0; i<argc; i++)
 {
  printf("%s/n",argv[i]);
 }
 return false;
}
void ShowStatInfo(char * fname,struct stat * buf)
{
 if( strcmp(fname,".") == 0 || strcmp(fname,"..")==0) return;
 char modestr[11];
 mode_to_letters(buf->st_mode,modestr);
 printf("%s",modestr);
 printf(" %4d ",(int)buf->st_nlink);
 printf("%-8s ",uid_to_name(buf->st_uid));
 printf("%-8s ",gid_to_name(buf->st_gid));
 printf("%8ld ",(long)buf->st_size);
 printf("%.12s",4+ctime(&buf->st_mtime));
 printf(" %s/n",fname);
}

void dostat(char * filename)
{
 struct stat info;
 if(stat(filename,&info)!=-1)
 {
  ShowStatInfo(filename,&info);
 }
 else perror(filename);
}

void ls1(char * dir)
{
 DIR * dir_ptr;
 struct dirent *direntp;
 if ((dir_ptr = opendir(dir))==NULL)
 {
  fprintf(stderr,"ls1: cannot open %s",dir);
 }
 else
 {
  while((direntp = readdir(dir_ptr))!=NULL)
  {
   //printf("%s/n",direntp->d_name);
   dostat(direntp->d_name);
  }
  closedir(dir_ptr);
 }
}
 
原创粉丝点击