#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <time.h>
char file_type(mode_t m);
char *file_permission(mode_t m,char *str);
char *file_uid(uid_t uid,char *str);
char *file_gid(gid_t gid,char *str);
void file_time(time_t time);
int main(int argc, const char *argv[])
{
struct stat buf;
if(stat(argv[1],&buf)<0)
{
perror("stat");
return -1;
}
//提取文件类型
char ch=file_type(buf.st_mode);
putchar(ch);
//提取文件权限
char str[10]="";
file_permission(buf.st_mode,str);
printf("%s ",str);
//提取链接数
printf("%ld ",buf.st_nlink);
//提取所属用户ID uid_t st_uid
file_uid(buf.st_uid,str);
printf("%s ",str);
//提取所属组用户ID gid_t st_gid
file_gid(buf.st_gid,str);
printf("%s ",str);
//提取文件大小 off_t st_size
printf("%ld ",buf.st_size);
//提取文件时间 st_atime
file_time((time_t)buf.st_mtime);
printf("%s\n",argv[1]);
return 0;
}
char file_type(mode_t m)
{
char ch;
switch(m&S_IFMT)
{
case S_IFBLK:ch='b';break;
case S_IFCHR:ch='c';break;
case S_IFDIR:ch='d';break;
case S_IFREG:ch='-';break;
case S_IFLNK:ch='l';break;
case S_IFSOCK:ch='s';break;
case S_IFIFO:ch='p';break;
}
return ch;
}
char *file_permission(mode_t m,char *str)
{
for(int i=0;i<9;i++)
{
if(m&(0400>>i))
{
switch(i%3)
{
case 0:str[i]='r';break;
case 1:str[i]='w';break;
default:str[i]='x';
}
}
else
{
str[i]='-';
}
}
return str;
}
char *file_uid(uid_t uid,char *str)
{
struct passwd *pa=getpwuid(uid);
if(pa==NULL)
{
perror("getpwuid");
return NULL;
}
strcpy(str,pa->pw_name);
return str;
}
char *file_gid(gid_t gid,char *str)
{
struct group *pa=getgrgid(gid);
if(pa==NULL)
{
perror("getgrgid");
return NULL;
}
strcpy(str,pa->gr_name);
return str;
}
void file_time(time_t time)
{
struct tm *pa=localtime(&time);
printf("%02d %02d %02d:%02d ",pa->tm_mon+1,pa->tm_mday,\
pa->tm_hour,pa->tm_min);
}