diff --git a/apps/s_client.c b/apps/s_client.c index 194832892787a7ea14d63d30c03b6c5172839ec2..e1be6a908b6ab93122a625c07f27c7e9f7570662 100644 --- a/apps/s_client.c +++ b/apps/s_client.c @@ -308,6 +308,9 @@ static void sc_usage(void) BIO_printf(bio_err," -prexit - print session information even on connection failure\n"); BIO_printf(bio_err," -showcerts - show all certificates in the chain\n"); BIO_printf(bio_err," -debug - extra output\n"); +#ifdef WATT32 + BIO_printf(bio_err," -wdebug - WATT-32 tcp debugging\n"); +#endif BIO_printf(bio_err," -msg - Show protocol messages\n"); BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n"); BIO_printf(bio_err," -state - print the 'ssl' states\n"); @@ -827,6 +830,10 @@ static char *jpake_secret = NULL; c_tlsextdebug=1; else if (strcmp(*argv,"-status") == 0) c_status_req=1; +#endif +#ifdef WATT32 + else if (strcmp(*argv,"-wdebug") == 0) + dbug_init(); #endif else if (strcmp(*argv,"-msg") == 0) c_msg=1; diff --git a/apps/s_server.c b/apps/s_server.c index 4b93fdefa2240ab2fe3b5e31a57e913f5be78cc1..1e15281c213afafbb726e71eb0d42d94862dd102 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -2971,7 +2971,7 @@ static int www_body(char *hostname, int s, int stype, unsigned char *context) BIO_printf(bio_s_out,"read R BLOCK\n"); #if defined(OPENSSL_SYS_NETWARE) delay(1000); -#elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__) +#elif !defined(OPENSSL_SYS_MSDOS) sleep(1); #endif continue; diff --git a/apps/s_socket.c b/apps/s_socket.c index 093b9c82ad478aa7de09f008cb1a357582c31a4a..e83baf4e709279dee9a452c990fa276eadb073a7 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -178,7 +178,12 @@ static void sock_cleanup(void) static int ssl_sock_init(void) { -#if defined(OPENSSL_SYS_WINDOWS) +#ifdef WATT32 + extern int _watt_do_exit; + _watt_do_exit = 0; + if (sock_init()) + return (0); +#elif defined(OPENSSL_SYS_WINDOWS) if (!wsa_init_done) { int err; diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index 4544ab209c75d914a5dfb99d32a22b12072110ba..a026b3e0b02c0370f2be61f95a003afd6d70bc75 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -494,6 +494,12 @@ int BIO_sock_init(void) } } #endif /* OPENSSL_SYS_WINDOWS */ +#ifdef WATT32 + extern int _watt_do_exit; + _watt_do_exit = 0; /* don't make sock_init() call exit() */ + if (sock_init()) + return (-1); +#endif #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) WORD wVerReq; @@ -543,6 +549,9 @@ int BIO_socket_ioctl(int fd, long type, void *arg) { int i; +#ifdef __DJGPP__ + i=ioctlsocket(fd,type,(char *)arg); +#else # if defined(OPENSSL_SYS_VMS) /* 2011-02-18 SMS. * VMS ioctl() can't tolerate a 64-bit "void *arg", but we @@ -565,8 +574,9 @@ int BIO_socket_ioctl(int fd, long type, void *arg) # else /* defined(OPENSSL_SYS_VMS) */ # define ARG arg # endif /* defined(OPENSSL_SYS_VMS) [else] */ - i=ioctlsocket(fd,type,ARG); + i=ioctlsocket(fd,type,ARG); +#endif /* __DJGPP__ */ if (i < 0) SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); return(i); diff --git a/crypto/bio/bss_dgram.c b/crypto/bio/bss_dgram.c index 25d5195bc22ea15755a8dbc42a465b7b755ef335..9c0950191b9e049f42b63645c237368b814db195 100644 --- a/crypto/bio/bss_dgram.c +++ b/crypto/bio/bss_dgram.c @@ -95,6 +95,12 @@ ((a)->s6_addr32[2] == htonl(0x0000ffff))) #endif +#ifdef WATT32 +#define sock_write SockWrite /* Watt-32 uses same names */ +#define sock_read SockRead +#define sock_puts SockPuts +#endif + static int dgram_write(BIO *h, const char *buf, int num); static int dgram_read(BIO *h, char *buf, int size); static int dgram_puts(BIO *h, const char *str); diff --git a/crypto/bio/bss_log.c b/crypto/bio/bss_log.c index 7b6eb7315251ef52946394a19bc05fe95206fe61..2227b2b52d475509af4401d24870884cab5268ac 100644 --- a/crypto/bio/bss_log.c +++ b/crypto/bio/bss_log.c @@ -88,7 +88,7 @@ # include #elif defined(OPENSSL_SYS_NETWARE) # define NO_SYSLOG -#elif !defined(MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && !defined(NO_SYSLOG) +#elif (!defined(MSDOS) || defined(WATT32)) && !defined(OPENSSL_SYS_VXWORKS) && !defined(NO_SYSLOG) # include #endif @@ -373,11 +373,15 @@ static void xcloselog(BIO* bp) { } -#else /* Unix */ +#else /* Unix/Watt32 */ static void xopenlog(BIO* bp, char* name, int level) { +#ifdef WATT32 /* djgpp/DOS */ + openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); +#else openlog(name, LOG_PID|LOG_CONS, level); +#endif } static void xsyslog(BIO *bp, int priority, const char *string) diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c index 4e1b3d5fa1141b3df18979a394288c776c4b3077..3df31938c185510fdf008d245388b7589b70ef13 100644 --- a/crypto/bio/bss_sock.c +++ b/crypto/bio/bss_sock.c @@ -65,6 +65,12 @@ #include +#ifdef WATT32 +#define sock_write SockWrite /* Watt-32 uses same names */ +#define sock_read SockRead +#define sock_puts SockPuts +#endif + static int sock_write(BIO *h, const char *buf, int num); static int sock_read(BIO *h, char *buf, int size); static int sock_puts(BIO *h, const char *str); diff --git a/crypto/des/read_pwd.c b/crypto/des/read_pwd.c index 9042afe1731483285da75953409b1169f627e3ff..ce5fa00a37a42fdf8d38bb6e36e2cb720744e5df 100644 --- a/crypto/des/read_pwd.c +++ b/crypto/des/read_pwd.c @@ -266,7 +266,7 @@ int des_read_pw(char *buf, char *buff, int size, const char *prompt, long status; unsigned short channel = 0; #else -#if !defined(OPENSSL_SYS_MSDOS) +#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) TTY_STRUCT tty_orig,tty_new; #endif #endif diff --git a/crypto/md4/md4.c b/crypto/md4/md4.c index f8a47fb50c7aa03ef9389142d3d30a0830da64fd..141415ad4df6731283b322f831ab01bc82e34b2f 100644 --- a/crypto/md4/md4.c +++ b/crypto/md4/md4.c @@ -64,7 +64,7 @@ void do_fp(FILE *f); void pt(unsigned char *md); -#if !defined(_OSD_POSIX) +#if !defined(_OSD_POSIX) && !defined(__DJGPP__) int read(int, void *, unsigned int); #endif diff --git a/crypto/md5/md5.c b/crypto/md5/md5.c index d171256520c9d7154dfb221107cda5dcd8fd486b..563733abc5061e47a884e0d85540d69df211244c 100644 --- a/crypto/md5/md5.c +++ b/crypto/md5/md5.c @@ -64,7 +64,7 @@ void do_fp(FILE *f); void pt(unsigned char *md); -#if !defined(_OSD_POSIX) +#if !defined(_OSD_POSIX) && !defined(__DJGPP__) int read(int, void *, unsigned int); #endif diff --git a/crypto/o_dir.c b/crypto/o_dir.c index ded369f23cf7f34a49d0c74b111523d43929b2dd..42891ea45928501431d6019edb33053616b6395c 100644 --- a/crypto/o_dir.c +++ b/crypto/o_dir.c @@ -70,7 +70,7 @@ #include "o_dir.h" #define LPDIR_H -#if defined OPENSSL_SYS_UNIX +#if defined OPENSSL_SYS_UNIX || defined DJGPP #include "LPdir_unix.c" #elif defined OPENSSL_SYS_VMS #include "LPdir_vms.c" diff --git a/crypto/perlasm/x86asm.pl b/crypto/perlasm/x86asm.pl index 6cf80546d29fb36f36294c050fbcc44d45a94f1c..cae156ae63ce322dad4e75caba349b0d5ed01f20 100644 --- a/crypto/perlasm/x86asm.pl +++ b/crypto/perlasm/x86asm.pl @@ -277,7 +277,7 @@ sub ::asm_init { print STDERR <<"EOF"; Pick one target type from elf - Linux, FreeBSD, Solaris x86, etc. - a.out - elder OpenBSD, etc. + a.out - DJGPP, elder OpenBSD, etc. coff - GAS/COFF such as Win32 targets win32n - Windows 95/Windows NT NASM format nw-nasm - NetWare NASM format diff --git a/crypto/ripemd/rmd160.c b/crypto/ripemd/rmd160.c index 0fcd99fe16f1e0ce9875e5f33adf15d515ce23ad..b0ec57449890b5d14f66d6adde93a6f6837d402f 100644 --- a/crypto/ripemd/rmd160.c +++ b/crypto/ripemd/rmd160.c @@ -64,7 +64,7 @@ void do_fp(FILE *f); void pt(unsigned char *md); -#if !defined(_OSD_POSIX) +#if !defined(_OSD_POSIX) && !defined(__DJGPP__) int read(int, void *, unsigned int); #endif diff --git a/crypto/ui/ui_openssl.c b/crypto/ui/ui_openssl.c index 1b09b916bbd6eadfe8d1cbeeda1acb3bc587781a..a38c7581e6a0ca10376d05fc9994f4c74a41128a 100644 --- a/crypto/ui/ui_openssl.c +++ b/crypto/ui/ui_openssl.c @@ -296,7 +296,7 @@ static long tty_orig[3], tty_new[3]; /* XXX Is there any guarantee that this w static long status; static unsigned short channel = 0; #else -#if !defined(OPENSSL_SYS_MSDOS) +#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) static TTY_STRUCT tty_orig,tty_new; #endif #endif diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl index dca37e7cd265878d04a77d6dea0235add06e4c74..86772329bc7bd5a2492e59fdddb25e7901b0f6c2 100644 --- a/crypto/x86cpuid.pl +++ b/crypto/x86cpuid.pl @@ -168,7 +168,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &ret (); &function_end_B("OPENSSL_rdtsc"); -# This works in Ring 0 only [read MS-DOS+privileged DPMI host], +# This works in Ring 0 only [read DJGPP+MS-DOS+privileged DPMI host], # but it's safe to call it on any [supported] 32-bit platform... # Just check for [non-]zero return value... &function_begin_B("OPENSSL_instrument_halt","EXTRN\t_OPENSSL_ia32cap_P:DWORD"); @@ -202,6 +202,41 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &ret (); &function_end_B("OPENSSL_instrument_halt"); +# Essentially there is only one use for this function. Under DJGPP: +# +# #include +# ... +# i=OPENSSL_far_spin(_dos_ds,0x46c); +# ... +# to obtain the number of spins till closest timer interrupt. + +&function_begin_B("OPENSSL_far_spin"); + &pushf (); + &pop ("eax"); + &bt ("eax",9); + &jnc (&label("nospin")); # interrupts are disabled + + &mov ("eax",&DWP(4,"esp")); + &mov ("ecx",&DWP(8,"esp")); + &data_word (0x90d88e1e); # push %ds, mov %eax,%ds + &xor ("eax","eax"); + &mov ("edx",&DWP(0,"ecx")); + &jmp (&label("spin")); + + &align (16); +&set_label("spin"); + &inc ("eax"); + &cmp ("edx",&DWP(0,"ecx")); + &je (&label("spin")); + + &data_word (0x1f909090); # pop %ds + &ret (); + +&set_label("nospin"); + &xor ("eax","eax"); + &xor ("edx","edx"); + &ret (); +&function_end_B("OPENSSL_far_spin"); &function_begin_B("OPENSSL_wipe_cpu","EXTRN\t_OPENSSL_ia32cap_P:DWORD"); &xor ("eax","eax"); diff --git a/demos/bio/sconnect.c b/demos/bio/sconnect.c index 87b380b258cb8f5b0c3574ec5aa07ac37a3fde0b..880344eb78453b80b3c87a5c357b2b1114a82d77 100644 --- a/demos/bio/sconnect.c +++ b/demos/bio/sconnect.c @@ -32,6 +32,11 @@ char *argv[]; else host=argv[1]; +#ifdef WATT32 + dbug_init(); + sock_init(); +#endif + /* Lets get nice error messages */ SSL_load_error_strings(); diff --git a/e_os.h b/e_os.h index 9a260a4141efaca097e82dbcf26aae1fcbaeeaa2..0a97895360d71407e2be33279641421728ac796e 100644 --- a/e_os.h +++ b/e_os.h @@ -150,6 +150,13 @@ extern "C" { #define clear_socket_error() WSASetLastError(0) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) +#elif defined(__DJGPP__) +#define WATT32 +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define closesocket(s) close_s(s) +#define readsocket(s,b,n) read_s(s,b,n) +#define writesocket(s,b,n) send(s,b,n,0) #elif defined(MAC_OS_pre_X) #define get_last_socket_error() errno #define clear_socket_error() errno=0 @@ -220,6 +227,19 @@ extern "C" { #if (defined(WINDOWS) || defined(MSDOS)) +# ifdef __DJGPP__ +# include +# include +# include +# include +# include +# define _setmode setmode +# define _O_TEXT O_TEXT +# define _O_BINARY O_BINARY +# undef DEVRANDOM +# define DEVRANDOM "/dev/urandom\x24" +# endif /* __DJGPP__ */ + # ifndef S_IFDIR # define S_IFDIR _S_IFDIR # endif @@ -228,7 +248,7 @@ extern "C" { # define S_IFMT _S_IFMT # endif -# if !defined(WINNT) +# if !defined(WINNT) && !defined(__DJGPP__) # define NO_SYSLOG # endif # define NO_DIRENT @@ -479,7 +499,7 @@ static unsigned int _strlen31(const char *str) # define SSLeay_Read(a,b,c) (-1) # define SHUTDOWN(fd) close(fd) # define SHUTDOWN2(fd) close(fd) -# else +# elif !defined(__DJGPP__) # if defined(_WIN32_WCE) && _WIN32_WCE<410 # define getservbyname _masked_declaration_getservbyname # endif @@ -506,6 +526,11 @@ static unsigned int _strlen31(const char *str) # define SSLeay_Read(a,b,c) recv((a),(b),(c),0) # define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } +# else +# define SSLeay_Write(a,b,c) write_s(a,b,c,0) +# define SSLeay_Read(a,b,c) read_s(a,b,c) +# define SHUTDOWN(fd) close_s(fd) +# define SHUTDOWN2(fd) close_s(fd) # endif # elif defined(MAC_OS_pre_X) diff --git a/e_os2.h b/e_os2.h index d07c4b9360302b88fe13cb17d99a5f52f777d644..f4597a2c6703fc2037e0b06e0d55f74e415c0a4f 100644 --- a/e_os2.h +++ b/e_os2.h @@ -85,7 +85,7 @@ extern "C" { /* ---------------------- Microsoft operating systems ---------------------- */ /* Note that MSDOS actually denotes 32-bit environments running on top of - MS-DOS. */ + MS-DOS, such as DJGPP one. */ #if defined(OPENSSL_SYSNAME_MSDOS) # undef OPENSSL_SYS_UNIX # define OPENSSL_SYS_MSDOS diff --git a/engines/e_aep.c b/engines/e_aep.c index d27e562b0cecdcba668315b0a80eac5e56206fae..a9372268cd4a21b78504e655390d6d579953fb82 100644 --- a/engines/e_aep.c +++ b/engines/e_aep.c @@ -57,7 +57,7 @@ #include #include -#if !defined(OPENSSL_SYS_MSDOS) || defined(__MINGW32__) +#if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__) || defined(__MINGW32__) #include #include #else