Compare commits

...

53 Commits

Author SHA1 Message Date
Jan Vidar Krey
2f830d3132 Cleaned up error handling. 2012-10-17 15:39:48 +02:00
Jan Vidar Krey
5884983a2f Return -1 as error for recv/send only to signal socket has closed, use a number < -1 for socket errors. 2012-10-17 15:02:32 +02:00
Jan Vidar Krey
c43acd97bd Fixed accept/connect state event propagation.
Also removed some unused states and flags.
2012-10-17 09:25:15 +02:00
Jan Vidar Krey
b1f2c93738 Reworked the error handling of non-blocking reads and writes.
This should prevent busy loops where the socket is makred readable
but we are really only looking for it to become writable.
2012-10-17 09:16:02 +02:00
Jan Vidar Krey
50912bdf75 More work on splitting out OpenSSL specific bits. 2012-10-15 20:39:03 +02:00
Jan Vidar Krey
f3922bb3e0 Work on splitting out OpenSSL cleanly. 2012-10-12 14:24:03 +02:00
Jan Vidar Krey
f20c42d05f Wrapped everything OpenSSL related in a SSL_USE_OPENSSL check macro. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
69603ff70f Add install make rule. 2012-10-09 14:36:14 +02:00
Jan Vidar Krey
3ea38c59af Better reporting using the !stats command. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
50292cb8c9 Update the network statistics every 10 seconds instead of 60 seconds. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
e4fc91dde1 Made the network statistics work again. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
8086d89e23 Better formatting of byte sizes. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
cc2ead8136 Use util's format_size. 2012-10-09 10:20:58 +02:00
Jan Vidar Krey
10d8157477 Added a utility function to convert an arbitrary byte size into a human readable string.
E.g. 849484 becomes "829.57 KB".
2012-10-09 10:20:12 +02:00
Jan Vidar Krey
0a7cb86014 Fixed a crash in plugin mod_chat_only. 2012-10-09 10:02:08 +02:00
Jan Vidar Krey
2e8c99b7ec Refurbished the ADC hub stress-tester tool; adcrush 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
cb6236691b Added more functionality to the ADC client test code. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
5136525abc Added API to construct ADC messages with source and destination. 2012-10-02 23:59:11 +02:00
Jan Vidar Krey
07da142e65 Only enable the C compiler (no C++ compiler required). 2012-10-05 09:09:54 +02:00
Jan Vidar Krey
aa21556600 Use correct source directory for building outside of source. 2012-10-04 22:00:30 +00:00
Tillmann Karras
16ee65422d Fix cbuffer initialization
If no data was appended, cbuf_get() would return a pointer to
uninitialized memory. Now it returns a pointer to a string of zero
length.
2012-10-03 22:40:33 +02:00
Jan Vidar Krey
f0b11dadf1 Refurbished adcrush (hub stress tester). 2012-10-03 13:51:07 +02:00
Jan Vidar Krey
61073bd304 Fix rare protocol parse error due to incorrect recv queue handling. 2012-10-03 13:49:50 +02:00
Jan Vidar Krey
20a847e1b4 Moved the ipcalc code to the network directory. 2012-10-03 12:59:05 +02:00
Jan Vidar Krey
a90807fccb Fix version auto generation. 2012-10-03 12:02:35 +02:00
Jan Vidar Krey
25c82076da Cmake fixes, build adc client and link uhub with pthread if sqlite3 is used. 2012-10-03 11:45:21 +02:00
Jan Vidar Krey
089966d918 Fix ADC client send queue. 2012-10-03 11:44:07 +02:00
Jan Vidar Krey
e95a892fb7 MSVC compile warnings fixed. 2012-10-02 22:47:43 +02:00
Jan Vidar Krey
564f09ad65 Update the CMake minimum version to 2.8.3 2012-10-02 20:16:30 +00:00
Jan Vidar Krey
a33851b13d fixup! Updated .gitignore 2012-10-02 21:54:56 +02:00
Jan Vidar Krey
20e445bf94 Updated .gitignore 2012-10-02 21:49:25 +02:00
Jan Vidar Krey
133707ef57 Removed the VS2010 project files. Use CMake instead. 2012-10-02 21:43:58 +02:00
Jan Vidar Krey
62d14a9c52 Plugin compile fixes for windows systems. 2012-10-02 21:42:58 +02:00
Jan Vidar Krey
ab9dda1c61 Some fixes for CMake on Windows.
Tested successfully with NMake.
2012-10-02 21:38:45 +02:00
Jan Vidar Krey
37e78eada1 Replaced the GNU makefiles with CMake. 2012-10-02 15:49:27 +02:00
Jan Vidar Krey
5b4467acd5 Minor stuff on the uhub-admin tool based on the changes in the ADC client code. 2012-09-28 15:52:39 +02:00
Jan Vidar Krey
ff2e2a3d4c Misc ADC client fixes. 2012-09-28 15:51:39 +02:00
Jan Vidar Krey
a599b29b9d Added more complete API for dealing with ADC messages.
- Added a construct method which would take a fourcc and a source.
- Added an unescape function that would write into pre-allocated memory.
2012-09-28 15:49:46 +02:00
Jan Vidar Krey
fc52f0e030 Renamed the hub_sendq and hub_recvq to ioq_send and ioq_recv. 2012-09-28 09:24:04 +02:00
Jan Vidar Krey
35bfefa717 Fix debug output typo. 2012-09-27 15:29:19 +02:00
Jan Vidar Krey
845aefc941 Decouple hub and user manager more cleanly. 2012-09-27 15:29:00 +02:00
Jan Vidar Krey
4fcf3ffc83 Add support for configuration options that depend on certain #ifdefs. 2012-09-27 15:28:46 +02:00
Jan Vidar Krey
ac39ebf38a Merge pull request #10 from blairbonnett/fix-check-escapes
Fix msg_check_escapes() so it allows escaped backslashes.
2012-09-17 11:49:14 -07:00
Blair Bonnett
3f777ce5e2 Fix msg_check_escapes() so it allows escaped backslashes.
If a valid escape (\n, \s, or \\) is found, increment the pointer
marking the start of the next search so we don't start looking at the
escaped character. The old behaviour was a problem for messages
containing slashes -- the escaped slash would be looked at in the next
pass and so the following character would be treated as an escape,
causing the message to be dropped for having "an invalid ADC escape".
2012-09-17 23:31:20 +12:00
Jan Vidar Krey
b0aa690cb4 Merge branch 'master' of github.com:janvidar/uhub 2012-08-07 11:56:40 +02:00
Jan Vidar Krey
fb11589bb0 Drop all ADC messages containing illegal ADC escapes. 2012-08-07 11:55:29 +02:00
Jan Vidar Krey
03c4292eea Merge pull request #8 from blairbonnett/upstart
Upstart script to run uhub as a service
2012-07-29 15:34:07 -07:00
Jan Vidar Krey
ccaf755da3 Merge branch 'master' of github.com:janvidar/uhub 2012-07-30 00:08:38 +02:00
Jan Vidar Krey
cba0121574 ADCH++ had a security bug that allowed UCMD extension to be relayed.
uhub did not have this security bug since the hub did not advertise support for the
UCMD extension, but the message was still correctly relayed as specified in the
protocol specification.

However, this commit adds support for the UCMD extension, but only to the extent
that uhub will advertise it and uhub will also drop any such CMD message
generated by a client and will (currently) never issues a CMD message by itself.
2012-07-30 00:08:12 +02:00
Blair Bonnett
166a105e33 Add upstart script to run uHub as a service.
Start and stop conditions are based off the OpenSSH upstart script which
ships with Ubuntu.
2012-07-29 16:22:38 +12:00
root
a32ea42754 - Update RH init scripts 2012-06-13 14:30:17 +04:00
Jan Vidar Krey
949b54fcdd Merge pull request #7 from yorhel/master
TLS probing fix
2012-06-03 15:45:28 -07:00
Yorhel
b9005b1724 core/probe.c: Fix TLS probe when handshake version != SSL version
GnuTLS sends a handshake with SSL 3.0 (0x0300) in the outer packet, but
mentions TLS 1.2 (0x0303) in the Client Hello. There's no real need for
uhub to validate these fields, as OpenSSL should do that itself already.
Just use the version mentioned in Client Hello for logging output.
2012-06-02 14:46:47 +02:00
67 changed files with 1793 additions and 2086 deletions

9
.gitignore vendored
View File

@@ -1,12 +1,18 @@
*~ *~
*.[oa] *.[oa]
*.lib
*.exe *.exe
*.manifest
*.gch *.gch
CMakeFiles/*
CMakeCache.txt
cmake_install.cmake
mod_*.dll
mod_*.exp
mod_*.so mod_*.so
uhub-admin uhub-admin
adcrush adcrush
uhub uhub
revision.h*
build-stamp build-stamp
debian/files debian/files
debian/uhub.debhelper.log debian/uhub.debhelper.log
@@ -15,3 +21,4 @@ debian/uhub.postrm.debhelper
debian/uhub.prerm.debhelper debian/uhub.prerm.debhelper
debian/uhub.substvars debian/uhub.substvars
uhub-passwd uhub-passwd
src/version.h

View File

@@ -1,8 +0,0 @@
GMAKE=gmake
all:
@${GMAKE} ${.TARGETS}
${.TARGETS}: all

214
CMakeLists.txt Normal file
View File

@@ -0,0 +1,214 @@
##
## Makefile for uhub
## Copyright (C) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>
#
cmake_minimum_required (VERSION 2.8.3)
project (uhub NONE)
enable_language(C)
set (UHUB_VERSION_MAJOR 0)
set (UHUB_VERSION_MINOR 4)
set (UHUB_VERSION_PATCH 1)
set (PROJECT_SOURCE_DIR "${CMAKE_SOURCE_DIR}/src")
option(RELEASE "Release build, debug build if disabled" ON)
option(LINK_SUPPORT "Allow hub linking" OFF)
option(SSL_SUPPORT "Enable SSL support" ON)
option(USE_OPENSSL "Use OpenSSL's SSL support" OFF)
option(SQLITE_SUPPORT "Enable SQLite support" ON)
option(ADC_STRESS "Enable the stress tester client" OFF)
find_package(Git)
if (SSL_SUPPORT)
if (USE_OPENSSL)
find_package(OpenSSL)
else()
find_package(GnuTLS)
endif()
if (NOT GNUTLS_FOUND AND NOT OPENSSL_FOUND)
message(FATAL_ERROR "Neither OpenSSL nor GnuTLS are not found!")
endif()
endif()
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
include_directories("${PROJECT_SOURCE_DIR}")
set (network_SOURCES
${PROJECT_SOURCE_DIR}/network/backend.c
${PROJECT_SOURCE_DIR}/network/connection.c
${PROJECT_SOURCE_DIR}/network/epoll.c
${PROJECT_SOURCE_DIR}/network/kqueue.c
${PROJECT_SOURCE_DIR}/network/select.c
${PROJECT_SOURCE_DIR}/network/timeout.c
${PROJECT_SOURCE_DIR}/network/timer.c
${PROJECT_SOURCE_DIR}/network/network.c
${PROJECT_SOURCE_DIR}/network/openssl.c
${PROJECT_SOURCE_DIR}/network/ipcalc.c
)
set (uhub_SOURCES
${PROJECT_SOURCE_DIR}/core/auth.c
${PROJECT_SOURCE_DIR}/core/command_parser.c
${PROJECT_SOURCE_DIR}/core/commands.c
${PROJECT_SOURCE_DIR}/core/config.c
${PROJECT_SOURCE_DIR}/core/eventqueue.c
${PROJECT_SOURCE_DIR}/core/hub.c
${PROJECT_SOURCE_DIR}/core/hubevent.c
${PROJECT_SOURCE_DIR}/core/inf.c
${PROJECT_SOURCE_DIR}/core/ioqueue.c
${PROJECT_SOURCE_DIR}/core/netevent.c
${PROJECT_SOURCE_DIR}/core/probe.c
${PROJECT_SOURCE_DIR}/core/route.c
${PROJECT_SOURCE_DIR}/core/user.c
${PROJECT_SOURCE_DIR}/core/usermanager.c
${PROJECT_SOURCE_DIR}/core/plugincallback.c
${PROJECT_SOURCE_DIR}/core/plugininvoke.c
${PROJECT_SOURCE_DIR}/core/pluginloader.c
)
set (adc_SOURCES
${PROJECT_SOURCE_DIR}/adc/message.c
${PROJECT_SOURCE_DIR}/adc/sid.c
)
set (utils_SOURCES
${PROJECT_SOURCE_DIR}/util/cbuffer.c
${PROJECT_SOURCE_DIR}/util/config_token.c
${PROJECT_SOURCE_DIR}/util/credentials.c
${PROJECT_SOURCE_DIR}/util/floodctl.c
${PROJECT_SOURCE_DIR}/util/getopt.c
${PROJECT_SOURCE_DIR}/util/list.c
${PROJECT_SOURCE_DIR}/util/log.c
${PROJECT_SOURCE_DIR}/util/memory.c
${PROJECT_SOURCE_DIR}/util/misc.c
${PROJECT_SOURCE_DIR}/util/rbtree.c
${PROJECT_SOURCE_DIR}/util/tiger.c
)
set (adcclient_SOURCES
${PROJECT_SOURCE_DIR}/tools/adcclient.c
${PROJECT_SOURCE_DIR}/core/ioqueue.c
)
add_library(adc STATIC ${adc_SOURCES})
add_library(network STATIC ${network_SOURCES})
add_library(utils STATIC ${utils_SOURCES})
add_dependencies(adc utils)
add_dependencies(network utils)
add_executable(uhub ${PROJECT_SOURCE_DIR}/core/main.c ${uhub_SOURCES} )
add_library(mod_example MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_example.c ${utils_SOURCES})
add_library(mod_welcome MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_welcome.c ${utils_SOURCES} ${network_SOURCES})
add_library(mod_logging MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_logging.c ${utils_SOURCES} ${PROJECT_SOURCE_DIR}/adc/sid.c ${network_SOURCES})
add_library(mod_auth_simple MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_auth_simple.c ${utils_SOURCES})
add_library(mod_chat_history MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_chat_history.c ${utils_SOURCES})
add_library(mod_chat_only MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_chat_only.c ${utils_SOURCES})
add_library(mod_topic MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_topic.c ${utils_SOURCES})
if (SQLITE_SUPPORT)
add_library(mod_auth_sqlite MODULE ${PROJECT_SOURCE_DIR}/plugins/mod_auth_sqlite.c ${utils_SOURCES})
add_executable(uhub-passwd ${PROJECT_SOURCE_DIR}/tools/uhub-passwd.c ${PROJECT_SOURCE_DIR}/util/misc.c ${PROJECT_SOURCE_DIR}/util/memory.c ${PROJECT_SOURCE_DIR}/util/log.c ${PROJECT_SOURCE_DIR}/util/list.c)
target_link_libraries(mod_auth_sqlite sqlite3)
target_link_libraries(uhub-passwd sqlite3)
set_target_properties(mod_auth_sqlite PROPERTIES PREFIX "")
if (UNIX)
target_link_libraries(uhub pthread)
endif()
endif()
if(WIN32)
target_link_libraries(uhub ws2_32)
target_link_libraries(mod_logging ws2_32)
target_link_libraries(mod_welcome ws2_32)
endif()
set_target_properties(
mod_example
mod_welcome
mod_logging
mod_auth_simple
mod_chat_history
mod_chat_only
mod_topic
PROPERTIES PREFIX "")
target_link_libraries(uhub ${CMAKE_DL_LIBS} adc network utils)
if(UNIX)
add_library(adcclient STATIC ${adcclient_SOURCES})
add_executable(uhub-admin ${PROJECT_SOURCE_DIR}/tools/admin.c)
target_link_libraries(uhub-admin adcclient adc network utils)
if (ADC_STRESS)
add_executable(adcrush ${PROJECT_SOURCE_DIR}/tools/adcrush.c ${adcclient_SOURCES})
target_link_libraries(adcrush adcclient adc network utils)
endif()
endif()
if(GIT_FOUND AND IS_DIRECTORY ".git")
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --pretty=format:%h OUTPUT_VARIABLE UHUB_REVISION)
set (UHUB_GIT_VERSION "${UHUB_VERSION_MAJOR}.${UHUB_VERSION_MINOR}.${UHUB_VERSION_PATCH}-git-${UHUB_REVISION}")
else()
set (UHUB_GIT_VERSION "${UHUB_VERSION_MAJOR}.${UHUB_VERSION_MINOR}.${UHUB_VERSION_PATCH}-release")
endif()
if(OPENSSL_FOUND)
set(SSL_LIBS ${OPENSSL_LIBRARIES})
add_definitions(-DSSL_SUPPORT=1 -DSSL_USE_OPENSSL=1)
include_directories(${OPENSSL_INCLUDE_DIR})
endif()
if (GNUTLS_FOUND)
set(SSL_LIBS ${GNUTLS_LIBRARIES})
add_definitions(-DSSL_SUPPORT=1 -DSSL_USE_GNUTLS=1 ${GNUTLS_DEFINITIONS})
include_directories(${GNUTLS_INCLUDE_DIR})
endif()
if(SSL_SUPPORT)
target_link_libraries(uhub ${SSL_LIBS})
if(UNIX)
target_link_libraries(uhub-admin ${SSL_LIBS})
endif()
target_link_libraries(mod_welcome ${SSL_LIBS})
target_link_libraries(mod_logging ${SSL_LIBS})
if (ADC_STRESS)
target_link_libraries(adcrush ${SSL_LIBS})
endif()
endif()
configure_file ("${PROJECT_SOURCE_DIR}/version.h.in" "${PROJECT_SOURCE_DIR}/version.h")
mark_as_advanced(FORCE CMAKE_BUILD_TYPE)
if (RELEASE)
set(CMAKE_BUILD_TYPE Release)
else()
set(CMAKE_BUILD_TYPE Debug)
# add_definitions(-DDEBUG)
endif()
if (UNIX)
install( TARGETS uhub RUNTIME DESTINATION bin )
install( TARGETS mod_example mod_welcome mod_logging mod_auth_simple mod_auth_sqlite mod_chat_history mod_chat_only mod_topic DESTINATION /var/lib/uhub/ OPTIONAL )
install( FILES ${CMAKE_SOURCE_DIR}/uhub.conf ${CMAKE_SOURCE_DIR}/plugins.conf ${CMAKE_SOURCE_DIR}/rules.txt ${CMAKE_SOURCE_DIR}/motd.txt DESTINATION /etc/uhub OPTIONAL )
if (SQLITE_SUPPORT)
install( TARGETS uhub-passwd RUNTIME DESTINATION bin )
endif()
endif()

View File

@@ -1,378 +0,0 @@
##
## Makefile for uhub (Use GNU make)
## Copyright (C) 2007-2010, Jan Vidar Krey <janvidar@extatic.org>
#
-include Makefile.private
CC = gcc
LD := $(CC)
MV := mv
RANLIB := ranlib
CFLAGS += -pipe -Wall
USE_SSL ?= YES
USE_PLUGINS ?= YES
USE_BIGENDIAN ?= AUTO
BITS ?= AUTO
SILENT ?= YES
TERSE ?= NO
STACK_PROTECT ?= NO
NEED_LIBDL ?= NO
ifeq ($(OS), Windows_NT)
WINDOWS ?= YES
OPSYS ?= Windows
else
OPSYS ?= $(shell uname)
endif
ifeq ($(OPSYS),SunOS)
LDLIBS += -lsocket -lnsl
endif
ifeq ($(OPSYS),Haiku)
LDLIBS += -lnetwork
endif
ifeq ($(OPSYS),Linux)
NEED_LIBDL = YES
endif
CFLAGS += -I./src/
ifeq ($(OPSYS),Windows)
USE_BIGENDIAN := NO
LDLIBS += -lws2_32
UHUB_CONF_DIR ?= c:/uhub/
UHUB_PREFIX ?= c:/uhub/
CFLAGS += -mno-cygwin
LDFLAGS += -mno-cygwin
BIN_EXT ?= .exe
else
DESTDIR ?= /
UHUB_CONF_DIR ?= $(DESTDIR)/etc/uhub
UHUB_PREFIX ?= $(DESTDIR)/usr/local
UHUB_MOD_DIR ?= $(DESTDIR)/var/lib/uhub
CFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
BIN_EXT ?=
endif
ifeq ($(SILENT),YES)
MSG_CC=@echo " CC:" $(notdir $<) &&
MSG_LD=@echo " LD:" $(notdir $@) &&
MSG_AR=@echo " AR:" $(notdir $@) &&
else
MSG_CC=
MSG_LD=
MSG_AR=
endif
ifeq ($(TERSE), YES)
MSG_CC=@
MSG_LD=@
MSG_AR=@
MSG_CLEAN=-n ""
else
MSG_CLEAN="Clean as a whistle"
endif
ifeq ($(RELEASE),YES)
CFLAGS += -O3 -DNDEBUG
else
CFLAGS += -ggdb -DDEBUG
endif
ifeq ($(STACK_PROTECT),YES)
CFLAGS += -fstack-protector-all
endif
ifeq ($(PROFILING),YES)
CFLAGS += -pg
LDFLAGS += -pg
endif
ifeq ($(FUNCTRACE),YES)
CFLAGS += -finstrument-functions
CFLAGS += -DDEBUG_FUNCTION_TRACE
endif
ifneq ($(BITS), AUTO)
ifeq ($(BITS), 64)
CFLAGS += -m64
LDFLAGS += -m64
else
ifeq ($(BITS), 32)
CFLAGS += -m32
LDFLAGS += -m32
endif
endif
endif
ifeq ($(USE_BIGENDIAN),AUTO)
ifeq ($(shell perl -e 'print pack("L", 0x554E4958)'),UNIX)
CFLAGS += -DARCH_BIGENDIAN
endif
else
ifeq ($(USE_BIGENDIAN),YES)
CFLAGS += -DARCH_BIGENDIAN
endif
endif
ifeq ($(USE_SSL),YES)
CFLAGS += -DSSL_SUPPORT
LDLIBS += -lssl -lcrypto
endif
ifeq ($(NEED_LIBDL),YES)
LDLIBS += -ldl
endif
GIT_VERSION=$(shell git describe --tags 2>/dev/null || echo "")
GIT_REVISION=$(shell git show --abbrev-commit 2>/dev/null | head -n 1 | cut -f 2 -d " " || echo "")
OLD_REVISION=$(shell grep GIT_REVISION revision.h 2>/dev/null | cut -f 3 -d " " | tr -d "\"")
# Sources
libuhub_SOURCES := \
src/core/auth.c \
src/core/command_parser.c \
src/core/commands.c \
src/core/config.c \
src/core/eventqueue.c \
src/core/hub.c \
src/core/hubevent.c \
src/core/hubio.c \
src/core/inf.c \
src/core/netevent.c \
src/core/probe.c \
src/core/route.c \
src/core/user.c \
src/core/usermanager.c \
src/core/plugincallback.c \
src/core/plugininvoke.c \
src/core/pluginloader.c \
src/network/backend.c \
src/network/connection.c \
src/network/epoll.c \
src/network/kqueue.c \
src/network/select.c \
src/network/timeout.c \
src/network/timer.c
libadc_common_SOURCES := \
src/adc/message.c \
src/adc/sid.c
libutils_SOURCES := \
src/util/cbuffer.c \
src/util/config_token.c \
src/util/credentials.c \
src/util/floodctl.c \
src/util/ipcalc.c \
src/util/list.c \
src/util/log.c \
src/util/memory.c \
src/util/misc.c \
src/network/network.c \
src/util/rbtree.c \
src/util/tiger.c
libadc_client_SOURCES := \
src/tools/adcclient.c
uhub_SOURCES := src/core/main.c
uhub-passwd_SOURCES := src/tools/uhub-passwd.c
uhub-passwd_LIBS := -lsqlite3
adcrush_SOURCES := src/tools/adcrush.c
admin_SOURCES := src/tools/admin.c
autotest_SOURCES := \
autotest/test_commands.tcc \
autotest/test_credentials.tcc \
autotest/test_eventqueue.tcc \
autotest/test_hub.tcc \
autotest/test_inf.tcc \
autotest/test_ipfilter.tcc \
autotest/test_list.tcc \
autotest/test_memory.tcc \
autotest/test_message.tcc \
autotest/test_misc.tcc \
autotest/test_sid.tcc \
autotest/test_tiger.tcc \
autotest/test_timer.tcc \
autotest/test_tokenizer.tcc \
autotest/test_usermanager.tcc
autotest_OBJECTS = autotest.o
# Plugin targets:
plugin_example_SOURCES := src/plugins/mod_example.c
plugin_example_TARGET := mod_example.so
plugin_welcome_SOURCES := src/plugins/mod_welcome.c
plugin_welcome_TARGET := mod_welcome.so
plugin_logging_SOURCES := src/plugins/mod_logging.c
plugin_logging_TARGET := mod_logging.so
plugin_auth_SOURCES := src/plugins/mod_auth_simple.c
plugin_auth_TARGET := mod_auth_simple.so
plugin_auth_sqlite_SOURCES := src/plugins/mod_auth_sqlite.c
plugin_auth_sqlite_TARGET := mod_auth_sqlite.so
plugin_auth_sqlite_LIBS := -lsqlite3
plugin_chat_history_SOURCES := src/plugins/mod_chat_history.c
plugin_chat_history_TARGET := mod_chat_history.so
plugin_chat_only_SOURCES := src/plugins/mod_chat_only.c
plugin_chat_only_TARGET := mod_chat_only.so
plugin_topic_SOURCES := src/plugins/mod_topic.c
plugin_topic_TARGET := mod_topic.so
# Source to objects
libuhub_OBJECTS := $(libuhub_SOURCES:.c=.o)
libutils_OBJECTS := $(libutils_SOURCES:.c=.o)
libadc_client_OBJECTS := $(libadc_client_SOURCES:.c=.o)
libadc_common_OBJECTS := $(libadc_common_SOURCES:.c=.o)
uhub_OBJECTS := $(uhub_SOURCES:.c=.o)
uhub-passwd_OBJECTS := $(uhub-passwd_SOURCES:.c=.o)
adcrush_OBJECTS := $(adcrush_SOURCES:.c=.o)
admin_OBJECTS := $(admin_SOURCES:.c=.o)
all_plugins := \
$(plugin_example_TARGET) \
$(plugin_logging_TARGET) \
$(plugin_auth_TARGET) \
$(plugin_auth_sqlite_TARGET) \
$(plugin_welcome_TARGET) \
$(plugin_chat_history_TARGET) \
$(plugin_chat_only_TARGET) \
$(plugin_topic_TARGET)
all_OBJECTS := \
$(libuhub_OBJECTS) \
$(uhub_OBJECTS) \
$(libutils_OBJECTS) \
$(adcrush_OBJECTS) \
$(autotest_OBJECTS) \
$(admin_OBJECTS) \
$(libadc_common_OBJECTS) \
$(libadc_client_OBJECTS)
all_OBJECTS += $(all_plugins)
uhub_BINARY=uhub$(BIN_EXT)
uhub-passwd_BINARY=uhub-passwd$(BIN_EXT)
adcrush_BINARY=adcrush$(BIN_EXT)
admin_BINARY=uhub-admin$(BIN_EXT)
autotest_BINARY=autotest/test$(BIN_EXT)
.PHONY: revision.h.tmp all plugins
%.o: %.c version.h revision.h
$(MSG_CC) $(CC) -fPIC -c $(CFLAGS) -o $@ $<
#%.so: %.c
# $(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
all: $(uhub_BINARY) $(uhub-passwd_BINARY) plugins
plugins: $(uhub_BINARY) $(all_plugins)
$(plugin_auth_TARGET): $(plugin_auth_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_auth_sqlite_TARGET): $(plugin_auth_sqlite_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS) $(LDFLAGS) $(plugin_auth_sqlite_LIBS)
$(plugin_example_TARGET): $(plugin_example_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_logging_TARGET): $(plugin_logging_SOURCES) $(libutils_OBJECTS) $(libadc_common_OBJECTS) src/network/network.o
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_chat_history_TARGET): $(plugin_chat_history_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_chat_only_TARGET): $(plugin_chat_only_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_welcome_TARGET): $(plugin_welcome_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_topic_TARGET): $(plugin_topic_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(adcrush_BINARY): $(adcrush_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(admin_BINARY): $(admin_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(uhub_BINARY): $(uhub_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(uhub-passwd_BINARY): $(uhub-passwd_OBJECTS) src/util/misc.o src/util/list.o src/util/memory.o src/util/log.o
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(uhub-passwd_LIBS)
autotest.c: $(autotest_SOURCES)
$(shell exotic --standalone $(autotest_SOURCES) > $@)
revision.h.tmp:
@rm -f $@
@echo "/* AUTOGENERATED FILE - DO NOT EDIT */" > $@
@if [ -n '$(GIT_VERSION)' ]; then echo \#define GIT_VERSION \"$(GIT_VERSION)\" >> $@; fi
@if [ -n '$(GIT_REVISION)' ]; then echo \#define GIT_REVISION \"$(GIT_REVISION)\" >> $@; fi
version.h: revision.h
revision.h: revision.h.tmp
@if [ '$(GIT_REVISION)' != '$(OLD_REVISION)' ]; then cp $@.tmp $@; fi
@if [ ! -f $@ ]; then cp $@.tmp $@; fi
$(autotest_OBJECTS): autotest.c
$(MSG_CC) $(CC) -c $(CFLAGS) -Isrc -o $@ $<
$(autotest_BINARY): $(autotest_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
autotest: $(autotest_BINARY)
@./$(autotest_BINARY) -s -f
ifeq ($(WINDOWS),YES)
install:
@echo "Cannot install automatically on windows."
else
install: all
@echo Copying $(uhub_BINARY) to $(UHUB_PREFIX)/bin/
@cp $(uhub_BINARY) $(UHUB_PREFIX)/bin/
@cp $(uhub-passwd_BINARY) $(UHUB_PREFIX)/bin/
@if [ ! -d $(UHUB_CONF_DIR) ]; then echo Creating $(UHUB_CONF_DIR); mkdir -p $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/uhub.conf ]; then cp doc/uhub.conf $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/rules.txt ]; then cp doc/rules.txt $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/plugins.conf ]; then cp doc/plugins.conf $(UHUB_CONF_DIR); fi
@if [ ! -d $(UHUB_MOD_DIR) ]; then echo Creating $(UHUB_MOD_DIR); mkdir -p $(UHUB_MOD_DIR); fi
@cp -f mod_*.so $(UHUB_MOD_DIR)
@touch $(UHUB_CONF_DIR)/motd.txt
@echo done.
endif
dist-clean:
@rm -rf $(all_OBJECTS) *~ core
clean:
@rm -rf $(libuhub_OBJECTS) *~ core $(uhub_BINARY) $(uhub-passwd_BINARY) $(admin_BINARY) $(autotest_BINARY) $(adcrush_BINARY) $(all_OBJECTS) $(all_plugins) autotest.c revision.h revision.h.tmp && \
echo $(MSG_CLEAN)

View File

@@ -19,7 +19,8 @@ EXO_TEST(setup, {
hub = hub_malloc_zero(sizeof(struct hub_info)); hub = hub_malloc_zero(sizeof(struct hub_info));
cbase = command_initialize(hub); cbase = command_initialize(hub);
hub->commands = cbase; hub->commands = cbase;
return cbase && hub && uman_init(hub) == 0; hub->users = uman_init();
return cbase && hub && hub->users;
}); });
static int test_handler(struct command_base* cbase, struct hub_user* user, struct hub_command* hcmd) static int test_handler(struct command_base* cbase, struct hub_user* user, struct hub_command* hcmd)
@@ -127,7 +128,7 @@ EXO_TEST(command_number_3, { return verify("!test3 -12", cmd_status_ok); });
EXO_TEST(command_user_1, { return verify("!test4 tester", cmd_status_arg_nick); }); EXO_TEST(command_user_1, { return verify("!test4 tester", cmd_status_arg_nick); });
EXO_TEST(command_user_2, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_arg_cid); }); EXO_TEST(command_user_2, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_arg_cid); });
EXO_TEST(command_user_3, { return uman_add(hub, &user) == 0; }); EXO_TEST(command_user_3, { return uman_add(hub->users, &user) == 0; });
EXO_TEST(command_user_4, { return verify("!test4 tester", cmd_status_ok); }); EXO_TEST(command_user_4, { return verify("!test4 tester", cmd_status_ok); });
EXO_TEST(command_user_5, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_ok); }); EXO_TEST(command_user_5, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_ok); });
@@ -225,7 +226,7 @@ EXO_TEST(command_argument_cred_6, {
#undef SETUP_COMMAND #undef SETUP_COMMAND
EXO_TEST(command_user_destroy, { return uman_remove(hub, &user) == 0; }); EXO_TEST(command_user_destroy, { return uman_remove(hub->users, &user) == 0; });
EXO_TEST(command_destroy, { EXO_TEST(command_destroy, {
@@ -241,3 +242,10 @@ EXO_TEST(command_destroy, {
DEL_TEST(c_test7); DEL_TEST(c_test7);
return 1; return 1;
}); });
EXO_TEST(cleanup, {
uman_shutdown(hub->users);
command_shutdown(hub->commands);
hub_free(hub);
return 1;
});

View File

@@ -2,32 +2,19 @@
#define MAX_USERS 64 #define MAX_USERS 64
static struct hub_info um_hub; static struct hub_user_manager* uman = 0;
static struct hub_user um_user[MAX_USERS]; static struct hub_user um_user[MAX_USERS];
// static struct net_connection um_cons[MAX_USERS];
EXO_TEST(um_test_setup, {
int i = 0;
memset(&um_hub, 0, sizeof(um_hub));
for (i = 0; i < MAX_USERS; i++)
{
/* memset(&um_cons[i], 0, sizeof(struct net_connection));
um_cons[i].sd = -1;
memset(&um_user[i], 0, sizeof(struct hub_user));
um_user[i].id.sid = i+1;
um_user[i].connection = &um_cons[i];*/
}
return 1;
});
EXO_TEST(um_init_1, { EXO_TEST(um_init_1, {
return uman_init(0) != 0; sid_t s;
}); uman = uman_init();
EXO_TEST(um_init_2, { for (s = 0; s < MAX_USERS; s++)
return uman_init(&um_hub) == 0; {
memset(&um_user[s], 0, sizeof(struct hub_user));
um_user[s].id.sid = s;
}
return !!uman;
}); });
EXO_TEST(um_shutdown_1, { EXO_TEST(um_shutdown_1, {
@@ -35,32 +22,29 @@ EXO_TEST(um_shutdown_1, {
}); });
EXO_TEST(um_shutdown_2, { EXO_TEST(um_shutdown_2, {
return uman_shutdown(&um_hub) == 0; return uman_shutdown(uman) == 0;
}); });
EXO_TEST(um_shutdown_3, { EXO_TEST(um_init_2, {
return uman_shutdown(&um_hub) == -1; uman = uman_init();
}); return !!uman;
EXO_TEST(um_init_3, {
return uman_init(&um_hub) == 0;
}); });
EXO_TEST(um_add_1, { EXO_TEST(um_add_1, {
return uman_add(&um_hub, &um_user[0]) == 0; return uman_add(uman, &um_user[0]) == 0;
}); });
EXO_TEST(um_size_1, { EXO_TEST(um_size_1, {
return hub_get_user_count(&um_hub) == 1; return uman->count == 1;
}); });
EXO_TEST(um_remove_1, { EXO_TEST(um_remove_1, {
return uman_remove(&um_hub, &um_user[0]) == 0; return uman_remove(uman, &um_user[0]) == 0;
}); });
EXO_TEST(um_size_2, { EXO_TEST(um_size_2, {
return hub_get_user_count(&um_hub) == 0; return uman->count == 0;
}); });
@@ -68,25 +52,21 @@ EXO_TEST(um_add_2, {
int i; int i;
for (i = 0; i < MAX_USERS; i++) for (i = 0; i < MAX_USERS; i++)
{ {
if (uman_add(&um_hub, &um_user[i]) != 0) if (uman_add(uman, &um_user[i]) != 0)
return 0; return 0;
} }
return 1; return 1;
}); });
EXO_TEST(um_size_3, { EXO_TEST(um_size_3, {
return hub_get_user_count(&um_hub) == MAX_USERS; return uman->count == MAX_USERS;
});
EXO_TEST(um_add_3, {
return uman_add(&um_hub, &um_user[5]) != 0;
}); });
EXO_TEST(um_remove_2, { EXO_TEST(um_remove_2, {
int i; int i;
for (i = 0; i < MAX_USERS; i++) for (i = 0; i < MAX_USERS; i++)
{ {
if (uman_remove(&um_hub, &um_user[i]) != 0) if (uman_remove(uman, &um_user[i]) != 0)
return 0; return 0;
} }
return 1; return 1;
@@ -105,5 +85,5 @@ EXO_TEST(um_remove_2, {
/* Last test */ /* Last test */
EXO_TEST(um_shutdown_4, { EXO_TEST(um_shutdown_4, {
return uman_shutdown(&um_hub) == 0; return uman_shutdown(uman) == 0;
}); });

View File

@@ -31,7 +31,8 @@ fi
# Check that networking is up. # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1 [ ${NETWORKING} = "no" ] && exit 1
# Check that uhub.conf exists. # Check that bin and uhub.conf exists.
[ -f $UHUBBINFILE ] || exit 6
[ -f /etc/uhub/uhub.conf ] || exit 6 [ -f /etc/uhub/uhub.conf ] || exit 6
RETVAL=0 RETVAL=0
@@ -40,7 +41,7 @@ RETVAL=0
start() { start() {
KIND="Uhub" KIND="Uhub"
echo -n $"Starting $KIND services: " echo -n $"Starting $KIND services: "
daemon uhub $UHUBOPTIONS daemon $UHUBBINFILE $UHUBOPTIONS
RETVAL=$? RETVAL=$?
echo "" echo ""
return $RETVAL return $RETVAL
@@ -49,7 +50,7 @@ start() {
stop() { stop() {
KIND="Uhub" KIND="Uhub"
echo -n $"Shutting down $KIND services: " echo -n $"Shutting down $KIND services: "
killproc uhub killproc $UHUBBINFILE
RETVAL=$? RETVAL=$?
echo "" echo ""
return $RETVAL return $RETVAL
@@ -77,7 +78,7 @@ relog() {
} }
rhstatus() { rhstatus() {
status uhub status $UHUBBINFILE
RETVAL=$? RETVAL=$?
if [ $RETVAL -ne 0 ] ; then if [ $RETVAL -ne 0 ] ; then
return $RETVAL return $RETVAL

View File

@@ -1,3 +1,6 @@
# locate bin file
UHUBBINFILE=/usr/bin/uhub
# Options to UHUB # Options to UHUB
# -v Verbose mode. Add more -v's for higher verbosity. # -v Verbose mode. Add more -v's for higher verbosity.
# -q Quiet mode - no output # -q Quiet mode - no output

View File

@@ -0,0 +1,28 @@
# uHub - a lightweight but high-performance hub for the ADC
# peer-to-peer protocol.
description "uHub - High performance ADC peer-to-peer hub"
# Start and stop conditions.
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
# Allow the service to respawn, but if its happening too often
# (10 times in 5 seconds) theres a problem and we should stop trying.
respawn
respawn limit 10 5
# The program is going to fork, and upstart needs to know this
# so it can track the change in PID.
expect fork
# Set the mode the process should create files in.
umask 022
# Make sure the log folder exists.
pre-start script
mkdir -p -m0755 /var/log/uhub
end script
# Command to run it.
exec /usr/bin/uhub -f -u uhub -g uhub -l /var/log/uhub/uhub.log -c /etc/uhub/uhub.conf

View File

@@ -33,7 +33,7 @@ typedef uint32_t fourcc_t;
#define FOURCC(a,b,c,d) (fourcc_t) ((a << 24) | (b << 16) | (c << 8) | d) #define FOURCC(a,b,c,d) (fourcc_t) ((a << 24) | (b << 16) | (c << 8) | d)
/* default welcome protocol support message, as sent by this server */ /* default welcome protocol support message, as sent by this server */
#define ADC_PROTO_SUPPORT "ADBASE ADTIGR ADPING" #define ADC_PROTO_SUPPORT "ADBASE ADTIGR ADPING ADUCMD"
/* Server sent commands */ /* Server sent commands */
#define ADC_CMD_ISID FOURCC('I','S','I','D') #define ADC_CMD_ISID FOURCC('I','S','I','D')
@@ -93,6 +93,15 @@ typedef uint32_t fourcc_t;
/* Extension messages */ /* Extension messages */
#define ADC_CMD_HCHK FOURCC('H','C','H','K') #define ADC_CMD_HCHK FOURCC('H','C','H','K')
/* UCMD Extension */
#define ADC_CMD_BCMD FOURCC('B','C','M','D')
#define ADC_CMD_DCMD FOURCC('D','C','M','D')
#define ADC_CMD_ECMD FOURCC('E','C','M','D')
#define ADC_CMD_FCMD FOURCC('F','C','M','D')
#define ADC_CMD_HCMD FOURCC('H','C','M','D')
#define ADC_CMD_ICMD FOURCC('I','C','M','D')
#define ADC_INF_FLAG_IPV4_ADDR "I4" /* ipv4 address */ #define ADC_INF_FLAG_IPV4_ADDR "I4" /* ipv4 address */
#define ADC_INF_FLAG_IPV6_ADDR "I6" /* ipv6 address */ #define ADC_INF_FLAG_IPV6_ADDR "I6" /* ipv6 address */
#define ADC_INF_FLAG_IPV4_UDP_PORT "U4" /* port number */ #define ADC_INF_FLAG_IPV4_UDP_PORT "U4" /* port number */

View File

@@ -63,6 +63,33 @@ static void msg_free(void* ptr)
#define msg_free(X) hub_free(X) #define msg_free(X) hub_free(X)
#endif /* MSG_MEMORY_DEBUG */ #endif /* MSG_MEMORY_DEBUG */
static int msg_check_escapes(const char* string, size_t len)
{
char* start = (char*) string;
while ((start = memchr(start, '\\', len - (start - string))))
{
if (start+1 == (string + len))
return 0;
switch (*(++start))
{
case '\\':
case 'n':
case 's':
/* Increment so we don't check the escaped
* character next time around. Not doing so
* leads to messages with escaped backslashes
* being incorrectly reported as having invalid
* escapes. */
++start;
break;
default:
return 0;
}
}
return 1;
}
struct adc_message* adc_msg_incref(struct adc_message* msg) struct adc_message* adc_msg_incref(struct adc_message* msg)
{ {
@@ -319,6 +346,13 @@ struct adc_message* adc_msg_parse(const char* line, size_t length)
return NULL; return NULL;
} }
if (!msg_check_escapes(line, length))
{
LOG_DEBUG("Dropped message with invalid ADC escape.");
msg_free(command);
return NULL;
}
if (line[length-1] != '\n') if (line[length-1] != '\n')
{ {
need_terminate = 1; need_terminate = 1;
@@ -498,6 +532,30 @@ struct adc_message* adc_msg_create(const char* line)
return adc_msg_parse(line, strlen(line)); return adc_msg_parse(line, strlen(line));
} }
struct adc_message* adc_msg_construct_source(fourcc_t fourcc, sid_t source, size_t size)
{
struct adc_message* msg = adc_msg_construct(fourcc, size + 4 + 1);
if (!msg)
return NULL;
adc_msg_add_argument(msg, sid_to_string(source));
msg->source = source;
return msg;
}
struct adc_message* adc_msg_construct_source_dest(fourcc_t fourcc, sid_t source, sid_t dest, size_t size)
{
struct adc_message* msg = adc_msg_construct(fourcc, size + 4 + 4 + 1);
if (!msg)
return NULL;
adc_msg_add_argument(msg, sid_to_string(source));
adc_msg_add_argument(msg, sid_to_string(dest));
msg->source = source;
msg->target = dest;
return msg;
}
struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size) struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size)
{ {
@@ -505,9 +563,7 @@ struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size)
if (!msg) if (!msg)
return NULL; /* OOM */ return NULL; /* OOM */
if (size < sizeof(fourcc)) size = sizeof(fourcc); if (!adc_msg_grow(msg, sizeof(fourcc) + size + 1))
if (!adc_msg_grow(msg, size+1))
{ {
msg_free(msg); msg_free(msg);
return NULL; /* OOM */ return NULL; /* OOM */
@@ -877,6 +933,41 @@ char* adc_msg_unescape(const char* string)
return new_string; return new_string;
} }
int adc_msg_unescape_to_target(const char* string, char* target, size_t target_size)
{
size_t w = 0;
char* ptr = (char*) target;
char* str = (char*) string;
int escaped = 0;
while (*str && w < (target_size-1))
{
if (escaped) {
if (*str == 's')
*ptr++ = ' ';
else if (*str == '\\')
*ptr++ = '\\';
else if (*str == 'n')
*ptr++ = '\n';
else
*ptr++ = *str;
w++;
escaped = 0;
} else {
if (*str == '\\')
escaped = 1;
else
{
*ptr++ = *str;
w++;
}
}
str++;
}
*ptr = 0;
w++;
return w;
}
char* adc_msg_escape(const char* string) char* adc_msg_escape(const char* string)
{ {

View File

@@ -91,6 +91,13 @@ extern struct adc_message* adc_msg_create(const char* string);
*/ */
extern struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size); extern struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size);
/**
* Construct a message for the given 'fourcc' and add a source SID to it,
* in addition pre-allocate 'size' bytes at the end of the message.
*/
extern struct adc_message* adc_msg_construct_source(fourcc_t fourcc, sid_t source, size_t size);
extern struct adc_message* adc_msg_construct_source_dest(fourcc_t fourcc, sid_t source, sid_t dest, size_t size);
/** /**
* Remove a named argument from the command. * Remove a named argument from the command.
* *
@@ -195,6 +202,14 @@ extern int adc_msg_add_named_argument_uint64(struct adc_message* cmd, const char
*/ */
extern char* adc_msg_unescape(const char* string); extern char* adc_msg_unescape(const char* string);
/**
* Convert a ADC command escaped string to a regular string.
* @return The number of bytes written to target. If the target is not large enough then
* the -1 is returned, but the string is guaranteed to always be \0 terminated.
*/
extern int adc_msg_unescape_to_target(const char* string, char* target, size_t target_size);
/** /**
* Convert a string to a ADC command escaped string. * Convert a string to a ADC command escaped string.
* @return adc command escaped string or NULL if out of memory. * @return adc command escaped string or NULL if out of memory.

View File

@@ -117,7 +117,7 @@ static enum command_parse_status command_extract_arguments(struct hub_info* hub,
case 'u': case 'u':
data = hub_malloc(sizeof(*data)); data = hub_malloc(sizeof(*data));
data->type = type_user; data->type = type_user;
data->data.user = uman_get_user_by_nick(hub, token); data->data.user = uman_get_user_by_nick(hub->users, token);
if (!data->data.user) if (!data->data.user)
{ {
hub_free(data); hub_free(data);
@@ -129,7 +129,7 @@ static enum command_parse_status command_extract_arguments(struct hub_info* hub,
case 'i': case 'i':
data = hub_malloc(sizeof(*data)); data = hub_malloc(sizeof(*data));
data->type = type_user; data->type = type_user;
data->data.user = uman_get_user_by_cid(hub, token); data->data.user = uman_get_user_by_cid(hub->users, token);
if (!data->data.user) if (!data->data.user)
{ {
hub_free(data); hub_free(data);

View File

@@ -421,7 +421,7 @@ static int command_whoip(struct command_base* cbase, struct hub_user* user, stru
struct hub_user* u; struct hub_user* u;
int ret = 0; int ret = 0;
ret = uman_get_user_by_addr(cbase->hub, users, arg->data.range); ret = uman_get_user_by_addr(cbase->hub->users, users, arg->data.range);
if (!ret) if (!ret)
{ {
list_clear(users, &null_free); list_clear(users, &null_free);
@@ -557,14 +557,28 @@ static int command_stats(struct command_base* cbase, struct hub_user* user, stru
{ {
struct cbuffer* buf = cbuf_create(128); struct cbuffer* buf = cbuf_create(128);
struct hub_info* hub = cbase->hub; struct hub_info* hub = cbase->hub;
static char rxbuf[64] = { "0 B" };
static char txbuf[64] = { "0 B" };
cbuf_append(buf, "Hub statistics: ");
cbuf_append_format(buf, PRINTF_SIZE_T "/" PRINTF_SIZE_T " users (peak %d). ", hub->users->count, hub->config->max_users, hub->users->count_peak);
format_size(hub->stats.net_rx, rxbuf, sizeof(rxbuf));
format_size(hub->stats.net_tx, txbuf, sizeof(txbuf));
cbuf_append_format(buf, "Network: tx=%s/s, rx=%s/s", txbuf, rxbuf);
#ifdef SHOW_PEAK_NET_STATS /* currently disabled */
format_size(hub->stats.net_rx_peak, rxbuf, sizeof(rxbuf));
format_size(hub->stats.net_tx_peak, txbuf, sizeof(txbuf));
cbuf_append_format(buf, ", peak_tx=%s/s, peak_rx=%s/s", txbuf, rxbuf);
#endif
format_size(hub->stats.net_rx_total, rxbuf, sizeof(rxbuf));
format_size(hub->stats.net_tx_total, txbuf, sizeof(txbuf));
cbuf_append_format(buf, ", total_tx=%s", txbuf);
cbuf_append_format(buf, ", total_rx=%s", rxbuf);
cbuf_append_format(buf, PRINTF_SIZE_T " users, peak: " PRINTF_SIZE_T ". Network (up/down): %d/%d KB/s, peak: %d/%d KB/s",
hub->users->count,
hub->users->count_peak,
(int) hub->stats.net_tx / 1024,
(int) hub->stats.net_rx / 1024,
(int) hub->stats.net_tx_peak / 1024,
(int) hub->stats.net_rx_peak / 1024);
return command_status(cbase, user, cmd, buf); return command_status(cbase, user, cmd, buf);
} }

View File

@@ -33,7 +33,7 @@ my $config_dump = "void dump_config(struct hub_config* config, int ignore_defaul
foreach my $option (@options) foreach my $option (@options)
{ {
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check) = @$option; my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
my $string = ($type =~ /(string|file|message)/); my $string = ($type =~ /(string|file|message)/);
my $min = undef; my $min = undef;
my $max = undef; my $max = undef;
@@ -50,12 +50,15 @@ foreach my $option (@options)
$regexp = undef if ($regexp eq ""); $regexp = undef if ($regexp eq "");
} }
$config_defaults .= "#ifdef $ifdef\n" if ($ifdef ne "");
$config_defaults .= "\tconfig->$name = "; $config_defaults .= "\tconfig->$name = ";
$config_defaults .= "hub_strdup(\"" if ($string); $config_defaults .= "hub_strdup(\"" if ($string);
$config_defaults .= $default; $config_defaults .= $default;
$config_defaults .= "\")" if ($string); $config_defaults .= "\")" if ($string);
$config_defaults .= ";\n"; $config_defaults .= ";\n";
$config_defaults .= "#endif /* $ifdef */\n" if ($ifdef ne "");
$config_apply .= "#ifdef $ifdef\n" if ($ifdef ne "");
$config_apply .= "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n"; $config_apply .= "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
if ($type eq "int") if ($type eq "int")
@@ -82,10 +85,17 @@ foreach my $option (@options)
"\t\t\treturn -1;\n" . "\t\t\treturn -1;\n" .
"\t\t}\n" . "\t\t}\n" .
"\t\treturn 0;\n" . "\t\treturn 0;\n" .
"\t}\n\n"; "\t}\n";
$config_apply .= "#endif /* $ifdef */\n" if ($ifdef ne "");
$config_free .= "\thub_free(config->" . $name . ");\n\n" if ($string); $config_apply .= "\n";
if ($string)
{
$config_free .= "#ifdef $ifdef\n" if ($ifdef ne "");
$config_free .= "\thub_free(config->" . $name . ");\n";
$config_free .= "#endif /* $ifdef */\n" if ($ifdef ne "");
$config_free .= "\n";
}
my $out = "%s"; my $out = "%s";
my $val = "config->$name"; my $val = "config->$name";
@@ -100,8 +110,11 @@ foreach my $option (@options)
$test = "strcmp(config->$name, \"$default\") != 0"; $test = "strcmp(config->$name, \"$default\") != 0";
} }
$config_dump .= "#ifdef $ifdef\n" if ($ifdef ne "");
$config_dump .= "\tif (!ignore_defaults || $test)\n"; $config_dump .= "\tif (!ignore_defaults || $test)\n";
$config_dump .= "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n"; $config_dump .= "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n";
$config_dump .= "#endif /* $ifdef */\n" if ($ifdef ne "");
$config_dump .= "\n";
} }
$config_apply .= "\t/* Still here -- unknown directive */\n"; $config_apply .= "\t/* Still here -- unknown directive */\n";
@@ -128,12 +141,14 @@ sub get_data($)
my $example = ""; my $example = "";
my $description = ""; my $description = "";
my $since = ""; my $since = "";
my $ifdef = "";
$short = $p->getElementsByTagName("short")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("short")->getLength()); $short = $p->getElementsByTagName("short")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("short")->getLength());
$since = $p->getElementsByTagName("since")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("since")->getLength()); $since = $p->getElementsByTagName("since")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("since")->getLength());
$example = $p->getElementsByTagName("example")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("example")->getLength()); $example = $p->getElementsByTagName("example")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("example")->getLength());
$description = $p->getElementsByTagName("description")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("description")->getLength()); $description = $p->getElementsByTagName("description")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("description")->getLength());
my $check = $p->getElementsByTagName("check")->item(0); my $check = $p->getElementsByTagName("check")->item(0);
$ifdef = $p->getElementsByTagName("ifdef")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("ifdef")->getLength());
my @data = ( my @data = (
$p->getAttribute("type"), $p->getAttribute("type"),
@@ -144,7 +159,8 @@ sub get_data($)
$description, $description,
$since, $since,
$example, $example,
$check $check,
$ifdef
); );
return @data; return @data;
} }
@@ -160,10 +176,12 @@ sub write_c_header(@)
foreach my $option (@data) foreach my $option (@data)
{ {
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option; my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
my $string = ($type =~ /(string|file|message)/); my $string = ($type =~ /(string|file|message)/);
print GENHEAD "#ifdef $ifdef\n" if ($ifdef ne "");
print GENHEAD "\t"; print GENHEAD "\t";
print GENHEAD "int " if ($type eq "int"); print GENHEAD "int " if ($type eq "int");
print GENHEAD "int " if ($type eq "boolean"); print GENHEAD "int " if ($type eq "boolean");
@@ -198,6 +216,7 @@ sub write_c_header(@)
$comment = $pad . "/*<<< " . $comment . " */"; $comment = $pad . "/*<<< " . $comment . " */";
} }
print GENHEAD $comment . "\n"; print GENHEAD $comment . "\n";
print GENHEAD "#endif /* $ifdef */\n" if ($ifdef ne "");
} }
print GENHEAD "};\n\n"; print GENHEAD "};\n\n";
@@ -224,7 +243,7 @@ sub write_sql_dump(@)
foreach my $option (@data) foreach my $option (@data)
{ {
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option; my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
if ($type =~ /(string|file|message)/ ) if ($type =~ /(string|file|message)/ )
{ {

View File

@@ -110,25 +110,33 @@ int hub_handle_message(struct hub_info* hub, struct hub_user* u, const char* lin
case ADC_CMD_DRES: case ADC_CMD_DRES:
cmd->priority = -1; cmd->priority = -1;
if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub, cmd->target), cmd->cache) == st_deny) if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub->users, cmd->target), cmd->cache) == st_deny)
break; break;
/* CHECK_FLOOD(search, 0); */ /* CHECK_FLOOD(search, 0); */
ROUTE_MSG; ROUTE_MSG;
case ADC_CMD_DRCM: case ADC_CMD_DRCM:
cmd->priority = -1; cmd->priority = -1;
if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny) if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub->users, cmd->target)) == st_deny)
break; break;
CHECK_FLOOD(connect, 1); CHECK_FLOOD(connect, 1);
ROUTE_MSG; ROUTE_MSG;
case ADC_CMD_DCTM: case ADC_CMD_DCTM:
cmd->priority = -1; cmd->priority = -1;
if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny) if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub->users, cmd->target)) == st_deny)
break; break;
CHECK_FLOOD(connect, 1); CHECK_FLOOD(connect, 1);
ROUTE_MSG; ROUTE_MSG;
case ADC_CMD_BCMD:
case ADC_CMD_DCMD:
case ADC_CMD_ECMD:
case ADC_CMD_FCMD:
case ADC_CMD_HCMD:
CHECK_FLOOD(extras, 1);
break;
default: default:
CHECK_FLOOD(extras, 1); CHECK_FLOOD(extras, 1);
ROUTE_MSG; ROUTE_MSG;
@@ -332,7 +340,7 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
} }
else if (private_msg) else if (private_msg)
{ {
struct hub_user* target = uman_get_user_by_sid(hub, cmd->target); struct hub_user* target = uman_get_user_by_sid(hub->users, cmd->target);
if (target) if (target)
status = plugin_handle_private_message(hub, u, target, message_decoded, 0); status = plugin_handle_private_message(hub, u, target, message_decoded, 0);
else else
@@ -373,7 +381,7 @@ void hub_send_sid(struct hub_info* hub, struct hub_user* u)
if (user_is_connecting(u)) if (user_is_connecting(u))
{ {
command = adc_msg_construct(ADC_CMD_ISID, 10); command = adc_msg_construct(ADC_CMD_ISID, 10);
sid = uman_get_free_sid(hub, u); sid = uman_get_free_sid(hub->users, u);
adc_msg_add_argument(command, (const char*) sid_to_string(sid)); adc_msg_add_argument(command, (const char*) sid_to_string(sid));
route_to_user(hub, u, command); route_to_user(hub, u, command);
adc_msg_free(command); adc_msg_free(command);
@@ -512,11 +520,11 @@ static int check_duplicate_logins_ok(struct hub_info* hub, struct hub_user* user
struct hub_user* lookup1; struct hub_user* lookup1;
struct hub_user* lookup2; struct hub_user* lookup2;
lookup1 = uman_get_user_by_nick(hub, user->id.nick); lookup1 = uman_get_user_by_nick(hub->users, user->id.nick);
if (lookup1) if (lookup1)
return status_msg_inf_error_nick_taken; return status_msg_inf_error_nick_taken;
lookup2 = uman_get_user_by_cid(hub, user->id.cid); lookup2 = uman_get_user_by_cid(hub->users, user->id.cid);
if (lookup2) if (lookup2)
return status_msg_inf_error_cid_taken; return status_msg_inf_error_cid_taken;
@@ -560,8 +568,8 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message
case UHUB_EVENT_USER_QUIT: case UHUB_EVENT_USER_QUIT:
{ {
uman_remove(hub, user); uman_remove(hub->users, user);
uman_send_quit_message(hub, user); uman_send_quit_message(hub, hub->users, user);
on_logout_user(hub, user); on_logout_user(hub, user);
hub_schedule_destroy_user(hub, user); hub_schedule_destroy_user(hub, user);
break; break;
@@ -578,7 +586,7 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message
struct hub_user* u = (struct hub_user*) list_get_first(hub->users->list); struct hub_user* u = (struct hub_user*) list_get_first(hub->users->list);
while (u) while (u)
{ {
uman_remove(hub, u); uman_remove(hub->users, u);
user_destroy(u); user_destroy(u);
u = (struct hub_user*) list_get_first(hub->users->list); u = (struct hub_user*) list_get_first(hub->users->list);
} }
@@ -592,6 +600,31 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message
} }
} }
static void hub_update_stats(struct hub_info* hub)
{
const int factor = TIMEOUT_STATS;
struct net_statistics* total;
struct net_statistics* intermediate;
net_stats_get(&intermediate, &total);
hub->stats.net_tx = (intermediate->tx / factor);
hub->stats.net_rx = (intermediate->rx / factor);
hub->stats.net_tx_peak = MAX(hub->stats.net_tx, hub->stats.net_tx_peak);
hub->stats.net_rx_peak = MAX(hub->stats.net_rx, hub->stats.net_rx_peak);
hub->stats.net_tx_total = total->tx;
hub->stats.net_rx_total = total->rx;
net_stats_reset();
}
static void hub_timer_statistics(struct timeout_evt* t)
{
struct hub_info* hub = (struct hub_info*) t->ptr;
hub_update_stats(hub);
timeout_queue_reschedule(net_backend_get_timeout_queue(), hub->stats.timeout, TIMEOUT_STATS);
}
static struct net_connection* start_listening_socket(const char* bind_addr, uint16_t port, int backlog, struct hub_info* hub) static struct net_connection* start_listening_socket(const char* bind_addr, uint16_t port, int backlog, struct hub_info* hub)
{ {
struct net_connection* server; struct net_connection* server;
@@ -698,41 +731,25 @@ static int load_ssl_certificates(struct hub_info* hub, struct hub_config* config
{ {
if (config->tls_enable) if (config->tls_enable)
{ {
hub->ssl_method = (SSL_METHOD*) SSLv23_method(); /* TLSv1_method() */ hub->ctx = net_ssl_context_create();
hub->ssl_ctx = SSL_CTX_new(hub->ssl_method); if (ssl_load_certificate(hub->ctx, config->tls_certificate) &&
ssl_load_private_key(hub->ctx, config->tls_private_key) &&
/* Disable SSLv2 */ ssl_check_private_key(hub->ctx))
SSL_CTX_set_options(hub->ssl_ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_quiet_shutdown(hub->ssl_ctx, 1);
if (SSL_CTX_use_certificate_file(hub->ssl_ctx, config->tls_certificate, SSL_FILETYPE_PEM) < 0)
{ {
LOG_ERROR("SSL_CTX_use_certificate_file: %s", ERR_error_string(ERR_get_error(), NULL)); LOG_INFO("Enabling TLS (%s), using certificate: %s, private key: %s", net_ssl_get_provider(), config->tls_certificate, config->tls_private_key);
return 1;
} }
return 0;
if (SSL_CTX_use_PrivateKey_file(hub->ssl_ctx, config->tls_private_key, SSL_FILETYPE_PEM) < 0)
{
LOG_ERROR("SSL_CTX_use_PrivateKey_file: %s", ERR_error_string(ERR_get_error(), NULL));
}
if (SSL_CTX_check_private_key(hub->ssl_ctx) != 1)
{
LOG_FATAL("SSL_CTX_check_private_key: Private key does not match the certificate public key: %s", ERR_error_string(ERR_get_error(), NULL));
return 0;
}
LOG_INFO("Enabling TLS, using certificate: %s, private key: %s", config->tls_certificate, config->tls_private_key);
} }
return 1; return 1;
} }
static void unload_ssl_certificates(struct hub_info* hub) static void unload_ssl_certificates(struct hub_info* hub)
{ {
if (hub->ssl_ctx) if (hub->ctx)
{ net_ssl_context_destroy(hub->ctx);
SSL_CTX_free(hub->ssl_ctx);
}
} }
#endif #endif /* SSL_SUPPORT */
struct hub_info* hub_start_service(struct hub_config* config) struct hub_info* hub_start_service(struct hub_config* config)
{ {
@@ -773,7 +790,8 @@ struct hub_info* hub_start_service(struct hub_config* config)
hub->config = config; hub->config = config;
hub->users = NULL; hub->users = NULL;
if (uman_init(hub) == -1) hub->users = uman_init();
if (!hub->users)
{ {
net_con_close(hub->server); net_con_close(hub->server);
hub_free(hub); hub_free(hub);
@@ -783,7 +801,7 @@ struct hub_info* hub_start_service(struct hub_config* config)
if (event_queue_initialize(&hub->queue, hub_event_dispatcher, (void*) hub) == -1) if (event_queue_initialize(&hub->queue, hub_event_dispatcher, (void*) hub) == -1)
{ {
net_con_close(hub->server); net_con_close(hub->server);
uman_shutdown(hub); uman_shutdown(hub->users);
hub_free(hub); hub_free(hub);
return 0; return 0;
} }
@@ -795,7 +813,7 @@ struct hub_info* hub_start_service(struct hub_config* config)
net_con_close(hub->server); net_con_close(hub->server);
hub_free(hub->recvbuf); hub_free(hub->recvbuf);
hub_free(hub->sendbuf); hub_free(hub->sendbuf);
uman_shutdown(hub); uman_shutdown(hub->users);
hub_free(hub); hub_free(hub);
return 0; return 0;
} }
@@ -807,6 +825,13 @@ struct hub_info* hub_start_service(struct hub_config* config)
g_hub = hub; g_hub = hub;
if (net_backend_get_timeout_queue())
{
hub->stats.timeout = hub_malloc_zero(sizeof(struct timeout_evt));
timeout_evt_initialize(hub->stats.timeout, hub_timer_statistics, hub);
timeout_queue_insert(net_backend_get_timeout_queue(), hub->stats.timeout, TIMEOUT_STATS);
}
// Start the hub command sub-system // Start the hub command sub-system
hub->commands = command_initialize(hub); hub->commands = command_initialize(hub);
return hub; return hub;
@@ -817,6 +842,12 @@ void hub_shutdown_service(struct hub_info* hub)
{ {
LOG_DEBUG("hub_shutdown_service()"); LOG_DEBUG("hub_shutdown_service()");
if (net_backend_get_timeout_queue())
{
timeout_queue_remove(net_backend_get_timeout_queue(), hub->stats.timeout);
hub_free(hub->stats.timeout);
}
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
unload_ssl_certificates(hub); unload_ssl_certificates(hub);
#endif #endif
@@ -824,7 +855,7 @@ void hub_shutdown_service(struct hub_info* hub)
event_queue_shutdown(hub->queue); event_queue_shutdown(hub->queue);
net_con_close(hub->server); net_con_close(hub->server);
server_alt_port_stop(hub); server_alt_port_stop(hub);
uman_shutdown(hub); uman_shutdown(hub->users);
hub->status = hub_status_stopped; hub->status = hub_status_stopped;
hub_free(hub->sendbuf); hub_free(hub->sendbuf);
hub_free(hub->recvbuf); hub_free(hub->recvbuf);

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -81,6 +81,7 @@ struct hub_stats
size_t net_rx_peak; size_t net_rx_peak;
size_t net_tx_total; size_t net_tx_total;
size_t net_rx_total; size_t net_rx_total;
struct timeout_evt* timeout; /**<< "Timeout handler for statistics" */
}; };
struct hub_logout_info struct hub_logout_info
@@ -115,8 +116,7 @@ struct hub_info
struct uhub_plugins* plugins; /* Plug-ins loaded for this hub instance. */ struct uhub_plugins* plugins; /* Plug-ins loaded for this hub instance. */
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
SSL_METHOD* ssl_method; struct ssl_context_handle* ctx;
SSL_CTX* ssl_ctx;
#endif /* SSL_SUPPORT */ #endif /* SSL_SUPPORT */
}; };

View File

@@ -24,12 +24,12 @@
void on_login_success(struct hub_info* hub, struct hub_user* u) void on_login_success(struct hub_info* hub, struct hub_user* u)
{ {
/* Send user list of all existing users */ /* Send user list of all existing users */
if (!uman_send_user_list(hub, u)) if (!uman_send_user_list(hub, hub->users, u))
return; return;
/* Mark as being in the normal state, and add user to the user list */ /* Mark as being in the normal state, and add user to the user list */
user_set_state(u, state_normal); user_set_state(u, state_normal);
uman_add(hub, u); uman_add(hub->users, u);
/* Announce new user to all connected users */ /* Announce new user to all connected users */
if (user_is_logged_in(u)) if (user_is_logged_in(u))

View File

@@ -325,8 +325,8 @@ static int check_nick(struct hub_info* hub, struct hub_user* user, struct adc_me
static int check_logged_in(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd) static int check_logged_in(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd)
{ {
struct hub_user* lookup1 = uman_get_user_by_nick(hub, user->id.nick); struct hub_user* lookup1 = uman_get_user_by_nick(hub->users, user->id.nick);
struct hub_user* lookup2 = uman_get_user_by_cid(hub, user->id.cid); struct hub_user* lookup2 = uman_get_user_by_cid(hub->users, user->id.cid);
if (lookup1 == user) if (lookup1 == user)
{ {

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@
*/ */
#include "uhub.h" #include "uhub.h"
#include "hubio.h"
#ifdef DEBUG_SENDQ #ifdef DEBUG_SENDQ
static void debug_msg(const char* prefix, struct adc_message* msg) static void debug_msg(const char* prefix, struct adc_message* msg)
@@ -35,13 +34,13 @@ static void debug_msg(const char* prefix, struct adc_message* msg)
} }
#endif #endif
struct hub_recvq* hub_recvq_create() struct ioq_recv* ioq_recv_create()
{ {
struct hub_recvq* q = hub_malloc_zero(sizeof(struct hub_recvq)); struct ioq_recv* q = hub_malloc_zero(sizeof(struct ioq_recv));
return q; return q;
} }
void hub_recvq_destroy(struct hub_recvq* q) void ioq_recv_destroy(struct ioq_recv* q)
{ {
if (q) if (q)
{ {
@@ -50,7 +49,7 @@ void hub_recvq_destroy(struct hub_recvq* q)
} }
} }
size_t hub_recvq_get(struct hub_recvq* q, void* buf, size_t bufsize) size_t ioq_recv_get(struct ioq_recv* q, void* buf, size_t bufsize)
{ {
uhub_assert(bufsize >= q->size); uhub_assert(bufsize >= q->size);
if (q->size) if (q->size)
@@ -65,7 +64,7 @@ size_t hub_recvq_get(struct hub_recvq* q, void* buf, size_t bufsize)
return 0; return 0;
} }
size_t hub_recvq_set(struct hub_recvq* q, void* buf, size_t bufsize) size_t ioq_recv_set(struct ioq_recv* q, void* buf, size_t bufsize)
{ {
if (q->buf) if (q->buf)
{ {
@@ -89,9 +88,9 @@ size_t hub_recvq_set(struct hub_recvq* q, void* buf, size_t bufsize)
} }
struct hub_sendq* hub_sendq_create() struct ioq_send* ioq_send_create()
{ {
struct hub_sendq* q = hub_malloc_zero(sizeof(struct hub_sendq)); struct ioq_send* q = hub_malloc_zero(sizeof(struct ioq_send));
if (!q) if (!q)
return 0; return 0;
@@ -110,7 +109,7 @@ static void clear_send_queue_callback(void* ptr)
adc_msg_free((struct adc_message*) ptr); adc_msg_free((struct adc_message*) ptr);
} }
void hub_sendq_destroy(struct hub_sendq* q) void ioq_send_destroy(struct ioq_send* q)
{ {
if (q) if (q)
{ {
@@ -120,21 +119,21 @@ void hub_sendq_destroy(struct hub_sendq* q)
} }
} }
void hub_sendq_add(struct hub_sendq* q, struct adc_message* msg_) void ioq_send_add(struct ioq_send* q, struct adc_message* msg_)
{ {
struct adc_message* msg = adc_msg_incref(msg_); struct adc_message* msg = adc_msg_incref(msg_);
#ifdef DEBUG_SENDQ #ifdef DEBUG_SENDQ
debug_msg("hub_sendq_add", msg); debug_msg("ioq_send_add", msg);
#endif #endif
uhub_assert(msg->cache && *msg->cache); uhub_assert(msg->cache && *msg->cache);
list_append(q->queue, msg); list_append(q->queue, msg);
q->size += msg->length; q->size += msg->length;
} }
void hub_sendq_remove(struct hub_sendq* q, struct adc_message* msg) void ioq_send_remove(struct ioq_send* q, struct adc_message* msg)
{ {
#ifdef DEBUG_SENDQ #ifdef DEBUG_SENDQ
debug_msg("hub_sendq_remove", msg); debug_msg("ioq_send_remove", msg);
#endif #endif
list_remove(q->queue, msg); list_remove(q->queue, msg);
q->size -= msg->length; q->size -= msg->length;
@@ -142,13 +141,13 @@ void hub_sendq_remove(struct hub_sendq* q, struct adc_message* msg)
q->offset = 0; q->offset = 0;
} }
int hub_sendq_send(struct hub_sendq* q, struct hub_user* user) int ioq_send_send(struct ioq_send* q, struct net_connection* con)
{ {
int ret; int ret;
struct adc_message* msg = list_get_first(q->queue); struct adc_message* msg = list_get_first(q->queue);
if (!msg) return 0; if (!msg) return 0;
uhub_assert(msg->cache && *msg->cache); uhub_assert(msg->cache && *msg->cache);
ret = net_con_send(user->connection, msg->cache + q->offset, msg->length - q->offset); ret = net_con_send(con, msg->cache + q->offset, msg->length - q->offset);
if (ret > 0) if (ret > 0)
{ {
@@ -156,18 +155,18 @@ int hub_sendq_send(struct hub_sendq* q, struct hub_user* user)
if (msg->length - q->offset > 0) if (msg->length - q->offset > 0)
return 0; return 0;
hub_sendq_remove(q, msg); ioq_send_remove(q, msg);
return 1; return 1;
} }
return ret; return ret;
} }
int hub_sendq_is_empty(struct hub_sendq* q) int ioq_send_is_empty(struct ioq_send* q)
{ {
return (q->size - q->offset) == 0; return (q->size - q->offset) == 0;
} }
size_t hub_sendq_get_bytes(struct hub_sendq* q) size_t ioq_send_get_bytes(struct ioq_send* q)
{ {
return q->size - q->offset; return q->size - q->offset;
} }

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -17,25 +17,25 @@
* *
*/ */
#ifndef HAVE_UHUB_HUB_IO_H #ifndef HAVE_UHUB_IO_QUEUE_H
#define HAVE_UHUB_HUB_IO_H #define HAVE_UHUB_IO_QUEUE_H
struct adc_message; struct adc_message;
struct linked_list; struct linked_list;
typedef int (*hub_recvq_write)(void* desc, const void* buf, size_t len); typedef int (*ioq_write)(void* desc, const void* buf, size_t len);
typedef int (*hub_recvq_read)(void* desc, void* buf, size_t len); typedef int (*ioq_read)(void* desc, void* buf, size_t len);
struct hub_sendq struct ioq_send
{ {
size_t size; /** Size of send queue (in bytes, not messages) */ size_t size; /** Size of send queue (in bytes, not messages) */
size_t offset; /** Queue byte offset in the first message. Should be 0 unless a partial write. */ size_t offset; /** Queue byte offset in the first message. Should be 0 unless a partial write. */
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
size_t last_send; /** When using SSL, one have to send the exact same buffer and length if a write cannot complete. */ size_t last_send; /** When using SSL, one have to send the exact same buffer and length if a write cannot complete. */
#endif #endif
struct linked_list* queue; /** List of queued messages */ struct linked_list* queue; /** List of queued messages (struct adc_message) */
}; };
struct hub_recvq struct ioq_recv
{ {
char* buf; char* buf;
size_t size; size_t size;
@@ -44,63 +44,63 @@ struct hub_recvq
/** /**
* Create a send queue * Create a send queue
*/ */
extern struct hub_sendq* hub_sendq_create(); extern struct ioq_send* ioq_send_create();
/** /**
* Destroy a send queue, and delete any queued messages. * Destroy a send queue, and delete any queued messages.
*/ */
extern void hub_sendq_destroy(struct hub_sendq*); extern void ioq_send_destroy(struct ioq_send*);
/** /**
* Add a message to the send queue. * Add a message to the send queue.
*/ */
extern void hub_sendq_add(struct hub_sendq*, struct adc_message* msg); extern void ioq_send_add(struct ioq_send*, struct adc_message* msg);
/** /**
* Process the send queue, and send as many messages as possible. * Process the send queue, and send as many messages as possible.
* @returns -1 on error, 0 if unable to send more, 1 if more can be sent. * @returns -1 on error, 0 if unable to send more, 1 if more can be sent.
*/ */
extern int hub_sendq_send(struct hub_sendq*, struct hub_user*); extern int ioq_send_send(struct ioq_send*, struct net_connection* con);
/** /**
* @returns 1 if send queue is empty, 0 otherwise. * @returns 1 if send queue is empty, 0 otherwise.
*/ */
extern int hub_sendq_is_empty(struct hub_sendq*); extern int ioq_send_is_empty(struct ioq_send*);
/** /**
* @returns the number of bytes remaining to be sent in the queue. * @returns the number of bytes remaining to be sent in the queue.
*/ */
extern size_t hub_sendq_get_bytes(struct hub_sendq*); extern size_t ioq_send_get_bytes(struct ioq_send*);
/** /**
* Create a receive queue. * Create a receive queue.
*/ */
extern struct hub_recvq* hub_recvq_create(); extern struct ioq_recv* ioq_recv_create();
/** /**
* Destroy a receive queue. * Destroy a receive queue.
*/ */
extern void hub_recvq_destroy(struct hub_recvq*); extern void ioq_recv_destroy(struct ioq_recv*);
/** /**
* Gets the buffer, copies it into buf and deallocates it. * Gets the buffer, copies it into buf and deallocates it.
* NOTE: bufsize *MUST* be larger than the buffer, otherwise it asserts. * NOTE: bufsize *MUST* be larger than the buffer, otherwise it asserts.
* @return the number of bytes copied into buf. * @return the number of bytes copied into buf.
*/ */
extern size_t hub_recvq_get(struct hub_recvq*, void* buf, size_t bufsize); extern size_t ioq_recv_get(struct ioq_recv*, void* buf, size_t bufsize);
/** /**
* Sets the buffer * Sets the buffer
*/ */
extern size_t hub_recvq_set(struct hub_recvq*, void* buf, size_t bufsize); extern size_t ioq_recv_set(struct ioq_recv*, void* buf, size_t bufsize);
/** /**
* @return 1 if size is zero, 0 otherwise. * @return 1 if size is zero, 0 otherwise.
*/ */
extern int hub_recvq_is_empty(struct hub_recvq* buf); extern int ioq_recv_is_empty(struct ioq_recv* buf);
#endif /* HAVE_UHUB_HUB_IO_H */ #endif /* HAVE_UHUB_IO_QUEUE_H */

View File

@@ -18,17 +18,14 @@
*/ */
#include <uhub.h> #include <uhub.h>
#include "hubio.h" #include "ioqueue.h"
#include "probe.h" #include "probe.h"
/* FIXME: This should not be needed! */
extern struct hub_info* g_hub;
int handle_net_read(struct hub_user* user) int handle_net_read(struct hub_user* user)
{ {
static char buf[MAX_RECV_BUF]; static char buf[MAX_RECV_BUF];
struct hub_recvq* q = user->recv_queue; struct ioq_recv* q = user->recv_queue;
size_t buf_size = hub_recvq_get(q, buf, MAX_RECV_BUF); size_t buf_size = ioq_recv_get(q, buf, MAX_RECV_BUF);
ssize_t size; ssize_t size;
if (user_flag_get(user, flag_maxbuf)) if (user_flag_get(user, flag_maxbuf))
@@ -58,7 +55,7 @@ int handle_net_read(struct hub_user* user)
while ((pos = memchr(start, '\n', remaining))) while ((pos = memchr(start, '\n', remaining)))
{ {
lastPos = pos; lastPos = pos+1;
pos[0] = '\0'; pos[0] = '\0';
#ifdef DEBUG_SENDQ #ifdef DEBUG_SENDQ
@@ -71,9 +68,9 @@ int handle_net_read(struct hub_user* user)
} }
else else
{ {
if (((pos - start) > 0) && g_hub->config->max_recv_buffer > (pos - start)) if (((pos - start) > 0) && user->hub->config->max_recv_buffer > (pos - start))
{ {
if (hub_handle_message(g_hub, user, start, (pos - start)) == -1) if (hub_handle_message(user->hub, user, start, (pos - start)) == -1)
{ {
return quit_protocol_error; return quit_protocol_error;
} }
@@ -88,20 +85,20 @@ int handle_net_read(struct hub_user* user)
if (lastPos || remaining) if (lastPos || remaining)
{ {
if (remaining < (size_t) g_hub->config->max_recv_buffer) if (remaining < (size_t) user->hub->config->max_recv_buffer)
{ {
hub_recvq_set(q, lastPos ? lastPos : buf, remaining); ioq_recv_set(q, lastPos ? lastPos : buf, remaining);
} }
else else
{ {
hub_recvq_set(q, 0, 0); ioq_recv_set(q, 0, 0);
user_flag_set(user, flag_maxbuf); user_flag_set(user, flag_maxbuf);
LOG_WARN("Received message past max_recv_buffer, dropping message."); LOG_WARN("Received message past max_recv_buffer, dropping message.");
} }
} }
else else
{ {
hub_recvq_set(q, 0, 0); ioq_recv_set(q, 0, 0);
} }
} }
return 0; return 0;
@@ -110,9 +107,9 @@ int handle_net_read(struct hub_user* user)
int handle_net_write(struct hub_user* user) int handle_net_write(struct hub_user* user)
{ {
int ret = 0; int ret = 0;
while (hub_sendq_get_bytes(user->send_queue)) while (ioq_send_get_bytes(user->send_queue))
{ {
ret = hub_sendq_send(user->send_queue, user); ret = ioq_send_send(user->send_queue, user->connection);
if (ret <= 0) if (ret <= 0)
break; break;
} }
@@ -120,7 +117,7 @@ int handle_net_write(struct hub_user* user)
if (ret < 0) if (ret < 0)
return quit_socket_error; return quit_socket_error;
if (hub_sendq_get_bytes(user->send_queue)) if (ioq_send_get_bytes(user->send_queue))
{ {
user_net_io_want_write(user); user_net_io_want_write(user);
} }
@@ -144,7 +141,7 @@ void net_event(struct net_connection* con, int event, void *arg)
{ {
if (user_is_connecting(user)) if (user_is_connecting(user))
{ {
hub_disconnect_user(g_hub, user, quit_timeout); hub_disconnect_user(user->hub, user, quit_timeout);
} }
return; return;
} }
@@ -154,7 +151,7 @@ void net_event(struct net_connection* con, int event, void *arg)
flag_close = handle_net_read(user); flag_close = handle_net_read(user);
if (flag_close) if (flag_close)
{ {
hub_disconnect_user(g_hub, user, flag_close); hub_disconnect_user(user->hub, user, flag_close);
return; return;
} }
} }
@@ -164,7 +161,7 @@ void net_event(struct net_connection* con, int event, void *arg)
flag_close = handle_net_write(user); flag_close = handle_net_write(user);
if (flag_close) if (flag_close)
{ {
hub_disconnect_user(g_hub, user, flag_close); hub_disconnect_user(user->hub, user, flag_close);
return; return;
} }
} }

View File

@@ -76,21 +76,20 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
probe_recvbuf[0] == 22 && probe_recvbuf[0] == 22 &&
probe_recvbuf[1] == 3 && /* protocol major version */ probe_recvbuf[1] == 3 && /* protocol major version */
probe_recvbuf[5] == 1 && /* message type */ probe_recvbuf[5] == 1 && /* message type */
probe_recvbuf[9] == probe_recvbuf[1] && probe_recvbuf[9] == probe_recvbuf[1])
probe_recvbuf[10] == probe_recvbuf[2])
{ {
if (probe->hub->config->tls_enable) if (probe->hub->config->tls_enable)
{ {
LOG_TRACE("Probed TLS %d.%d connection", (int) probe_recvbuf[1], (int) probe_recvbuf[2]); LOG_TRACE("Probed TLS %d.%d connection", (int) probe_recvbuf[9], (int) probe_recvbuf[10]);
if (user_create(probe->hub, probe->connection, &probe->addr)) if (user_create(probe->hub, probe->connection, &probe->addr))
{ {
probe->connection = 0; probe->connection = 0;
} }
net_con_ssl_handshake(con, net_con_ssl_mode_server, probe->hub->ssl_ctx); net_con_ssl_handshake(con, net_con_ssl_mode_server, probe->hub->ctx);
} }
else else
{ {
LOG_TRACE("Probed TLS %d.%d connection. TLS disabled in hub.", (int) probe_recvbuf[1], (int) probe_recvbuf[2]); LOG_TRACE("Probed TLS %d.%d connection. TLS disabled in hub.", (int) probe_recvbuf[9], (int) probe_recvbuf[10]);
} }
} }
else else

View File

@@ -30,7 +30,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
break; break;
case 'D': case 'D':
target = uman_get_user_by_sid(hub, msg->target); target = uman_get_user_by_sid(hub->users, msg->target);
if (target) if (target)
{ {
route_to_user(hub, target, msg); route_to_user(hub, target, msg);
@@ -38,7 +38,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
break; break;
case 'E': case 'E':
target = uman_get_user_by_sid(hub, msg->target); target = uman_get_user_by_sid(hub->users, msg->target);
if (target) if (target)
{ {
route_to_user(hub, target, msg); route_to_user(hub, target, msg);
@@ -108,17 +108,17 @@ int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_messag
uhub_assert(msg->cache && *msg->cache); uhub_assert(msg->cache && *msg->cache);
if (hub_sendq_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline)) if (ioq_send_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline))
{ {
/* Perform oportunistic write */ /* Perform oportunistic write */
hub_sendq_add(user->send_queue, msg); ioq_send_add(user->send_queue, msg);
handle_net_write(user); handle_net_write(user);
} }
else else
{ {
if (check_send_queue(hub, user, msg) >= 0) if (check_send_queue(hub, user, msg) >= 0)
{ {
hub_sendq_add(user->send_queue, msg); ioq_send_add(user->send_queue, msg);
if (!user_flag_get(user, flag_pipeline)) if (!user_flag_get(user, flag_pipeline))
user_net_io_want_write(user); user_net_io_want_write(user);
} }
@@ -128,7 +128,7 @@ int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_messag
int route_flush_pipeline(struct hub_info* hub, struct hub_user* u) int route_flush_pipeline(struct hub_info* hub, struct hub_user* u)
{ {
if (hub_sendq_is_empty(u->send_queue)) if (ioq_send_is_empty(u->send_queue))
return 0; return 0;
handle_net_write(u); handle_net_write(u);

View File

@@ -46,8 +46,8 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s
if (user == NULL) if (user == NULL)
return NULL; /* OOM */ return NULL; /* OOM */
user->send_queue = hub_sendq_create(); user->send_queue = ioq_send_create();
user->recv_queue = hub_recvq_create(); user->recv_queue = ioq_recv_create();
user->connection = con; user->connection = con;
net_con_reinitialize(user->connection, net_event, user, NET_EVENT_READ); net_con_reinitialize(user->connection, net_event, user, NET_EVENT_READ);
@@ -60,6 +60,8 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s
flood_control_reset(&user->flood_search); flood_control_reset(&user->flood_search);
flood_control_reset(&user->flood_update); flood_control_reset(&user->flood_update);
flood_control_reset(&user->flood_extras); flood_control_reset(&user->flood_extras);
user->hub = hub;
return user; return user;
} }
@@ -68,8 +70,8 @@ void user_destroy(struct hub_user* user)
{ {
LOG_TRACE("user_destroy(), user=%p", user); LOG_TRACE("user_destroy(), user=%p", user);
hub_recvq_destroy(user->recv_queue); ioq_recv_destroy(user->recv_queue);
hub_sendq_destroy(user->send_queue); ioq_send_destroy(user->send_queue);
if (user->connection) if (user->connection)
{ {

View File

@@ -113,8 +113,8 @@ struct hub_user
struct linked_list* feature_cast; /** Features supported by feature cast */ struct linked_list* feature_cast; /** Features supported by feature cast */
struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */ struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */
struct hub_info* hub; /** The hub instance this user belong to */ struct hub_info* hub; /** The hub instance this user belong to */
struct hub_recvq* recv_queue; struct ioq_recv* recv_queue;
struct hub_sendq* send_queue; struct ioq_send* send_queue;
struct net_connection* connection; /** Connection data */ struct net_connection* connection; /** Connection data */
struct hub_user_limits limits; /** Data used for limitation */ struct hub_user_limits limits; /** Data used for limitation */
enum user_quit_reason quit_reason; /** Quit reason (see user_quit_reason) */ enum user_quit_reason quit_reason; /** Quit reason (see user_quit_reason) */

View File

@@ -38,50 +38,12 @@ static void clear_user_list_callback(void* ptr)
} }
} }
void uman_update_stats(struct hub_info* hub)
struct hub_user_manager* uman_init()
{ {
const int factor = TIMEOUT_STATS; struct hub_user_manager* users = (struct hub_user_manager*) hub_malloc_zero(sizeof(struct hub_user_manager));
struct net_statistics* total;
struct net_statistics* intermediate;
net_stats_get(&intermediate, &total);
hub->stats.net_tx = (intermediate->tx / factor);
hub->stats.net_rx = (intermediate->rx / factor);
hub->stats.net_tx_peak = MAX(hub->stats.net_tx, hub->stats.net_tx_peak);
hub->stats.net_rx_peak = MAX(hub->stats.net_rx, hub->stats.net_rx_peak);
hub->stats.net_tx_total = total->tx;
hub->stats.net_rx_total = total->rx;
net_stats_reset();
}
void uman_print_stats(struct hub_info* hub)
{
LOG_INFO("Statistics users=" PRINTF_SIZE_T " (peak_users=" PRINTF_SIZE_T "), net_tx=%d KB/s, net_rx=%d KB/s (peak_tx=%d KB/s, peak_rx=%d KB/s)",
hub->users->count,
hub->users->count_peak,
(int) hub->stats.net_tx / 1024,
(int) hub->stats.net_rx / 1024,
(int) hub->stats.net_tx_peak / 1024,
(int) hub->stats.net_rx_peak / 1024);
}
static void timer_statistics(struct timeout_evt* t)
{
struct hub_info* hub = (struct hub_info*) t->ptr;
uman_update_stats(hub);
timeout_queue_reschedule(net_backend_get_timeout_queue(), hub->users->timeout, TIMEOUT_STATS);
}
int uman_init(struct hub_info* hub)
{
struct hub_user_manager* users = NULL;
if (!hub)
return -1;
users = (struct hub_user_manager*) hub_malloc_zero(sizeof(struct hub_user_manager));
if (!users) if (!users)
return -1; return NULL;
users->list = list_create(); users->list = list_create();
users->sids = sid_pool_create(net_get_max_sockets()); users->sids = sid_pool_create(net_get_max_sockets());
@@ -90,143 +52,119 @@ int uman_init(struct hub_info* hub)
{ {
list_destroy(users->list); list_destroy(users->list);
hub_free(users); hub_free(users);
return NULL;
}
return users;
}
int uman_shutdown(struct hub_user_manager* users)
{
if (!users)
return -1; return -1;
}
if (net_backend_get_timeout_queue()) if (users->list)
{ {
users->timeout = hub_malloc_zero(sizeof(struct timeout_evt)); list_clear(users->list, &clear_user_list_callback);
timeout_evt_initialize(users->timeout, timer_statistics, hub); list_destroy(users->list);
timeout_queue_insert(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS);
} }
sid_pool_destroy(users->sids);
hub->users = users; hub_free(users);
return 0; return 0;
} }
int uman_shutdown(struct hub_info* hub) int uman_add(struct hub_user_manager* users, struct hub_user* user)
{ {
if (!hub || !hub->users) if (!users || !user)
return -1; return -1;
if (net_backend_get_timeout_queue()) list_append(users->list, user);
{ users->count++;
timeout_queue_remove(net_backend_get_timeout_queue(), hub->users->timeout); users->count_peak = MAX(users->count, users->count_peak);
hub_free(hub->users->timeout);
}
if (hub->users->list)
{
list_clear(hub->users->list, &clear_user_list_callback);
list_destroy(hub->users->list);
}
sid_pool_destroy(hub->users->sids);
hub_free(hub->users);
hub->users = 0;
users->shared_size += user->limits.shared_size;
users->shared_files += user->limits.shared_files;
return 0; return 0;
} }
int uman_remove(struct hub_user_manager* users, struct hub_user* user)
int uman_add(struct hub_info* hub, struct hub_user* user)
{ {
if (!hub || !user) if (!users || !user)
return -1; return -1;
if (user->hub) list_remove(users->list, user);
return -1;
list_append(hub->users->list, user); if (users->count > 0)
hub->users->count++;
hub->users->count_peak = MAX(hub->users->count, hub->users->count_peak);
hub->users->shared_size += user->limits.shared_size;
hub->users->shared_files += user->limits.shared_files;
user->hub = hub;
return 0;
}
int uman_remove(struct hub_info* hub, struct hub_user* user)
{
if (!hub || !user)
return -1;
list_remove(hub->users->list, user);
if (hub->users->count > 0)
{ {
hub->users->count--; users->count--;
} }
else else
{ {
uhub_assert(!"negative count!"); uhub_assert(!"negative count!");
} }
hub->users->shared_size -= user->limits.shared_size; users->shared_size -= user->limits.shared_size;
hub->users->shared_files -= user->limits.shared_files; users->shared_files -= user->limits.shared_files;
user->hub = 0;
return 0; return 0;
} }
struct hub_user* uman_get_user_by_sid(struct hub_info* hub, sid_t sid) struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid)
{ {
return sid_lookup(hub->users->sids, sid); return sid_lookup(users->sids, sid);
} }
struct hub_user* uman_get_user_by_cid(struct hub_info* hub, const char* cid) struct hub_user* uman_get_user_by_cid(struct hub_user_manager* users, const char* cid)
{ {
struct hub_user* user = (struct hub_user*) list_get_first(hub->users->list); /* iterate users - only on incoming INF msg */ struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
while (user) while (user)
{ {
if (strcmp(user->id.cid, cid) == 0) if (strcmp(user->id.cid, cid) == 0)
return user; return user;
user = (struct hub_user*) list_get_next(hub->users->list); user = (struct hub_user*) list_get_next(users->list);
} }
return NULL; return NULL;
} }
struct hub_user* uman_get_user_by_nick(struct hub_info* hub, const char* nick) struct hub_user* uman_get_user_by_nick(struct hub_user_manager* users, const char* nick)
{ {
struct hub_user* user = (struct hub_user*) list_get_first(hub->users->list); /* iterate users - only on incoming INF msg */ struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
while (user) while (user)
{ {
if (strcmp(user->id.nick, nick) == 0) if (strcmp(user->id.nick, nick) == 0)
return user; return user;
user = (struct hub_user*) list_get_next(hub->users->list); user = (struct hub_user*) list_get_next(users->list);
} }
return NULL; return NULL;
} }
size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range) size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linked_list* target, struct ip_range* range)
{ {
size_t num = 0; size_t num = 0;
struct hub_user* user = (struct hub_user*) list_get_first(hub->users->list); /* iterate users - only on incoming INF msg */ struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
while (user) while (user)
{ {
if (ip_in_range(&user->id.addr, range)) if (ip_in_range(&user->id.addr, range))
{ {
list_append(users, user); list_append(target, user);
num++; num++;
} }
user = (struct hub_user*) list_get_next(hub->users->list); user = (struct hub_user*) list_get_next(users->list);
} }
return num; return num;
} }
int uman_send_user_list(struct hub_info* hub, struct hub_user* target) int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* target)
{ {
int ret = 1; int ret = 1;
struct hub_user* user; struct hub_user* user;
user_flag_set(target, flag_user_list); user_flag_set(target, flag_user_list);
user = (struct hub_user*) list_get_first(hub->users->list); /* iterate users - only on INF or PAS msg */ user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on INF or PAS msg */
while (user) while (user)
{ {
if (user_is_logged_in(user)) if (user_is_logged_in(user))
@@ -235,7 +173,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user* target)
if (!ret) if (!ret)
break; break;
} }
user = (struct hub_user*) list_get_next(hub->users->list); user = (struct hub_user*) list_get_next(users->list);
} }
#if 0 #if 0
@@ -248,7 +186,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user* target)
return ret; return ret;
} }
void uman_send_quit_message(struct hub_info* hub, struct hub_user* leaving) void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* leaving)
{ {
struct adc_message* command = adc_msg_construct(ADC_CMD_IQUI, 6); struct adc_message* command = adc_msg_construct(ADC_CMD_IQUI, 6);
adc_msg_add_argument(command, (const char*) sid_to_string(leaving->id.sid)); adc_msg_add_argument(command, (const char*) sid_to_string(leaving->id.sid));
@@ -261,9 +199,9 @@ void uman_send_quit_message(struct hub_info* hub, struct hub_user* leaving)
adc_msg_free(command); adc_msg_free(command);
} }
sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user) sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user* user)
{ {
sid_t sid = sid_alloc(hub->users->sids, user); sid_t sid = sid_alloc(users->sids, user);
user->id.sid = sid; user->id.sid = sid;
return sid; return sid;
} }

View File

@@ -28,36 +28,35 @@ struct hub_user_manager
uint64_t shared_size; /**<< "The total number of shared bytes among fully connected users." */ uint64_t shared_size; /**<< "The total number of shared bytes among fully connected users." */
uint64_t shared_files; /**<< "The total number of shared files among fully connected users." */ uint64_t shared_files; /**<< "The total number of shared files among fully connected users." */
struct linked_list* list; /**<< "Contains all logged in users" */ struct linked_list* list; /**<< "Contains all logged in users" */
struct timeout_evt* timeout; /**<< "Timeout handler for statistics" */
}; };
/** /**
* Initializes the user manager. * Initializes the user manager.
* @return 0 on success, or -1 if error (out of memory). * @return 0 on success, or -1 if error (out of memory).
*/ */
extern int uman_init(struct hub_info* hub); extern struct hub_user_manager* uman_init();
/** /**
* Shuts down the user manager. * Shuts down the user manager.
* All users will be disconnected and deleted as part of this. * All users will be disconnected and deleted as part of this.
* *
* @return 0 on success, or -1 in an error occured (hub is invalid). * @return 0 on success, or -1 in an error occured (invalid pointer).
*/ */
extern int uman_shutdown(struct hub_info* hub); extern int uman_shutdown(struct hub_user_manager* users);
/** /**
* Generate statistics for logfiles. * Generate statistics for logfiles.
*/ */
extern void uman_update_stats(struct hub_info* hub); extern void uman_update_stats(struct hub_user_manager* users);
extern void uman_print_stats(struct hub_info* hub); extern void uman_print_stats(struct hub_user_manager* users);
/** /**
* Add a user to the user manager. * Add a user to the user manager.
* *
* @param hub The hub to add the user to * @param users The usermanager to add the user to
* @param user The user to be added to the hub. * @param user The user to be added to the hub.
*/ */
extern int uman_add(struct hub_info* hub, struct hub_user* user); extern int uman_add(struct hub_user_manager* users, struct hub_user* user);
/** /**
* Remove a user from the user manager. * Remove a user from the user manager.
@@ -66,12 +65,12 @@ extern int uman_add(struct hub_info* hub, struct hub_user* user);
* *
* @return 0 if successfully removed, -1 if error. * @return 0 if successfully removed, -1 if error.
*/ */
extern int uman_remove(struct hub_info* hub, struct hub_user* user); extern int uman_remove(struct hub_user_manager* users, struct hub_user* user);
/** /**
* Returns and allocates an unused session ID (SID). * Returns and allocates an unused session ID (SID).
*/ */
extern sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user); extern sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user* user);
/** /**
* Lookup a user based on the session ID (SID). * Lookup a user based on the session ID (SID).
@@ -86,26 +85,28 @@ extern sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user);
* *
* @return a user if found, or NULL if not found * @return a user if found, or NULL if not found
*/ */
extern struct hub_user* uman_get_user_by_sid(struct hub_info* hub, sid_t sid); extern struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid);
/** /**
* Lookup a user based on the client ID (CID). * Lookup a user based on the client ID (CID).
* @return a user if found, or NULL if not found * @return a user if found, or NULL if not found
*/ */
extern struct hub_user* uman_get_user_by_cid(struct hub_info* hub, const char* cid); extern struct hub_user* uman_get_user_by_cid(struct hub_user_manager* users, const char* cid);
/** /**
* Lookup a user based on the nick name. * Lookup a user based on the nick name.
* @return a user if found, or NULL if not found * @return a user if found, or NULL if not found
*/ */
extern struct hub_user* uman_get_user_by_nick(struct hub_info* hub, const char* nick); extern struct hub_user* uman_get_user_by_nick(struct hub_user_manager* users, const char* nick);
/** /**
* Lookup users based on an ip address range. * Lookup users based on an ip address range.
* *
* @param[out] target the list of users matching the address
* @param range the IP range of users to match
* @return The number of users matching the addressess, or -1 on error (mask is wrong). * @return The number of users matching the addressess, or -1 on error (mask is wrong).
*/ */
extern size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range); extern size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linked_list* target, struct ip_range* range);
/** /**
* Send the user list of connected clients to 'user'. * Send the user list of connected clients to 'user'.
@@ -113,13 +114,13 @@ extern size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* us
* *
* @return 1 if sending the user list succeeded, 0 otherwise. * @return 1 if sending the user list succeeded, 0 otherwise.
*/ */
extern int uman_send_user_list(struct hub_info* hub, struct hub_user* user); extern int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* user);
/** /**
* Send a quit message to all connected users when 'user' is * Send a quit message to all connected users when 'user' is
* leaving the hub (for whatever reason). * leaving the hub (for whatever reason).
*/ */
extern void uman_send_quit_message(struct hub_info* hub, struct hub_user* user); extern void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* user);
#endif /* HAVE_UHUB_USER_MANAGER_H */ #endif /* HAVE_UHUB_USER_MANAGER_H */

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -181,11 +181,8 @@ void net_con_close(struct net_connection* con)
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (con->ssl) if (con->ssl)
{ net_ssl_shutdown(con);
SSL_shutdown(con->ssl); #endif /* SSL_SUPPORT */
SSL_clear(con->ssl);
}
#endif
net_close(con->sd); net_close(con->sd);
con->sd = -1; con->sd = -1;

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -20,11 +20,10 @@
#define NET_WANT_READ NET_EVENT_READ #define NET_WANT_READ NET_EVENT_READ
#define NET_WANT_WRITE NET_EVENT_WRITE #define NET_WANT_WRITE NET_EVENT_WRITE
#define NET_WANT_ACCEPT NET_EVENT_READ #define NET_WANT_ACCEPT NET_EVENT_READ
#define NET_WANT_SSL_READ 0x0010
#define NET_WANT_SSL_WRITE 0x0020 #define NET_SSL_ANY NET_WANT_SSL_READ | NET_WANT_SSL_WRITE | NET_WANT_SSL_ACCEPT | NET_WANT_SSL_CONNECT | NET_WANT_SSL_X509_LOOKUP
#define NET_WANT_SSL_ACCEPT 0x0040
#define NET_WANT_SSL_CONNECT 0x0080 struct ssl_handle; /* abstract type */
#define NET_WANT_SSL_X509_LOOKUP 0x0100
#define NET_CLEANUP 0x8000 #define NET_CLEANUP 0x8000
@@ -36,9 +35,7 @@
struct timeout_evt* timeout; /** timeout event handler */ struct timeout_evt* timeout; /** timeout event handler */
#define NET_CON_STRUCT_SSL \ #define NET_CON_STRUCT_SSL \
SSL* ssl; /** SSL handle */ \ struct ssl_handle* ssl; /** SSL handle */
uint32_t ssl_state; /** SSL state */ \
size_t write_len; /** Length of last SSL_write(), only used if flags is NET_WANT_SSL_READ. */ \
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
#define NET_CON_STRUCT_COMMON \ #define NET_CON_STRUCT_COMMON \

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -20,132 +20,23 @@
#include "uhub.h" #include "uhub.h"
#include "network/common.h" #include "network/common.h"
#ifdef SSL_SUPPORT
enum uhub_tls_state
{
tls_st_none,
tls_st_error,
tls_st_accepting,
tls_st_connecting,
tls_st_connected,
tls_st_disconnecting,
};
static int handle_openssl_error(struct net_connection* con, int ret)
{
uhub_assert(con);
int error = SSL_get_error(con->ssl, ret);
switch (error)
{
case SSL_ERROR_ZERO_RETURN:
LOG_PROTO("SSL_get_error: ret=%d, error=%d: SSL_ERROR_ZERO_RETURN", ret, error);
con->ssl_state = tls_st_error;
return -1;
case SSL_ERROR_WANT_READ:
LOG_PROTO("SSL_get_error: ret=%d, error=%d: SSL_ERROR_WANT_READ", ret, error);
con->flags |= NET_WANT_SSL_READ;
net_con_update(con, NET_EVENT_READ);
return 0;
case SSL_ERROR_WANT_WRITE:
LOG_PROTO("SSL_get_error: ret=%d, error=%d: SSL_ERROR_WANT_WRITE", ret, error);
con->flags |= NET_WANT_SSL_WRITE;
net_con_update(con, NET_EVENT_READ | NET_EVENT_WRITE);
return 0;
case SSL_ERROR_SYSCALL:
LOG_PROTO("SSL_get_error: ret=%d, error=%d: SSL_ERROR_SYSCALL", ret, error);
/* if ret == 0, connection closed, if ret == -1, check with errno */
if (ret == 0)
return -1;
else
return -net_error();
case SSL_ERROR_SSL:
LOG_PROTO("SSL_get_error: ret=%d, error=%d: SSL_ERROR_SSL", ret, error);
/* internal openssl error */
con->ssl_state = tls_st_error;
return -1;
}
return -1;
}
ssize_t net_con_ssl_accept(struct net_connection* con)
{
uhub_assert(con);
con->ssl_state = tls_st_accepting;
ssize_t ret = SSL_accept(con->ssl);
#ifdef NETWORK_DUMP_DEBUG
LOG_PROTO("SSL_accept() ret=%d", ret);
#endif
if (ret > 0)
{
net_con_update(con, NET_EVENT_READ);
con->ssl_state = tls_st_connected;
}
else
{
return handle_openssl_error(con, ret);
}
return ret;
}
ssize_t net_con_ssl_connect(struct net_connection* con)
{
uhub_assert(con);
con->ssl_state = tls_st_connecting;
ssize_t ret = SSL_connect(con->ssl);
#ifdef NETWORK_DUMP_DEBUG
LOG_PROTO("SSL_connect() ret=%d", ret);
#endif
if (ret > 0)
{
con->ssl_state = tls_st_connected;
net_con_update(con, NET_EVENT_READ);
}
else
{
return handle_openssl_error(con, ret);
}
return ret;
}
ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode ssl_mode, SSL_CTX* ssl_ctx)
{
uhub_assert(con);
SSL* ssl = 0;
if (ssl_mode == net_con_ssl_mode_server)
{
ssl = SSL_new(ssl_ctx);
if (!ssl)
{
LOG_ERROR("Unable to create new SSL stream\n");
return -1;
}
SSL_set_fd(ssl, con->sd);
net_con_set_ssl(con, ssl);
return net_con_ssl_accept(con);
}
else
{
ssl = SSL_new(SSL_CTX_new(TLSv1_method()));
SSL_set_fd(ssl, con->sd);
net_con_set_ssl(con, ssl);
return net_con_ssl_connect(con);
}
}
#endif /* SSL_SUPPORT */
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
void net_stats_add_tx(size_t bytes); void net_stats_add_tx(size_t bytes);
void net_stats_add_rx(size_t bytes); void net_stats_add_rx(size_t bytes);
#endif #endif
static int is_blocked_or_interrupted()
{
int err = net_error();
return
#ifdef WINSOCK
err == WSAEWOULDBLOCK
#else
err == EWOULDBLOCK
#endif
|| err == EINTR;
}
ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len) ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
{ {
int ret; int ret;
@@ -156,13 +47,7 @@ ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
ret = net_send(con->sd, buf, len, UHUB_SEND_SIGNAL); ret = net_send(con->sd, buf, len, UHUB_SEND_SIGNAL);
if (ret == -1) if (ret == -1)
{ {
if ( if (is_blocked_or_interrupted())
#ifdef WINSOCK
net_error() == WSAEWOULDBLOCK
#else
net_error() == EWOULDBLOCK
#endif
|| net_error() == EINTR)
return 0; return 0;
return -1; return -1;
} }
@@ -170,19 +55,9 @@ ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
} }
else else
{ {
con->write_len = len; ret = net_ssl_send(con, buf, len);
ret = SSL_write(con->ssl, buf, len);
LOG_PROTO("SSL_write(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret);
if (ret <= 0)
{
return handle_openssl_error(con, ret);
}
else
{
net_stats_add_tx(ret);
}
} }
#endif #endif /* SSL_SUPPORT */
return ret; return ret;
} }
@@ -190,19 +65,13 @@ ssize_t net_con_recv(struct net_connection* con, void* buf, size_t len)
{ {
int ret; int ret;
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (!net_con_is_ssl(con)) if (!con->ssl)
{ {
#endif #endif
ret = net_recv(con->sd, buf, len, 0); ret = net_recv(con->sd, buf, len, 0);
if (ret == -1) if (ret == -1)
{ {
if ( if (is_blocked_or_interrupted())
#ifdef WINSOCK
net_error() == WSAEWOULDBLOCK
#else
net_error() == EWOULDBLOCK
#endif
|| net_error() == EINTR)
return 0; return 0;
return -net_error(); return -net_error();
} }
@@ -214,22 +83,9 @@ ssize_t net_con_recv(struct net_connection* con, void* buf, size_t len)
} }
else else
{ {
if (con->ssl_state == tls_st_error) ret = net_ssl_recv(con, buf, len);
return -1;
ret = SSL_read(con->ssl, buf, len);
LOG_PROTO("SSL_read(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret);
if (ret > 0)
{
net_con_update(con, NET_EVENT_READ);
net_stats_add_rx(ret);
}
else
{
return handle_openssl_error(con, ret);
}
} }
#endif #endif /* SSL_SUPPORT */
return ret; return ret;
} }
@@ -238,13 +94,7 @@ ssize_t net_con_peek(struct net_connection* con, void* buf, size_t len)
int ret = net_recv(con->sd, buf, len, MSG_PEEK); int ret = net_recv(con->sd, buf, len, MSG_PEEK);
if (ret == -1) if (ret == -1)
{ {
if ( if (is_blocked_or_interrupted())
#ifdef WINSOCK
net_error() == WSAEWOULDBLOCK
#else
net_error() == EWOULDBLOCK
#endif
|| net_error() == EINTR)
return 0; return 0;
return -net_error(); return -net_error();
} }
@@ -254,19 +104,10 @@ ssize_t net_con_peek(struct net_connection* con, void* buf, size_t len)
} }
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
int net_con_is_ssl(struct net_connection* con) int net_con_is_ssl(struct net_connection* con)
{ {
return con->ssl != 0; return !!con->ssl;
}
SSL* net_con_get_ssl(struct net_connection* con)
{
return con->ssl;
}
void net_con_set_ssl(struct net_connection* con, SSL* ssl)
{
con->ssl = ssl;
} }
#endif /* SSL_SUPPORT */ #endif /* SSL_SUPPORT */
@@ -283,7 +124,8 @@ void* net_con_get_ptr(struct net_connection* con)
void net_con_destroy(struct net_connection* con) void net_con_destroy(struct net_connection* con)
{ {
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
SSL_free(con->ssl); if (con->ssl)
net_ssl_destroy(con);
#endif #endif
hub_free(con); hub_free(con);
} }
@@ -295,68 +137,16 @@ void net_con_callback(struct net_connection* con, int events)
if (events == NET_EVENT_TIMEOUT) if (events == NET_EVENT_TIMEOUT)
{ {
LOG_TRACE("net_con_callback(%p, TIMEOUT", con); LOG_TRACE("net_con_callback(%p, TIMEOUT)", con);
con->callback(con, events, con->ptr); con->callback(con, events, con->ptr);
return; return;
} }
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (!con->ssl) if (con->ssl)
{ net_ssl_callback(con, events);
else
#endif #endif
con->callback(con, events, con->ptr); con->callback(con, events, con->ptr);
#ifdef SSL_SUPPORT
}
else
{
#ifdef NETWORK_DUMP_DEBUG
LOG_PROTO("net_con_event: events=%d, con=%p, state=%d", events, con, con->ssl_state);
#endif
switch (con->ssl_state)
{
case tls_st_none:
con->callback(con, events, con->ptr);
break;
case tls_st_error:
con->callback(con, NET_EVENT_READ, con->ptr);
break;
case tls_st_accepting:
if (net_con_ssl_accept(con) < 0)
{
con->callback(con, NET_EVENT_READ, con->ptr);
}
break;
case tls_st_connecting:
if (net_con_ssl_connect(con) < 0)
{
con->callback(con, NET_EVENT_READ, con->ptr);
}
break;
case tls_st_connected:
LOG_PROTO("tls_st_connected, events=%s%s, ssl_flags=%s%s", (events & NET_EVENT_READ ? "R" : ""), (events & NET_EVENT_WRITE ? "W" : ""), con->flags & NET_WANT_SSL_READ ? "R" : "", con->flags & NET_WANT_SSL_WRITE ? "W" : "");
if (events & NET_EVENT_WRITE && con->flags & NET_WANT_SSL_READ)
{
con->callback(con, events & NET_EVENT_READ, con->ptr);
return;
}
if (events & NET_EVENT_READ && con->flags & NET_WANT_SSL_WRITE)
{
con->callback(con, events & NET_EVENT_READ, con->ptr);
return;
}
con->callback(con, events, con->ptr);
break;
case tls_st_disconnecting:
return;
}
}
#endif
} }

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
#include "uhub.h" #include "uhub.h"
#include "network/common.h" #include "network/common.h"
#include "network/backend.h" #include "network/backend.h"
#include "network/tls.h"
#define NET_EVENT_TIMEOUT 0x0001 #define NET_EVENT_TIMEOUT 0x0001
#define NET_EVENT_READ 0x0002 #define NET_EVENT_READ 0x0002
@@ -83,29 +84,5 @@ extern ssize_t net_con_peek(struct net_connection* con, void* buf, size_t len);
extern void net_con_set_timeout(struct net_connection* con, int seconds); extern void net_con_set_timeout(struct net_connection* con, int seconds);
extern void net_con_clear_timeout(struct net_connection* con); extern void net_con_clear_timeout(struct net_connection* con);
#ifdef SSL_SUPPORT
/**
* Start SSL_accept()
*/
extern ssize_t net_con_ssl_accept(struct net_connection*);
/**
* Start SSL_connect()
*/
extern ssize_t net_con_ssl_connect(struct net_connection*);
enum net_con_ssl_mode
{
net_con_ssl_mode_server,
net_con_ssl_mode_client,
};
extern ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode, SSL_CTX* ssl_ctx);
extern int net_con_is_ssl(struct net_connection* con);
extern SSL* net_con_get_ssl(struct net_connection* con);
extern void net_con_set_ssl(struct net_connection* con, SSL*);
#endif /* SSL_SUPPORT */
#endif /* HAVE_UHUB_NETWORK_CONNECTION_H */ #endif /* HAVE_UHUB_NETWORK_CONNECTION_H */

View File

@@ -59,9 +59,11 @@ int net_initialize()
net_stats_initialize(); net_stats_initialize();
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
#ifdef SSL_USE_OPENSSL
LOG_TRACE("Initializing OpenSSL..."); LOG_TRACE("Initializing OpenSSL...");
SSL_library_init(); SSL_library_init();
SSL_load_error_strings(); SSL_load_error_strings();
#endif /* SSL_USE_OPENSSL */
#endif /* SSL_SUPPORT */ #endif /* SSL_SUPPORT */
net_initialized = 1; net_initialized = 1;
@@ -100,10 +102,12 @@ int net_destroy()
net_backend_shutdown(); net_backend_shutdown();
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
#ifdef SSL_USE_OPENSSL
ERR_free_strings(); ERR_free_strings();
EVP_cleanup(); EVP_cleanup();
CRYPTO_cleanup_all_ex_data(); CRYPTO_cleanup_all_ex_data();
#endif #endif /* SSL_USE_OPENSSL */
#endif /* SSL_SUPPORT */
#ifdef WINSOCK #ifdef WINSOCK
WSACleanup(); WSACleanup();

View File

@@ -31,6 +31,7 @@ struct net_statistics
}; };
struct net_socket_t; struct net_socket_t;
struct ip_addr_encap;
/** /**
* Initialize the socket monitor subsystem. * Initialize the socket monitor subsystem.

305
src/network/openssl.c Normal file
View File

@@ -0,0 +1,305 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2012, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#include "network/common.h"
#include "network/tls.h"
#ifdef SSL_SUPPORT
#ifdef SSL_USE_OPENSSL
#define NETWORK_DUMP_DEBUG
struct net_ssl_openssl
{
SSL* ssl;
enum ssl_state state;
uint32_t flags;
BIO* biow;
BIO* bior;
};
struct net_context_openssl
{
SSL_METHOD* ssl_method;
SSL_CTX* ssl_ctx;
};
static struct net_ssl_openssl* get_handle(struct net_connection* con)
{
uhub_assert(con);
return (struct net_ssl_openssl*) con->ssl;
}
const char* net_ssl_get_provider()
{
return OPENSSL_VERSION_TEXT;
}
/**
* Create a new SSL context.
*/
struct ssl_context_handle* net_ssl_context_create()
{
struct net_context_openssl* ctx = (struct net_context_openssl*) hub_malloc_zero(sizeof(struct net_context_openssl));
ctx->ssl_method = (SSL_METHOD*) SSLv23_method(); /* TLSv1_method() */
ctx->ssl_ctx = SSL_CTX_new(ctx->ssl_method);
/* Disable SSLv2 */
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_quiet_shutdown(ctx->ssl_ctx, 1);
return (struct ssl_context_handle*) ctx;
}
extern void net_ssl_context_destroy(struct ssl_context_handle* ctx_)
{
struct net_context_openssl* ctx = (struct net_context_openssl*) ctx_;
SSL_CTX_free(ctx->ssl_ctx);
hub_free(ctx);
}
int ssl_load_certificate(struct ssl_context_handle* ctx_, const char* pem_file)
{
struct net_context_openssl* ctx = (struct net_context_openssl*) ctx_;
if (SSL_CTX_use_certificate_file(ctx->ssl_ctx, pem_file, SSL_FILETYPE_PEM) < 0)
{
LOG_ERROR("SSL_CTX_use_certificate_file: %s", ERR_error_string(ERR_get_error(), NULL));
return 0;
}
return 1;
}
int ssl_load_private_key(struct ssl_context_handle* ctx_, const char* pem_file)
{
struct net_context_openssl* ctx = (struct net_context_openssl*) ctx_;
if (SSL_CTX_use_PrivateKey_file(ctx->ssl_ctx, pem_file, SSL_FILETYPE_PEM) < 0)
{
LOG_ERROR("SSL_CTX_use_PrivateKey_file: %s", ERR_error_string(ERR_get_error(), NULL));
return 0;
}
return 1;
}
int ssl_check_private_key(struct ssl_context_handle* ctx_)
{
struct net_context_openssl* ctx = (struct net_context_openssl*) ctx_;
if (SSL_CTX_check_private_key(ctx->ssl_ctx) != 1)
{
LOG_FATAL("SSL_CTX_check_private_key: Private key does not match the certificate public key: %s", ERR_error_string(ERR_get_error(), NULL));
return 0;
}
return 1;
}
static int handle_openssl_error(struct net_connection* con, int ret, enum ssl_state forced_rwstate)
{
struct net_ssl_openssl* handle = get_handle(con);
int err = SSL_get_error(handle->ssl, ret);
switch (err)
{
case SSL_ERROR_ZERO_RETURN:
// Not really an error, but SSL was shut down.
return -1;
case SSL_ERROR_WANT_READ:
handle->state = forced_rwstate;
net_con_update(con, NET_EVENT_READ);
return 0;
case SSL_ERROR_WANT_WRITE:
handle->state = forced_rwstate;
net_con_update(con, NET_EVENT_WRITE);
return 0;
case SSL_ERROR_SYSCALL:
handle->state = tls_st_error;
return -2;
}
}
ssize_t net_con_ssl_accept(struct net_connection* con)
{
struct net_ssl_openssl* handle = get_handle(con);
handle->state = tls_st_accepting;
ssize_t ret;
ret = SSL_accept(handle->ssl);
LOG_PROTO("SSL_accept() ret=%d", ret);
if (ret > 0)
{
net_con_update(con, NET_EVENT_READ);
handle->state = tls_st_connected;
return ret;
}
return handle_openssl_error(con, ret, tls_st_accepting);
}
ssize_t net_con_ssl_connect(struct net_connection* con)
{
struct net_ssl_openssl* handle = get_handle(con);
ssize_t ret;
handle->state = tls_st_connecting;
ret = SSL_connect(handle->ssl);
#ifdef NETWORK_DUMP_DEBUG
LOG_PROTO("SSL_connect() ret=%d", ret);
#endif /* NETWORK_DUMP_DEBUG */
if (ret > 0)
{
handle->state = tls_st_connected;
net_con_update(con, NET_EVENT_READ);
return ret;
}
return handle_openssl_error(con, ret, tls_st_connecting);
}
ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode ssl_mode, struct ssl_context_handle* ssl_ctx)
{
uhub_assert(con);
struct net_context_openssl* ctx = (struct net_context_openssl*) ssl_ctx;
struct net_ssl_openssl* handle = (struct net_ssl_openssl*) hub_malloc_zero(sizeof(struct net_ssl_openssl));
if (ssl_mode == net_con_ssl_mode_server)
{
handle->ssl = SSL_new(ctx->ssl_ctx);
if (!handle->ssl)
{
LOG_ERROR("Unable to create new SSL stream\n");
return -1;
}
SSL_set_fd(handle->ssl, con->sd);
handle->bior = SSL_get_rbio(handle->ssl);
handle->biow = SSL_get_wbio(handle->ssl);
con->ssl = (struct ssl_handle*) handle;
return net_con_ssl_accept(con);
}
else
{
handle->ssl = SSL_new(SSL_CTX_new(TLSv1_method()));
SSL_set_fd(handle->ssl, con->sd);
handle->bior = SSL_get_rbio(handle->ssl);
handle->biow = SSL_get_wbio(handle->ssl);
con->ssl = (struct ssl_handle*) handle;
return net_con_ssl_connect(con);
}
}
ssize_t net_ssl_send(struct net_connection* con, const void* buf, size_t len)
{
struct net_ssl_openssl* handle = get_handle(con);
uhub_assert(handle->state == tls_st_connected || handle->state == tls_st_need_write);
ERR_clear_error();
ssize_t ret = SSL_write(handle->ssl, buf, len);
LOG_PROTO("SSL_write(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret);
if (ret > 0)
{
handle->state = tls_st_connected;
return ret;
}
return handle_openssl_error(con, ret, tls_st_need_write);
}
ssize_t net_ssl_recv(struct net_connection* con, void* buf, size_t len)
{
struct net_ssl_openssl* handle = get_handle(con);
ssize_t ret;
if (handle->state == tls_st_error)
return -2;
uhub_assert(handle->state == tls_st_connected || handle->state == tls_st_need_read);
ERR_clear_error();
ret = SSL_read(handle->ssl, buf, len);
LOG_PROTO("SSL_read(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret);
if (ret > 0)
{
handle->state = tls_st_connected;
return ret;
}
return handle_openssl_error(con, ret, tls_st_need_read);
}
void net_ssl_shutdown(struct net_connection* con)
{
struct net_ssl_openssl* handle = get_handle(con);
SSL_shutdown(handle->ssl);
SSL_clear(handle->ssl);
}
void net_ssl_destroy(struct net_connection* con)
{
struct net_ssl_openssl* handle = get_handle(con);
SSL_free(handle->ssl);
}
void net_ssl_callback(struct net_connection* con, int events)
{
struct net_ssl_openssl* handle = get_handle(con);
switch (handle->state)
{
case tls_st_none:
con->callback(con, events, con->ptr);
break;
case tls_st_error:
con->callback(con, NET_EVENT_READ, con->ptr);
break;
case tls_st_accepting:
if (net_con_ssl_accept(con) != 0)
con->callback(con, NET_EVENT_READ, con->ptr);
break;
case tls_st_connecting:
if (net_con_ssl_connect(con) != 0)
con->callback(con, NET_EVENT_READ, con->ptr);
break;
case tls_st_need_read:
con->callback(con, NET_EVENT_READ, con->ptr);
break;
case tls_st_need_write:
con->callback(con, NET_EVENT_WRITE, con->ptr);
break;
case tls_st_connected:
con->callback(con, events, con->ptr);
break;
case tls_st_disconnecting:
return;
}
}
#endif /* SSL_USE_OPENSSL */
#endif /* SSL_SUPPORT */

101
src/network/tls.h Normal file
View File

@@ -0,0 +1,101 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2012, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_NETWORK_TLS_H
#define HAVE_UHUB_NETWORK_TLS_H
#include "uhub.h"
#ifdef SSL_SUPPORT
enum ssl_state
{
tls_st_none,
tls_st_error,
tls_st_accepting,
tls_st_connecting,
tls_st_connected,
tls_st_need_read, /* special case of connected */
tls_st_need_write, /* special case of connected */
tls_st_disconnecting,
};
enum net_con_ssl_mode
{
net_con_ssl_mode_server,
net_con_ssl_mode_client,
};
struct ssl_context_handle;
/**
* Returns a string describing the TLS/SSL provider information
*/
extern const char* net_ssl_get_provider();
/**
* Create a new SSL context.
*/
extern struct ssl_context_handle* net_ssl_context_create();
extern void net_ssl_context_destroy(struct ssl_context_handle* ctx);
/**
* Return 0 on error, 1 otherwise.
*/
extern int ssl_load_certificate(struct ssl_context_handle* ctx, const char* pem_file);
/**
* Return 0 on error, 1 otherwise.
*/
extern int ssl_load_private_key(struct ssl_context_handle* ctx, const char* pem_file);
/**
* Return 0 if private key does not match certificate, 1 if everything is OK.
*/
extern int ssl_check_private_key(struct ssl_context_handle* ctx);
/**
* Start SSL_accept()
*/
extern ssize_t net_con_ssl_accept(struct net_connection*);
/**
* Start SSL_connect()
*/
extern ssize_t net_con_ssl_connect(struct net_connection*);
extern ssize_t net_ssl_send(struct net_connection* con, const void* buf, size_t len);
extern ssize_t net_ssl_recv(struct net_connection* con, void* buf, size_t len);
extern void net_ssl_shutdown(struct net_connection* con);
extern void net_ssl_destroy(struct net_connection* con);
extern void net_ssl_callback(struct net_connection* con, int events);
extern ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode, struct ssl_context_handle* ssl_ctx);
extern SSL* net_con_get_ssl(struct net_connection* con);
#ifdef SSL_USE_OPENSSL
extern void net_con_set_ssl(struct net_connection* con, SSL*);
#endif // SSL_USE_OPENSSL
extern int net_con_is_ssl(struct net_connection* con);
#endif /* SSL_SUPPORT */
#endif /* HAVE_UHUB_NETWORK_TLS_H */

View File

@@ -26,7 +26,7 @@
#include "system.h" #include "system.h"
#include "util/credentials.h" #include "util/credentials.h"
#include "util/ipcalc.h" #include "network/ipcalc.h"
#include "plugin_api/types.h" #include "plugin_api/types.h"
typedef void (*on_connection_accepted_t)(struct plugin_handle*, struct ip_addr_encap*); typedef void (*on_connection_accepted_t)(struct plugin_handle*, struct ip_addr_encap*);

View File

@@ -20,7 +20,6 @@
#include "plugin_api/handle.h" #include "plugin_api/handle.h"
#include "util/memory.h" #include "util/memory.h"
#include "util/list.h" #include "util/list.h"
#include "util/ipcalc.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/log.h" #include "util/log.h"
#include "util/config_token.h" #include "util/config_token.h"

View File

@@ -21,7 +21,6 @@
#include <sqlite3.h> #include <sqlite3.h>
#include "util/memory.h" #include "util/memory.h"
#include "util/list.h" #include "util/list.h"
#include "util/ipcalc.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/log.h" #include "util/log.h"
#include "util/config_token.h" #include "util/config_token.h"

View File

@@ -67,7 +67,7 @@ static size_t get_messages(struct chat_history_data* data, size_t num, struct cb
char* message; char* message;
int skiplines = 0; int skiplines = 0;
size_t lines = 0; size_t lines = 0;
int total = list_size(messages); size_t total = list_size(messages);
if (total == 0) if (total == 0)
return 0; return 0;

View File

@@ -64,13 +64,13 @@ static struct user_info* get_user_info(struct chat_only_data* data, sid_t sid)
struct user_info* u; struct user_info* u;
// resize buffer if needed. // resize buffer if needed.
if (sid > data->max_users) // FIXME: >= ? if (sid >= data->max_users)
{ {
u = hub_malloc_zero(sizeof(struct user_info) * (sid + 1)); u = hub_malloc_zero(sizeof(struct user_info) * (sid + 1));
memcpy(u, data->users, data->max_users); memcpy(u, data->users, data->max_users);
hub_free(data->users); hub_free(data->users);
data->users = u; data->users = u;
data->max_users = sid; data->max_users = sid + 1;
u = NULL; u = NULL;
} }

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -21,12 +21,14 @@
#include "adc/adcconst.h" #include "adc/adcconst.h"
#include "adc/sid.h" #include "adc/sid.h"
#include "util/memory.h" #include "util/memory.h"
#include "util/ipcalc.h" #include "network/ipcalc.h"
#include "plugin_api/handle.h" #include "plugin_api/handle.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/config_token.h" #include "util/config_token.h"
#ifndef WIN32
#include <syslog.h> #include <syslog.h>
#endif
struct ip_addr_encap; struct ip_addr_encap;
@@ -60,11 +62,13 @@ static int log_open_file(struct plugin_handle* plugin, struct log_data* data)
return (data->fd != -1); return (data->fd != -1);
} }
#ifndef WIN32
static int log_open_syslog(struct plugin_handle* plugin) static int log_open_syslog(struct plugin_handle* plugin)
{ {
openlog("uhub", 0, LOG_USER); openlog("uhub", 0, LOG_USER);
return 1; return 1;
} }
#endif
static struct log_data* parse_config(const char* line, struct plugin_handle* plugin) static struct log_data* parse_config(const char* line, struct plugin_handle* plugin)
{ {
@@ -94,6 +98,7 @@ static struct log_data* parse_config(const char* line, struct plugin_handle* plu
data->logfile = strdup(cfg_settings_get_value(setting)); data->logfile = strdup(cfg_settings_get_value(setting));
data->logmode = mode_file; data->logmode = mode_file;
} }
#ifndef WIN32
else if (strcmp(cfg_settings_get_key(setting), "syslog") == 0) else if (strcmp(cfg_settings_get_key(setting), "syslog") == 0)
{ {
int use_syslog = 0; int use_syslog = 0;
@@ -102,6 +107,7 @@ static struct log_data* parse_config(const char* line, struct plugin_handle* plu
data->logmode = (use_syslog) ? mode_syslog : mode_file; data->logmode = (use_syslog) ? mode_syslog : mode_file;
} }
} }
#endif
else else
{ {
set_error_message(plugin, "Unknown startup parameters given"); set_error_message(plugin, "Unknown startup parameters given");
@@ -134,6 +140,7 @@ static struct log_data* parse_config(const char* line, struct plugin_handle* plu
return 0; return 0;
} }
} }
#ifndef WIN32
else else
{ {
if (!log_open_syslog(plugin)) if (!log_open_syslog(plugin))
@@ -144,7 +151,7 @@ static struct log_data* parse_config(const char* line, struct plugin_handle* plu
return 0; return 0;
} }
} }
#endif
return data; return data;
} }
@@ -155,10 +162,12 @@ static void log_close(struct log_data* data)
hub_free(data->logfile); hub_free(data->logfile);
close(data->fd); close(data->fd);
} }
#ifndef WIN32
else else
{ {
closelog(); closelog();
} }
#endif
hub_free(data); hub_free(data);
} }
@@ -186,19 +195,25 @@ static void log_message(struct log_data* data, const char *format, ...)
} }
else else
{ {
#ifdef WIN32
_commit(data->fd);
#else
#if defined _POSIX_SYNCHRONIZED_IO && _POSIX_SYNCHRONIZED_IO > 0 #if defined _POSIX_SYNCHRONIZED_IO && _POSIX_SYNCHRONIZED_IO > 0
fdatasync(data->fd); fdatasync(data->fd);
#else #else
fsync(data->fd); fsync(data->fd);
#endif
#endif #endif
} }
} }
#ifndef WIN32
else else
{ {
va_start(args, format); va_start(args, format);
vsyslog(LOG_INFO, format, args); vsyslog(LOG_INFO, format, args);
va_end(args); va_end(args);
} }
#endif
} }
static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user) static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user)

View File

@@ -22,13 +22,12 @@
#include "adc/sid.h" #include "adc/sid.h"
#include "util/cbuffer.h" #include "util/cbuffer.h"
#include "util/memory.h" #include "util/memory.h"
#include "util/ipcalc.h" #include "network/ipcalc.h"
#include "plugin_api/handle.h" #include "plugin_api/handle.h"
#include "plugin_api/command_api.h" #include "plugin_api/command_api.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/config_token.h" #include "util/config_token.h"
#include <syslog.h>
#define MAX_WELCOME_SIZE 16384 #define MAX_WELCOME_SIZE 16384

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2009, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -99,11 +99,16 @@
#endif #endif
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
#ifdef SSL_USE_OPENSSL
#include <openssl/ssl.h> #include <openssl/ssl.h>
#include <openssl/err.h> #include <openssl/err.h>
#endif /* SSL_USE_OPENSSL */
#ifdef SSL_USE_GNUTLS
#include <gnutls/gnutls.h>
#endif /* SSL_USE_GNUTLS */
#endif #endif
#include "../version.h" #include "version.h"
#define uhub_assert assert #define uhub_assert assert
@@ -270,6 +275,7 @@ typedef unsigned __int64 uint64_t;
#define open _open #define open _open
#define close _close #define close _close
#define read _read #define read _read
#define write _write
#define NEED_GETOPT #define NEED_GETOPT
#endif #endif

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,50 @@
#define ADC_CID_SIZE 39 #define ADC_CID_SIZE 39
#define BIG_BUFSIZE 32768 #define BIG_BUFSIZE 32768
#define TIGERSIZE 24 #define TIGERSIZE 24
#define MAX_RECV_BUFFER 65536
// #define ADCC_DEBUG // #define ADCC_DEBUG
// #define ADC_CLIENT_DEBUG_PROTO
enum ADC_client_state
{
ps_none, /* Not connected */
ps_conn, /* Connecting... */
ps_conn_ssl, /* SSL handshake */
ps_protocol, /* Have sent HSUP */
ps_identify, /* Have sent BINF */
ps_verify, /* Have sent HPAS */
ps_normal, /* Are fully logged in */
};
enum ADC_client_flags
{
cflag_none = 0,
cflag_ssl = 1,
cflag_choke = 2,
cflag_pipe = 4,
};
struct ADC_client
{
sid_t sid;
enum ADC_client_state state;
struct adc_message* info;
struct ioq_recv* recv_queue;
struct ioq_send* send_queue;
adc_client_cb callback;
size_t s_offset;
size_t r_offset;
size_t timeout;
struct net_connection* con;
struct net_timer* timer;
struct sockaddr_in addr;
char* hub_address;
char* nick;
char* desc;
int flags;
void* ptr;
};
static ssize_t ADC_client_recv(struct ADC_client* client); static ssize_t ADC_client_recv(struct ADC_client* client);
static void ADC_client_send_info(struct ADC_client* client); static void ADC_client_send_info(struct ADC_client* client);
@@ -34,7 +77,8 @@ static void ADC_client_on_connected_ssl(struct ADC_client* client);
static void ADC_client_on_disconnected(struct ADC_client* client); static void ADC_client_on_disconnected(struct ADC_client* client);
static void ADC_client_on_login(struct ADC_client* client); static void ADC_client_on_login(struct ADC_client* client);
static int ADC_client_parse_address(struct ADC_client* client, const char* arg); static int ADC_client_parse_address(struct ADC_client* client, const char* arg);
static void ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length); static int ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length);
static int ADC_client_send_queue(struct ADC_client* client);
static void ADC_client_debug(struct ADC_client* client, const char* format, ...) static void ADC_client_debug(struct ADC_client* client, const char* format, ...)
{ {
@@ -144,7 +188,7 @@ static void event_callback(struct net_connection* con, int events, void *arg)
if (events & NET_EVENT_WRITE) if (events & NET_EVENT_WRITE)
{ {
/* FIXME: Call send again */ ADC_client_send_queue(client);
} }
} }
} }
@@ -156,12 +200,25 @@ static void event_callback(struct net_connection* con, int events, void *arg)
TARGET = NULL; \ TARGET = NULL; \
hub_free(TMP); hub_free(TMP);
#define UNESCAPE_ARG_X(TMP, TARGET, SIZE) \
if (TMP) \
adc_msg_unescape_to_target(TMP, TARGET, SIZE); \
else \
TARGET[0] = '\0'; \
hub_free(TMP);
#define EXTRACT_NAMED_ARG(MSG, NAME, TARGET) \ #define EXTRACT_NAMED_ARG(MSG, NAME, TARGET) \
do { \ do { \
char* tmp = adc_msg_get_named_argument(MSG, NAME); \ char* tmp = adc_msg_get_named_argument(MSG, NAME); \
UNESCAPE_ARG(tmp, TARGET); \ UNESCAPE_ARG(tmp, TARGET); \
} while (0) } while (0)
#define EXTRACT_NAMED_ARG_X(MSG, NAME, TARGET, SIZE) \
do { \
char* tmp = adc_msg_get_named_argument(MSG, NAME); \
UNESCAPE_ARG_X(tmp, TARGET, SIZE); \
} while(0)
#define EXTRACT_POS_ARG(MSG, POS, TARGET) \ #define EXTRACT_POS_ARG(MSG, POS, TARGET) \
do { \ do { \
char* tmp = adc_msg_get_argument(MSG, POS); \ char* tmp = adc_msg_get_argument(MSG, POS); \
@@ -169,11 +226,14 @@ static void event_callback(struct net_connection* con, int events, void *arg)
} while (0) } while (0)
static void ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length) static int ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length)
{ {
struct ADC_chat_message chat;
struct ADC_client_callback_data data;
ADC_TRACE; ADC_TRACE;
#ifdef ADC_CLIENT_DEBUG_PROTO #ifdef ADC_CLIENT_DEBUG_PROTO
ADC_client_debug(client, "- LINE: '%s'", start); ADC_client_debug(client, "- LINE: '%s'", line);
#endif #endif
/* Parse message */ /* Parse message */
@@ -181,13 +241,13 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
if (!msg) if (!msg)
{ {
ADC_client_debug(client, "WARNING: Message cannot be decoded: \"%s\"", line); ADC_client_debug(client, "WARNING: Message cannot be decoded: \"%s\"", line);
return; return -1;
} }
if (length < 4) if (length < 4)
{ {
ADC_client_debug(client, "Unexpected response from hub: '%s'", line); ADC_client_debug(client, "Unexpected response from hub: '%s'", line);
return; return -1;
} }
switch (msg->cmd) switch (msg->cmd)
@@ -210,12 +270,18 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
case ADC_CMD_DMSG: case ADC_CMD_DMSG:
case ADC_CMD_IMSG: case ADC_CMD_IMSG:
{ {
struct ADC_chat_message chat;
struct ADC_client_callback_data data;
chat.from_sid = msg->source; chat.from_sid = msg->source;
chat.to_sid = msg->target; chat.to_sid = msg->target;
data.chat = &chat; data.chat = &chat;
EXTRACT_POS_ARG(msg, 0, chat.message); EXTRACT_POS_ARG(msg, 0, chat.message);
chat.flags = 0;
if (adc_msg_has_named_argument(msg, ADC_MSG_FLAG_ACTION))
chat.flags |= chat_flags_action;
if (adc_msg_has_named_argument(msg, ADC_MSG_FLAG_PRIVATE))
chat.flags |= chat_flags_private;
client->callback(client, ADC_CLIENT_MESSAGE, &data); client->callback(client, ADC_CLIENT_MESSAGE, &data);
hub_free(chat.message); hub_free(chat.message);
break; break;
@@ -259,24 +325,33 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
{ {
struct ADC_user user; struct ADC_user user;
user.sid = msg->source; user.sid = msg->source;
EXTRACT_NAMED_ARG(msg, "NI", user.name); EXTRACT_NAMED_ARG_X(msg, "NI", user.name, sizeof(user.name));
EXTRACT_NAMED_ARG(msg, "DE", user.description); EXTRACT_NAMED_ARG_X(msg, "DE", user.description, sizeof(user.description));
EXTRACT_NAMED_ARG(msg, "VE", user.version); EXTRACT_NAMED_ARG_X(msg, "VE", user.version, sizeof(user.version));
EXTRACT_NAMED_ARG(msg, "ID", user.cid); EXTRACT_NAMED_ARG_X(msg, "ID", user.cid, sizeof(user.cid));
EXTRACT_NAMED_ARG(msg, "I4", user.address); EXTRACT_NAMED_ARG_X(msg, "I4", user.address, sizeof(user.address));
struct ADC_client_callback_data data; struct ADC_client_callback_data data;
data.user = &user; data.user = &user;
client->callback(client, ADC_CLIENT_USER_JOIN, &data); client->callback(client, ADC_CLIENT_USER_JOIN, &data);
hub_free(user.name);
hub_free(user.description);
hub_free(user.version);
hub_free(user.cid);
hub_free(user.address);
} }
} }
} }
break;
case ADC_CMD_IQUI:
{
struct ADC_client_quit_reason reason;
memset(&reason, 0, sizeof(reason));
reason.sid = string_to_sid(&line[5]);
if (adc_msg_has_named_argument(msg, ADC_QUI_FLAG_DISCONNECT))
reason.flags |= 1;
data.quit = &reason;
client->callback(client, ADC_CLIENT_USER_QUIT, &data);
break;
}
case ADC_CMD_ISTA: case ADC_CMD_ISTA:
/* /*
@@ -292,77 +367,133 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
} }
adc_msg_free(msg); adc_msg_free(msg);
return 0;
} }
static ssize_t ADC_client_recv(struct ADC_client* client) static ssize_t ADC_client_recv(struct ADC_client* client)
{ {
static char buf[BIG_BUFSIZE];
struct ioq_recv* q = client->recv_queue;
size_t buf_size = ioq_recv_get(q, buf, BIG_BUFSIZE);
ssize_t size;
ADC_TRACE; ADC_TRACE;
ssize_t size = net_con_recv(client->con, &client->recvbuf[client->r_offset], ADC_BUFSIZE - client->r_offset);
if (size <= 0)
return size;
client->r_offset += size; if (client->flags & cflag_choke)
client->recvbuf[client->r_offset] = 0; buf_size = 0;
size = net_con_recv(client->con, buf + buf_size, BIG_BUFSIZE - buf_size);
char* start = client->recvbuf; if (size > 0)
char* pos; buf_size += size;
char* lastPos = 0;
size_t remaining = client->r_offset;
while ((pos = memchr(start, '\n', remaining))) if (size < 0)
return -1;
else if (size == 0)
return 0;
else
{ {
pos[0] = 0; char* lastPos = 0;
char* start = buf;
char* pos = 0;
size_t remaining = buf_size;
ADC_client_on_recv_line(client, start, pos - start); while ((pos = memchr(start, '\n', remaining)))
{
lastPos = pos+1;
pos[0] = '\0';
pos++; #ifdef DEBUG_SENDQ
remaining -= (pos - start); LOG_DUMP("PROC: \"%s\" (%d)\n", start, (int) (pos - start));
start = pos; #endif
lastPos = pos;
if (client->flags & cflag_choke)
client->flags &= ~cflag_choke;
else
{
if (((pos - start) > 0) && MAX_RECV_BUFFER > (pos - start))
{
if (ADC_client_on_recv_line(client, start, pos - start) == -1)
return -1;
}
}
pos[0] = '\n'; /* FIXME: not needed */
pos ++;
remaining -= (pos - start);
start = pos;
}
if (lastPos || remaining)
{
if (remaining < (size_t) MAX_RECV_BUFFER)
{
ioq_recv_set(q, lastPos ? lastPos : buf, remaining);
}
else
{
ioq_recv_set(q, 0, 0);
client->flags |= cflag_choke;
LOG_WARN("Received message past MAX_RECV_BUFFER (%d), dropping message.", MAX_RECV_BUFFER);
}
}
else
{
ioq_recv_set(q, 0, 0);
}
}
return 0;
}
static int ADC_client_send_queue(struct ADC_client* client)
{
int ret = 0;
while (ioq_send_get_bytes(client->send_queue))
{
ret = ioq_send_send(client->send_queue, client->con);
if (ret <= 0)
break;
} }
if (lastPos) if (ret < 0)
return quit_socket_error;
if (ioq_send_get_bytes(client->send_queue))
{ {
memmove(client->recvbuf, lastPos, remaining); net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE);
client->r_offset = remaining; }
else
{
net_con_update(client->con, NET_EVENT_READ);
} }
return 0; return 0;
} }
void ADC_client_send(struct ADC_client* client, char* msg) void ADC_client_send(struct ADC_client* client, struct adc_message* msg)
{ {
ADC_TRACE; ADC_TRACE;
int ret = net_con_send(client->con, msg, strlen(msg));
#ifdef ADC_CLIENT_DEBUG_PROTO uhub_assert(client->con != NULL);
char* dump = strdup(msg); uhub_assert(msg->cache && *msg->cache);
dump[strlen(msg) - 1] = 0;
ADC_client_debug(client, "- SEND: '%s'", dump);
free(dump);
#endif
if (ret != strlen(msg)) if (ioq_send_is_empty(client->send_queue) && !(client->flags & cflag_pipe))
{ {
if (ret == -1) /* Perform oportunistic write */
{ ioq_send_add(client->send_queue, msg);
if (net_error() != EWOULDBLOCK) ADC_client_send_queue(client);
ADC_client_on_disconnected(client); }
} else
else {
{ ioq_send_add(client->send_queue, msg);
/* FIXME: Not all data sent! */ if (!(client->flags & cflag_pipe))
printf("ret (%d) != msg->length (%d)\n", ret, (int) strlen(msg)); net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE);
}
} }
} }
void ADC_client_send_info(struct ADC_client* client) void ADC_client_send_info(struct ADC_client* client)
{ {
ADC_TRACE; ADC_TRACE;
char binf[11]; client->info = adc_msg_construct_source(ADC_CMD_BINF, client->sid, 64);
snprintf(binf, 11, "BINF %s\n", sid_to_string(client->sid));
client->info = adc_msg_create(binf);
adc_msg_add_named_argument_string(client->info, ADC_INF_FLAG_NICK, client->nick); adc_msg_add_named_argument_string(client->info, ADC_INF_FLAG_NICK, client->nick);
@@ -374,43 +505,38 @@ void ADC_client_send_info(struct ADC_client* client)
adc_msg_add_named_argument_string(client->info, ADC_INF_FLAG_USER_AGENT, PRODUCT "/" VERSION); adc_msg_add_named_argument_string(client->info, ADC_INF_FLAG_USER_AGENT, PRODUCT "/" VERSION);
adc_cid_pid(client); adc_cid_pid(client);
ADC_client_send(client, client->info->cache); ADC_client_send(client, client->info);
} }
int ADC_client_create(struct ADC_client* client, const char* nickname, const char* description)
struct ADC_client* ADC_client_create(const char* nickname, const char* description, void* ptr)
{ {
ADC_TRACE; ADC_TRACE;
memset(client, 0, sizeof(struct ADC_client)); struct ADC_client* client = (struct ADC_client*) hub_malloc_zero(sizeof(struct ADC_client));
int sd = net_socket_create(PF_INET, SOCK_STREAM, IPPROTO_TCP); int sd = net_socket_create(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sd == -1) return -1; if (sd == -1) return NULL;
client->con = net_con_create(); client->con = net_con_create();
#if 0
/* FIXME */
client->timer = 0; /* FIXME: hub_malloc(sizeof(struct net_timer)); */
#endif
net_con_initialize(client->con, sd, event_callback, client, 0); net_con_initialize(client->con, sd, event_callback, client, 0);
#if 0
/* FIXME */
net_timer_initialize(client->timer, timer_callback, client);
#endif
ADC_client_set_state(client, ps_none); ADC_client_set_state(client, ps_none);
client->nick = hub_strdup(nickname); client->nick = hub_strdup(nickname);
client->desc = hub_strdup(description); client->desc = hub_strdup(description);
return 0; client->send_queue = ioq_send_create();
client->recv_queue = ioq_recv_create();
client->ptr = ptr;
return client;
} }
void ADC_client_destroy(struct ADC_client* client) void ADC_client_destroy(struct ADC_client* client)
{ {
ADC_TRACE; ADC_TRACE;
ADC_client_disconnect(client); ADC_client_disconnect(client);
#if 0 ioq_send_destroy(client->send_queue);
/* FIXME */ ioq_recv_destroy(client->recv_queue);
net_timer_shutdown(client->timer);
#endif
hub_free(client->timer); hub_free(client->timer);
adc_msg_free(client->info); adc_msg_free(client->info);
hub_free(client->nick); hub_free(client->nick);
@@ -451,18 +577,20 @@ static void ADC_client_on_connected(struct ADC_client* client)
{ {
ADC_TRACE; ADC_TRACE;
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (client->ssl_enabled) if (client->flags & cflag_ssl)
{ {
net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE); net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE);
client->callback(client, ADC_CLIENT_SSL_HANDSHAKE, 0); client->callback(client, ADC_CLIENT_SSL_HANDSHAKE, 0);
ADC_client_set_state(client, ps_conn_ssl); ADC_client_set_state(client, ps_conn_ssl);
net_con_ssl_handshake(client->con, net_con_ssl_mode_client, NULL);
} }
else else
#endif #endif
{ {
net_con_update(client->con, NET_EVENT_READ); net_con_update(client->con, NET_EVENT_READ);
client->callback(client, ADC_CLIENT_CONNECTED, 0); client->callback(client, ADC_CLIENT_CONNECTED, 0);
ADC_client_send(client, ADC_HANDSHAKE); ADC_client_send(client, adc_msg_create(ADC_HANDSHAKE));
ADC_client_set_state(client, ps_protocol); ADC_client_set_state(client, ps_protocol);
} }
} }
@@ -471,9 +599,10 @@ static void ADC_client_on_connected(struct ADC_client* client)
static void ADC_client_on_connected_ssl(struct ADC_client* client) static void ADC_client_on_connected_ssl(struct ADC_client* client)
{ {
ADC_TRACE; ADC_TRACE;
net_con_update(client->con, NET_EVENT_READ); client->callback(client, ADC_CLIENT_SSL_OK, 0);
client->callback(client, ADC_CLIENT_CONNECTED, 0); client->callback(client, ADC_CLIENT_CONNECTED, 0);
ADC_client_send(client, ADC_HANDSHAKE); net_con_update(client->con, NET_EVENT_READ);
ADC_client_send(client, adc_msg_create(ADC_HANDSHAKE));
ADC_client_set_state(client, ps_protocol); ADC_client_set_state(client, ps_protocol);
} }
#endif #endif
@@ -522,10 +651,12 @@ static int ADC_client_parse_address(struct ADC_client* client, const char* arg)
/* Check for ADC or ADCS */ /* Check for ADC or ADCS */
if (!strncmp(arg, "adc://", 6)) if (!strncmp(arg, "adc://", 6))
client->ssl_enabled = 0; {
client->flags &= ~cflag_ssl;
}
else if (!strncmp(arg, "adcs://", 7)) else if (!strncmp(arg, "adcs://", 7))
{ {
client->ssl_enabled = 1; client->flags |= cflag_ssl;
ssl = 1; ssl = 1;
} }
else else
@@ -563,3 +694,23 @@ void ADC_client_set_callback(struct ADC_client* client, adc_client_cb cb)
ADC_TRACE; ADC_TRACE;
client->callback = cb; client->callback = cb;
} }
sid_t ADC_client_get_sid(const struct ADC_client* client)
{
return client->sid;
}
const char* ADC_client_get_nick(const struct ADC_client* client)
{
return client->nick;
}
const char* ADC_client_get_description(const struct ADC_client* client)
{
return client->desc;
}
void* ADC_client_get_ptr(const struct ADC_client* client)
{
return client->ptr;
}

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -24,17 +24,6 @@
#define ADC_BUFSIZE 16384 #define ADC_BUFSIZE 16384
enum ADC_client_state
{
ps_none, /* Not connected */
ps_conn, /* Connecting... */
ps_conn_ssl, /* SSL handshake */
ps_protocol, /* Have sent HSUP */
ps_identify, /* Have sent BINF */
ps_verify, /* Have sent HPAS */
ps_normal, /* Are fully logged in */
};
struct ADC_client; struct ADC_client;
enum ADC_client_callback_type enum ADC_client_callback_type
@@ -71,6 +60,13 @@ struct ADC_hub_info
char* version; char* version;
}; };
enum ADC_chat_message_flags
{
chat_flags_none = 0,
chat_flags_action = 1,
chat_flags_private = 2
};
struct ADC_chat_message struct ADC_chat_message
{ {
sid_t from_sid; sid_t from_sid;
@@ -79,14 +75,23 @@ struct ADC_chat_message
int flags; int flags;
}; };
#define MAX_DESC_LEN 128
struct ADC_user struct ADC_user
{ {
sid_t sid; sid_t sid;
char* cid; char cid[MAX_CID_LEN+1];
char* name; char name[MAX_NICK_LEN+1];
char* description; char description[MAX_DESC_LEN+1];
char* address; char address[INET6_ADDRSTRLEN+1];
char* version; char version[MAX_UA_LEN+1];
};
struct ADC_client_quit_reason
{
sid_t sid;
sid_t initator; // 0 = default/hub.
char message[128]; // optional
int flags;
}; };
@@ -96,41 +101,23 @@ struct ADC_client_callback_data
struct ADC_hub_info* hubinfo; struct ADC_hub_info* hubinfo;
struct ADC_chat_message* chat; struct ADC_chat_message* chat;
struct ADC_user* user; struct ADC_user* user;
struct ADC_client_quit_reason* quit;
}; };
}; };
sid_t ADC_client_get_sid(const struct ADC_client* client);
const char* ADC_client_get_nick(const struct ADC_client* client);
const char* ADC_client_get_description(const struct ADC_client* client);
void* ADC_client_get_ptr(const struct ADC_client* client);
typedef int (*adc_client_cb)(struct ADC_client*, enum ADC_client_callback_type, struct ADC_client_callback_data* data); typedef int (*adc_client_cb)(struct ADC_client*, enum ADC_client_callback_type, struct ADC_client_callback_data* data);
struct ADC_client struct ADC_client* ADC_client_create(const char* nickname, const char* description, void* ptr);
{
sid_t sid;
enum ADC_client_state state;
struct adc_message* info;
char recvbuf[ADC_BUFSIZE];
char sendbuf[ADC_BUFSIZE];
adc_client_cb callback;
size_t s_offset;
size_t r_offset;
size_t timeout;
struct net_connection* con;
struct net_timer* timer;
struct sockaddr_in addr;
char* hub_address;
char* nick;
char* desc;
int ssl_enabled;
#ifdef SSL_SUPPORT
const SSL_METHOD* ssl_method;
SSL_CTX* ssl_ctx;
#endif /* SSL_SUPPORT */
};
int ADC_client_create(struct ADC_client* client, const char* nickname, const char* description);
void ADC_client_set_callback(struct ADC_client* client, adc_client_cb); void ADC_client_set_callback(struct ADC_client* client, adc_client_cb);
void ADC_client_destroy(struct ADC_client* client); void ADC_client_destroy(struct ADC_client* client);
int ADC_client_connect(struct ADC_client* client, const char* address); int ADC_client_connect(struct ADC_client* client, const char* address);
void ADC_client_disconnect(struct ADC_client* client); void ADC_client_disconnect(struct ADC_client* client);
void ADC_client_send(struct ADC_client* client, char* msg); void ADC_client_send(struct ADC_client* client, struct adc_message* msg);
#endif /* HAVE_UHUB_ADC_CLIENT_H */ #endif /* HAVE_UHUB_ADC_CLIENT_H */

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -24,10 +24,12 @@
#define ADC_CID_SIZE 39 #define ADC_CID_SIZE 39
#define BIG_BUFSIZE 32768 #define BIG_BUFSIZE 32768
#define TIGERSIZE 24 #define TIGERSIZE 24
#define STATS_INTERVAL 3
#define ADCRUSH "adcrush/0.3" #define ADCRUSH "adcrush/0.3"
#define ADC_NICK "[BOT]adcrush" #define ADC_NICK "[BOT]adcrush"
#define ADC_DESC "crash\\stest\\sdummy" #define ADC_DESC "crash\\stest\\sdummy"
#define LVL_INFO 1 #define LVL_INFO 1
#define LVL_DEBUG 2 #define LVL_DEBUG 2
#define LVL_VERBOSE 3 #define LVL_VERBOSE 3
@@ -38,6 +40,32 @@ static int cfg_level = 1; /* activity level (0..3) */
static int cfg_chat = 0; /* chat mode, allow sending chat messages */ static int cfg_chat = 0; /* chat mode, allow sending chat messages */
static int cfg_quiet = 0; /* quiet mode (no output) */ static int cfg_quiet = 0; /* quiet mode (no output) */
static int cfg_clients = ADC_CLIENTS_DEFAULT; /* number of clients */ static int cfg_clients = ADC_CLIENTS_DEFAULT; /* number of clients */
static int cfg_netstats_interval = STATS_INTERVAL;
static int running = 1;
static int logged_in = 0;
static int blank = 0;
static struct net_statistics* stats_intermediate;
static struct net_statistics* stats_total;
static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data);
static void timer_callback(struct timeout_evt* t);
static void do_blank(int n)
{
n++;
while (n > 0)
{
fprintf(stdout, " ");
n--;
}
}
struct AdcFuzzUser
{
struct ADC_client* client;
struct timeout_evt* timer;
int logged_in;
};
#define MAX_CHAT_MSGS 35 #define MAX_CHAT_MSGS 35
const char* chat_messages[MAX_CHAT_MSGS] = { const char* chat_messages[MAX_CHAT_MSGS] = {
@@ -103,10 +131,14 @@ static void bot_output(struct ADC_client* client, int level, const char* format,
va_end(args); va_end(args);
if (cfg_debug >= level) if (cfg_debug >= level)
fprintf(stdout, "* [%p] %s\n", client, logmsg); {
int num = fprintf(stdout, "* [%p] %s", client, logmsg);
do_blank(blank - num);
fprintf(stdout, "\n");
}
} }
#if 0
static size_t get_wait_rand(size_t max) static size_t get_wait_rand(size_t max)
{ {
static size_t next = 0; static size_t next = 0;
@@ -115,120 +147,144 @@ static size_t get_wait_rand(size_t max)
return ((size_t )(next / 65536) % max); return ((size_t )(next / 65536) % max);
} }
static size_t get_next_timeout_evt()
{
switch (cfg_level)
{
case 0: return get_wait_rand(120);
case 1: return get_wait_rand(60);
case 2: return get_wait_rand(15);
case 3: return get_wait_rand(5);
}
}
static void perf_result(struct ADC_client* client, sid_t target, const char* what, const char* token); static void perf_result(struct ADC_client* client, sid_t target, const char* what, const char* token);
static void perf_chat(struct ADC_client* client, int priv) static void perf_chat(struct ADC_client* client, int priv)
{ {
char buf[1024] = { 0, };
size_t r = get_wait_rand(MAX_CHAT_MSGS-1); size_t r = get_wait_rand(MAX_CHAT_MSGS-1);
char* msg = adc_msg_escape(chat_messages[r]); char* msg = adc_msg_escape(chat_messages[r]);
struct adc_message* cmd = NULL;
if (priv) if (priv)
{ cmd = adc_msg_construct_source_dest(ADC_CMD_DMSG, ADC_client_get_sid(client), ADC_client_get_sid(client), strlen(msg));
strcat(buf, "EMSG ");
strcat(buf, sid_to_string(client->sid));
strcat(buf, " ");
strcat(buf, sid_to_string(client->sid));
}
else else
{ cmd = adc_msg_construct_source(ADC_CMD_BMSG, ADC_client_get_sid(client), strlen(msg));
strcat(buf, "BMSG ");
strcat(buf, sid_to_string(client->sid));
}
strcat(buf, " ");
strcat(buf, msg);
hub_free(msg); hub_free(msg);
strcat(buf, "\n"); ADC_client_send(client, cmd);
ADC_client_send(client, buf);
} }
static void perf_search(struct ADC_client* client) static void perf_search(struct ADC_client* client)
{ {
char buf[1024] = { 0, };
size_t r = get_wait_rand(MAX_SEARCH_MSGS-1); size_t r = get_wait_rand(MAX_SEARCH_MSGS-1);
size_t pst = get_wait_rand(100); size_t pst = get_wait_rand(100);
struct adc_message* cmd = NULL;
if (pst > 80) if (pst > 80)
{ {
strcat(buf, "FSCH "); cmd = adc_msg_construct_source(ADC_CMD_FSCH, ADC_client_get_sid(client), strlen(search_messages[r]) + 6);
strcat(buf, sid_to_string(client->sid)); adc_msg_add_argument(cmd, "+TCP4");
strcat(buf, " +TCP4 ");
} }
else else
{ {
strcat(buf, "BSCH "); cmd = adc_msg_construct_source(ADC_CMD_BSCH, ADC_client_get_sid(client), strlen(search_messages[r]) + 6);
strcat(buf, sid_to_string(client->sid)); adc_msg_add_argument(cmd, "+TCP4");
strcat(buf, " ");
} }
strcat(buf, search_messages[r]); ADC_client_send(client, cmd);
strcat(buf, "\n");
ADC_client_send(client, buf);
} }
static void perf_result(struct ADC_client* client, sid_t target, const char* what, const char* token) static void perf_result(struct ADC_client* client, sid_t target, const char* what, const char* token)
{ {
char buf[1024] = { 0, }; char tmp[256];
strcat(buf, "DRES "); struct adc_message* cmd = adc_msg_construct_source_dest(ADC_CMD_DRES, ADC_client_get_sid(client), target, strlen(what) + strlen(token) + 64);
strcat(buf, sid_to_string(client->sid));
strcat(buf, " "); snprintf(tmp, sizeof(tmp), "FNtest/%s.dat", what);
strcat(buf, sid_to_string(target)); adc_msg_add_argument(cmd, tmp);
strcat(buf, " FN" "test/");
strcat(buf, what); adc_msg_add_argument(cmd, "SL0");
strcat(buf, ".dat"); adc_msg_add_argument(cmd, "SI1209818412");
strcat(buf, " SL" "0"); adc_msg_add_argument(cmd, "TR5T6YJYKO3WECS52BKWVSOP5VUG4IKNSZBZ5YHBA");
strcat(buf, " SI" "908987128912"); snprintf(tmp, sizeof(tmp), "TO%s", token);
strcat(buf, " TR" "5T6YJYKO3WECS52BKWVSOP5VUG4IKNSZBZ5YHBA"); adc_msg_add_argument(cmd, tmp);
strcat(buf, " TO");
strcat(buf, token); ADC_client_send(client, cmd);
strcat(buf, "\n");
ADC_client_send(client, buf);
} }
static void perf_ctm(struct ADC_client* client) static void perf_ctm(struct ADC_client* client)
{ {
char buf[1024] = { 0, }; char buf[1024] = { 0, };
strcat(buf, "DCTM "); struct adc_message* cmd = adc_msg_construct_source_dest(ADC_CMD_DCTM, ADC_client_get_sid(client), ADC_client_get_sid(client), 32);
strcat(buf, sid_to_string(client->sid)); adc_msg_add_argument(cmd, "ADC/1.0");
strcat(buf, " "); adc_msg_add_argument(cmd, "TOKEN123456");
strcat(buf, sid_to_string(client->sid)); adc_msg_add_argument(cmd, sid_to_string(ADC_client_get_sid(client)));
strcat(buf, " "); ADC_client_send(client, cmd);
strcat(buf, "ADC/1.0");
strcat(buf, " TOKEN111");
strcat(buf, sid_to_string(client->sid));
strcat(buf, "\n");
ADC_client_send(client, buf);
} }
static void perf_update(struct ADC_client* client) static void perf_update(struct ADC_client* client)
{ {
char buf[1024] = { 0, }; char buf[16] = { 0, };
int n = (int) get_wait_rand(10)+1; int n = (int) get_wait_rand(10)+1;
struct adc_message* cmd = adc_msg_construct_source(ADC_CMD_BINF, ADC_client_get_sid(client), 32);
strcat(buf, "BINF "); snprintf(buf, sizeof(buf), "HN%d", n);
strcat(buf, sid_to_string(client->sid)); adc_msg_add_argument(cmd, buf);
strcat(buf, " HN"); ADC_client_send(client, cmd);
strcat(buf, uhub_itoa(n)); }
strcat(buf, "\n"); static void client_disconnect(struct AdcFuzzUser* c)
ADC_client_send(client, buf); {
ADC_client_destroy(c->client);
hub_free(c->client);
c->client = 0;
timeout_queue_remove(net_backend_get_timeout_queue(), c->timer);
hub_free(c->timer);
c->timer = 0;
c->logged_in = 0;
}
static void client_connect(struct AdcFuzzUser* c, const char* nick, const char* description)
{
size_t timeout = get_next_timeout_evt();
struct ADC_client* client = ADC_client_create(nick, description, c);
c->client = client;
c->timer = (struct timeout_evt*) hub_malloc(sizeof(struct timeout_evt));
timeout_evt_initialize(c->timer, timer_callback, c);
timeout_queue_insert(net_backend_get_timeout_queue(), c->timer, timeout);
bot_output(client, LVL_VERBOSE, "Initial timeout: %d seconds", timeout);
c->logged_in = 0;
ADC_client_set_callback(client, handle);
ADC_client_connect(client, cfg_uri);
} }
static void perf_normal_action(struct ADC_client* client) static void perf_normal_action(struct ADC_client* client)
{ {
struct AdcFuzzUser* user = (struct AdcFuzzUser*) ADC_client_get_ptr(client);
size_t r = get_wait_rand(5); size_t r = get_wait_rand(5);
size_t p = get_wait_rand(100); size_t p = get_wait_rand(100);
switch (r) switch (r)
{ {
case 0: case 0:
if (p > (90 - (10 * cfg_level))) // if (p > (90 - (10 * cfg_level)))
{ {
struct ADC_client* c;
char* nick = hub_strdup(ADC_client_get_nick(client));
char* desc = hub_strdup(ADC_client_get_description(client));
bot_output(client, LVL_VERBOSE, "timeout -> disconnect"); bot_output(client, LVL_VERBOSE, "timeout -> disconnect");
ADC_client_disconnect(client); client_disconnect(user);
client_connect(user, nick, desc);
hub_free(nick);
hub_free(desc);
} }
break; break;
@@ -236,37 +292,43 @@ static void perf_normal_action(struct ADC_client* client)
if (cfg_chat) if (cfg_chat)
{ {
bot_output(client, LVL_VERBOSE, "timeout -> chat"); bot_output(client, LVL_VERBOSE, "timeout -> chat");
perf_chat(client, 0); if (user->logged_in)
perf_chat(client, 0);
} }
break; break;
case 2: case 2:
bot_output(client, LVL_VERBOSE, "timeout -> search"); bot_output(client, LVL_VERBOSE, "timeout -> search");
perf_search(client); if (user->logged_in)
perf_search(client);
break; break;
case 3: case 3:
bot_output(client, LVL_VERBOSE, "timeout -> update"); bot_output(client, LVL_VERBOSE, "timeout -> update");
perf_update(client); if (user->logged_in)
perf_update(client);
break; break;
case 4: case 4:
bot_output(client, LVL_VERBOSE, "timeout -> privmsg"); bot_output(client, LVL_VERBOSE, "timeout -> privmsg");
perf_chat(client, 1); if (user->logged_in)
perf_chat(client, 1);
break; break;
case 5: case 5:
bot_output(client, LVL_VERBOSE, "timeout -> ctm/rcm"); bot_output(client, LVL_VERBOSE, "timeout -> ctm/rcm");
perf_ctm(client); if (user->logged_in)
perf_ctm(client);
break; break;
} }
} }
#endif
static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data) static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data)
{ {
struct AdcFuzzUser* user = (struct AdcFuzzUser*) ADC_client_get_ptr(client);
switch (type) switch (type)
{ {
case ADC_CLIENT_CONNECTING: case ADC_CLIENT_CONNECTING:
@@ -274,7 +336,7 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
break; break;
case ADC_CLIENT_CONNECTED: case ADC_CLIENT_CONNECTED:
bot_output(client, LVL_DEBUG, "*** Connected."); // bot_output(client, LVL_DEBUG, "*** Connected.");
break; break;
case ADC_CLIENT_DISCONNECTED: case ADC_CLIENT_DISCONNECTED:
@@ -282,38 +344,40 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
break; break;
case ADC_CLIENT_LOGGING_IN: case ADC_CLIENT_LOGGING_IN:
bot_output(client, LVL_DEBUG, "*** Logging in..."); // bot_output(client, LVL_DEBUG, "*** Logging in...");
break; break;
case ADC_CLIENT_PASSWORD_REQ: case ADC_CLIENT_PASSWORD_REQ:
bot_output(client, LVL_DEBUG, "*** Requesting password."); //bot_output(client, LVL_DEBUG, "*** Requesting password.");
break;
case ADC_CLIENT_LOGGED_IN: case ADC_CLIENT_LOGGED_IN:
bot_output(client, LVL_DEBUG, "*** Logged in."); bot_output(client, LVL_DEBUG, "*** Logged in.");
user->logged_in = 1;
break; break;
case ADC_CLIENT_LOGIN_ERROR: case ADC_CLIENT_LOGIN_ERROR:
bot_output(client, LVL_DEBUG, "*** Login error"); bot_output(client, LVL_DEBUG, "*** Login error");
break; break;
case ADC_CLIENT_SSL_HANDSHAKE:
case ADC_CLIENT_SSL_OK:
break;
case ADC_CLIENT_MESSAGE: case ADC_CLIENT_MESSAGE:
bot_output(client, LVL_DEBUG, " <%s> %s", sid_to_string(data->chat->from_sid), data->chat->message); // bot_output(client, LVL_DEBUG, " <%s> %s", sid_to_string(data->chat->from_sid), data->chat->message);
break; break;
case ADC_CLIENT_USER_JOIN: case ADC_CLIENT_USER_JOIN:
bot_output(client, LVL_VERBOSE, " JOIN: %s", data->user->name);
break; break;
case ADC_CLIENT_USER_QUIT: case ADC_CLIENT_USER_QUIT:
bot_output(client, LVL_VERBOSE, " QUIT");
break; break;
case ADC_CLIENT_SEARCH_REQ: case ADC_CLIENT_SEARCH_REQ:
break; break;
case ADC_CLIENT_HUB_INFO: case ADC_CLIENT_HUB_INFO:
bot_output(client, LVL_DEBUG, " Hub: \"%s\" [%s]\n"
" \"%s\"\n", data->hubinfo->name, data->hubinfo->version, data->hubinfo->description);
break; break;
default: default:
@@ -324,40 +388,78 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
return 1; return 1;
} }
static void timer_callback(struct timeout_evt* t)
{
size_t timeout = get_next_timeout_evt();
struct AdcFuzzUser* client = (struct AdcFuzzUser*) t->ptr;
if (client->logged_in)
{
perf_normal_action(client->client);
bot_output(client->client, LVL_VERBOSE, "Next timeout: %d seconds", (int) timeout);
}
timeout_queue_reschedule(net_backend_get_timeout_queue(), client->timer, timeout);
}
static struct AdcFuzzUser client[ADC_MAX_CLIENTS];
void p_status()
{
static char rxbuf[64] = { "0 B" };
static char txbuf[64] = { "0 B" };
int logged_in = 0;
size_t n;
static size_t rx = 0, tx = 0;
for (n = 0; n < cfg_clients; n++)
{
if (client[n].logged_in)
logged_in++;
}
if (difftime(time(NULL), stats_intermediate->timestamp) >= cfg_netstats_interval)
{
net_stats_get(&stats_intermediate, &stats_total);
rx = stats_intermediate->rx / cfg_netstats_interval;
tx = stats_intermediate->tx / cfg_netstats_interval;
net_stats_reset();
format_size(rx, rxbuf, sizeof(rxbuf));
format_size(tx, txbuf, sizeof(txbuf));
}
n = blank;
blank = printf("Connected bots: %d/%d, network: rx=%s/s, tx=%s/s", logged_in, cfg_clients, rxbuf, txbuf);
if (n > blank)
do_blank(n-blank);
printf("\r");
}
void runloop(size_t clients) void runloop(size_t clients)
{ {
size_t n = 0; size_t n = 0;
struct ADC_client* client[ADC_MAX_CLIENTS]; blank = 0;
for (n = 0; n < clients; n++) for (n = 0; n < clients; n++)
{ {
struct ADC_client* c = malloc(sizeof(struct ADC_client));
client[n] = c;
char nick[20]; char nick[20];
snprintf(nick, 20, "adcrush_%d", (int) n); snprintf(nick, 20, "adcrush_%d", (int) n);
client_connect(&client[n], nick, "stresstester");
ADC_client_create(c, nick, "stresstester");
ADC_client_set_callback(c, handle);
ADC_client_connect(c, cfg_uri);
} }
while (net_backend_process()) while (running && net_backend_process())
{ {
p_status();
} }
for (n = 0; n < clients; n++) for (n = 0; n < clients; n++)
{ {
ADC_client_destroy(client[n]); struct AdcFuzzUser* c = &client[n];
free(client[n]); client_disconnect(c);
client[n] = 0;
} }
} }
static void print_version() static void print_version()
{ {
printf(ADCRUSH "\n"); printf(ADCRUSH "\n");
printf("Copyright (C) 2008-2009, Jan Vidar Krey\n"); printf("Copyright (C) 2008-2012, Jan Vidar Krey\n");
printf("\n"); printf("\n");
} }
@@ -374,6 +476,7 @@ static void print_usage(const char* program)
printf(" -c Allow broadcasting chat messages.\n"); printf(" -c Allow broadcasting chat messages.\n");
printf(" -d Enable debug output.\n"); printf(" -d Enable debug output.\n");
printf(" -q Quiet mode (no output).\n"); printf(" -q Quiet mode (no output).\n");
printf(" -i <num> Average network statistics for given interval (default: 3)\n");
printf("\n"); printf("\n");
exit(0); exit(0);
@@ -407,6 +510,10 @@ int parse_arguments(int argc, char** argv)
{ {
cfg_level = MIN(MAX(uhub_atoi(argv[opt]), 0), 3); cfg_level = MIN(MAX(uhub_atoi(argv[opt]), 0), 3);
} }
else if (!strcmp(argv[opt], "-i") && (++opt) < argc)
{
cfg_netstats_interval = MAX(uhub_atoi(argv[opt]), 1);
}
else if (!strcmp(argv[opt], "-n") && (++opt) < argc) else if (!strcmp(argv[opt], "-n") && (++opt) < argc)
{ {
cfg_clients = MIN(MAX(uhub_atoi(argv[opt]), 1), ADC_MAX_CLIENTS); cfg_clients = MIN(MAX(uhub_atoi(argv[opt]), 1), ADC_MAX_CLIENTS);
@@ -428,13 +535,15 @@ void parse_command_line(int argc, char** argv)
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
parse_command_line(argc, argv); parse_command_line(argc, argv);
net_initialize(); net_initialize();
net_stats_get(&stats_intermediate, &stats_total);
hub_log_initialize(NULL, 0); hub_log_initialize(NULL, 0);
hub_set_log_verbosity(1000); hub_set_log_verbosity(1000);
setvbuf(stdout, NULL, _IONBF, 0);
runloop(cfg_clients); runloop(cfg_clients);
net_destroy(); net_destroy();

View File

@@ -19,52 +19,122 @@
#include "adcclient.h" #include "adcclient.h"
static struct ADC_user g_usermap[SID_MAX];
static void user_add(const struct ADC_user* user)
{
printf(" >> JOIN: %s (%s)\n", user->name, user->address);
memcpy(&g_usermap[user->sid], user, sizeof(struct ADC_user));
}
static struct ADC_user* user_get(sid_t sid)
{
struct ADC_user* user = &g_usermap[sid];
uhub_assert(user->sid != 0);
return user;
}
static void user_remove(const struct ADC_client_quit_reason* quit)
{
struct ADC_user* user = user_get(quit->sid);
printf(" << QUIT: %s (%s)\n", user->name, quit->message);
memset(&g_usermap[quit->sid], 0, sizeof(struct ADC_user));
}
static void on_message(struct ADC_chat_message* chat)
{
struct ADC_user* user;
const char* pm = (chat->flags & chat_flags_private) ? "PM" : " ";
const char* brack1 = (chat->flags & chat_flags_action) ? "*" : "<";
const char* brack2 = (chat->flags & chat_flags_action) ? "" : ">";
struct linked_list* lines;
int ret;
char* line;
if (!chat->from_sid)
{
printf("HUB ");
}
else
{
user = user_get(chat->from_sid);
printf(" %s %s%s%s ", pm, brack1, user->name, brack2);
}
lines = list_create();
ret = split_string(chat->message, "\n", lines, 1);
line = (char*) list_get_first(lines);
ret = 0;
while (line)
{
if (ret > 0)
printf(" ");
printf("%s\n", line);
ret++;
line = (char*) list_get_next(lines);
}
list_clear(lines, &hub_free);
list_destroy(lines);
}
static void status(const char* msg)
{
printf("*** %s\n", msg);
}
static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data) static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data)
{ {
switch (type) switch (type)
{ {
case ADC_CLIENT_CONNECTING: case ADC_CLIENT_CONNECTING:
puts("*** Connecting..."); status("Connecting...");
break; break;
case ADC_CLIENT_CONNECTED: case ADC_CLIENT_CONNECTED:
puts("*** Connected."); status("Connected.");
break; break;
case ADC_CLIENT_DISCONNECTED: case ADC_CLIENT_DISCONNECTED:
puts("*** Disconnected."); status("Disconnected.");
break; break;
case ADC_CLIENT_SSL_HANDSHAKE: case ADC_CLIENT_SSL_HANDSHAKE:
puts("*** SSL handshake."); status("SSL handshake.");
break; break;
case ADC_CLIENT_LOGGING_IN: case ADC_CLIENT_LOGGING_IN:
puts("*** Logging in..."); status("Logging in...");
break; break;
case ADC_CLIENT_PASSWORD_REQ: case ADC_CLIENT_PASSWORD_REQ:
puts("*** Requesting password."); status("Requesting password.");
break; break;
case ADC_CLIENT_LOGGED_IN: case ADC_CLIENT_LOGGED_IN:
puts("*** Logged in."); status("Logged in.");
break; break;
case ADC_CLIENT_LOGIN_ERROR: case ADC_CLIENT_LOGIN_ERROR:
puts("*** Login error"); status("Login error");
break; break;
case ADC_CLIENT_MESSAGE: case ADC_CLIENT_MESSAGE:
printf(" <%s> %s\n", sid_to_string(data->chat->from_sid), data->chat->message); on_message(data->chat);
break; break;
case ADC_CLIENT_USER_JOIN: case ADC_CLIENT_USER_JOIN:
printf(" JOIN: %s %s\n", sid_to_string(data->user->sid), data->user->name);
user_add(data->user);
break; break;
case ADC_CLIENT_USER_QUIT: case ADC_CLIENT_USER_QUIT:
printf(" QUIT\n"); user_remove(data->quit);
break; break;
case ADC_CLIENT_SEARCH_REQ: case ADC_CLIENT_SEARCH_REQ:
@@ -93,16 +163,18 @@ int main(int argc, char** argv)
return 1; return 1;
} }
struct ADC_client client; struct ADC_client* client;
net_initialize(); net_initialize();
ADC_client_create(&client, "uhub-admin", "stresstester"); memset(g_usermap, 0, sizeof(g_usermap));
ADC_client_set_callback(&client, handle);
ADC_client_connect(&client, argv[1]); client = ADC_client_create("uhub-admin", "stresstester", NULL);
ADC_client_set_callback(client, handle);
ADC_client_connect(client, argv[1]);
while (running && net_backend_process()) { } while (running && net_backend_process()) { }
ADC_client_destroy(&client); ADC_client_destroy(client);
net_destroy(); net_destroy();
return 0; return 0;
} }

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2012, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -41,7 +41,7 @@
#define TIMEOUT_CONNECTED 15 #define TIMEOUT_CONNECTED 15
#define TIMEOUT_HANDSHAKE 30 #define TIMEOUT_HANDSHAKE 30
#define TIMEOUT_SENDQ 120 #define TIMEOUT_SENDQ 120
#define TIMEOUT_STATS 60 #define TIMEOUT_STATS 10
#define MAX_CID_LEN 39 #define MAX_CID_LEN 39
#define MAX_NICK_LEN 64 #define MAX_NICK_LEN 64
@@ -63,7 +63,6 @@ extern "C" {
#include "util/credentials.h" #include "util/credentials.h"
#include "util/floodctl.h" #include "util/floodctl.h"
#include "util/getopt.h" #include "util/getopt.h"
#include "util/ipcalc.h"
#include "util/list.h" #include "util/list.h"
#include "util/log.h" #include "util/log.h"
#include "util/memory.h" #include "util/memory.h"
@@ -75,6 +74,7 @@ extern "C" {
#include "network/network.h" #include "network/network.h"
#include "network/connection.h" #include "network/connection.h"
#include "network/ipcalc.h"
#include "network/timeout.h" #include "network/timeout.h"
#include "core/auth.h" #include "core/auth.h"
@@ -82,7 +82,7 @@ extern "C" {
#include "core/eventid.h" #include "core/eventid.h"
#include "core/eventqueue.h" #include "core/eventqueue.h"
#include "core/netevent.h" #include "core/netevent.h"
#include "core/hubio.h" #include "core/ioqueue.h"
#include "core/user.h" #include "core/user.h"
#include "core/usermanager.h" #include "core/usermanager.h"
#include "core/route.h" #include "core/route.h"

View File

@@ -36,6 +36,7 @@ extern struct cbuffer* cbuf_create(size_t capacity)
buf->size = 0; buf->size = 0;
buf->flags = 0; buf->flags = 0;
buf->buf = hub_malloc(capacity + 1); buf->buf = hub_malloc(capacity + 1);
buf->buf[0] = '\0';
return buf; return buf;
} }

View File

@@ -305,6 +305,27 @@ int is_number(const char* value, int* num)
} }
const char* format_size(size_t bytes, char* buf, size_t bufsize)
{
static const char* quant[] = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB" };
size_t b = bytes;
size_t factor = 0;
size_t divisor = 1;
while (b > 1024)
{
factor++;
b = (b >> 10);
divisor = (divisor << 10);
}
uhub_assert(factor < (sizeof(quant) / sizeof(const char*)));
if (factor >= 2)
snprintf(buf, bufsize, "%.1f %s", (double) bytes / (double) divisor, quant[factor]);
else
snprintf(buf, bufsize, PRINTF_SIZE_T " %s", bytes / divisor, quant[factor]);
return buf;
}
const char* uhub_itoa(int val) const char* uhub_itoa(int val)
{ {
static char buf[22]; static char buf[22];

View File

@@ -42,6 +42,19 @@ extern char* strip_off_quotes(char* line);
*/ */
extern int is_number(const char* str, int* num); extern int is_number(const char* str, int* num);
/**
* Convert the 'bytes' number into a formatted byte size string.
* E.g. "129012" becomes "125.99 KB".
* Note, if the output buffer is not large enough then the output
* will be truncated. The buffer will always be \0 terminated.
*
* @param bytes the number that should be formatted.
* @param[out] buf the buffer the string should be formatted into
* @param bufsize the size of 'buf'
* @return A pointer to buf.
*/
extern const char* format_size(size_t bytes, char* buf, size_t bufsize);
extern int file_read_lines(const char* file, void* data, file_line_handler_t handler); extern int file_read_lines(const char* file, void* data, file_line_handler_t handler);
/** /**

36
src/version.h.in Normal file
View File

@@ -0,0 +1,36 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2012, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* THIS FILE IS AUTO-GENERATED BY CMAKE - DO NOT EDIT MANUALLY! */
#ifndef VERSION
#define VERSION "@UHUB_VERSION_MAJOR@.@UHUB_VERSION_MINOR@.@UHUB_VERSION_PATCH@"
#endif
#define GIT_VERSION "@UHUB_GIT_VERSION@"
#ifndef PRODUCT
#define PRODUCT "uhub"
#endif
#define PRODUCT_STRING PRODUCT "/" GIT_VERSION
#ifndef COPYRIGHT
#define COPYRIGHT "Copyright (c) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>"
#endif

View File

@@ -1,23 +0,0 @@
#if !defined(_MSC_VER)
#include "revision.h"
#endif
#ifndef PRODUCT
#define PRODUCT "uhub"
#endif
#ifndef VERSION
#define VERSION "0.4.0"
#endif
#ifndef GIT_REVISION
#define REVISION ""
#define PRODUCT_STRING PRODUCT "/" VERSION
#else
#define REVISION "git-" GIT_REVISION
#define PRODUCT_STRING PRODUCT "/" VERSION "-" REVISION
#endif
#ifndef COPYRIGHT
#define COPYRIGHT "Copyright (c) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>"
#endif

7
vs2010/.gitignore vendored
View File

@@ -1,7 +0,0 @@
*.vcproj.user
*.vcproj.filters
*.ncb
*.aps
*.suo
Debug
Release

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}</ProjectGuid>
<RootNamespace>mod_auth_simple</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\plugins\mod_auth_simple.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{0EF03E84-2720-4616-A5BE-4D5737F68445}</ProjectGuid>
<RootNamespace>mod_auth_sqlite</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\src;$(IncludePath);$(SolutionDir)..\thirdparty\sqlite</IncludePath>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;$(SolutionDir)\$(Configuration)\sqlite.lib;%(AdditionalDependencies)</AdditionalDependencies>
<DelayLoadDLLs>
</DelayLoadDLLs>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\plugins\mod_auth_sqlite.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>mod_example</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\plugins\mod_example.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>mod_topic</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\plugins\mod_topic.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\thirdparty\sqlite\shell.c" />
<ClCompile Include="..\..\..\thirdparty\sqlite\sqlite3.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\thirdparty\sqlite\sqlite3.h" />
<ClInclude Include="..\..\..\thirdparty\sqlite\sqlite3ext.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{A4FC9D62-D544-4D2A-88d7-A58529C3460B}</ProjectGuid>
<RootNamespace>sqlite</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>uhubpasswd</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
<IncludePath>$(SolutionDir)..\src;$(IncludePath);$(SolutionDir)..\thirdparty\sqlite</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;$(SolutionDir)\$(Configuration)\sqlite.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\src\tools\uhub-passwd.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,83 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C++ Express 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub", "uhub.vcxproj", "{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub_utils", "uhub_utils\uhub_utils.vcxproj", "{0A3C1519-D877-47D9-A82E-40AC1BC79D75}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_auth_simple", "plugins\mod_auth_simple\mod_auth_simple.vcxproj", "{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_example", "plugins\mod_example\mod_example.vcxproj", "{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_auth_sqlite", "plugins\mod_auth_sqlite\mod_auth_sqlite.vcxproj", "{0EF03E84-2720-4616-A5BE-4D5737F68445}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
{A4FC9D62-D544-4D2A-88D7-A58529C3460B} = {A4FC9D62-D544-4D2A-88D7-A58529C3460B}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite", "thirdparty\sqlite\sqlite.vcxproj", "{A4FC9D62-D544-4D2A-88D7-A58529C3460B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub-passwd", "uhub-passwd\uhub-passwd.vcxproj", "{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
{A4FC9D62-D544-4D2A-88D7-A58529C3460B} = {A4FC9D62-D544-4D2A-88D7-A58529C3460B}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_topic", "plugins\mod_topic\mod_topic.vcxproj", "{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}"
ProjectSection(ProjectDependencies) = postProject
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E} = {98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Debug|Win32.ActiveCfg = Debug|Win32
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Debug|Win32.Build.0 = Debug|Win32
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Release|Win32.ActiveCfg = Release|Win32
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Release|Win32.Build.0 = Release|Win32
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Debug|Win32.ActiveCfg = Debug|Win32
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Debug|Win32.Build.0 = Debug|Win32
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Release|Win32.ActiveCfg = Release|Win32
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Release|Win32.Build.0 = Release|Win32
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Debug|Win32.ActiveCfg = Debug|Win32
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Debug|Win32.Build.0 = Debug|Win32
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Release|Win32.ActiveCfg = Release|Win32
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Release|Win32.Build.0 = Release|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Debug|Win32.ActiveCfg = Debug|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Debug|Win32.Build.0 = Debug|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Release|Win32.ActiveCfg = Release|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Release|Win32.Build.0 = Release|Win32
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Debug|Win32.ActiveCfg = Debug|Win32
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Debug|Win32.Build.0 = Debug|Win32
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Release|Win32.ActiveCfg = Release|Win32
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Release|Win32.Build.0 = Release|Win32
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Debug|Win32.ActiveCfg = Debug|Win32
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Debug|Win32.Build.0 = Debug|Win32
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Release|Win32.ActiveCfg = Release|Win32
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Release|Win32.Build.0 = Release|Win32
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Debug|Win32.ActiveCfg = Debug|Win32
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Debug|Win32.Build.0 = Debug|Win32
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Release|Win32.ActiveCfg = Release|Win32
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Release|Win32.Build.0 = Release|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Debug|Win32.ActiveCfg = Debug|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Debug|Win32.Build.0 = Debug|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Release|Win32.ActiveCfg = Release|Win32
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,151 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>uhub</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)\$(Configuration);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(projectDir)..\src\</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild>
<CompileAsManaged>false</CompileAsManaged>
<CompileAs>CompileAsC</CompileAs>
<FunctionLevelLinking>true</FunctionLevelLinking>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);ws2_32.lib;uhub_utils.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\adc\message.c" />
<ClCompile Include="..\src\adc\sid.c" />
<ClCompile Include="..\src\core\auth.c" />
<ClCompile Include="..\src\core\commands.c" />
<ClCompile Include="..\src\core\command_parser.c" />
<ClCompile Include="..\src\core\config.c" />
<ClCompile Include="..\src\core\eventqueue.c" />
<ClCompile Include="..\src\core\hub.c" />
<ClCompile Include="..\src\core\hubevent.c" />
<ClCompile Include="..\src\core\hubio.c" />
<ClCompile Include="..\src\core\inf.c" />
<ClCompile Include="..\src\core\main.c" />
<ClCompile Include="..\src\core\netevent.c" />
<ClCompile Include="..\src\core\plugincallback.c" />
<ClCompile Include="..\src\core\plugininvoke.c" />
<ClCompile Include="..\src\core\pluginloader.c" />
<ClCompile Include="..\src\core\probe.c" />
<ClCompile Include="..\src\core\route.c" />
<ClCompile Include="..\src\core\user.c" />
<ClCompile Include="..\src\core\usermanager.c" />
<ClCompile Include="..\src\network\backend.c" />
<ClCompile Include="..\src\network\connection.c" />
<ClCompile Include="..\src\network\epoll.c" />
<ClCompile Include="..\src\network\kqueue.c" />
<ClCompile Include="..\src\network\network.c" />
<ClCompile Include="..\src\network\select.c" />
<ClCompile Include="..\src\network\timeout.c" />
<ClCompile Include="..\src\network\timer.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\adc\adcconst.h" />
<ClInclude Include="..\src\adc\message.h" />
<ClInclude Include="..\src\adc\sid.h" />
<ClInclude Include="..\src\core\auth.h" />
<ClInclude Include="..\src\core\commands.h" />
<ClInclude Include="..\src\core\commands_builtin.h" />
<ClInclude Include="..\src\core\command_parser.h" />
<ClInclude Include="..\src\core\config.h" />
<ClInclude Include="..\src\core\eventid.h" />
<ClInclude Include="..\src\core\eventqueue.h" />
<ClInclude Include="..\src\core\gen_config.h" />
<ClInclude Include="..\src\core\hub.h" />
<ClInclude Include="..\src\core\hubevent.h" />
<ClInclude Include="..\src\core\hubio.h" />
<ClInclude Include="..\src\core\inf.h" />
<ClInclude Include="..\src\core\netevent.h" />
<ClInclude Include="..\src\core\plugincallback.h" />
<ClInclude Include="..\src\core\plugininvoke.h" />
<ClInclude Include="..\src\core\pluginloader.h" />
<ClInclude Include="..\src\core\probe.h" />
<ClInclude Include="..\src\core\route.h" />
<ClInclude Include="..\src\core\user.h" />
<ClInclude Include="..\src\core\usermanager.h" />
<ClInclude Include="..\src\network\backend.h" />
<ClInclude Include="..\src\network\common.h" />
<ClInclude Include="..\src\network\connection.h" />
<ClInclude Include="..\src\network\network.h" />
<ClInclude Include="..\src\network\timeout.h" />
<ClInclude Include="..\src\plugin_api\command_api.h" />
<ClInclude Include="..\src\plugin_api\handle.h" />
<ClInclude Include="..\src\system.h" />
<ClInclude Include="..\src\uhub.h" />
<ClInclude Include="..\version.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -1,98 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{0A3C1519-D877-47D9-A82E-40AC1BC79D75}</ProjectGuid>
<RootNamespace>uhub_utils</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\src\util\cbuffer.c" />
<ClCompile Include="..\..\src\util\config_token.c" />
<ClCompile Include="..\..\src\util\credentials.c" />
<ClCompile Include="..\..\src\util\floodctl.c" />
<ClCompile Include="..\..\src\util\getopt.c" />
<ClCompile Include="..\..\src\util\ipcalc.c" />
<ClCompile Include="..\..\src\util\list.c" />
<ClCompile Include="..\..\src\util\log.c" />
<ClCompile Include="..\..\src\util\memory.c" />
<ClCompile Include="..\..\src\util\misc.c" />
<ClCompile Include="..\..\src\util\rbtree.c" />
<ClCompile Include="..\..\src\util\tiger.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\util\cbuffer.h" />
<ClInclude Include="..\..\src\util\config_token.h" />
<ClInclude Include="..\..\src\util\credentials.h" />
<ClInclude Include="..\..\src\util\floodctl.h" />
<ClInclude Include="..\..\src\util\getopt.h" />
<ClInclude Include="..\..\src\util\ipcalc.h" />
<ClInclude Include="..\..\src\util\list.h" />
<ClInclude Include="..\..\src\util\log.h" />
<ClInclude Include="..\..\src\util\memory.h" />
<ClInclude Include="..\..\src\util\misc.h" />
<ClInclude Include="..\..\src\util\rbtree.h" />
<ClInclude Include="..\..\src\util\tiger.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>