diff options
author | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
commit | 7988979a722b4cdf287b2093956a76a3f19b9897 (patch) | |
tree | d35e251d0472ceca55a2eef61cff261c8ee68fab /test/stat/memcmp-stat.c |
add uClibc-ng test directory
Diffstat (limited to 'test/stat/memcmp-stat.c')
-rw-r--r-- | test/stat/memcmp-stat.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/test/stat/memcmp-stat.c b/test/stat/memcmp-stat.c new file mode 100644 index 0000000..254c754 --- /dev/null +++ b/test/stat/memcmp-stat.c @@ -0,0 +1,107 @@ +/* Distilled from issue found with tar and symlinks. + * Make sure that the whole stat struct between runs + * is agreeable. + */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <assert.h> +#include <time.h> + +static void show_stat(struct stat *st) +{ + printf( + "------------------\n" + "st_dev = %li\n" + "st_ino = %li\n" + "st_mode = %li\n" + "st_nlink = %li\n" + "st_uid = %li\n" + "st_gid = %li\n" + "st_rdev = %li\n" + "st_size = %li\n" + "st_blksize = %li\n" + "st_blocks = %li\n" + "st_atime = %li\n" + "st_ansec = %li\n" + "st_mtime = %li\n" + "st_mnsec = %li\n" + "st_ctime = %li\n" + "st_cnsec = %li\n", + (long int)st->st_dev, + (long int)st->st_ino, + (long int)st->st_mode, + (long int)st->st_nlink, + (long int)st->st_uid, + (long int)st->st_gid, + (long int)st->st_rdev, + (long int)st->st_size, + (long int)st->st_blksize, + (long int)st->st_blocks, +#if !defined(__UCLIBC__) || defined(__USE_MISC) + (long int)st->st_atime, + (long int)st->st_atim.tv_nsec, + (long int)st->st_mtime, + (long int)st->st_mtim.tv_nsec, + (long int)st->st_ctime, + (long int)st->st_ctim.tv_nsec +#else + (long int)st->st_atime, + (long int)st->st_atimensec, + (long int)st->st_mtime, + (long int)st->st_mtimensec, + (long int)st->st_ctime, + (long int)st->st_ctimensec +#endif + ); +} + +int main(void) +{ + int ret; + int fd; + struct stat fst, st; + + memset(&fst, 0xAA, sizeof(fst)); + memset(&st, 0x55, sizeof(st)); + + unlink(".testfile"); + fd = open(".testfile", O_WRONLY | O_CREAT | O_EXCL, 0); + if (fd < 0) { + perror("open(.testfile) failed"); + return 1; + } + ret = fstat(fd, &fst); + if (ret != 0) { + perror("fstat(.testfile) failed"); + return 1; + } + close(fd); + + ret = stat(".testfile", &st); + if (ret != 0) { + perror("stat(.testfile) failed"); + return 1; + } + + ret = memcmp(&fst, &st, sizeof(fst)); + if (ret != 0) { + printf("FAILED: memcmp() = %i\n", ret); + show_stat(&fst); + show_stat(&st); + } + + unlink(".testfile"); + + return ret; +} |