| #include <stdio.h> |
| #include <string.h> |
| #include <fcntl.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| static 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); |
| } |
| |