pcsc-wirecheck-gen.c

00001 /*
00002  * Copyright (C) 2007
00003  *  Jacob Berkman
00004  * Copyright (C) 2007-2009
00005  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
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("        /* "c" */\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(/*@unused@*/ int argc, /*@unused@*/ 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 }