
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#define ERR_MSG(msg) do{\
printf("line:%d\n",__LINE__);\
perror(msg);\
}while(0)
char* get_filePermission(mode_t m,char ptr[10],int size)
{
if(size<10)
{
printf("数组容量必须大于10");
return NULL;
}
char per[]="rwx";
int i=0;
for(i=0;i<9;i++)
{
if((m&(0400>>i))==0){
ptr[i]='-';
}
else{
ptr[i]=per[i%3];
}
}
return ptr;
}
char* get_fileStyle(mode_t m,char pdr[])
{
if((m&S_IFMT)==S_IFREG){
strcpy(pdr,"-");
}
else if((m&S_IFMT)==S_IFLNK){
strcpy(pdr,"l");
}
else if((m&S_IFMT)==S_IFSOCK){
strcpy(pdr,"s");
}
else if((m&S_IFMT)==S_IFBLK){
strcpy(pdr,"b");
}
else if((m&S_IFMT)==S_IFDIR){
strcpy(pdr,"d");
}
else if((m&S_IFMT)==S_IFCHR){
strcpy(pdr,"c");
}
else if((m&S_IFMT)==S_IFIFO){
strcpy(pdr,"p");
}
return pdr;
}
char* get_usrname(uid_t uid)
{
static char usrname[20]="";
struct passwd* usr=getpwuid(uid);
if(NULL==usr){
return NULL;
}
strcpy(usrname,usr->pw_name);
return usrname;
}
char* get_grpname(uid_t gid)
{
static char grpname[20]="";
struct group* gr=getgrgid(gid);
if(NULL==gr)
{
perror("getGrpName");
return NULL;
}
strcpy(grpname,gr->gr_name);
return grpname;
}
int main(int argc, const char *argv[])
{
char ptr[10]="";
char pdr[2]="";
struct stat buf;
struct tm* hr;
if(stat("./02fclose.c",&buf)<0){
perror("stat");
return -1;
}
get_filePermission(buf.st_mode,ptr,sizeof(ptr));
get_fileStyle(buf.st_mode,pdr);
printf("%s",pdr);
printf("%s\n",ptr);
printf("link=%ld\t",buf.st_nlink);
printf("%s %s\t",get_usrname(buf.st_uid),\
get_grpname(buf.st_gid));
printf("size=%ld",buf.st_size);
hr=localtime(&buf.st_atime);
printf(" %d月%d日 %02d:%02d:%02d",hr->tm_mon+1,hr->tm_mday,\
hr->tm_hour,hr->tm_min,hr->tm_sec);
printf(" 02fclose.c\n");
return 0;
}