13、实现Linux下的ls-l命令
void getmode(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)
{
struct passwd* getpwuid(), *pw_ptr;
static char numstr[10];
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* getpwuid(), *pw_ptr;
static char numstr[10];
if((grp_ptr = getpwuid(uid)) == NULL)
{
sprintf(numstr, "%d", gid);
return numstr;
}
else
{
return grp_ptr->gr_name;
}
}
void show_file_info(char* filename, struct stat* info_p)
{
char* ctime();
char m_mode[11] = {0};
char filestat[256] = {0};
getmode(info_p->st_mode, m_mode);
sprintf(filestat, "%s %3d %8s %8s %10ld %.12s %s\n,
m_mode, (int)info_p->st_nlink, uid_to_name(info_o->st_uid), gid_to_name(info_p->st_gid),
(long) info_p->st_size, 4+ctime(&info_p->st_mtime), filename);
strcat(buf, filestat);
}
void dostat(char* filename)
{
struct stat m_stat;
if(stat(filename, &m_stat) == -1)
{
perror(filename);
}
else
{
show_file_info(filename, &m_stat);
}
}
char* ls_function(char *dirname)
{
DIR* dir_ptr;
struct dirent* direntp;
memset(buf, 0, BUFFER_SIZE);
if(dir_ptr = opendir(dirname)) == NULL)
{
perror("opendir");
}
else
{
while((direntp = readdir(dir_ptr)) != NULL)
{
dostat(direntp->d_name);
}
closedir(dir_ptr);
}
return buf;
}