xref: /freebsd/crypto/krb5/src/util/et/t_com_err.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include "com_err.h"
6 #include "et1.h"
7 #include "et2.h"
8 
9 int misc_err, known_err;        /* known_err is err in whether or not
10                                    table is 'known' to library */
11 int fail;
12 
13 static void
try_one(errcode_t code,int known,int table,int msgno)14 try_one (errcode_t code, int known, int table, int msgno)
15 {
16     const char *msg = error_message (code);
17     char buffy[1024];
18 
19     snprintf (buffy, sizeof(buffy), "error table %d message %d", table, msgno);
20     if (0 == strcmp (buffy, msg)) {
21         if (!known) {
22             known_err++;
23         }
24         return;
25     }
26     snprintf (buffy, sizeof(buffy), "Unknown code et%d %d", table, msgno);
27     if (!strcmp (buffy, msg)) {
28         if (known)
29             known_err++;
30         return;
31     }
32     printf ("error code %ld got unrecognized message '%s',\n"
33             "should have been table %d message %d\n",
34             (long) code, msg, table, msgno);
35     misc_err++;
36 }
37 
38 static void
try_table(int table,int known,int lineno,errcode_t c0,errcode_t c1,errcode_t c2)39 try_table (int table, int known, int lineno,
40            errcode_t c0, errcode_t c1, errcode_t c2)
41 {
42     try_one (c0, known, table, 0);
43     try_one (c1, known, table, 1);
44     try_one (c2, known, table, 2);
45     if (misc_err != 0 || known_err != 0) {
46         fail++;
47         if (known_err)
48             printf ("table list error from line %d, table %d\n", lineno,
49                     table);
50         if (misc_err)
51             printf ("misc errors from line %d table %d\n", lineno, table);
52         misc_err = known_err = 0;
53     }
54 }
55 
56 static void
try_em_1(int t1_known,int t2_known,int lineno)57 try_em_1 (int t1_known, int t2_known, int lineno)
58 {
59     try_table (1, t1_known, lineno, ET1_M0, ET1_M1, ET1_M2);
60     try_table (2, t2_known, lineno, ET2_M0, ET2_M1, ET2_M2);
61 }
62 #define try_em(A,B) try_em_1(A,B,__LINE__)
63 
run(void * x)64 static void *run(/*@unused@*/ void *x)
65 {
66     try_em (0, 0);
67     (void) add_error_table (&et_et1_error_table);
68     try_em (1, 0);
69     (void) add_error_table (&et_et2_error_table);
70     try_em (1, 1);
71     (void) remove_error_table (&et_et1_error_table);
72     try_em (0, 1);
73     (void) remove_error_table (&et_et1_error_table);
74     try_em (0, 1);
75     (void) remove_error_table (&et_et2_error_table);
76     try_em (0, 0);
77 
78     initialize_et1_error_table ();
79     try_em (1, 0);
80     (void) add_error_table (&et_et1_error_table);
81     try_em (1, 0);
82     (void) remove_error_table (&et_et1_error_table);
83     try_em (1, 0);
84     (void) remove_error_table (&et_et1_error_table);
85     try_em (0, 0);
86 
87     initialize_et1_error_table ();
88     try_em (1, 0);
89     (void) add_error_table (&et_et1_error_table);
90     try_em (1, 0);
91     (void) add_error_table (&et_et2_error_table);
92     try_em (1, 1);
93     (void) remove_error_table (&et_et1_error_table);
94     try_em (1, 1);
95     (void) remove_error_table (&et_et1_error_table);
96     try_em (0, 1);
97     (void) remove_error_table (&et_et2_error_table);
98     try_em (0, 0);
99     (void) remove_error_table (&et_et2_error_table);
100     try_em (0, 0);
101 
102     (void) add_error_table (&et_et2_error_table);
103     try_em (0, 1);
104     initialize_et2_error_table ();
105     try_em (0, 1);
106     (void) add_error_table (&et_et1_error_table);
107     try_em (1, 1);
108     (void) remove_error_table (&et_et1_error_table);
109     try_em (0, 1);
110     (void) remove_error_table (&et_et2_error_table);
111     try_em (0, 1);
112     (void) remove_error_table (&et_et2_error_table);
113     try_em (0, 0);
114 
115     return 0;
116 }
117 
118 #ifdef TEST_THREADS
119 #include <pthread.h>
120 #endif
121 
main(int argc,char * argv[])122 int main (/*@unused@*/ int argc, /*@unused@*/ char *argv[])
123 {
124 #ifdef TEST_THREADS
125     pthread_t t;
126     int err;
127     void *t_retval;
128 
129     err = pthread_create(&t, 0, run, 0);
130     if (err) {
131         fprintf(stderr, "pthread_create error: %s\n", strerror(err));
132         exit(1);
133     }
134     err = pthread_join(t, &t_retval);
135     if (err) {
136         fprintf(stderr, "pthread_join error: %s\n", strerror(err));
137         exit(1);
138     }
139     return fail;
140 #else
141     run(0);
142     return fail;
143 #endif
144 }
145