| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | /* * defs.h: initial definitions for PuTTY. * * The rule about this header file is that it can't depend on any * other header file in this code base. This is where we define * things, as much as we can, that other headers will want to refer * to, such as opaque structure types and their associated typedefs, * or macros that are used by other headers. */#ifndef PUTTY_DEFS_H#define PUTTY_DEFS_H#ifndef WINSCP#ifdef NDEBUG/* * PuTTY is a security project, so assertions are important - if an * assumption is violated, proceeding anyway may have far worse * consequences than simple program termination. This check and #error * should arrange that we don't ever accidentally compile assertions * out. */#error Do not compile this code base with NDEBUG defined!#endif#endif#if HAVE_CMAKE_H#include "cmake.h"#endif#include <stddef.h>#include <stdint.h>#include <stdio.h>                     /* for __MINGW_PRINTF_FORMAT */#include <stdbool.h>#ifdef WINSCP#define HAVE_AES_NI 1#endif#if defined _MSC_VER && _MSC_VER < 1800/* Work around lack of inttypes.h and strtoumax in older MSVC */#define PRIx32 "x"#define PRIu32 "u"#define PRIu64 "I64u"#define PRIdMAX "I64d"#define PRIXMAX "I64X"#define SCNu64 "I64u"#define SIZEx "Ix"#define SIZEu "Iu"/* Also, define a LEGACY_WINDOWS flag to enable other workarounds */#define LEGACY_WINDOWS#else#include <inttypes.h>/* Because we still support older MSVC libraries which don't recognise the * standard C "z" modifier for size_t-sized integers, we must use an * inttypes.h-style macro for those */#define SIZEx "zx"#define SIZEu "zu"#endif#if defined __GNUC__ || defined __clang__/* * On MinGW, the correct compiler format checking for vsnprintf() etc * can depend on compile-time flags; these control whether you get * ISO C or Microsoft's non-standard format strings. * We sometimes use __attribute__ ((format)) for our own printf-like * functions, which are ultimately interpreted by the toolchain-chosen * printf, so we need to take that into account to get correct warnings. */#ifdef __MINGW_PRINTF_FORMAT#define PRINTF_LIKE(fmt_index, ellipsis_index) \    __attribute__ ((format (__MINGW_PRINTF_FORMAT, fmt_index, ellipsis_index)))#else#define PRINTF_LIKE(fmt_index, ellipsis_index) \    __attribute__ ((format (printf, fmt_index, ellipsis_index)))#endif#else /* __GNUC__ */#define PRINTF_LIKE(fmt_index, ellipsis_index)#endif /* __GNUC__ */typedef struct conf_tag Conf;typedef struct terminal_tag Terminal;typedef struct term_utf8_decode term_utf8_decode;typedef struct Filename Filename;typedef struct FontSpec FontSpec;typedef struct bufchain_tag bufchain;typedef struct strbuf strbuf;typedef struct LoadedFile LoadedFile;typedef struct RSAKey RSAKey;typedef struct BinarySink BinarySink;typedef struct BinarySource BinarySource;typedef struct stdio_sink stdio_sink;typedef struct bufchain_sink bufchain_sink;typedef struct handle_sink handle_sink;typedef struct IdempotentCallback IdempotentCallback;typedef struct SockAddr SockAddr;typedef struct Socket Socket;typedef struct Plug Plug;typedef struct SocketPeerInfo SocketPeerInfo;typedef struct DeferredSocketOpener DeferredSocketOpener;typedef struct DeferredSocketOpenerVtable DeferredSocketOpenerVtable;typedef struct Backend Backend;typedef struct BackendVtable BackendVtable;typedef struct Interactor Interactor;typedef struct InteractorVtable InteractorVtable;typedef struct InteractionReadySeat InteractionReadySeat;typedef struct Ldisc_tag Ldisc;typedef struct LogContext LogContext;typedef struct LogPolicy LogPolicy;typedef struct LogPolicyVtable LogPolicyVtable;typedef struct Seat Seat;typedef struct SeatVtable SeatVtable;typedef struct SeatDialogText SeatDialogText;typedef struct SeatDialogTextItem SeatDialogTextItem;typedef struct SeatDialogPromptDescriptions SeatDialogPromptDescriptions;typedef struct SeatPromptResult SeatPromptResult;typedef struct cmdline_get_passwd_input_state cmdline_get_passwd_input_state;typedef struct TermWin TermWin;typedef struct TermWinVtable TermWinVtable;typedef struct Ssh Ssh;typedef struct mp_int mp_int;typedef struct MontyContext MontyContext;typedef struct WeierstrassCurve WeierstrassCurve;typedef struct WeierstrassPoint WeierstrassPoint;typedef struct MontgomeryCurve MontgomeryCurve;typedef struct MontgomeryPoint MontgomeryPoint;typedef struct EdwardsCurve EdwardsCurve;typedef struct EdwardsPoint EdwardsPoint;typedef struct SshServerConfig SshServerConfig;typedef struct SftpServer SftpServer;typedef struct SftpServerVtable SftpServerVtable;typedef struct Channel Channel;typedef struct SshChannel SshChannel;typedef struct mainchan mainchan;typedef struct CertExprBuilder CertExprBuilder;typedef struct ssh_sharing_state ssh_sharing_state;typedef struct ssh_sharing_connstate ssh_sharing_connstate;typedef struct share_channel share_channel;typedef struct PortFwdManager PortFwdManager;typedef struct PortFwdRecord PortFwdRecord;typedef struct ConnectionLayer ConnectionLayer;typedef struct prng prng;typedef struct ssh_hashalg ssh_hashalg;typedef struct ssh_hash ssh_hash;typedef struct ssh_kex ssh_kex;typedef struct ssh_kexes ssh_kexes;typedef struct ssh_keyalg ssh_keyalg;typedef struct ssh_key ssh_key;typedef struct ssh_compressor ssh_compressor;typedef struct ssh_decompressor ssh_decompressor;typedef struct ssh_compression_alg ssh_compression_alg;typedef struct ssh2_userkey ssh2_userkey;typedef struct ssh2_macalg ssh2_macalg;typedef struct ssh2_mac ssh2_mac;typedef struct ssh_cipheralg ssh_cipheralg;typedef struct ssh_cipher ssh_cipher;typedef struct ssh2_ciphers ssh2_ciphers;typedef struct dh_ctx dh_ctx;typedef struct ecdh_key ecdh_key;typedef struct ecdh_keyalg ecdh_keyalg;typedef struct NTRUKeyPair NTRUKeyPair;typedef struct NTRUEncodeSchedule NTRUEncodeSchedule;typedef struct RFC6979 RFC6979;typedef struct RFC6979Result RFC6979Result;typedef struct dlgparam dlgparam;typedef struct dlgcontrol dlgcontrol;typedef struct settings_w settings_w;typedef struct settings_r settings_r;typedef struct settings_e settings_e;typedef struct ca_options ca_options;typedef struct host_ca host_ca;typedef struct host_ca_enum host_ca_enum;typedef struct SessionSpecial SessionSpecial;typedef struct StripCtrlChars StripCtrlChars;typedef struct BidiContext BidiContext;/* * A small structure wrapping up a (pointer, length) pair so that it * can be conveniently passed to or from a function. */typedef struct ptrlen {    const void *ptr;    size_t len;} ptrlen;typedef struct logblank_t logblank_t;typedef struct BinaryPacketProtocol BinaryPacketProtocol;typedef struct PacketProtocolLayer PacketProtocolLayer;struct unicode_data;/* Do a compile-time type-check of 'to_check' (without evaluating it), * as a side effect of returning the value 'to_return'. Note that * although this macro double-*expands* to_return, it always * *evaluates* exactly one copy of it, so it's side-effect safe. */#define TYPECHECK(to_check, to_return)                  \    (sizeof(to_check) ? (to_return) : (to_return))/* Return a pointer to the object of structure type 'type' whose field * with name 'field' is pointed at by 'object'. */#define container_of(object, type, field)                               \    TYPECHECK(object == &((type *)0)->field,                            \              ((type *)(((char *)(object)) - offsetof(type, field))))#if defined __GNUC__ || defined __clang__#define NORETURN __attribute__((__noreturn__))#elif defined _MSC_VER#define NORETURN __declspec(noreturn)#else#define NORETURN#endif/* * Standard macro definitions. STR() behaves like the preprocessor * stringification # operator, and CAT() behaves like the token paste * ## operator, except that each one macro-expands its argument(s) * first, unlike the raw version. E.g. * *   #__LINE__               ->    "__LINE__" *   STR(__LINE__)           ->    "1234"             (or whatever) * * and similarly, * *   foo ## __LINE__         ->    foo__LINE__ *   CAT(foo, __LINE__)      ->    foo1234            (or whatever) * * The expansion is achieved by having each macro pass its arguments * to a secondary inner macro, because parameter lists of a macro call * get expanded before the called macro is invoked. So STR(__LINE__) * -> STR_INNER(1234) -> #1234 -> "1234", and similarly for CAT. */#define STR_INNER(x) #x#define STR(x) STR_INNER(x)#define CAT_INNER(x,y) x ## y#define CAT(x,y) CAT_INNER(x,y)/* * Structure shared between ssh.h and storage.h, giving strictness * options relating to checking of an OpenSSH certificate. It's a bit * cheaty to put something so specific in here, but more painful to * put it in putty.h. */struct ca_options {    bool permit_rsa_sha1, permit_rsa_sha256, permit_rsa_sha512;};#endif /* PUTTY_DEFS_H */
 |