| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | #include <stdio.h>#include <string.h>#include <fcntl.h>#include <sys/stat.h>#include <unistd.h>#include <stdlib.h>void print_struct_stat(char *msg, struct stat *s){    printf("%s\n", msg);    /* The casts are because glibc thinks it's cool */    printf("device    : 0x%llx\n",(long long)s->st_dev);    printf("inode     : %lld\n",  (long long)s->st_ino);    printf("mode      : 0x%llx\n",(long long)s->st_mode);    printf("nlink     : %lld\n",  (long long)s->st_nlink);    printf("uid       : %lld\n",  (long long)s->st_uid);    printf("gid       : %lld\n",  (long long)s->st_gid);    printf("rdev      : 0x%llx\n",(long long)s->st_rdev);    printf("size      : %lld\n",  (long long)s->st_size);    printf("blksize   : %lld\n",  (long long)s->st_blksize);    printf("blocks    : %lld\n",  (long long)s->st_blocks);    printf("atime     : %lld\n",  (long long)s->st_atime);    printf("mtime     : %lld\n",  (long long)s->st_mtime);    printf("ctime     : %lld\n",  (long long)s->st_ctime);}int main(int argc,char **argv){    int fd, ret;    char *file;    struct stat s;    if (argc < 2) {	fprintf(stderr, "Usage: stat FILE\n");	exit(1);    }    file = argv[1];    memset(&s, 0, sizeof(struct stat));    ret = stat(file, &s);    if(ret<0){	perror("stat");	exit(1);    }    print_struct_stat("\nTesting stat:", &s);    memset(&s, 0, sizeof(struct stat));    ret = lstat(file, &s);    if(ret<0){	perror("lstat");	exit(1);    }    print_struct_stat("\nTesting lstat:", &s);    fd = open(file, O_RDONLY);    if(fd<0){	perror("open");	exit(1);    }    memset(&s, 0, sizeof(struct stat));    ret = fstat(fd,&s);    if(ret<0){	perror("fstat");	exit(1);    }    print_struct_stat("\nTesting fstat:", &s);    exit(0);}
 |