~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to testsuite/nsswitch/getgrent_r.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Use set/get/endgrent calls from two processes to iterate over the
 
3
 * password database.  This checks the multithreaded stuff works.
 
4
 */
 
5
 
 
6
#include <stdio.h>
 
7
#include <grp.h>
 
8
#include <sys/types.h>
 
9
#include <sys/stat.h>
 
10
#include <fcntl.h>
 
11
#include <errno.h>
 
12
#include <wait.h>
 
13
 
 
14
void dump_grent(char *id)
 
15
{
 
16
    struct group *gr;
 
17
    char fname[255];
 
18
    FILE *fptr;
 
19
 
 
20
    /* Open results file */
 
21
 
 
22
    sprintf(fname, "/tmp/getgrent_r-%s.out-%d", id, getpid());
 
23
 
 
24
    if ((fptr = fopen(fname, "w")) < 0) {
 
25
        fprintf(stderr, "ERROR: could not open file %s: %s\n", fname,
 
26
                sys_errlist[errno]);
 
27
        return;
 
28
    }
 
29
 
 
30
    /* Dump group database */
 
31
 
 
32
    setgrent();
 
33
        
 
34
    while((gr = getgrent()) != NULL) {
 
35
        fprintf(fptr,"%s:%s:%d:%d\n", gr->gr_name, gr->gr_passwd,
 
36
                gr->gr_gid);
 
37
    }
 
38
        
 
39
    endgrent();
 
40
 
 
41
    /* Close results file */
 
42
 
 
43
    fclose(fptr);
 
44
}
 
45
 
 
46
int main(int argc, char **argv)
 
47
{
 
48
    pid_t pid;
 
49
 
 
50
    /* Check args */
 
51
 
 
52
    if (argc != 2) {
 
53
        printf("ERROR: must specify output file identifier\n");
 
54
        return 1;
 
55
    }
 
56
 
 
57
    /* Fork child process */
 
58
 
 
59
    if ((pid = fork()) == -1) {
 
60
        printf("ERROR: unable to fork\n");
 
61
        return 1;
 
62
    }
 
63
 
 
64
    /* Handle test case */
 
65
 
 
66
    if (pid > 0) {
 
67
        int status;
 
68
 
 
69
        /* Parent */
 
70
 
 
71
        dump_grent(argv[1]);
 
72
        wait(&status);
 
73
 
 
74
    } else {
 
75
 
 
76
        /* Child */
 
77
 
 
78
        dump_grent(argv[1]);
 
79
        return 0;
 
80
    }
 
81
 
 
82
    printf("PASS: run getgrent_r.c\n");
 
83
    return 0;
 
84
}