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