00001
00002
00003
00004
00005
00006
00007
00008 #include <stdio.h>
00009 #include <sys/types.h>
00010 #include <sys/wait.h>
00011 #include <stddef.h>
00012
00013 #include "PCSC/pcsclite.h"
00014 #include "pcscd.h"
00015 #include "winscard_msg.h"
00016 #include "readerfactory.h"
00017 #include "eventhandler.h"
00018
00019 #define BLANK_LINE() \
00020 do { \
00021 printf("\n"); \
00022 } while(0)
00023
00024 #define COMMENT(c) \
00025 do { \
00026 printf(" \n"); \
00027 } while(0)
00028
00029 #define STRINGIFY(a) #a
00030
00031
00032 #define CHECK_CDEFINE(a) \
00033 printf(" CLASSERT("#a" == "STRINGIFY(a) ");\n")
00034
00035 #define CHECK_CVALUE(a) \
00036 printf(" CLASSERT("#a" == %lld);\n", (long long)a)
00037
00038 #define CHECK_DEFINE(a) \
00039 do { \
00040 printf(" LASSERTF("#a" == "STRINGIFY(a) \
00041 ",\" found %%lld\\n\",\n " \
00042 "(long long)"#a");\n"); \
00043 } while(0)
00044
00045 #define CHECK_VALUE(a) \
00046 do { \
00047 printf(" LASSERTF("#a \
00048 " == %lld, \" found %%lld\\n\",\n "\
00049 "(long long)"#a");\n", (long long)a); \
00050 } while(0)
00051
00052 #define CHECK_VALUE_64(a) \
00053 do { \
00054 printf(" LASSERTF("#a \
00055 " == %lldULL, \" found %%lld\\n\",\n "\
00056 "(long long)"#a");\n", (long long)a); \
00057 } while(0)
00058
00059 #define CHECK_MEMBER_OFFSET(s,m) \
00060 do { \
00061 CHECK_VALUE((int)offsetof(struct s, m)); \
00062 } while(0)
00063
00064 #define CHECK_MEMBER_SIZEOF(s,m) \
00065 do { \
00066 CHECK_VALUE((int)sizeof(((struct s *)0)->m)); \
00067 } while(0)
00068
00069 #define CHECK_MEMBER(s,m) \
00070 do { \
00071 CHECK_MEMBER_OFFSET(s, m); \
00072 CHECK_MEMBER_SIZEOF(s, m); \
00073 } while(0)
00074
00075 #define CHECK_STRUCT(s) \
00076 do { \
00077 COMMENT("Checks for struct "#s); \
00078 CHECK_VALUE((int)sizeof(struct s)); \
00079 } while(0)
00080
00081 static void
00082 check_constants (void)
00083 {
00084 COMMENT ("Constants...");
00085
00086 BLANK_LINE ();
00087 CHECK_DEFINE (PROTOCOL_VERSION_MAJOR);
00088 CHECK_DEFINE (PROTOCOL_VERSION_MINOR);
00089
00090 BLANK_LINE ();
00091 CHECK_DEFINE (MAX_READERNAME);
00092 CHECK_DEFINE (MAX_ATR_SIZE);
00093 CHECK_DEFINE (MAX_BUFFER_SIZE);
00094
00095 BLANK_LINE ();
00096 COMMENT ("enum pcsc_msg_commands");
00097 CHECK_VALUE (SCARD_ESTABLISH_CONTEXT);
00098 CHECK_VALUE (SCARD_RELEASE_CONTEXT);
00099 CHECK_VALUE (SCARD_LIST_READERS);
00100 CHECK_VALUE (SCARD_CONNECT);
00101 CHECK_VALUE (SCARD_RECONNECT);
00102 CHECK_VALUE (SCARD_DISCONNECT);
00103 CHECK_VALUE (SCARD_BEGIN_TRANSACTION);
00104 CHECK_VALUE (SCARD_END_TRANSACTION);
00105 CHECK_VALUE (SCARD_TRANSMIT);
00106 CHECK_VALUE (SCARD_CONTROL);
00107 CHECK_VALUE (SCARD_STATUS);
00108 CHECK_VALUE (SCARD_GET_STATUS_CHANGE);
00109 CHECK_VALUE (SCARD_CANCEL);
00110 CHECK_VALUE (SCARD_CANCEL_TRANSACTION);
00111 CHECK_VALUE (SCARD_GET_ATTRIB);
00112 CHECK_VALUE (SCARD_SET_ATTRIB);
00113 CHECK_VALUE (CMD_VERSION);
00114 CHECK_VALUE (CMD_GET_READERS_STATE);
00115 CHECK_VALUE (CMD_WAIT_READER_STATE_CHANGE);
00116 CHECK_VALUE (CMD_STOP_WAITING_READER_STATE_CHANGE);
00117 }
00118
00119 static void
00120 check_types (void)
00121 {
00122 COMMENT ("Types...");
00123
00124 BLANK_LINE ();
00125 CHECK_STRUCT (version_struct);
00126 CHECK_MEMBER (version_struct, major);
00127 CHECK_MEMBER (version_struct, minor);
00128 CHECK_MEMBER (version_struct, rv);
00129
00130 BLANK_LINE ();
00131 CHECK_STRUCT (client_struct);
00132 CHECK_MEMBER (client_struct, hContext);
00133
00134 BLANK_LINE ();
00135 CHECK_STRUCT (establish_struct);
00136 CHECK_MEMBER (establish_struct, dwScope);
00137 CHECK_MEMBER (establish_struct, hContext);
00138 CHECK_MEMBER (establish_struct, rv);
00139
00140 BLANK_LINE ();
00141 CHECK_STRUCT (release_struct);
00142 CHECK_MEMBER (release_struct, hContext);
00143 CHECK_MEMBER (release_struct, rv);
00144
00145 BLANK_LINE ();
00146 CHECK_STRUCT (connect_struct);
00147 CHECK_MEMBER (connect_struct, hContext);
00148 CHECK_MEMBER (connect_struct, szReader);
00149 CHECK_MEMBER (connect_struct, dwShareMode);
00150 CHECK_MEMBER (connect_struct, dwPreferredProtocols);
00151 CHECK_MEMBER (connect_struct, hCard);
00152 CHECK_MEMBER (connect_struct, dwActiveProtocol);
00153 CHECK_MEMBER (connect_struct, rv);
00154
00155 BLANK_LINE ();
00156 CHECK_STRUCT (reconnect_struct);
00157 CHECK_MEMBER (reconnect_struct, hCard);
00158 CHECK_MEMBER (reconnect_struct, dwShareMode);
00159 CHECK_MEMBER (reconnect_struct, dwPreferredProtocols);
00160 CHECK_MEMBER (reconnect_struct, dwInitialization);
00161 CHECK_MEMBER (reconnect_struct, dwActiveProtocol);
00162 CHECK_MEMBER (reconnect_struct, rv);
00163
00164 BLANK_LINE ();
00165 CHECK_STRUCT (disconnect_struct);
00166 CHECK_MEMBER (disconnect_struct, hCard);
00167 CHECK_MEMBER (disconnect_struct, dwDisposition);
00168 CHECK_MEMBER (disconnect_struct, rv);
00169
00170 BLANK_LINE ();
00171 CHECK_STRUCT (begin_struct);
00172 CHECK_MEMBER (begin_struct, hCard);
00173 CHECK_MEMBER (begin_struct, rv);
00174
00175 BLANK_LINE ();
00176 CHECK_STRUCT (end_struct);
00177 CHECK_MEMBER (end_struct, hCard);
00178 CHECK_MEMBER (end_struct, dwDisposition);
00179 CHECK_MEMBER (end_struct, rv);
00180
00181 BLANK_LINE ();
00182 CHECK_STRUCT (cancel_struct);
00183 CHECK_MEMBER (cancel_struct, hContext);
00184 CHECK_MEMBER (cancel_struct, rv);
00185
00186 BLANK_LINE ();
00187 CHECK_STRUCT (status_struct);
00188 CHECK_MEMBER (status_struct, hCard);
00189 CHECK_MEMBER (status_struct, mszReaderNames);
00190 CHECK_MEMBER (status_struct, pcchReaderLen);
00191 CHECK_MEMBER (status_struct, dwState);
00192 CHECK_MEMBER (status_struct, dwProtocol);
00193 CHECK_MEMBER (status_struct, pbAtr);
00194 CHECK_MEMBER (status_struct, pcbAtrLen);
00195 CHECK_MEMBER (status_struct, rv);
00196
00197 BLANK_LINE ();
00198 CHECK_STRUCT (transmit_struct);
00199 CHECK_MEMBER (transmit_struct, hCard);
00200 CHECK_MEMBER (transmit_struct, ioSendPciProtocol);
00201 CHECK_MEMBER (transmit_struct, ioSendPciLength);
00202 CHECK_MEMBER (transmit_struct, cbSendLength);
00203 CHECK_MEMBER (transmit_struct, ioRecvPciProtocol);
00204 CHECK_MEMBER (transmit_struct, ioRecvPciLength);
00205 CHECK_MEMBER (transmit_struct, pcbRecvLength);
00206 CHECK_MEMBER (transmit_struct, rv);
00207
00208 BLANK_LINE ();
00209 CHECK_STRUCT (control_struct);
00210 CHECK_MEMBER (control_struct, hCard);
00211 CHECK_MEMBER (control_struct, dwControlCode);
00212 CHECK_MEMBER (control_struct, cbSendLength);
00213 CHECK_MEMBER (control_struct, cbRecvLength);
00214 CHECK_MEMBER (control_struct, dwBytesReturned);
00215 CHECK_MEMBER (control_struct, rv);
00216
00217 BLANK_LINE ();
00218 CHECK_STRUCT (getset_struct);
00219 CHECK_MEMBER (getset_struct, hCard);
00220 CHECK_MEMBER (getset_struct, dwAttrId);
00221 CHECK_MEMBER (getset_struct, cbAttrLen);
00222 CHECK_MEMBER (getset_struct, rv);
00223
00224 BLANK_LINE ();
00225 CHECK_STRUCT (pubReaderStatesList);
00226 CHECK_MEMBER (pubReaderStatesList, readerID);
00227 CHECK_MEMBER (pubReaderStatesList, readerName);
00228 CHECK_MEMBER (pubReaderStatesList, readerState);
00229 CHECK_MEMBER (pubReaderStatesList, readerSharing);
00230 CHECK_MEMBER (pubReaderStatesList, cardAtr);
00231 CHECK_MEMBER (pubReaderStatesList, cardAtrLength);
00232 CHECK_MEMBER (pubReaderStatesList, cardProtocol);
00233 }
00234
00235 int
00236 main( int argc, char **argv)
00237 {
00238 (void)argc;
00239 (void)argv;
00240
00241 printf ("#include <sys/types.h>\n"
00242 "#include <time.h>\n"
00243 "#include <stddef.h>\n\n"
00244 "#include \"PCSC/pcsclite.h\"\n"
00245 "#include \"pcscd.h\"\n"
00246 "#include \"readerfactory.h\"\n"
00247 "#include \"eventhandler.h\"\n"
00248 "#include \"winscard_msg.h\"\n\n"
00249 "#include \"lassert.h\"\n\n"
00250 "int pcsc_assert_wire_constants(void);\n"
00251 "int pcsc_assert_wire_constants(void)\n"
00252 "{\n");
00253
00254 BLANK_LINE ();
00255
00256 check_constants ();
00257 check_types ();
00258
00259 BLANK_LINE ();
00260
00261 printf ("return 0;\n");
00262 printf ("}\n");
00263
00264 return 0;
00265 }