diff --git a/get_ver.awk b/get_ver.awk new file mode 100755 index 00000000..e483018a --- /dev/null +++ b/get_ver.awk @@ -0,0 +1,20 @@ +# fetch libssh2 version number from input file and write them to STDOUT +BEGIN { + while ((getline < ARGV[1]) > 0) { + if (match ($0, /^#define LIBSSH2_VERSION[\s|\t]+"[^"]+"/)) { + my_ver_str = substr($3, 2, length($3) - 2); + split(my_ver_str, v, "."); + if (v[3]) + gsub("[^0-9].*$", "", v[3]); + else + v[3] = 0; + if (v[2]) + gsub("[^0-9].*$", "", v[2]); + else + v[2] = 0; + my_ver = v[1] "," v[2] "," v[3]; + } + } + print "LIBSSH2_VERSION = " my_ver ""; + print "LIBSSH2_VERSION_STR = " my_ver_str ""; +} diff --git a/include/libssh2.h b/include/libssh2.h index 0a18d91f..4a2bb503 100644 --- a/include/libssh2.h +++ b/include/libssh2.h @@ -59,7 +59,7 @@ extern "C" { # endif /* LIBSSH2_WIN32 */ #endif /* LIBSSH2_API */ -#if defined(LIBSSH2_DARWIN) || (defined(LIBSSH2_WIN32) && !defined(_MSC_VER)) +#if defined(LIBSSH2_DARWIN) || (defined(LIBSSH2_WIN32) && !defined(_MSC_VER) && !defined(__MINGW32__)) # include #endif diff --git a/nw/Makefile b/nw/Makefile new file mode 100644 index 00000000..1f04ce84 --- /dev/null +++ b/nw/Makefile @@ -0,0 +1,2 @@ +include Makefile.netware + diff --git a/nw/Makefile.netware b/nw/Makefile.netware new file mode 100644 index 00000000..880938c7 --- /dev/null +++ b/nw/Makefile.netware @@ -0,0 +1,537 @@ +################################################################# +# +## Makefile for building libssh2 (NetWare version - gnu make) +## Use: make -f Makefile.netware [help|all|clean|dev|devclean|dist|distclean|objclean] +## +## Comments to: Guenter Knauf +# +################################################################# + +# Edit the path below to point to the base of your Novell NDK. +ifndef NDKBASE +NDKBASE = c:/novell +endif + +# Edit the path below to point to the base of your Zlib sources. +ifndef ZLIB_PATH +ZLIB_PATH = ../../zlib-1.2.3 +endif + +# Edit the path below to point to the base of your OpenSSL package. +ifndef OPENSSL_PATH +OPENSSL_PATH = ../../openssl-0.9.8d +endif + +# Edit the path below to point to your Distribution folder. +ifndef DISTDIR +DISTDIR = libssh2-$(LIBSSH2_VERSION_STR)-bin-nw +endif +DISTARC = $(DISTDIR).zip + +# Edit the path below to point to your Development folder. +ifndef DEVLDIR +DEVLDIR = libssh2-$(LIBSSH2_VERSION_STR)-dev-nw +endif +DEVLARC = $(DEVLDIR).zip + +# Edit the vars below to change NLM target settings. +TARGET = libssh2 +VERSION = $(LIBSSH2_VERSION) +COPYR = Copyright (c) 2004-2007 Sara Golemon +WWWURL = http://www.libssh2.org/ +DESCR = libssh2 $(LIBSSH2_VERSION_STR) - $(WWWURL) +MTSAFE = YES +STACK = 64000 +SCREEN = none +EXPORTS = @$(TARGET).imp + +# Edit the var below to point to your lib architecture. +ifndef LIBARCH +LIBARCH = LIBC +endif + +# must be equal to DEBUG or NDEBUG +DB = NDEBUG +# DB = DEBUG +# Optimization: -O or debugging: -g +ifeq ($(DB),NDEBUG) + OPT = -O2 + OBJDIR = release +else + OPT = -g + OBJDIR = debug +endif + +# Include the version info retrieved from libssh2.h +-include $(OBJDIR)/version.inc + +# The following line defines your compiler. +ifdef METROWERKS + CC = mwccnlm +else + CC = gcc +endif +CP = cp -afv +# RM = rm -f +AWK = awk +ZIP = zip -qzr9 +# if you want to mark the target as MTSAFE you will need a tool for +# generating the xdc data for the linker; here's a minimal tool: +# http://www.gknw.de/development/prgtools/mkxdc.zip +MPKXDC = mkxdc + +# Global flags for all compilers +CFLAGS = $(OPT) -D$(DB) -DNETWARE -nostdinc # -DHAVE_CONFIG_H +CFLAGS += -DLIBSSH2DEBUG + +ifeq ($(CC),mwccnlm) +LD = mwldnlm +LDFLAGS = -nostdlib $(PRELUDE) $(OBJL) -o $@ -commandfile +AR = mwldnlm +ARFLAGS = -type library -w nocmdline $(OBJS) -o +LIBEXT = lib +CFLAGS += -msgstyle gcc -gccinc -inline on -opt nointrinsics -proc 586 +CFLAGS += -relax_pointers +#CFLAGS += -w on +ifeq ($(LIBARCH),LIBC) + PRELUDE = $(SDK_LIBC)/imports/libcpre.o + CFLAGS += -align 4 +else + PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj" +# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h" + CFLAGS += -align 1 +endif +else +LD = nlmconv +LDFLAGS = -T +AR = ar +ARFLAGS = -cq +LIBEXT = a +CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return +CFLAGS += -fno-strict-aliasing -Wall -Wno-unused # -pedantic +ifeq ($(LIBARCH),LIBC) + PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o +else + PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o + CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h +endif +endif + +LDLIBS = + +NDK_ROOT = $(NDKBASE)/ndk +SDK_CLIB = $(NDK_ROOT)/nwsdk +SDK_LIBC = $(NDK_ROOT)/libc +SDK_LDAP = $(NDK_ROOT)/cldapsdk/netware + +INCLUDES = -I. -I../include + +INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl +LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.$(LIBEXT) $(OPENSSL_PATH)/out_nw_libc/ssl.$(LIBEXT) +IMPORTS += GetProcessSwitchCount RunningProcess + +ifdef WITH_ZLIB + INCLUDES += -I$(ZLIB_PATH) + IMPORTS += @$(ZLIB_PATH)/nw/libz.imp + MODULES += libz.nlm +endif + +ifeq ($(LIBARCH),LIBC) + INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks + # INCLUDES += -I$(SDK_LIBC)/include/winsock + # INCLUDES += -I$(SDK_LDAP)/libc/inc + CFLAGS += -D_POSIX_SOURCE + # CFLAGS += -D__ANSIC__ +else + INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include + # INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete + # INCLUDES += -I$(SDK_LDAP)/clib/inc + CFLAGS += -DNETDB_USE_INTERNET +endif +CFLAGS += $(INCLUDES) + +ifeq ($(MTSAFE),YES) + XDCOPT = -n +endif +ifeq ($(MTSAFE),NO) + XDCOPT = -u +endif +ifdef XDCOPT + XDCDATA = $(OBJDIR)/$(TARGET).xdc +endif + +ifeq ($(findstring linux,$(OSTYPE)),linux) +#-include $(NDKBASE)/nlmconv/ncpfs.inc +DL = ' +DS = / +else +DS = \\ +endif + +vpath %.c . ../src + +OBJECTS = \ + channel.o \ + comp.o \ + crypt.o \ + hostkey.o \ + kex.o \ + mac.o \ + misc.o \ + openssl.o \ + packet.o \ + pem.o \ + publickey.o \ + scp.o \ + session.o \ + sftp.o \ + transport.o \ + userauth.o + +OBJS := $(addprefix $(OBJDIR)/,$(OBJECTS)) $(LDLIBS) +OBJL = $(OBJS) $(OBJDIR)/nwlibc.o + +all: lib nlm + +nlm: prebuild $(TARGET).nlm + +lib: prebuild $(TARGET).$(LIBEXT) + +prebuild: $(OBJDIR) $(OBJDIR)/version.inc libssh2_config.h + +test: all + $(MAKE) -C test -f Makefile.netware + +$(OBJDIR)/%.o: %.c +# @echo Compiling $< + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/version.inc: ../include/libssh2.h $(OBJDIR) + @echo Creating $@ + @$(AWK) -f ../get_ver.awk $< > $@ + +dist: all $(DISTDIR) $(DISTDIR)/readme.txt + @-mkdir $(DISTDIR)$(DS)bin + @-$(CP) ../INSTALL $(DISTDIR) + @-$(CP) ../LICENSE $(DISTDIR) + @-$(CP) ../README $(DISTDIR) + @$(CP) $(TARGET).nlm $(DISTDIR)/bin + @echo Creating $(DISTARC) + @$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt + +dev: all $(DEVLDIR) $(DEVLDIR)/readme.txt + @-mkdir $(DEVLDIR)$(DS)bin + @-mkdir $(DEVLDIR)$(DS)include + @-mkdir $(DEVLDIR)$(DS)nw + @-$(CP) ../INSTALL $(DEVLDIR) + @-$(CP) ../LICENSE $(DEVLDIR) + @-$(CP) ../README $(DEVLDIR) + @$(CP) $(TARGET).nlm $(DEVLDIR)/bin + @$(CP) ../include/*.h $(DEVLDIR)/include + @$(CP) libssh2_config.h $(DEVLDIR)/include + @$(CP) $(TARGET).$(LIBEXT) $(DEVLDIR)/nw + @echo Creating $(DEVLARC) + @$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt + +distclean: clean + -$(RM) -r $(DISTDIR) + -$(RM) $(DISTARC) + +devclean: clean + -$(RM) -r $(DEVLDIR) + -$(RM) $(DEVLARC) + +objclean: all + -$(RM) -r $(OBJDIR) + +testclean: clean + $(MAKE) -C test -f Makefile.netware clean + +clean: + -$(RM) libssh2_config.h + -$(RM) libssh2.imp + -$(RM) $(TARGET).nlm $(TARGET).$(LIBEXT) + -$(RM) -r $(OBJDIR) + +$(OBJDIR): + @mkdir $@ + +$(DISTDIR): + @mkdir $@ + +$(DEVLDIR): + @mkdir $@ + +$(TARGET).$(LIBEXT): $(OBJS) + @echo Creating $@ + @-$(RM) $@ + @$(AR) $(ARFLAGS) $@ $^ + +$(TARGET).nlm: $(OBJDIR)/$(TARGET).def $(TARGET).imp $(OBJL) $(XDCDATA) + @echo Linking $@ + @-$(RM) $@ + @$(LD) $(LDFLAGS) $< + +$(OBJDIR)/%.xdc: Makefile.netware + @echo Creating $@ + @$(MPKXDC) $(XDCOPT) $@ + +$(OBJDIR)/%.def: Makefile.netware + @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@ + @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@ + @echo $(DL)# All your changes will be lost!!$(DL) >> $@ + @echo $(DL)#$(DL) >> $@ + @echo $(DL)copyright "$(COPYR)"$(DL) >> $@ + @echo $(DL)description "$(DESCR)"$(DL) >> $@ + @echo $(DL)version $(VERSION)$(DL) >> $@ +ifdef NLMTYPE + @echo $(DL)type $(NLMTYPE)$(DL) >> $@ +endif +ifdef STACK + @echo $(DL)stack $(STACK)$(DL) >> $@ +endif +ifdef SCREEN + @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@ +else + @echo $(DL)screenname "DEFAULT"$(DL) >> $@ +endif +ifeq ($(DB),DEBUG) + @echo $(DL)debug$(DL) >> $@ +endif + @echo $(DL)threadname "$(TARGET)"$(DL) >> $@ +ifdef XDCDATA + @echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@ +endif +ifeq ($(LIBARCH),CLIB) + @echo $(DL)start _Prelude$(DL) >> $@ + @echo $(DL)exit _Stop$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@ + @echo $(DL)module clib$(DL) >> $@ +else + @echo $(DL)flag_on 64$(DL) >> $@ + @echo $(DL)pseudopreemption$(DL) >> $@ + @echo $(DL)start _LibCPrelude$(DL) >> $@ + @echo $(DL)exit _LibCPostlude$(DL) >> $@ + @echo $(DL)check _LibCCheckUnload$(DL) >> $@ + @echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@ + @echo $(DL)module libc$(DL) >> $@ +endif +ifdef MODULES + @echo $(DL)module $(MODULES)$(DL) >> $@ +endif +ifdef EXPORTS + @echo $(DL)export $(EXPORTS)$(DL) >> $@ +endif +ifdef IMPORTS + @echo $(DL)import $(IMPORTS)$(DL) >> $@ +endif +ifeq ($(LD),nlmconv) + @echo $(DL)input $(OBJL)$(DL) >> $@ + @echo $(DL)input $(PRELUDE)$(DL) >> $@ + @echo $(DL)output $(TARGET).nlm$(DL) >> $@ +endif + +libssh2_config.h: Makefile.netware + @echo Creating $@ + @echo $(DL)/* $@ for NetWare target.$(DL) > $@ + @echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@ + @echo $(DL)** All your changes will be lost!!$(DL) >> $@ + @echo $(DL)*/$(DL) >> $@ + @echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@ + @echo $(DL)#define VERSION "$(LIBSSH2_VERSION_STR)"$(DL) >> $@ + @echo $(DL)#define PACKAGE_BUGREPORT "http://sourceforge.net/projects/libssh2"$(DL) >> $@ + @echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_CTYPE_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@ + @echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_ERRNO_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@ + @echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@ + @echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@ + @echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@ + @echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@ + @echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@ + @echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@ + @echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_MATH_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SELECT 1$(DL) >> $@ + @echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@ + @echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@ + @echo $(DL)#define HAVE_STDARG_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_STDDEF_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ + @echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@ + @echo $(DL)#define RETSIGTYPE void$(DL) >> $@ + @echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ + @echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ + @echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ + @echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ + @echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ + @echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ + @echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ + @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ + @echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_PEM_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@ + @echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@ + @echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@ +ifdef WITH_ZLIB + @echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_HAVE_ZLIB 1$(DL) >> $@ +endif +ifdef ENABLE_IPV6 + @echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@ +endif +ifdef NW_WINSOCK + @echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ +else + @echo $(DL)#define HAVE_SYS_TYPES_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_SOCKET_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@ + @echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@ +endif +ifdef OLD_NOVELLSDK + @echo $(DL)#define socklen_t int$(DL) >> $@ +endif + @echo $(DL)#define LIBSSH2_DH_GEX_NEW 1$(DL) >> $@ +ifeq ($(DB),DEBUG) + @echo $(DL)#define LIBSSH2_DEBUG_CONNECTION 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_ERRORS 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_KEX 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_PUBLICKEY 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_SCP 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_SFTP 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_TRANSPORT 1$(DL) >> $@ + @echo $(DL)#define LIBSSH2_DEBUG_USERAUTH 1$(DL) >> $@ +endif + +libssh2.imp: Makefile.netware + @echo Creating $@ + @echo $(DL)# $@ for NetWare target.$(DL) > $@ + @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@ + @echo $(DL)# All your changes will be lost!!$(DL) >> $@ + @echo $(DL) (LIBSSH2)$(DL) >> $@ + @echo $(DL) libssh2_banner_set,$(DL) >> $@ + @echo $(DL) libssh2_channel_close,$(DL) >> $@ + @echo $(DL) libssh2_channel_direct_tcpip_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_eof,$(DL) >> $@ + @echo $(DL) libssh2_channel_flush_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_free,$(DL) >> $@ + @echo $(DL) libssh2_channel_open_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_process_startup,$(DL) >> $@ + @echo $(DL) libssh2_channel_read_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_request_pty_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_set_blocking,$(DL) >> $@ + @echo $(DL) libssh2_channel_setenv_ex,$(DL) >> $@ + @echo $(DL) libssh2_channel_write_ex,$(DL) >> $@ + @echo $(DL) libssh2_hostkey_hash,$(DL) >> $@ + @echo $(DL) libssh2_scp_recv,$(DL) >> $@ + @echo $(DL) libssh2_scp_send_ex,$(DL) >> $@ + @echo $(DL) libssh2_session_abstract,$(DL) >> $@ + @echo $(DL) libssh2_session_callback_set,$(DL) >> $@ + @echo $(DL) libssh2_session_disconnect_ex,$(DL) >> $@ + @echo $(DL) libssh2_session_free,$(DL) >> $@ + @echo $(DL) libssh2_session_init_ex,$(DL) >> $@ + @echo $(DL) libssh2_session_last_error,$(DL) >> $@ + @echo $(DL) libssh2_session_method_pref,$(DL) >> $@ + @echo $(DL) libssh2_session_methods,$(DL) >> $@ + @echo $(DL) libssh2_session_startup,$(DL) >> $@ + @echo $(DL) libssh2_sftp_close_handle,$(DL) >> $@ + @echo $(DL) libssh2_sftp_fstat_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_init,$(DL) >> $@ + @echo $(DL) libssh2_sftp_last_error,$(DL) >> $@ + @echo $(DL) libssh2_sftp_mkdir_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_open_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_read,$(DL) >> $@ + @echo $(DL) libssh2_sftp_readdir,$(DL) >> $@ + @echo $(DL) libssh2_sftp_rename_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_rmdir_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_seek,$(DL) >> $@ + @echo $(DL) libssh2_sftp_shutdown,$(DL) >> $@ + @echo $(DL) libssh2_sftp_stat_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_symlink_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_tell,$(DL) >> $@ + @echo $(DL) libssh2_sftp_unlink_ex,$(DL) >> $@ + @echo $(DL) libssh2_sftp_write,$(DL) >> $@ + @echo $(DL) libssh2_userauth_authenticated,$(DL) >> $@ + @echo $(DL) libssh2_userauth_keyboard_interactive_ex,$(DL) >> $@ + @echo $(DL) libssh2_userauth_list,$(DL) >> $@ + @echo $(DL) libssh2_userauth_password_ex,$(DL) >> $@ + @echo $(DL) libssh2_userauth_publickey_fromfile_ex$(DL) >> $@ + +$(DISTDIR)/readme.txt: Makefile.netware + @echo Creating $@ + @echo $(DL)This is a binary distribution for NetWare platform.$(DL) > $@ + @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ + @echo $(DL)Please download the complete libssh package for$(DL) >> $@ + @echo $(DL)any further documentation:$(DL) >> $@ + @echo $(DL)$(WWWURL)$(DL) >> $@ + +$(DEVLDIR)/readme.txt: Makefile.netware + @echo Creating $@ + @echo $(DL)This is a development distribution for NetWare platform.$(DL) > $@ + @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ + @echo $(DL)Please download the complete libssh package for$(DL) >> $@ + @echo $(DL)any further documentation:$(DL) >> $@ + @echo $(DL)$(WWWURL)$(DL) >> $@ + +help: $(OBJDIR)/version.inc + @echo $(DL)===========================================================$(DL) + @echo $(DL)Novell LibC NDK = $(SDK_LIBC)$(DL) + @echo $(DL)OpenSSL path = $(OPENSSL_PATH)$(DL) + @echo $(DL)Zlib path = $(ZLIB_PATH)$(DL) + @echo $(DL)===========================================================$(DL) + @echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL) + @echo $(DL)$(MAKE) all$(DL) + @echo $(DL)$(MAKE) dll$(DL) + @echo $(DL)$(MAKE) lib$(DL) + @echo $(DL)$(MAKE) clean$(DL) + @echo $(DL)$(MAKE) dev$(DL) + @echo $(DL)$(MAKE) devclean$(DL) + @echo $(DL)$(MAKE) dist$(DL) + @echo $(DL)$(MAKE) distclean$(DL) + @echo $(DL)$(MAKE) objclean$(DL) + @echo $(DL)===========================================================$(DL) + + diff --git a/nw/keepscreen.c b/nw/keepscreen.c new file mode 100644 index 00000000..c3471b3e --- /dev/null +++ b/nw/keepscreen.c @@ -0,0 +1,25 @@ +/* Simple _NonAppStop() implementation which can be linked to your + * NLM in order to keep the screen open when the NLM terminates + * (the good old clib behaviour). + * You dont have to call it, its done automatically from LibC. + * + * 2004-Aug-11 by Guenter Knauf + * + * URL: http://www.gknw.net/development/mk_nlm/ + */ + +#include +#include + +void _NonAppStop() +{ + uint16_t row, col; + + GetScreenSize(&row, &col); + gotorowcol(row-1, 0); + /* pressanykey(); */ + printf(" "); + getcharacter(); +} + + diff --git a/nw/nwlibc.c b/nw/nwlibc.c new file mode 100644 index 00000000..30fecec4 --- /dev/null +++ b/nw/nwlibc.c @@ -0,0 +1,309 @@ +/********************************************************************* + * Universal NetWare library stub. * + * written by Ulrich Neuman and given to OpenSource copyright-free. * + * version: 1.0 * + *********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef struct +{ + int _errno; + void *twentybytes; +} libthreaddata_t; + +typedef struct +{ + int x; + int y; + int z; + void *tenbytes; + NXKey_t perthreadkey; /* if -1, no key obtained... */ + NXMutex_t *lock; +} libdata_t; + +int gLibId = -1; +void *gLibHandle = (void *) NULL; +rtag_t gAllocTag = (rtag_t) NULL; +NXMutex_t *gLibLock = (NXMutex_t *) NULL; + +/* internal library function prototypes... */ +int DisposeLibraryData ( void * ); +void DisposeThreadData ( void * ); +int GetOrSetUpData ( int id, libdata_t **data, libthreaddata_t **threaddata ); + + +int _NonAppStart +( + void *NLMHandle, + void *errorScreen, + const char *cmdLine, + const char *loadDirPath, + size_t uninitializedDataLength, + void *NLMFileHandle, + int (*readRoutineP)( int conn, void *fileHandle, size_t offset, + size_t nbytes, size_t *bytesRead, void *buffer ), + size_t customDataOffset, + size_t customDataSize, + int messageCount, + const char **messages +) +{ + NX_LOCK_INFO_ALLOC(liblock, "Per-Application Data Lock", 0); + +#ifndef __GNUC__ +#pragma unused(cmdLine) +#pragma unused(loadDirPath) +#pragma unused(uninitializedDataLength) +#pragma unused(NLMFileHandle) +#pragma unused(readRoutineP) +#pragma unused(customDataOffset) +#pragma unused(customDataSize) +#pragma unused(messageCount) +#pragma unused(messages) +#endif + +/* +** Here we process our command line, post errors (to the error screen), +** perform initializations and anything else we need to do before being able +** to accept calls into us. If we succeed, we return non-zero and the NetWare +** Loader will leave us up, otherwise we fail to load and get dumped. +*/ + gAllocTag = AllocateResourceTag(NLMHandle, + " memory allocations", AllocSignature); + + if (!gAllocTag) + { + OutputToScreen(errorScreen, "Unable to allocate resource tag for " + "library memory allocations.\n"); + return -1; + } + + gLibId = register_library(DisposeLibraryData); + + if (gLibId < -1) + { + OutputToScreen(errorScreen, "Unable to register library with kernel.\n"); + return -1; + } + + gLibHandle = NLMHandle; + + gLibLock = NXMutexAlloc(0, 0, &liblock); + + if (!gLibLock) + { + OutputToScreen(errorScreen, "Unable to allocate library data lock.\n"); + return -1; + } + + return 0; +} + +/* +** Here we clean up any resources we allocated. Resource tags is a big part +** of what we created, but NetWare doesn't ask us to free those. +*/ +void _NonAppStop( void ) +{ + (void) unregister_library(gLibId); + NXMutexFree(gLibLock); +} + +/* +** This function cannot be the first in the file for if the file is linked +** first, then the check-unload function's offset will be nlmname.nlm+0 +** which is how to tell that there isn't one. When the check function is +** first in the linked objects, it is ambiguous. For this reason, we will +** put it inside this file after the stop function. +** +** Here we check to see if it's alright to ourselves to be unloaded. If not, +** we return a non-zero value. Right now, there isn't any reason not to allow +** it. +*/ +int _NonAppCheckUnload( void ) +{ + return 0; +} + +int GetOrSetUpData +( + int id, + libdata_t **appData, + libthreaddata_t **threadData +) +{ + int err; + libdata_t *app_data; + libthreaddata_t *thread_data; + NXKey_t key; + NX_LOCK_INFO_ALLOC(liblock, "Application Data Lock", 0); + + err = 0; + thread_data = (libthreaddata_t *) NULL; + +/* +** Attempt to get our data for the application calling us. This is where we +** store whatever application-specific information we need to carry in support +** of calling applications. +*/ + app_data = (libdata_t *) get_app_data(id); + + if (!app_data) + { +/* +** This application hasn't called us before; set up application AND per-thread +** data. Of course, just in case a thread from this same application is calling +** us simultaneously, we better lock our application data-creation mutex. We +** also need to recheck for data after we acquire the lock because WE might be +** that other thread that was too late to create the data and the first thread +** in will have created it. +*/ + NXLock(gLibLock); + + if (!(app_data = (libdata_t *) get_app_data(id))) + { + app_data = (libdata_t *) malloc(sizeof(libdata_t)); + + if (app_data) + { + memset(app_data, 0, sizeof(libdata_t)); + + app_data->tenbytes = malloc(10); + app_data->lock = NXMutexAlloc(0, 0, &liblock); + + if (!app_data->tenbytes || !app_data->lock) + { + if (app_data->lock) + NXMutexFree(app_data->lock); + + free(app_data); + app_data = (libdata_t *) NULL; + err = ENOMEM; + } + + if (app_data) + { +/* +** Here we burn in the application data that we were trying to get by calling +** get_app_data(). Next time we call the first function, we'll get this data +** we're just now setting. We also go on here to establish the per-thread data +** for the calling thread, something we'll have to do on each application +** thread the first time it calls us. +*/ + err = set_app_data(gLibId, app_data); + + if (err) + { + free(app_data); + app_data = (libdata_t *) NULL; + err = ENOMEM; + } + else + { + /* create key for thread-specific data... */ + err = NXKeyCreate(DisposeThreadData, (void *) NULL, &key); + + if (err) /* (no more keys left?) */ + key = -1; + + app_data->perthreadkey = key; + } + } + } + } + + NXUnlock(gLibLock); + } + + if (app_data) + { + key = app_data->perthreadkey; + + if ( key != -1 /* couldn't create a key? no thread data */ + && !(err = NXKeyGetValue(key, (void **) &thread_data)) + && !thread_data) + { +/* +** Allocate the per-thread data for the calling thread. Regardless of whether +** there was already application data or not, this may be the first call by a +** a new thread. The fact that we allocation 20 bytes on a pointer is not very +** important, this just helps to demonstrate that we can have arbitrarily +** complex per-thread data. +*/ + thread_data = (libthreaddata_t *) malloc(sizeof(libthreaddata_t)); + + if (thread_data) + { + thread_data->_errno = 0; + thread_data->twentybytes = malloc(20); + + if (!thread_data->twentybytes) + { + free(thread_data); + thread_data = (libthreaddata_t *) NULL; + err = ENOMEM; + } + + if ((err = NXKeySetValue(key, thread_data))) + { + free(thread_data->twentybytes); + free(thread_data); + thread_data = (libthreaddata_t *) NULL; + } + } + } + } + + if (appData) + *appData = app_data; + + if (threadData) + *threadData = thread_data; + + return err; +} + +int DisposeLibraryData +( + void *data +) +{ + if (data) + { + void *tenbytes = ((libdata_t *) data)->tenbytes; + + if (tenbytes) + free(tenbytes); + + free(data); + } + + return 0; +} + +void DisposeThreadData +( + void *data +) +{ + if (data) + { + void *twentybytes = ((libthreaddata_t *) data)->twentybytes; + + if (twentybytes) + free(twentybytes); + + free(data); + } +} + + diff --git a/nw/test/Makefile.netware b/nw/test/Makefile.netware new file mode 100644 index 00000000..45ead51a --- /dev/null +++ b/nw/test/Makefile.netware @@ -0,0 +1,271 @@ +################################################################# +# +## Makefile for building libssh2 (NetWare version - gnu make) +## Use: make -f Makefile.netware +## +## Comments to: Guenter Knauf +# +################################################################# + +# Edit the path below to point to the base of your Novell NDK. +ifndef NDKBASE +NDKBASE = c:/novell +endif + +# Edit the path below to point to the base of your Zlib sources. +ifndef ZLIB_PATH +ZLIB_PATH = ../../zlib-1.2.3 +endif + +# Edit the path below to point to the base of your OpenSSL package. +ifndef OPENSSL_PATH +OPENSSL_PATH = ../../openssl-0.9.8d +endif + +# Edit the vars below to change NLM target settings. +#TARGETS = ssh2_sample sftp ssh2 +TARGET = ssh2_sample +VERSION = $(LIBSSH2_VERSION) +COPYR = Copyright (c) 2004-2007, Sara Golemon +WWWURL = http://www.libssh2.org/ +DESCR = libssh2 sample $(LIBSSH2_VERSION_STR) - $(WWWURL) +MTSAFE = YES +STACK = 64000 +SCREEN = none + +# Edit the var below to point to your lib architecture. +ifndef LIBARCH +LIBARCH = LIBC +endif + +# must be equal to DEBUG or NDEBUG +DB = NDEBUG +# DB = DEBUG +# Optimization: -O or debugging: -g +ifeq ($(DB),NDEBUG) + OPT = -O2 + OBJDIR = release +else + OPT = -g + OBJDIR = debug +endif + +# Include the version info retrieved from xml2ver.h +-include $(OBJDIR)/version.inc + +# The following line defines your compiler. +ifdef METROWERKS + CC = mwccnlm +else + CC = gcc +endif +CP = cp -afv +# RM = rm -f +AWK = awk +# if you want to mark the target as MTSAFE you will need a tool for +# generating the xdc data for the linker; here's a minimal tool: +# http://www.gknw.de/development/prgtools/mkxdc.zip +MPKXDC = mkxdc + +# Global flags for all compilers +CFLAGS = $(OPT) -D$(DB) -DNETWARE -nostdinc # -DHAVE_CONFIG_H + +ifeq ($(CC),mwccnlm) +LD = mwldnlm +LDFLAGS = -nostdlib $(PRELUDE) $(OBJS) -o $@ -commandfile +AR = mwldnlm +ARFLAGS = -type library -w nocmdline $(OBJS) -o +LIBEXT = lib +CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586 +CFLAGS += -relax_pointers +#CFLAGS += -w on +ifeq ($(LIBARCH),LIBC) + PRELUDE = $(SDK_LIBC)/imports/libcpre.o + CFLAGS += -align 4 +else + PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj" +# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h" + CFLAGS += -align 1 +endif +else +LD = nlmconv +LDFLAGS = -T +AR = ar +ARFLAGS = -cq +LIBEXT = a +CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing +CFLAGS += -Wall,no-unused # -pedantic +ifeq ($(LIBARCH),LIBC) + PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o +else + PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o + CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h +endif +endif + +NDK_ROOT = $(NDKBASE)/ndk +SDK_CLIB = $(NDK_ROOT)/nwsdk +SDK_LIBC = $(NDK_ROOT)/libc +SDK_LDAP = $(NDK_ROOT)/cldapsdk/netware + +INCLUDES = -I. -I.. -I../../include + +LDLIBS = + +INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl +#LDLIBS = $(OPENSSL_PATH)/out_nw_libc/crypto.$(LIBEXT) $(OPENSSL_PATH)/out_nw_libc/ssl.$(LIBEXT) +IMPORTS += GetProcessSwitchCount RunningProcess + +ifdef LINK_STATIC + LDLIBS += ../libssh2.$(LIBEXT) +else + IMPORTS += @../libssh2.imp + MODULES += libssh2.nlm +endif + +ifdef WITH_ZLIB + INCLUDES += -I$(ZLIB_PATH) +ifdef Z_LINK_STATIC + LDLIBS += @$(ZLIB_PATH)/nw/libz.$(LIBEXT) +else + IMPORTS += @$(ZLIB_PATH)/nw/libz.imp + MODULES += libz.nlm +endif +endif + +ifeq ($(LIBARCH),LIBC) + INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks + # INCLUDES += -I$(SDK_LIBC)/include/winsock + # INCLUDES += -I$(SDK_LDAP)/libc/inc + CFLAGS += -D_POSIX_SOURCE + # CFLAGS += -D__ANSIC__ +else + INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include + # INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete + # INCLUDES += -I$(SDK_LDAP)/clib/inc + CFLAGS += -DNETDB_USE_INTERNET +endif +CFLAGS += $(INCLUDES) + +ifeq ($(MTSAFE),YES) + XDCOPT = -n +endif +ifeq ($(MTSAFE),NO) + XDCOPT = -u +endif +ifdef XDCOPT + XDCDATA = $(OBJDIR)/$(TARGET).xdc +endif + +ifeq ($(findstring linux,$(OSTYPE)),linux) +DL = ' +#-include $(NDKBASE)/nlmconv/ncpfs.inc +endif + +vpath %.c ../.. ../../example/simple + +OBJS = $(OBJDIR)/$(TARGET).o $(LDLIBS) + + +all: nlm + +nlm: prebuild $(TARGET).nlm + +prebuild: $(OBJDIR) $(OBJDIR)/version.inc + +$(OBJDIR)/%.o: %.c +# @echo Compiling $< + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/version.inc: ../../include/libssh2.h $(OBJDIR) + @echo Creating $@ + @$(AWK) -f ../../get_ver.awk $< > $@ + +objclean: all + -$(RM) -r $(OBJDIR) + +clean: + -$(RM) $(TARGET).exe + -$(RM) -r $(OBJDIR) + +$(OBJDIR): + @mkdir $@ + +$(TARGET).nlm: $(OBJDIR)/$(TARGET).def $(OBJS) $(XDCDATA) + @echo Linking $@ + @-$(RM) $@ + @$(LD) $(LDFLAGS) $< + +$(OBJDIR)/%.xdc: Makefile.netware + @echo Creating $@ + @$(MPKXDC) $(XDCOPT) $@ + +$(OBJDIR)/%.def: Makefile.netware + @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@ + @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@ + @echo $(DL)# All your changes will be lost!!$(DL) >> $@ + @echo $(DL)#$(DL) >> $@ + @echo $(DL)copyright "$(COPYR)"$(DL) >> $@ + @echo $(DL)description "$(DESCR)"$(DL) >> $@ + @echo $(DL)version $(VERSION)$(DL) >> $@ +ifdef NLMTYPE + @echo $(DL)type $(NLMTYPE)$(DL) >> $@ +endif +ifdef STACK + @echo $(DL)stack $(STACK)$(DL) >> $@ +endif +ifdef SCREEN + @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@ +else + @echo $(DL)screenname "DEFAULT"$(DL) >> $@ +endif +ifeq ($(DB),DEBUG) + @echo $(DL)debug$(DL) >> $@ +endif + @echo $(DL)threadname "$(TARGET)"$(DL) >> $@ +ifdef XDCDATA + @echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@ +endif +ifeq ($(LIBARCH),CLIB) + @echo $(DL)start _Prelude$(DL) >> $@ + @echo $(DL)exit _Stop$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@ + @echo $(DL)module clib$(DL) >> $@ +else + @echo $(DL)flag_on 64$(DL) >> $@ + @echo $(DL)pseudopreemption$(DL) >> $@ + @echo $(DL)start _LibCPrelude$(DL) >> $@ + @echo $(DL)exit _LibCPostlude$(DL) >> $@ + @echo $(DL)check _LibCCheckUnload$(DL) >> $@ + @echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@ + @echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@ +# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@ + @echo $(DL)module libc$(DL) >> $@ +endif +ifdef MODULES + @echo $(DL)module $(MODULES)$(DL) >> $@ +endif +ifdef EXPORTS + @echo $(DL)export $(EXPORTS)$(DL) >> $@ +endif +ifdef IMPORTS + @echo $(DL)import $(IMPORTS)$(DL) >> $@ +endif +ifeq ($(LD),nlmconv) +ifdef WITH_SSL + @echo $(DL)input $(LIBSSL)$(DL) >> $@ +endif + @echo $(DL)input $(OBJS)$(DL) >> $@ + @echo $(DL)input $(PRELUDE)$(DL) >> $@ + @echo $(DL)output $(TARGET).nlm$(DL) >> $@ +endif + + diff --git a/src/libssh2_priv.h b/src/libssh2_priv.h index 23766150..6843e955 100644 --- a/src/libssh2_priv.h +++ b/src/libssh2_priv.h @@ -374,8 +374,6 @@ struct _LIBSSH2_MAC_METHOD { int (*dtor)(LIBSSH2_SESSION *session, void **abstract); }; -#ifdef LIBSSH2DEBUG -void _libssh2_debug(LIBSSH2_SESSION *session, int context, const char *format, ...); #define LIBSSH2_DBG_TRANS 1 #define LIBSSH2_DBG_KEX 2 #define LIBSSH2_DBG_AUTH 3 @@ -384,6 +382,8 @@ void _libssh2_debug(LIBSSH2_SESSION *session, int context, const char *format, . #define LIBSSH2_DBG_SFTP 6 #define LIBSSH2_DBG_ERROR 7 #define LIBSSH2_DBG_PUBLICKEY 8 +#ifdef LIBSSH2DEBUG +void _libssh2_debug(LIBSSH2_SESSION *session, int context, const char *format, ...); #else #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 style */ diff --git a/src/session.c b/src/session.c index 4c19680a..55abc852 100644 --- a/src/session.c +++ b/src/session.c @@ -971,13 +971,13 @@ LIBSSH2_API int libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds, case LIBSSH2_POLLFD_CHANNEL: if (FD_ISSET(fds[i].fd.channel->session->socket_fd, &rfds)) { /* Spin session until no data available */ - while (libssh2_packet_read(fds[i].fd.channel->session, 0) > 0); + while (libssh2_packet_read(fds[i].fd.channel->session) > 0); } break; case LIBSSH2_POLLFD_LISTENER: if (FD_ISSET(fds[i].fd.listener->session->socket_fd, &rfds)) { /* Spin session until no data available */ - while (libssh2_packet_read(fds[i].fd.listener->session, 0) > 0); + while (libssh2_packet_read(fds[i].fd.listener->session) > 0); } break; } diff --git a/win32/Makefile b/win32/Makefile new file mode 100644 index 00000000..8342b4de --- /dev/null +++ b/win32/Makefile @@ -0,0 +1,2 @@ +include Makefile.win32 + diff --git a/win32/Makefile.win32 b/win32/Makefile.win32 new file mode 100644 index 00000000..b3b1f730 --- /dev/null +++ b/win32/Makefile.win32 @@ -0,0 +1,298 @@ +################################################################# +# +## Makefile for building libssh2 (Win32 version - gnu make) +## Use: make -f Makefile.win32 [help|all|clean|dev|devclean|dist|distclean|objclean] +## +## Comments to: Guenter Knauf +# +################################################################# + +# Edit the path below to point to the base of your Zlib sources. +ifndef ZLIB_PATH +ZLIB_PATH = ../../zlib-1.2.3 +endif + +# Edit the path below to point to the base of your OpenSSL package. +ifndef OPENSSL_PATH +OPENSSL_PATH = ../../openssl-0.9.8d +endif + +# Edit the path below to point to your Distribution folder. +ifndef DISTDIR +DISTDIR = libssh2-$(LIBSSH2_VERSION_STR)-bin-w32 +endif +DISTARC = $(DISTDIR).zip + +# Edit the path below to point to your Development folder. +ifndef DEVLDIR +DEVLDIR = libssh2-$(LIBSSH2_VERSION_STR)-dev-w32 +endif +DEVLARC = $(DEVLDIR).zip + +# Edit the vars below to change target settings. +TARGET = libssh2 +VERSION = $(LIBSSH2_VERSION) +COPYR = (c) 2004-2007 Sara Golemon +WWWURL = http://www.libssh2.org/ +DESCR = libssh2 $(LIBSSH2_VERSION_STR) +#STACK = 64000 + +# must be equal to DEBUG or NDEBUG +DB = NDEBUG +# DB = DEBUG +# Optimization: -O or debugging: -g +ifeq ($(DB),NDEBUG) + OPT = -O2 + OBJDIR = release +else + OPT = -g + OBJDIR = debug +endif + +# Include the version info retrieved from libssh2.h +-include $(OBJDIR)/version.inc + +# The following line defines your compiler. +ifdef METROWERKS + CC = mwcc +else + CC = gcc +endif +CP = cp -afv +# RM = rm -f +AWK = awk +ZIP = zip -qzr9 + +# Global flags for all compilers +CFLAGS = $(OPT) -D$(DB) -DWIN32 -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H + +ifeq ($(CC),mwcc) +LD = mwld +RC = mwwinrc +LDFLAGS = -nostdlib +AR = $(LD) +ARFLAGS = -type library -w nocmdline $(OBJS) -o +LIBEXT = lib +LIBPATH += -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support" +LDLIBS += -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib +LDLIBS += -lkernel32.lib -luser32.lib -lwsock32.lib +RCFLAGS = +CFLAGS += -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586 +CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support" +CFLAGS += -w on,nounused,nounusedexpr # -ansi strict +else +LD = gcc +RC = windres +LDFLAGS = -s -shared -Wl,--out-implib,$(TARGET)dll.a +AR = ar +ARFLAGS = -cq +LIBEXT = a +#LDLIBS += -lwsock32 +LDLIBS += -lws2_32 +RCFLAGS = -O coff -i +CFLAGS += -fno-strict-aliasing -Wall -Wno-unused # -pedantic +endif + +INCLUDES = -I. -I../include +INCLUDES += -I$(OPENSSL_PATH)/outinc -I$(OPENSSL_PATH)/outinc/openssl + +ifdef LINK_STATIC +LDLIBS += $(OPENSSL_PATH)/out/libcrypto.$(LIBEXT) $(OPENSSL_PATH)/out/libssl.$(LIBEXT) +else +LDLIBS += $(OPENSSL_PATH)/out/libeay32.$(LIBEXT) $(OPENSSL_PATH)/out/libssl32.$(LIBEXT) +endif + +ifdef WITH_ZLIB + INCLUDES += -I$(ZLIB_PATH) + LDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT) +endif + +CFLAGS += $(INCLUDES) + +#ifeq ($(findstring linux,$(OSTYPE)),linux) +ifdef __MSYS__ +DL = ' +DS = / +else +DS = \\ +endif + +vpath %.c . ../src + +OBJECTS = \ + channel.o \ + comp.o \ + crypt.o \ + hostkey.o \ + kex.o \ + mac.o \ + misc.o \ + openssl.o \ + packet.o \ + pem.o \ + publickey.o \ + scp.o \ + session.o \ + sftp.o \ + userauth.o + +OBJS := $(addprefix $(OBJDIR)/,$(OBJECTS)) +OBJL = $(OBJS) $(OBJDIR)/$(TARGET).res + +all: lib dll + +dll: prebuild $(TARGET).dll + +lib: prebuild $(TARGET).$(LIBEXT) + +prebuild: $(OBJDIR) $(OBJDIR)/version.inc +# libssh2_config.h + +test: all + $(MAKE) -C test -f Makefile.win32 + +$(OBJDIR)/%.o: %.c +# @echo Compiling $< + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/version.inc: ../include/libssh2.h $(OBJDIR) + @echo Creating $@ + @$(AWK) -f ../get_ver.awk $< > $@ + +dist: all $(DISTDIR) $(DISTDIR)/readme.txt + @-mkdir $(DISTDIR)$(DS)bin + @-$(CP) ../INSTALL $(DISTDIR) + @-$(CP) ../LICENSE $(DISTDIR) + @-$(CP) ../README $(DISTDIR) + @$(CP) $(TARGET).dll $(DISTDIR)/bin + @echo Creating $(DISTARC) + @$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt + +dev: all $(DEVLDIR) $(DEVLDIR)/readme.txt + @-mkdir $(DEVLDIR)$(DS)bin + @-mkdir $(DEVLDIR)$(DS)include + @-mkdir $(DEVLDIR)$(DS)win32 + @-$(CP) ../INSTALL $(DEVLDIR) + @-$(CP) ../LICENSE $(DEVLDIR) + @-$(CP) ../README $(DEVLDIR) + @$(CP) $(TARGET).dll $(DEVLDIR)/bin + @$(CP) ../include/*.h $(DEVLDIR)/include + @$(CP) libssh2_config.h $(DEVLDIR)/include + @$(CP) *.$(LIBEXT) $(DEVLDIR)/win32 + @echo Creating $(DEVLARC) + @$(ZIP) $(DEVLARC) $(DEVLDIR)/* < $(DEVLDIR)/readme.txt + +distclean: clean + -$(RM) -r $(DISTDIR) + -$(RM) $(DISTARC) + +devclean: clean + -$(RM) -r $(DEVLDIR) + -$(RM) $(DEVLARC) + +objclean: all + -$(RM) -r $(OBJDIR) + +testclean: clean + $(MAKE) -C test -f Makefile.win32 clean + +clean: +# -$(RM) libssh2_config.h + -$(RM) $(TARGET).dll $(TARGET).$(LIBEXT) $(TARGET)dll.$(LIBEXT) + -$(RM) -r $(OBJDIR) + +$(OBJDIR): + @mkdir $@ + +$(DISTDIR): + @mkdir $@ + +$(DEVLDIR): + @mkdir $@ + +$(TARGET).$(LIBEXT): $(OBJS) + @echo Creating $@ + @-$(RM) $@ + @$(AR) $(ARFLAGS) $@ $^ + +$(TARGET).dll $(TARGET)dll.a: $(OBJL) + @echo Linking $@ + @-$(RM) $@ + @$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS) + + +$(OBJDIR)/%.res: $(OBJDIR)/%.rc + @echo Creating $@ + @$(RC) $(RCFLAGS) $< -o $@ + +$(OBJDIR)/%.rc: Makefile.win32 $(OBJDIR)/version.inc + @echo 1 VERSIONINFO > $@ + @echo FILEVERSION $(LIBSSH2_VERSION),0 >> $@ + @echo PRODUCTVERSION $(LIBSSH2_VERSION),0 >> $@ + @echo FILEFLAGSMASK 0x3fL >> $@ + @echo FILEOS 0x40004L >> $@ + @echo FILEFLAGS 0x0L >> $@ + @echo FILETYPE 0x1L >> $@ + @echo FILESUBTYPE 0x0L >> $@ + @echo BEGIN >> $@ + @echo BLOCK "StringFileInfo" >> $@ + @echo BEGIN >> $@ + @echo BLOCK "040904E4" >> $@ + @echo BEGIN >> $@ + @echo VALUE "LegalCopyright","$(COPYR)\0" >> $@ +ifdef COMPANY + @echo VALUE "CompanyName","$(COMPANY)\0" >> $@ +endif + @echo VALUE "ProductName","$(notdir $(@:.rc=.dll))\0" >> $@ + @echo VALUE "ProductVersion","$(LIBSSH2_VERSION_STR)\0" >> $@ + @echo VALUE "License","Released under GPL.\0" >> $@ + @echo VALUE "FileDescription","$(DESCR)\0" >> $@ + @echo VALUE "FileVersion","$(LIBSSH2_VERSION_STR)\0" >> $@ + @echo VALUE "InternalName","$(notdir $(@:.rc=))\0" >> $@ + @echo VALUE "OriginalFilename","$(notdir $(@:.rc=.dll))\0" >> $@ + @echo VALUE "WWW","$(WWWURL)\0" >> $@ + @echo END >> $@ + @echo END >> $@ + @echo BLOCK "VarFileInfo" >> $@ + @echo BEGIN >> $@ + @echo VALUE "Translation", 0x409, 1252 >> $@ + @echo END >> $@ + @echo END >> $@ +ifdef ICON + @echo 10 ICON DISCARDABLE "$(ICON)" >> $@ +endif + +$(DISTDIR)/readme.txt: Makefile.win32 + @echo Creating $@ + @echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@ + @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ + @echo $(DL)Please download the complete libssh package for$(DL) >> $@ + @echo $(DL)any further documentation:$(DL) >> $@ + @echo $(DL)$(WWWURL)$(DL) >> $@ + +$(DEVLDIR)/readme.txt: Makefile.win32 + @echo Creating $@ + @echo $(DL)This is a development distribution for Win32 platform.$(DL) > $@ + @echo $(DL)libssh version $(LIBSSH2_VERSION_STR)$(DL) >> $@ + @echo $(DL)Please download the complete libssh package for$(DL) >> $@ + @echo $(DL)any further documentation:$(DL) >> $@ + @echo $(DL)$(WWWURL)$(DL) >> $@ + +help: $(OBJDIR)/version.inc + @echo $(DL)===========================================================$(DL) + @echo $(DL)OpenSSL path = $(OPENSSL_PATH)$(DL) + @echo $(DL)Zlib path = $(ZLIB_PATH)$(DL) + @echo $(DL)===========================================================$(DL) + @echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL) + @echo $(DL)$(MAKE) all$(DL) + @echo $(DL)$(MAKE) dll$(DL) + @echo $(DL)$(MAKE) lib$(DL) + @echo $(DL)$(MAKE) clean$(DL) + @echo $(DL)$(MAKE) dev$(DL) + @echo $(DL)$(MAKE) devclean$(DL) + @echo $(DL)$(MAKE) dist$(DL) + @echo $(DL)$(MAKE) distclean$(DL) + @echo $(DL)$(MAKE) objclean$(DL) + @echo $(DL)===========================================================$(DL) + + diff --git a/win32/libssh2_config.h b/win32/libssh2_config.h index 7661e99a..04a55541 100644 --- a/win32/libssh2_config.h +++ b/win32/libssh2_config.h @@ -5,6 +5,11 @@ #include #include +#ifdef __MINGW32__ +#define ENOTCONN WSAENOTCONN +#define WINSOCK_VERSION MAKEWORD(2,0) +#endif + /* same as WSABUF */ struct iovec { u_long iov_len; @@ -36,3 +41,4 @@ static inline int usleep(int udelay) /* Enable newer diffie-hellman-group-exchange-sha1 syntax */ #define LIBSSH2_DH_GEX_NEW 1 + diff --git a/win32/test/Makefile.win32 b/win32/test/Makefile.win32 new file mode 100644 index 00000000..711a1940 --- /dev/null +++ b/win32/test/Makefile.win32 @@ -0,0 +1,214 @@ +################################################################# +# +## Makefile for building libssh2 sample (Win32 version - gnu make) +## Use: make -f Makefile.win32 [help] +## +## Comments to: Guenter Knauf +# +################################################################# + +# Edit the path below to point to the base of your Zlib sources. +ifndef ZLIB_PATH +ZLIB_PATH = ../../zlib-1.2.3 +endif + +# Edit the path below to point to the base of your OpenSSL package. +ifndef OPENSSL_PATH +OPENSSL_PATH = ../../openssl-0.9.8d +endif + +# Edit the vars below to change target settings. +#TARGETS = ssh2_sample sftp ssh2 +TARGET = ssh2_sample +VERSION = $(LIBSSH2_VERSION) +COPYR = (c) 2004-2007 Sara Golemon +WWWURL = http://www.libssh2.org/ +DESCR = libssh2 sample $(LIBSSH2_VERSION_STR) +#STACK = 64000 + +# must be equal to DEBUG or NDEBUG +DB = NDEBUG +# DB = DEBUG +# Optimization: -O or debugging: -g +ifeq ($(DB),NDEBUG) + OPT = -O2 + OBJDIR = release +else + OPT = -g + OBJDIR = debug +endif + +# Include the version info retrieved from libssh2.h +-include $(OBJDIR)/version.inc + +# The following line defines your compiler. +ifdef METROWERKS + CC = mwcc +else + CC = gcc +endif +CP = cp -afv +# RM = rm -f +AWK = awk +ZIP = zip -qzr9 + +# Global flags for all compilers +CFLAGS = $(OPT) -D$(DB) -DWIN32 -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H +CFLAGS += -DWINSOCK_VERSION=MAKEWORD(2,0) + +ifeq ($(CC),mwcc) +LD = mwld +RC = mwwinrc +LDFLAGS = -nostdlib +AR = $(LD) +ARFLAGS = -type library -w nocmdline $(OBJS) -o +LIBEXT = lib +LIBPATH += -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support" +LDLIBS += -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib +LDLIBS += -lkernel32.lib -luser32.lib -lwsock32.lib +RCFLAGS = +CFLAGS += -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 586 +CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support" +CFLAGS += -w on,nounused,nounusedexpr # -ansi strict +else +LD = gcc +RC = windres +LDFLAGS = -s +AR = ar +ARFLAGS = -cq +LIBEXT = a +#LDLIBS += -lwsock32 +LDLIBS += -lws2_32 +RCFLAGS = -O coff -i +CFLAGS += -fno-strict-aliasing -Wall -Wno-unused # -pedantic +endif + +INCLUDES = -I. -I.. -I../../include +INCLUDES += -I$(OPENSSL_PATH)/outinc -I$(OPENSSL_PATH)/outinc/openssl + +ifdef LINK_STATIC + LDLIBS += ../libssh2.$(LIBEXT) +else + LDLIBS += ../libssh2dll.$(LIBEXT) +endif + +#ifdef LINK_STATIC +#LDLIBS += $(OPENSSL_PATH)/out/libcrypto.$(LIBEXT) $(OPENSSL_PATH)/out/libssl.$(LIBEXT) +#else +#LDLIBS += $(OPENSSL_PATH)/out/libeay32.$(LIBEXT) $(OPENSSL_PATH)/out/libssl32.$(LIBEXT) +#endif + +ifdef WITH_ZLIB + INCLUDES += -I$(ZLIB_PATH) + LDLIBS += $(ZLIB_PATH)/libz.$(LIBEXT) +endif + +CFLAGS += $(INCLUDES) + +#ifeq ($(findstring linux,$(OSTYPE)),linux) +ifdef __MSYS__ +DL = ' +DS = / +else +DS = \\ +endif + +vpath %.c ../.. ../../example/simple + +#OBJS := $(addprefix $(OBJDIR)/,$(OBJECTS)) +OBJS = $(OBJDIR)/$(TARGET).o + + +all: exe + +exe: prebuild $(TARGET).exe + +prebuild: $(OBJDIR) $(OBJDIR)/version.inc +# libssh2_config.h + +$(OBJDIR)/%.o: %.c +# @echo Compiling $< + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/version.inc: ../../include/libssh2.h $(OBJDIR) + @echo Creating $@ + @$(AWK) -f ../../get_ver.awk $< > $@ + +distclean: clean + -$(RM) -r $(DISTDIR) + -$(RM) $(DISTARC) + +devclean: clean + -$(RM) -r $(DEVLDIR) + -$(RM) $(DEVLARC) + +objclean: all + -$(RM) -r $(OBJDIR) + +clean: +# -$(RM) libssh2_config.h + -$(RM) $(TARGET).exe + -$(RM) -r $(OBJDIR) + +$(OBJDIR): + @mkdir $@ + +$(TARGET).exe: $(OBJDIR)/$(TARGET).res $(OBJS) + @echo Linking $@ + @-$(RM) $@ + @$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS) + +$(OBJDIR)/%.res: $(OBJDIR)/%.rc + @echo Creating $@ + @$(RC) $(RCFLAGS) $< -o $@ + +$(OBJDIR)/%.rc: Makefile.win32 $(OBJDIR)/version.inc + @echo 1 VERSIONINFO > $@ + @echo FILEVERSION $(LIBSSH2_VERSION),0 >> $@ + @echo PRODUCTVERSION $(LIBSSH2_VERSION),0 >> $@ + @echo FILEFLAGSMASK 0x3fL >> $@ + @echo FILEOS 0x40004L >> $@ + @echo FILEFLAGS 0x0L >> $@ + @echo FILETYPE 0x1L >> $@ + @echo FILESUBTYPE 0x0L >> $@ + @echo BEGIN >> $@ + @echo BLOCK "StringFileInfo" >> $@ + @echo BEGIN >> $@ + @echo BLOCK "040904E4" >> $@ + @echo BEGIN >> $@ + @echo VALUE "LegalCopyright","$(COPYR)\0" >> $@ +ifdef COMPANY + @echo VALUE "CompanyName","$(COMPANY)\0" >> $@ +endif + @echo VALUE "ProductName","$(notdir $(@:.rc=.exe))\0" >> $@ + @echo VALUE "ProductVersion","$(LIBSSH2_VERSION_STR)\0" >> $@ + @echo VALUE "License","Released under GPL.\0" >> $@ + @echo VALUE "FileDescription","$(DESCR)\0" >> $@ + @echo VALUE "FileVersion","$(LIBSSH2_VERSION_STR)\0" >> $@ + @echo VALUE "InternalName","$(notdir $(@:.rc=))\0" >> $@ + @echo VALUE "OriginalFilename","$(notdir $(@:.rc=.exe))\0" >> $@ + @echo VALUE "WWW","$(WWWURL)\0" >> $@ + @echo END >> $@ + @echo END >> $@ + @echo BLOCK "VarFileInfo" >> $@ + @echo BEGIN >> $@ + @echo VALUE "Translation", 0x409, 1252 >> $@ + @echo END >> $@ + @echo END >> $@ +ifdef ICON + @echo 10 ICON DISCARDABLE "$(ICON)" >> $@ +endif + +help: $(OBJDIR)/version.inc + @echo $(DL)===========================================================$(DL) + @echo $(DL)OpenSSL path = $(OPENSSL_PATH)$(DL) + @echo $(DL)Zlib path = $(ZLIB_PATH)$(DL) + @echo $(DL)===========================================================$(DL) + @echo $(DL)libssh $(LIBSSH2_VERSION_STR) - available targets are:$(DL) + @echo $(DL)$(MAKE) all$(DL) + @echo $(DL)$(MAKE) exe$(DL) + @echo $(DL)$(MAKE) clean$(DL) + @echo $(DL)$(MAKE) objclean$(DL) + @echo $(DL)===========================================================$(DL) + +