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 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 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 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 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 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