diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:20:00 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:20:00 +0000 |
commit | 8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch) | |
tree | 4099e8021376c7d8c05bdf8503093d80e9c7bad0 /testsuite/nsswitch/getgrent_r.c | |
parent | Initial commit. (diff) | |
download | samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip |
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testsuite/nsswitch/getgrent_r.c')
-rw-r--r-- | testsuite/nsswitch/getgrent_r.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/testsuite/nsswitch/getgrent_r.c b/testsuite/nsswitch/getgrent_r.c new file mode 100644 index 0000000..883c897 --- /dev/null +++ b/testsuite/nsswitch/getgrent_r.c @@ -0,0 +1,84 @@ +/* + * Use set/get/endgrent calls from two processes to iterate over the + * password database. This checks the multithreaded stuff works. + */ + +#include <stdio.h> +#include <grp.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <wait.h> + +void dump_grent(char *id) +{ + struct group *gr; + char fname[255]; + FILE *fptr; + + /* Open results file */ + + sprintf(fname, "/tmp/getgrent_r-%s.out-%d", id, getpid()); + + if ((fptr = fopen(fname, "w")) == NULL) { + fprintf(stderr, "ERROR: could not open file %s: %s\n", fname, + sys_errlist[errno]); + return; + } + + /* Dump group database */ + + setgrent(); + + while((gr = getgrent()) != NULL) { + fprintf(fptr,"%s:%s:%d\n", gr->gr_name, gr->gr_passwd, + gr->gr_gid); + } + + endgrent(); + + /* Close results file */ + + fclose(fptr); +} + +int main(int argc, char **argv) +{ + pid_t pid; + + /* Check args */ + + if (argc != 2) { + printf("ERROR: must specify output file identifier\n"); + return 1; + } + + /* Fork child process */ + + if ((pid = fork()) == -1) { + printf("ERROR: unable to fork\n"); + return 1; + } + + /* Handle test case */ + + if (pid > 0) { + int status; + + /* Parent */ + + dump_grent(argv[1]); + wait(&status); + + } else { + + /* Child */ + + dump_grent(argv[1]); + return 0; + } + + printf("PASS: run getgrent_r.c\n"); + return 0; +} |