Compare commits
1 Commits
cmake
...
command_cl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
714d110a94 |
17
.gitignore
vendored
17
.gitignore
vendored
@@ -1,24 +1,9 @@
|
|||||||
*~
|
*~
|
||||||
*.[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
|
||||||
build-stamp
|
revision.h*
|
||||||
debian/files
|
|
||||||
debian/uhub.debhelper.log
|
|
||||||
debian/uhub.postinst.debhelper
|
|
||||||
debian/uhub.postrm.debhelper
|
|
||||||
debian/uhub.prerm.debhelper
|
|
||||||
debian/uhub.substvars
|
|
||||||
uhub-passwd
|
|
||||||
src/version.h
|
|
||||||
|
|||||||
8
BSDmakefile
Normal file
8
BSDmakefile
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
GMAKE=gmake
|
||||||
|
|
||||||
|
all:
|
||||||
|
@${GMAKE} ${.TARGETS}
|
||||||
|
|
||||||
|
${.TARGETS}: all
|
||||||
|
|
||||||
170
CMakeLists.txt
170
CMakeLists.txt
@@ -1,170 +0,0 @@
|
|||||||
##
|
|
||||||
## Makefile for uhub
|
|
||||||
## Copyright (C) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>
|
|
||||||
#
|
|
||||||
|
|
||||||
cmake_minimum_required (VERSION 2.8.3)
|
|
||||||
|
|
||||||
project (uhub)
|
|
||||||
|
|
||||||
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(SQLITE_SUPPORT "Enable SQLite support" ON)
|
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
|
|
||||||
if (SSL_SUPPORT)
|
|
||||||
find_package(OpenSSL REQUIRED)
|
|
||||||
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}/util/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
|
|
||||||
)
|
|
||||||
|
|
||||||
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 "")
|
|
||||||
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 ${adcclient_SOURCES})
|
|
||||||
target_link_libraries(uhub-admin adcclient adc network utils)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(GIT_FOUND)
|
|
||||||
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()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(OPENSSL_FOUND)
|
|
||||||
add_definitions(-DSSL_SUPPORT=1)
|
|
||||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
|
||||||
target_link_libraries(uhub ${OPENSSL_LIBRARIES})
|
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(uhub-admin ${OPENSSL_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
target_link_libraries(mod_welcome ${OPENSSL_LIBRARIES})
|
|
||||||
target_link_libraries(mod_logging ${OPENSSL_LIBRARIES})
|
|
||||||
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)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
OpenSSL License Exception
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
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 3 (GPL) as published by
|
|
||||||
the Free Software Foundation.
|
|
||||||
The full text the GPL can be found in the COPYING file.
|
|
||||||
|
|
||||||
In addition this distribution of uhub may be linked against OpenSSL
|
|
||||||
according to the terms described here:
|
|
||||||
|
|
||||||
You have permission to copy, modify, propagate, and distribute a work
|
|
||||||
formed by combining OpenSSL with uhub, or a work derivative of such a
|
|
||||||
combination, even if such copying, modification, propagation, or
|
|
||||||
distribution would otherwise violate the terms of the GPL. You must
|
|
||||||
comply with the GPL in all respects for all of the code used other than
|
|
||||||
OpenSSL.
|
|
||||||
|
|
||||||
You may include this OpenSSL exception and its grant of permissions when
|
|
||||||
you distribute uhub. Inclusion of this notice with such a distribution
|
|
||||||
constitutes a grant of such permission. If you do not wish to grant these
|
|
||||||
permissions, delete this file.
|
|
||||||
|
|
||||||
50
ChangeLog
50
ChangeLog
@@ -1,53 +1,3 @@
|
|||||||
0.4.0:
|
|
||||||
- Cleaned up code generator for config file parsing.
|
|
||||||
- Merge pull request #5 from yorhel/master
|
|
||||||
- Print error message in case of shutting down due to errors loading plugins.
|
|
||||||
- Fix Windows file read discrepancy.
|
|
||||||
- convert_to_sqlite.pl: Update to the latest SQL schema + be more Perlish
|
|
||||||
- Fix VS2010 project file - missing .c file.
|
|
||||||
- Merge https://github.com/Tilka/uhub
|
|
||||||
- use "I64u" instead of PRIu64 on Windows
|
|
||||||
- remove obsolete settings in uhub.conf
|
|
||||||
- fix uhub_itoa() and uhub_ulltoa()
|
|
||||||
- marked plugin callbacks that are not called yet
|
|
||||||
- add on_change_nick() to struct plugin_funcs
|
|
||||||
- minimal changes
|
|
||||||
- Updated init script in debian package.
|
|
||||||
- Updated list of man pages in debian package.
|
|
||||||
- Added man page for uhub-passwd.
|
|
||||||
- Merge branch 'master' of https://github.com/Tilka/uhub
|
|
||||||
- Fix issue with QUI messages being allowed through the hub
|
|
||||||
- don't show error on SIGTERM in select() backend
|
|
||||||
- fix dependency of 'install' target
|
|
||||||
- changed all calls to assert() to uhub_assert()
|
|
||||||
- Don't strip the U4/U6 port numbers if updated after login.
|
|
||||||
- Fix compile issue with double typedefs.
|
|
||||||
- Remove list assertion when removing element that is not in the list. Breaks autotest.
|
|
||||||
- Cleaned up command handling code, by splitting into multiple files.
|
|
||||||
- Fix bug #183 - Added proper OpenSSL license exception for the GPL.
|
|
||||||
- OMG OPTIMIZED
|
|
||||||
- use dh_prep instead of dh_clean -k
|
|
||||||
- fix double free
|
|
||||||
- use "0" instead of "false"
|
|
||||||
- fix use of uninitialized struct ip_range
|
|
||||||
- fix random crashes upon !reload
|
|
||||||
- fix command syntax
|
|
||||||
- use arg parser in !broadcast
|
|
||||||
- Fixed tiny memory leak on reload/shutdown.
|
|
||||||
- Merge https://github.com/Tilka/uhub
|
|
||||||
- fix multiple optional arguments
|
|
||||||
- small cleanup
|
|
||||||
- also clean uhub-passwd
|
|
||||||
- ignore files generated by dpkg-buildpackage
|
|
||||||
- automatically clean up plugin commands
|
|
||||||
- minimal documentation fixes
|
|
||||||
- update client software link
|
|
||||||
- update compile howto link
|
|
||||||
- fix debian changelog
|
|
||||||
- Fix bug #158 - Added plugin for setting topic (hub description).
|
|
||||||
- Command arguments handling + cleanups
|
|
||||||
|
|
||||||
|
|
||||||
0.3.2:
|
0.3.2:
|
||||||
- Fixed bugs in the kqueue network backend (OSX/BSD)
|
- Fixed bugs in the kqueue network backend (OSX/BSD)
|
||||||
- Rewrote the configuration backend code.
|
- Rewrote the configuration backend code.
|
||||||
|
|||||||
354
GNUmakefile
Normal file
354
GNUmakefile
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
##
|
||||||
|
## 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/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_SOURCE := src/plugins/mod_chat_history.c
|
||||||
|
plugin_chat_history_TARGET := mod_chat_history.so
|
||||||
|
|
||||||
|
plugin_chat_only_SOURCE := src/plugins/mod_chat_only.c
|
||||||
|
plugin_chat_only_TARGET := mod_chat_only.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)
|
||||||
|
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_SOURCE) $(libutils_OBJECTS)
|
||||||
|
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||||
|
|
||||||
|
$(plugin_chat_only_TARGET): $(plugin_chat_only_SOURCE) $(libutils_OBJECTS)
|
||||||
|
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||||
|
|
||||||
|
$(plugin_welcome_TARGET): $(plugin_welcome_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)
|
||||||
|
$(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: $(uhub_BINARY)
|
||||||
|
@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) $(admin_BINARY) $(autotest_BINARY) $(adcrush_BINARY) $(all_OBJECTS) $(all_plugins) autotest.c revision.h revision.h.tmp && \
|
||||||
|
echo $(MSG_CLEAN)
|
||||||
|
|
||||||
|
|
||||||
2
README
2
README
@@ -4,5 +4,5 @@ For the official documentation, bugs and other information, please visit:
|
|||||||
http://www.uhub.org/
|
http://www.uhub.org/
|
||||||
|
|
||||||
For a list of compatible ADC clients, see:
|
For a list of compatible ADC clients, see:
|
||||||
http://en.wikipedia.org/wiki/Advanced_Direct_Connect#Client_software
|
http://www.adcportal.com/wiki/index.php/ADC_Software_List#Client_Software
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#include <uhub.h>
|
#include <uhub.h>
|
||||||
|
|
||||||
static struct hub_info* hub = NULL;
|
static struct hub_info* hub = NULL;
|
||||||
static struct hub_command* cmd = NULL;
|
|
||||||
static struct hub_user user;
|
static struct hub_user user;
|
||||||
static struct command_base* cbase = NULL;
|
static struct command_base* cbase = NULL;
|
||||||
static struct command_handle* c_test1 = NULL;
|
static struct command_handle* c_test1 = NULL;
|
||||||
@@ -18,14 +17,11 @@ static int result = 0;
|
|||||||
EXO_TEST(setup, {
|
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;
|
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)
|
||||||
{
|
{
|
||||||
printf("test_handler\n");
|
|
||||||
result = 1;
|
result = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -39,7 +35,7 @@ static struct command_handle* create_handler(const char* prefix, const char* arg
|
|||||||
c->cred = cred;
|
c->cred = cred;
|
||||||
c->handler = test_handler;
|
c->handler = test_handler;
|
||||||
c->description = "A handler added by autotest.";
|
c->description = "A handler added by autotest.";
|
||||||
c->origin = "exotic test";
|
c->description = "exotic";
|
||||||
c->ptr = &c->ptr;
|
c->ptr = &c->ptr;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
@@ -71,7 +67,7 @@ EXO_TEST(command_create, {
|
|||||||
ADD_TEST(c_test1, "test1", "", auth_cred_guest);
|
ADD_TEST(c_test1, "test1", "", auth_cred_guest);
|
||||||
ADD_TEST(c_test2, "test2", "", auth_cred_operator);
|
ADD_TEST(c_test2, "test2", "", auth_cred_operator);
|
||||||
ADD_TEST(c_test3, "test3", "N?N?N", auth_cred_guest);
|
ADD_TEST(c_test3, "test3", "N?N?N", auth_cred_guest);
|
||||||
ADD_TEST(c_test4, "test4", "u", auth_cred_guest);
|
ADD_TEST(c_test4, "test4", "n", auth_cred_guest);
|
||||||
ADD_TEST(c_test5, "test5", "i", auth_cred_guest);
|
ADD_TEST(c_test5, "test5", "i", auth_cred_guest);
|
||||||
ADD_TEST(c_test6, "test6", "?c", auth_cred_guest);
|
ADD_TEST(c_test6, "test6", "?c", auth_cred_guest);
|
||||||
ADD_TEST(c_test6, "test7", "C", auth_cred_guest);
|
ADD_TEST(c_test6, "test7", "C", auth_cred_guest);
|
||||||
@@ -82,36 +78,12 @@ extern void command_destroy(struct hub_command* cmd);
|
|||||||
|
|
||||||
static int verify(const char* str, enum command_parse_status expected)
|
static int verify(const char* str, enum command_parse_status expected)
|
||||||
{
|
{
|
||||||
struct hub_command* cmd = command_parse(cbase, hub, &user, str);
|
struct hub_command* cmd = command_parse(cbase, &user, str);
|
||||||
enum command_parse_status status = cmd->status;
|
enum command_parse_status status = cmd->status;
|
||||||
command_free(cmd);
|
command_free(cmd);
|
||||||
return status == expected;
|
return status == expected;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct hub_command_arg_data* verify_argument(struct hub_command* cmd, enum hub_command_arg_type type)
|
|
||||||
{
|
|
||||||
return hub_command_arg_next(cmd, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int verify_arg_integer(struct hub_command* cmd, int expected)
|
|
||||||
{
|
|
||||||
struct hub_command_arg_data* data = verify_argument(cmd, type_integer);
|
|
||||||
return data->data.integer == expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int verify_arg_user(struct hub_command* cmd, struct hub_user* expected)
|
|
||||||
{
|
|
||||||
struct hub_command_arg_data* data = verify_argument(cmd, type_user);
|
|
||||||
return data->data.user == expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int verify_arg_cred(struct hub_command* cmd, enum auth_credentials cred)
|
|
||||||
{
|
|
||||||
struct hub_command_arg_data* data = verify_argument(cmd, type_credentials);
|
|
||||||
return data->data.credentials == cred;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EXO_TEST(command_access_1, { return verify("!test1", cmd_status_ok); });
|
EXO_TEST(command_access_1, { return verify("!test1", cmd_status_ok); });
|
||||||
EXO_TEST(command_access_2, { return verify("!test2", cmd_status_access_error); });
|
EXO_TEST(command_access_2, { return verify("!test2", cmd_status_access_error); });
|
||||||
EXO_TEST(command_access_3, { user.credentials = auth_cred_operator; return verify("!test2", cmd_status_ok); });
|
EXO_TEST(command_access_3, { user.credentials = auth_cred_operator; return verify("!test2", cmd_status_ok); });
|
||||||
@@ -128,7 +100,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->users, &user) == 0; });
|
EXO_TEST(command_user_3, { return uman_add(hub, &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); });
|
||||||
|
|
||||||
@@ -162,77 +134,7 @@ EXO_TEST(command_parse_3, { return verify("!fail", cmd_status_not_found); });
|
|||||||
// built-in command
|
// built-in command
|
||||||
EXO_TEST(command_parse_4, { return verify("!help", cmd_status_ok); });
|
EXO_TEST(command_parse_4, { return verify("!help", cmd_status_ok); });
|
||||||
|
|
||||||
|
|
||||||
#define SETUP_COMMAND(string) \
|
|
||||||
do { \
|
|
||||||
if (cmd) command_free(cmd); \
|
|
||||||
cmd = command_parse(cbase, hub, &user, string); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_integer_1, {
|
|
||||||
SETUP_COMMAND("!test3");
|
|
||||||
return verify_argument(cmd, type_integer) == NULL;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_integer_2, {
|
|
||||||
SETUP_COMMAND("!test3 10 42");
|
|
||||||
return verify_arg_integer(cmd, 10) && verify_arg_integer(cmd, 42) && verify_argument(cmd, type_integer) == NULL;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_integer_3, {
|
|
||||||
SETUP_COMMAND("!test3 10 42 6784");
|
|
||||||
return verify_arg_integer(cmd, 10) && verify_arg_integer(cmd, 42) && verify_arg_integer(cmd, 6784);
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_user_1, {
|
|
||||||
SETUP_COMMAND("!test4 tester");
|
|
||||||
return verify_arg_user(cmd, &user) ;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cid_1, {
|
|
||||||
SETUP_COMMAND("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY");
|
|
||||||
return verify_arg_user(cmd, &user) ;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_1, {
|
|
||||||
SETUP_COMMAND("!test7 admin");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_admin);;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_2, {
|
|
||||||
SETUP_COMMAND("!test7 op");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_operator);;
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_3, {
|
|
||||||
SETUP_COMMAND("!test7 operator");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_operator);
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_4, {
|
|
||||||
SETUP_COMMAND("!test7 super");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_super);
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_5, {
|
|
||||||
SETUP_COMMAND("!test7 guest");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_guest);
|
|
||||||
});
|
|
||||||
|
|
||||||
EXO_TEST(command_argument_cred_6, {
|
|
||||||
SETUP_COMMAND("!test7 user");
|
|
||||||
return verify_arg_cred(cmd, auth_cred_user);
|
|
||||||
});
|
|
||||||
|
|
||||||
#undef SETUP_COMMAND
|
|
||||||
|
|
||||||
EXO_TEST(command_user_destroy, { return uman_remove(hub->users, &user) == 0; });
|
|
||||||
|
|
||||||
EXO_TEST(command_destroy, {
|
EXO_TEST(command_destroy, {
|
||||||
|
|
||||||
command_free(cmd);
|
|
||||||
cmd = NULL;
|
|
||||||
|
|
||||||
DEL_TEST(c_test1);
|
DEL_TEST(c_test1);
|
||||||
DEL_TEST(c_test2);
|
DEL_TEST(c_test2);
|
||||||
DEL_TEST(c_test3);
|
DEL_TEST(c_test3);
|
||||||
@@ -242,10 +144,3 @@ 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;
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -2,19 +2,32 @@
|
|||||||
|
|
||||||
#define MAX_USERS 64
|
#define MAX_USERS 64
|
||||||
|
|
||||||
static struct hub_user_manager* uman = 0;
|
static struct hub_info um_hub;
|
||||||
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, {
|
||||||
sid_t s;
|
return uman_init(0) != 0;
|
||||||
uman = uman_init();
|
});
|
||||||
|
|
||||||
for (s = 0; s < MAX_USERS; s++)
|
EXO_TEST(um_init_2, {
|
||||||
{
|
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, {
|
||||||
@@ -22,29 +35,32 @@ EXO_TEST(um_shutdown_1, {
|
|||||||
});
|
});
|
||||||
|
|
||||||
EXO_TEST(um_shutdown_2, {
|
EXO_TEST(um_shutdown_2, {
|
||||||
return uman_shutdown(uman) == 0;
|
return uman_shutdown(&um_hub) == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
EXO_TEST(um_init_2, {
|
EXO_TEST(um_shutdown_3, {
|
||||||
uman = uman_init();
|
return uman_shutdown(&um_hub) == -1;
|
||||||
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(uman, &um_user[0]) == 0;
|
return uman_add(&um_hub, &um_user[0]) == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
EXO_TEST(um_size_1, {
|
EXO_TEST(um_size_1, {
|
||||||
return uman->count == 1;
|
return hub_get_user_count(&um_hub) == 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
EXO_TEST(um_remove_1, {
|
EXO_TEST(um_remove_1, {
|
||||||
return uman_remove(uman, &um_user[0]) == 0;
|
return uman_remove(&um_hub, &um_user[0]) == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
EXO_TEST(um_size_2, {
|
EXO_TEST(um_size_2, {
|
||||||
return uman->count == 0;
|
return hub_get_user_count(&um_hub) == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -52,21 +68,25 @@ 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(uman, &um_user[i]) != 0)
|
if (uman_add(&um_hub, &um_user[i]) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
EXO_TEST(um_size_3, {
|
EXO_TEST(um_size_3, {
|
||||||
return uman->count == MAX_USERS;
|
return hub_get_user_count(&um_hub) == 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(uman, &um_user[i]) != 0)
|
if (uman_remove(&um_hub, &um_user[i]) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@@ -85,5 +105,5 @@ EXO_TEST(um_remove_2, {
|
|||||||
|
|
||||||
/* Last test */
|
/* Last test */
|
||||||
EXO_TEST(um_shutdown_4, {
|
EXO_TEST(um_shutdown_4, {
|
||||||
return uman_shutdown(uman) == 0;
|
return uman_shutdown(&um_hub) == 0;
|
||||||
});
|
});
|
||||||
|
|||||||
4
debian/changelog
vendored
4
debian/changelog
vendored
@@ -2,13 +2,13 @@ uhub (0.3.2-1) unstable; urgency=low
|
|||||||
|
|
||||||
* Updated upstream version.
|
* Updated upstream version.
|
||||||
|
|
||||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon, 30 May 2010 18:00:00 +0200
|
-- Jan Vidar Krey <janvidar@extatic.org> Mon 30 May 2010 18:00:00 +0200
|
||||||
|
|
||||||
uhub (0.3.1-1) unstable; urgency=low
|
uhub (0.3.1-1) unstable; urgency=low
|
||||||
|
|
||||||
* Updated version number.
|
* Updated version number.
|
||||||
|
|
||||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon, 04 Apr 2010 16:44:21 +0200
|
-- Jan Vidar Krey <janvidar@extatic.org> Mon 04 Apr 2010 16:44:21 +0200
|
||||||
|
|
||||||
uhub (0.3.0-2) unstable; urgency=low
|
uhub (0.3.0-2) unstable; urgency=low
|
||||||
|
|
||||||
|
|||||||
2
debian/rules
vendored
2
debian/rules
vendored
@@ -24,7 +24,7 @@ binary-indep: build
|
|||||||
binary-arch: build
|
binary-arch: build
|
||||||
dh_testdir
|
dh_testdir
|
||||||
dh_testroot
|
dh_testroot
|
||||||
dh_prep
|
dh_clean -k
|
||||||
dh_installdirs
|
dh_installdirs
|
||||||
$(MAKE) install $(makeopts)
|
$(MAKE) install $(makeopts)
|
||||||
dh_installdocs
|
dh_installdocs
|
||||||
|
|||||||
9
debian/uhub.init
vendored
9
debian/uhub.init
vendored
@@ -5,8 +5,7 @@
|
|||||||
# Required-Stop: $remote_fs $network
|
# Required-Stop: $remote_fs $network
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
# Default-Stop: 0 1 6
|
# Default-Stop: 0 1 6
|
||||||
# Short-Description: Start daemon at boot time
|
# Short-Description: uhub - High performance ADC p2p hub.
|
||||||
# Description: Enable service provided by daemon.
|
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||||
@@ -84,12 +83,8 @@ case "$1" in
|
|||||||
$0 start
|
$0 start
|
||||||
;;
|
;;
|
||||||
|
|
||||||
status)
|
|
||||||
status_of_proc $DAEMON $NAME && exit 0 || exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|status}" >&2
|
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
1
debian/uhub.manpages
vendored
1
debian/uhub.manpages
vendored
@@ -1,2 +1 @@
|
|||||||
doc/uhub.1
|
doc/uhub.1
|
||||||
doc/uhub-passwd.1
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
= Architecture of uHub =
|
= Architecture of uHub =
|
||||||
|
|
||||||
uHub is single-threaded and handles network and timer events using the
|
uHub is single threaded and handles network and timer events using the
|
||||||
libevent library.
|
libevent library.
|
||||||
For each state there is a read event (and sometimes a write event) and timeout
|
For each state there is a read event (and sometimes a write event) and timeout
|
||||||
event in case an expected read (or write) event does not occur.
|
event in case an expected read (or write) event does not occur.
|
||||||
|
|
||||||
|
|
||||||
== Protocol overview ==
|
== Protocol overview ==
|
||||||
uHub "speaks" the ADC protocol, which works in short as follows:
|
uHub use "speak" the ADC protocol, which works in short as follows:
|
||||||
(C = client, S = server aka uHub).
|
(C = client, S = server aka uHub).
|
||||||
|
|
||||||
C: HSUP ADBASE
|
C: HSUP ADBASE
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
How to compile:
|
How to compile:
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
See the official compiling howto: http://www.uhub.org/compile.php
|
See the official compiling howto: http://www.extatic.org/uhub/compile.html
|
||||||
|
|
||||||
Prerequisites
|
Prerequisites
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ The hub should send a packet containing the token back:
|
|||||||
'IECH {token} {host:port}', aswell as the same message via TCP.
|
'IECH {token} {host:port}', aswell as the same message via TCP.
|
||||||
|
|
||||||
If the client receives the message via UDP, it should now be able to determine the type of NAT.
|
If the client receives the message via UDP, it should now be able to determine the type of NAT.
|
||||||
If the client receives the message via TCP only it knows it has a firewall blocking incomming communication.
|
If the client receives the message via TCP only it knows it has a firewall blocking icomming communication.
|
||||||
If the client does not receive the message, it should assume a firewall is blocking all UDP communication,
|
If the client does not receive the message, it should assume a firewall is blocking all UDP communication,
|
||||||
and resume in passive mode.
|
and resume in passive mode.
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ fi
|
|||||||
# Check that networking is up.
|
# Check that networking is up.
|
||||||
[ ${NETWORKING} = "no" ] && exit 1
|
[ ${NETWORKING} = "no" ] && exit 1
|
||||||
|
|
||||||
# Check that bin and uhub.conf exists.
|
# Check that 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
|
||||||
@@ -41,7 +40,7 @@ RETVAL=0
|
|||||||
start() {
|
start() {
|
||||||
KIND="Uhub"
|
KIND="Uhub"
|
||||||
echo -n $"Starting $KIND services: "
|
echo -n $"Starting $KIND services: "
|
||||||
daemon $UHUBBINFILE $UHUBOPTIONS
|
daemon uhub $UHUBOPTIONS
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
echo ""
|
echo ""
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
@@ -50,7 +49,7 @@ start() {
|
|||||||
stop() {
|
stop() {
|
||||||
KIND="Uhub"
|
KIND="Uhub"
|
||||||
echo -n $"Shutting down $KIND services: "
|
echo -n $"Shutting down $KIND services: "
|
||||||
killproc $UHUBBINFILE
|
killproc uhub
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
echo ""
|
echo ""
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
@@ -78,7 +77,7 @@ relog() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rhstatus() {
|
rhstatus() {
|
||||||
status $UHUBBINFILE
|
status uhub
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
if [ $RETVAL -ne 0 ] ; then
|
if [ $RETVAL -ne 0 ] ; then
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
# 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
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
.TH UHUB-PASSWD "1" "May 2012"
|
|
||||||
.SH NAME
|
|
||||||
uhub-passwd \- small utility for manipulating passwords which are
|
|
||||||
used by uhub daemon
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B uhub-passwd
|
|
||||||
\fIfilename command \fR[...]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
uHub is a high performance peer-to-peer hub for the ADC network.
|
|
||||||
Its low memory footprint allows it to handle several thousand users
|
|
||||||
on high-end servers, or a small private hub on embedded hardware.
|
|
||||||
.SH "OPTIONS"
|
|
||||||
.TP
|
|
||||||
.BI \^create
|
|
||||||
.TP
|
|
||||||
.BI \^add " username password [credentials = user]"
|
|
||||||
.TP
|
|
||||||
.BI \^del " username"
|
|
||||||
.TP
|
|
||||||
.BI \^mod " username credentials"
|
|
||||||
.TP
|
|
||||||
.BI \^pass " username password"
|
|
||||||
.TP
|
|
||||||
.BI \^list
|
|
||||||
.SH "PARAMETERS"
|
|
||||||
.TP
|
|
||||||
.B 'filename'
|
|
||||||
is a database file
|
|
||||||
.TP
|
|
||||||
.B 'username'
|
|
||||||
is a nickname (UTF\-8, up to 64 bytes)
|
|
||||||
.TP
|
|
||||||
.B 'password'
|
|
||||||
is a password (UTF\-8, up to 64 bytes)
|
|
||||||
.TP
|
|
||||||
.B 'credentials'
|
|
||||||
is one of 'admin', 'super', 'op', 'user'
|
|
||||||
.SH AUTHOR
|
|
||||||
This program was written by Jan Vidar Krey <janvidar@extatic.org>
|
|
||||||
.SH "BUG REPORTS"
|
|
||||||
If you find a bug in uhub please report it to
|
|
||||||
.B http://bugs.extatic.org/
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# uhub.conf - A example configuration file.
|
# uhub.conf - A example configuration file.
|
||||||
# You should normally place this file in /etc/uhub/uhub.conf
|
# You should normally place this file in /etc/uhub/uhub.conf
|
||||||
# and customize some of the settings below.
|
# And change the file_acl and file_motd below.
|
||||||
#
|
#
|
||||||
# This file is read only to the uhub deamon, and if you
|
# This file is read only to the uhub deamon, and if you
|
||||||
# make changes to it while uhub is running you can send a
|
# make changes to it while uhub is running you can send a
|
||||||
@@ -38,6 +38,17 @@ hub_enabled=1
|
|||||||
# Access control list (user database)
|
# Access control list (user database)
|
||||||
file_acl=/etc/uhub/users.conf
|
file_acl=/etc/uhub/users.conf
|
||||||
|
|
||||||
|
# This file can contain a message of the day. A welcome
|
||||||
|
# message send to any client when connecting.
|
||||||
|
# If the file does not exist, is empty, or cannot be opened
|
||||||
|
# the motd will not be sent to the clients.
|
||||||
|
# Normally this message is sent to clients when connecting.
|
||||||
|
file_motd=/etc/uhub/motd.txt
|
||||||
|
|
||||||
|
# This file can contain a rules of the hub.
|
||||||
|
# Normally this message is sent to clients when write in chat !rules
|
||||||
|
file_rules=/etc/uhub/rules.txt
|
||||||
|
|
||||||
# This file can contain a conf for plugin subsystem
|
# This file can contain a conf for plugin subsystem
|
||||||
file_plugins = /etc/uhub/plugins.conf
|
file_plugins = /etc/uhub/plugins.conf
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# 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
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2009, 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
|
||||||
@@ -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 ADUCMD"
|
#define ADC_PROTO_SUPPORT "ADBASE ADTIGR ADPING"
|
||||||
|
|
||||||
/* Server sent commands */
|
/* Server sent commands */
|
||||||
#define ADC_CMD_ISID FOURCC('I','S','I','D')
|
#define ADC_CMD_ISID FOURCC('I','S','I','D')
|
||||||
@@ -85,23 +85,10 @@ typedef uint32_t fourcc_t;
|
|||||||
#define ADC_CMD_DINF FOURCC('D','I','N','F')
|
#define ADC_CMD_DINF FOURCC('D','I','N','F')
|
||||||
#define ADC_CMD_EINF FOURCC('E','I','N','F')
|
#define ADC_CMD_EINF FOURCC('E','I','N','F')
|
||||||
#define ADC_CMD_FINF FOURCC('F','I','N','F')
|
#define ADC_CMD_FINF FOURCC('F','I','N','F')
|
||||||
#define ADC_CMD_BQUI FOURCC('B','Q','U','I')
|
|
||||||
#define ADC_CMD_DQUI FOURCC('D','Q','U','I')
|
|
||||||
#define ADC_CMD_EQUI FOURCC('E','Q','U','I')
|
|
||||||
#define ADC_CMD_FQUI FOURCC('F','Q','U','I')
|
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
|||||||
@@ -63,33 +63,6 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -154,7 +127,7 @@ static int adc_msg_cache_append(struct adc_message* msg, const char* string, siz
|
|||||||
memcpy(&msg->cache[msg->length], string, len);
|
memcpy(&msg->cache[msg->length], string, len);
|
||||||
adc_msg_set_length(msg, msg->length + len);
|
adc_msg_set_length(msg, msg->length + len);
|
||||||
|
|
||||||
uhub_assert(msg->capacity > msg->length);
|
assert(msg->capacity > msg->length);
|
||||||
msg->cache[msg->length] = 0;
|
msg->cache[msg->length] = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -346,13 +319,6 @@ 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;
|
||||||
@@ -532,16 +498,6 @@ struct adc_message* adc_msg_create(const char* line)
|
|||||||
return adc_msg_parse(line, strlen(line));
|
return adc_msg_parse(line, strlen(line));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern 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);
|
|
||||||
if (!msg)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
adc_msg_add_argument(msg, sid_to_string(source));
|
|
||||||
msg->source = source;
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@@ -549,7 +505,9 @@ struct adc_message* adc_msg_construct(fourcc_t fourcc, size_t size)
|
|||||||
if (!msg)
|
if (!msg)
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
|
|
||||||
if (!adc_msg_grow(msg, sizeof(fourcc) + size + 1))
|
if (size < sizeof(fourcc)) size = sizeof(fourcc);
|
||||||
|
|
||||||
|
if (!adc_msg_grow(msg, size+1))
|
||||||
{
|
{
|
||||||
msg_free(msg);
|
msg_free(msg);
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
@@ -919,41 +877,6 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -91,12 +91,6 @@ 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);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a named argument from the command.
|
* Remove a named argument from the command.
|
||||||
*
|
*
|
||||||
@@ -201,14 +195,6 @@ 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.
|
||||||
|
|||||||
@@ -1,298 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
static void hub_command_args_free(struct hub_command* cmd)
|
|
||||||
{
|
|
||||||
struct hub_command_arg_data* data = NULL;
|
|
||||||
|
|
||||||
if (!cmd->args)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (data = (struct hub_command_arg_data*) list_get_first(cmd->args); data; data = (struct hub_command_arg_data*) list_get_next(cmd->args))
|
|
||||||
{
|
|
||||||
switch (data->type)
|
|
||||||
{
|
|
||||||
case type_string:
|
|
||||||
hub_free(data->data.string);
|
|
||||||
break;
|
|
||||||
case type_range:
|
|
||||||
hub_free(data->data.range);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list_clear(cmd->args, hub_free);
|
|
||||||
list_destroy(cmd->args);
|
|
||||||
cmd->args = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void command_free(struct hub_command* cmd)
|
|
||||||
{
|
|
||||||
if (!cmd) return;
|
|
||||||
|
|
||||||
hub_free(cmd->prefix);
|
|
||||||
hub_command_args_free(cmd);
|
|
||||||
hub_free(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum command_parse_status command_extract_arguments(struct hub_info* hub, const struct hub_user* user, struct command_handle* command, struct linked_list* tokens, struct linked_list* args)
|
|
||||||
{
|
|
||||||
int arg = 0;
|
|
||||||
int opt = 0;
|
|
||||||
int greedy = 0;
|
|
||||||
char arg_code;
|
|
||||||
char* token = NULL;
|
|
||||||
char* tmp = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
struct hub_command_arg_data* data = NULL;
|
|
||||||
enum command_parse_status status = cmd_status_ok;
|
|
||||||
|
|
||||||
// Ignore the first token since it is the prefix.
|
|
||||||
token = list_get_first(tokens);
|
|
||||||
list_remove(tokens, token);
|
|
||||||
hub_free(token);
|
|
||||||
|
|
||||||
while (status == cmd_status_ok && (arg_code = command->args[arg++]))
|
|
||||||
{
|
|
||||||
if (greedy)
|
|
||||||
{
|
|
||||||
size = 1;
|
|
||||||
for (tmp = (char*) list_get_first(tokens); tmp; tmp = (char*) list_get_next(tokens))
|
|
||||||
size += (strlen(tmp) + 1);
|
|
||||||
token = hub_malloc_zero(size);
|
|
||||||
|
|
||||||
while ((tmp = list_get_first(tokens)))
|
|
||||||
{
|
|
||||||
if (*token)
|
|
||||||
strcat(token, " ");
|
|
||||||
strcat(token, tmp);
|
|
||||||
list_remove(tokens, tmp);
|
|
||||||
hub_free(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
token = list_get_first(tokens);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!token || !*token)
|
|
||||||
{
|
|
||||||
if (arg_code == '?' || opt == 1)
|
|
||||||
status = cmd_status_ok;
|
|
||||||
else
|
|
||||||
status = cmd_status_missing_args;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (arg_code)
|
|
||||||
{
|
|
||||||
case '?':
|
|
||||||
opt = 1;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case '+':
|
|
||||||
greedy = 1;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case 'u':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_user;
|
|
||||||
data->data.user = uman_get_user_by_nick(hub->users, token);
|
|
||||||
if (!data->data.user)
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_nick;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_user;
|
|
||||||
data->data.user = uman_get_user_by_cid(hub->users, token);
|
|
||||||
if (!data->data.user)
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_cid;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'a':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_address;
|
|
||||||
if (ip_convert_to_binary(token, data->data.address) == -1)
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_address;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'r':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_range;
|
|
||||||
data->data.range = hub_malloc_zero(sizeof(struct ip_range));
|
|
||||||
if (!ip_convert_address_to_range(token, data->data.range))
|
|
||||||
{
|
|
||||||
hub_free(data->data.range);
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_address;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
case 'm':
|
|
||||||
case 'p':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_string;
|
|
||||||
data->data.string = strdup(token);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_command;
|
|
||||||
data->data.command = command_handler_lookup(hub->commands, token);
|
|
||||||
if (!data->data.command)
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_command;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'C':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_credentials;
|
|
||||||
if (!auth_string_to_cred(token, &data->data.credentials))
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_cred;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'N':
|
|
||||||
data = hub_malloc(sizeof(*data));
|
|
||||||
data->type = type_integer;
|
|
||||||
if (!is_number(token, &data->data.integer))
|
|
||||||
{
|
|
||||||
hub_free(data);
|
|
||||||
data = NULL;
|
|
||||||
status = cmd_status_arg_number;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\0':
|
|
||||||
if (!opt)
|
|
||||||
{
|
|
||||||
status = cmd_status_missing_args;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status = cmd_status_ok;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data)
|
|
||||||
{
|
|
||||||
list_append(args, data);
|
|
||||||
data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_remove(tokens, token);
|
|
||||||
hub_free(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
hub_free(data);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct command_handle* command_get_handler(struct command_base* cbase, const char* prefix, const struct hub_user* user, struct hub_command* cmd)
|
|
||||||
{
|
|
||||||
struct command_handle* handler = NULL;
|
|
||||||
uhub_assert(cmd != NULL);
|
|
||||||
|
|
||||||
if (prefix && prefix[0] && prefix[1])
|
|
||||||
{
|
|
||||||
handler = command_handler_lookup(cbase, prefix + 1);
|
|
||||||
if (handler)
|
|
||||||
{
|
|
||||||
cmd->ptr = handler->ptr;
|
|
||||||
cmd->handler = handler->handler;
|
|
||||||
cmd->status = command_is_available(handler, user->credentials) ? cmd_status_ok : cmd_status_access_error;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cmd->status = cmd_status_not_found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cmd->status = cmd_status_syntax_error;
|
|
||||||
}
|
|
||||||
return handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse a command and break it down into a struct hub_command.
|
|
||||||
*/
|
|
||||||
struct hub_command* command_parse(struct command_base* cbase, struct hub_info* hub, const struct hub_user* user, const char* message)
|
|
||||||
{
|
|
||||||
struct linked_list* tokens = list_create();
|
|
||||||
struct hub_command* cmd = NULL;
|
|
||||||
struct command_handle* handle = NULL;
|
|
||||||
|
|
||||||
cmd = hub_malloc_zero(sizeof(struct hub_command));
|
|
||||||
cmd->status = cmd_status_ok;
|
|
||||||
cmd->message = message;
|
|
||||||
cmd->prefix = NULL;
|
|
||||||
cmd->args = list_create();
|
|
||||||
cmd->user = user;
|
|
||||||
|
|
||||||
if (split_string(message, " ", tokens, 0) <= 0)
|
|
||||||
{
|
|
||||||
cmd->status = cmd_status_syntax_error;
|
|
||||||
goto command_parse_cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup hub command.
|
|
||||||
cmd->prefix = strdup(((char*) list_get_first(tokens)) + 1);
|
|
||||||
|
|
||||||
// Find a matching command handler
|
|
||||||
handle = command_get_handler(cbase, list_get_first(tokens), user, cmd);
|
|
||||||
if (cmd->status != cmd_status_ok)
|
|
||||||
goto command_parse_cleanup;
|
|
||||||
|
|
||||||
// Parse arguments
|
|
||||||
cmd->status = command_extract_arguments(hub, user, handle, tokens, cmd->args);
|
|
||||||
goto command_parse_cleanup;
|
|
||||||
|
|
||||||
command_parse_cleanup:
|
|
||||||
list_clear(tokens, &hub_free);
|
|
||||||
list_destroy(tokens);
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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_COMMAND_PARSER_H
|
|
||||||
#define HAVE_UHUB_COMMAND_PARSER_H
|
|
||||||
|
|
||||||
struct hub_command;
|
|
||||||
struct hub_user;
|
|
||||||
struct command_base;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse a message as a command and return a status indicating if the command
|
|
||||||
* is valid and that the arguments are sane.
|
|
||||||
*
|
|
||||||
* @param cbase Command base pointer.
|
|
||||||
* @param user User who invoked the command.
|
|
||||||
* @param message The message that is to be interpreted as a command (including the invokation prefix '!' or '+')
|
|
||||||
*
|
|
||||||
* @return a hub_command that must be freed with command_free(). @See struct hub_command.
|
|
||||||
*/
|
|
||||||
extern struct hub_command* command_parse(struct command_base* cbase, struct hub_info* hub, const struct hub_user* user, const char* message);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free a hub_command that was created in command_parse().
|
|
||||||
*/
|
|
||||||
extern void command_free(struct hub_command* command);
|
|
||||||
|
|
||||||
|
|
||||||
enum command_parse_status
|
|
||||||
{
|
|
||||||
cmd_status_ok, /** <<< "Everything seems to OK" */
|
|
||||||
cmd_status_not_found, /** <<< "Command was not found" */
|
|
||||||
cmd_status_access_error, /** <<< "You don't have access to this command" */
|
|
||||||
cmd_status_syntax_error, /** <<< "Not a valid command." */
|
|
||||||
cmd_status_missing_args, /** <<< "Missing some or all required arguments." */
|
|
||||||
cmd_status_arg_nick, /** <<< "A nick argument does not match an online user. ('n')" */
|
|
||||||
cmd_status_arg_cid, /** <<< "A cid argument does not match an online user. ('i')." */
|
|
||||||
cmd_status_arg_address, /** <<< "A address range argument is not valid ('a')." */
|
|
||||||
cmd_status_arg_number, /** <<< "A number argument is not valid ('N')" */
|
|
||||||
cmd_status_arg_cred, /** <<< "A credentials argument is not valid ('C')" */
|
|
||||||
cmd_status_arg_command, /** <<< "A command argument is not valid ('c')" */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum hub_command_arg_type
|
|
||||||
{
|
|
||||||
type_integer,
|
|
||||||
type_string,
|
|
||||||
type_user,
|
|
||||||
type_address,
|
|
||||||
type_range,
|
|
||||||
type_credentials,
|
|
||||||
type_command
|
|
||||||
};
|
|
||||||
|
|
||||||
struct hub_command_arg_data
|
|
||||||
{
|
|
||||||
enum hub_command_arg_type type;
|
|
||||||
union {
|
|
||||||
int integer;
|
|
||||||
char* string;
|
|
||||||
struct hub_user* user;
|
|
||||||
struct ip_addr_encap* address;
|
|
||||||
struct ip_range* range;
|
|
||||||
enum auth_credentials credentials;
|
|
||||||
struct command_handle* command;
|
|
||||||
} data;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int (*command_handler)(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This struct contains all information needed to invoke
|
|
||||||
* a command, which includes the whole message, the prefix,
|
|
||||||
* the decoded arguments (according to parameter list), and
|
|
||||||
* the user pointer (ptr) which comes from the command it was matched to.
|
|
||||||
*
|
|
||||||
* The message and prefix is generally always available, but args only
|
|
||||||
* if status == cmd_status_ok.
|
|
||||||
* Handler and ptr are NULL if status == cmd_status_not_found, or status == cmd_status_access_error.
|
|
||||||
* Ptr might also be NULL if cmd_status_ok because the command that handles it was added with a NULL ptr.
|
|
||||||
*/
|
|
||||||
struct hub_command
|
|
||||||
{
|
|
||||||
const char* message; /**<<< "The complete message." */
|
|
||||||
char* prefix; /**<<< "The prefix extracted from the message." */
|
|
||||||
struct linked_list* args; /**<<< "List of arguments of type struct hub_command_arg_data. Parsed from message." */
|
|
||||||
enum command_parse_status status; /**<<< "Status of the parsed hub_command." */
|
|
||||||
command_handler handler; /**<<< "The function handler to call in order to invoke this command." */
|
|
||||||
const struct hub_user* user; /**<<< "The user who invoked this command." */
|
|
||||||
void* ptr; /**<<< "A pointer of data which came from struct command_handler" */
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the command argument iterator and return the number of arguments
|
|
||||||
* that can be extracted from a parsed command.
|
|
||||||
*
|
|
||||||
* @param cmd the command to start iterating arguments
|
|
||||||
* @return returns the number of arguments provided for the command
|
|
||||||
*/
|
|
||||||
extern size_t hub_command_arg_reset(struct hub_command* cmd);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtain the current argument and place it in data and increments the iterator.
|
|
||||||
* If no argument exists, or the argument is of a different type than \param type, then 0 is returned.
|
|
||||||
*
|
|
||||||
* NOTE: when calling hub_command_arg_next the first time during a command callback it is safe to assume
|
|
||||||
* that the first argument will be extracted. Thus you don't need to call hub_command_arg_reset().
|
|
||||||
*
|
|
||||||
* @param cmd the command used for iterating arguments.
|
|
||||||
* @param type the expected type of this argument
|
|
||||||
* @return NULL if no argument is found or if the argument found does not match the expected type.
|
|
||||||
*/
|
|
||||||
extern struct hub_command_arg_data* hub_command_arg_next(struct hub_command* cmd, enum hub_command_arg_type type);
|
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_COMMAND_PARSER_H */
|
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "uhub.h"
|
#include "uhub.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
// #define CRASH_DEBUG
|
||||||
// #define DEBUG_UNLOAD_PLUGINS
|
// #define DEBUG_UNLOAD_PLUGINS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ struct command_base
|
|||||||
struct hub_info* hub;
|
struct hub_info* hub;
|
||||||
struct linked_list* handlers;
|
struct linked_list* handlers;
|
||||||
size_t prefix_length_max;
|
size_t prefix_length_max;
|
||||||
|
struct ip_range range; // cached for parsing. Only one can be used per parameter.
|
||||||
};
|
};
|
||||||
|
|
||||||
struct command_base* command_initialize(struct hub_info* hub)
|
struct command_base* command_initialize(struct hub_info* hub)
|
||||||
@@ -60,7 +62,7 @@ struct command_base* command_initialize(struct hub_info* hub)
|
|||||||
void command_shutdown(struct command_base* cbase)
|
void command_shutdown(struct command_base* cbase)
|
||||||
{
|
{
|
||||||
commands_builtin_remove(cbase);
|
commands_builtin_remove(cbase);
|
||||||
uhub_assert(list_size(cbase->handlers) == 0);
|
assert(list_size(cbase->handlers) == 0);
|
||||||
list_destroy(cbase->handlers);
|
list_destroy(cbase->handlers);
|
||||||
hub_free(cbase);
|
hub_free(cbase);
|
||||||
}
|
}
|
||||||
@@ -86,14 +88,47 @@ int command_del(struct command_base* cbase, struct command_handle* cmd)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int command_is_available(struct command_handle* handle, enum auth_credentials credentials)
|
static int command_is_available(struct command_handle* handle, const struct hub_user* user)
|
||||||
{
|
{
|
||||||
uhub_assert(handle != NULL);
|
uhub_assert(handle != NULL);
|
||||||
return handle->cred <= credentials;
|
uhub_assert(user != NULL);
|
||||||
|
return handle->cred <= user->credentials;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hub_command_args_free(struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct hub_command_arg_data* data = NULL;
|
||||||
|
|
||||||
struct command_handle* command_handler_lookup(struct command_base* cbase, const char* prefix)
|
if (!cmd->args)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (data = (struct hub_command_arg_data*) list_get_first(cmd->args); data; data = (struct hub_command_arg_data*) list_get_next(cmd->args))
|
||||||
|
{
|
||||||
|
switch (data->type)
|
||||||
|
{
|
||||||
|
case type_string:
|
||||||
|
hub_free(data->data.string);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list_clear(cmd->args, hub_free);
|
||||||
|
list_destroy(cmd->args);
|
||||||
|
cmd->args = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void command_free(struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
if (!cmd) return;
|
||||||
|
|
||||||
|
hub_free(cmd->prefix);
|
||||||
|
hub_command_args_free(cmd);
|
||||||
|
hub_free(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct command_handle* command_handler_lookup(struct command_base* cbase, const char* prefix)
|
||||||
{
|
{
|
||||||
struct command_handle* handler = NULL;
|
struct command_handle* handler = NULL;
|
||||||
size_t prefix_len = strlen(prefix);
|
size_t prefix_len = strlen(prefix);
|
||||||
@@ -110,41 +145,239 @@ struct command_handle* command_handler_lookup(struct command_base* cbase, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void command_get_syntax(struct command_handle* handler, struct cbuffer* buf)
|
static enum command_parse_status command_extract_arguments(struct command_base* cbase, const struct hub_user* user, struct command_handle* command, struct linked_list* tokens, struct linked_list* args)
|
||||||
{
|
{
|
||||||
size_t n, arg_count;
|
int arg = 0;
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
char arg_code, last_arg = -1;
|
char arg_code;
|
||||||
|
char* token = NULL;
|
||||||
|
struct hub_command_arg_data* data = NULL;
|
||||||
|
enum command_parse_status status = cmd_status_ok;
|
||||||
|
|
||||||
cbuf_append_format(buf, "!%s", handler->prefix);
|
// Ignore the first token since it is the prefix.
|
||||||
if (handler->args)
|
token = list_get_first(tokens);
|
||||||
|
list_remove(tokens, token);
|
||||||
|
hub_free(token);
|
||||||
|
|
||||||
|
while (status == cmd_status_ok && (arg_code = command->args[arg++]))
|
||||||
{
|
{
|
||||||
arg_count = strlen(handler->args);
|
token = list_get_first(tokens);
|
||||||
for (n = 0; n < arg_count; n++)
|
if (!token || !*token)
|
||||||
{
|
{
|
||||||
if (!strchr("?+", last_arg))
|
status = (arg_code == '?' ? cmd_status_ok : cmd_status_missing_args);
|
||||||
cbuf_append(buf, " ");
|
break;
|
||||||
arg_code = handler->args[n];
|
}
|
||||||
|
|
||||||
switch (arg_code)
|
switch (arg_code)
|
||||||
{
|
{
|
||||||
case '?': cbuf_append(buf, "["); opt++; break;
|
case '?':
|
||||||
case '+': /* ignore */ break;
|
opt = 1;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_user;
|
||||||
|
data->data.user = uman_get_user_by_nick(cbase->hub, token);
|
||||||
|
if (!data->data.user)
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_nick;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_user;
|
||||||
|
data->data.user = uman_get_user_by_cid(cbase->hub, token);
|
||||||
|
if (!data->data.user)
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_cid;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_address;
|
||||||
|
if (ip_convert_to_binary(token, data->data.address) == -1)
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_address;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_range;
|
||||||
|
if (!ip_convert_address_to_range(token, data->data.range))
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_address;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
case 'p':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_string;
|
||||||
|
data->data.string = strdup(token);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_command;
|
||||||
|
data->data.command = command_handler_lookup(cbase, token);
|
||||||
|
if (!data->data.command)
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_command;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'C':
|
||||||
|
data = hub_malloc(sizeof(*data));
|
||||||
|
data->type = type_credentials;
|
||||||
|
if (!auth_string_to_cred(token, &data->data.credentials))
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
status = cmd_status_arg_cred;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'N':
|
||||||
|
data->type = type_integer;
|
||||||
|
if (!is_number(token, &data->data.integer))
|
||||||
|
{
|
||||||
|
hub_free(data);
|
||||||
|
data = NULL;
|
||||||
|
return cmd_status_arg_number;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '\0':
|
||||||
|
if (!opt)
|
||||||
|
{
|
||||||
|
status = cmd_status_missing_args;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = cmd_status_ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
list_append(args, data);
|
||||||
|
data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_remove(tokens, token);
|
||||||
|
hub_free(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
hub_free(data);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct command_handle* command_get_handler(struct command_base* cbase, const char* prefix, const struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct command_handle* handler = NULL;
|
||||||
|
uhub_assert(cmd != NULL);
|
||||||
|
|
||||||
|
if (prefix && prefix[0] && prefix[1])
|
||||||
|
{
|
||||||
|
handler = command_handler_lookup(cbase, prefix + 1);
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
cmd->ptr = handler->ptr;
|
||||||
|
cmd->handler = handler->handler;
|
||||||
|
cmd->status = command_is_available(handler, user) ? cmd_status_ok : cmd_status_access_error;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd->status = cmd_status_not_found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd->status = cmd_status_syntax_error;
|
||||||
|
}
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a command and break it down into a struct hub_command.
|
||||||
|
*/
|
||||||
|
struct hub_command* command_parse(struct command_base* cbase, const struct hub_user* user, const char* message)
|
||||||
|
{
|
||||||
|
struct linked_list* tokens = list_create();
|
||||||
|
struct hub_command* cmd = NULL;
|
||||||
|
struct command_handle* handle = NULL;
|
||||||
|
|
||||||
|
cmd = hub_malloc_zero(sizeof(struct hub_command));
|
||||||
|
cmd->status = cmd_status_ok;
|
||||||
|
cmd->message = message;
|
||||||
|
cmd->prefix = NULL;
|
||||||
|
cmd->args = list_create();
|
||||||
|
cmd->user = user;
|
||||||
|
|
||||||
|
if (split_string(message, " ", tokens, 0) <= 0)
|
||||||
|
{
|
||||||
|
cmd->status = cmd_status_syntax_error;
|
||||||
|
goto command_parse_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup hub command.
|
||||||
|
cmd->prefix = strdup(((char*) list_get_first(tokens)) + 1);
|
||||||
|
|
||||||
|
// Find a matching command handler
|
||||||
|
handle = command_get_handler(cbase, list_get_first(tokens), user, cmd);
|
||||||
|
if (cmd->status != cmd_status_ok)
|
||||||
|
goto command_parse_cleanup;
|
||||||
|
|
||||||
|
// Parse arguments
|
||||||
|
cmd->status = command_extract_arguments(cbase, user, handle, tokens, cmd->args);
|
||||||
|
goto command_parse_cleanup;
|
||||||
|
|
||||||
|
command_parse_cleanup:
|
||||||
|
list_clear(tokens, &hub_free);
|
||||||
|
list_destroy(tokens);
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
void command_get_syntax(struct command_handle* handler, struct cbuffer* buf)
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
int opt = 0;
|
||||||
|
if (handler->args)
|
||||||
|
{
|
||||||
|
for (n = 0; n < strlen(handler->args); n++)
|
||||||
|
{
|
||||||
|
if (n > 0 && !opt) cbuf_append(buf, " ");
|
||||||
|
switch (handler->args[n])
|
||||||
|
{
|
||||||
|
case '?': cbuf_append(buf, "["); opt = 1; continue;
|
||||||
case 'n': cbuf_append(buf, "<nick>"); break;
|
case 'n': cbuf_append(buf, "<nick>"); break;
|
||||||
case 'u': cbuf_append(buf, "<user>"); break;
|
|
||||||
case 'i': cbuf_append(buf, "<cid>"); break;
|
case 'i': cbuf_append(buf, "<cid>"); break;
|
||||||
case 'a': cbuf_append(buf, "<addr>"); break;
|
case 'a': cbuf_append(buf, "<addr>"); break;
|
||||||
case 'r': cbuf_append(buf, "<addr range>"); break;
|
|
||||||
case 'm': cbuf_append(buf, "<message>"); break;
|
case 'm': cbuf_append(buf, "<message>"); break;
|
||||||
case 'p': cbuf_append(buf, "<password>"); break;
|
case 'p': cbuf_append(buf, "<password>"); break;
|
||||||
case 'C': cbuf_append(buf, "<credentials>"); break;
|
case 'C': cbuf_append(buf, "<credentials>"); break;
|
||||||
case 'c': cbuf_append(buf, "<command>"); break;
|
case 'c': cbuf_append(buf, "<command>"); break;
|
||||||
case 'N': cbuf_append(buf, "<number>"); break;
|
case 'N': cbuf_append(buf, "<number>"); break;
|
||||||
default: LOG_ERROR("unknown argument code '%c'", arg_code);
|
|
||||||
}
|
}
|
||||||
last_arg = arg_code;
|
if (opt)
|
||||||
}
|
{
|
||||||
while (opt--)
|
|
||||||
cbuf_append(buf, "]");
|
cbuf_append(buf, "]");
|
||||||
|
opt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +450,7 @@ int command_check_args(struct hub_command* cmd, struct command_handle* handler)
|
|||||||
int command_invoke(struct command_base* cbase, struct hub_user* user, const char* message)
|
int command_invoke(struct command_base* cbase, struct hub_user* user, const char* message)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct hub_command* cmd = command_parse(cbase, cbase->hub, user, message);
|
struct hub_command* cmd = command_parse(cbase, user, message);
|
||||||
|
|
||||||
switch (cmd->status)
|
switch (cmd->status)
|
||||||
{
|
{
|
||||||
@@ -233,11 +466,14 @@ int command_invoke(struct command_base* cbase, struct hub_user* user, const char
|
|||||||
ret = send_command_access_denied(cbase, user, cmd->prefix);
|
ret = send_command_access_denied(cbase, user, cmd->prefix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case cmd_status_syntax_error:
|
||||||
|
ret = send_command_syntax_error(cbase, user);
|
||||||
|
break;
|
||||||
|
|
||||||
case cmd_status_missing_args:
|
case cmd_status_missing_args:
|
||||||
ret = send_command_missing_arguments(cbase, user, cmd);
|
ret = send_command_missing_arguments(cbase, user, cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case cmd_status_syntax_error:
|
|
||||||
case cmd_status_arg_nick:
|
case cmd_status_arg_nick:
|
||||||
case cmd_status_arg_cid:
|
case cmd_status_arg_cid:
|
||||||
case cmd_status_arg_address:
|
case cmd_status_arg_address:
|
||||||
@@ -253,28 +489,9 @@ int command_invoke(struct command_base* cbase, struct hub_user* user, const char
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t hub_command_arg_reset(struct hub_command* cmd)
|
|
||||||
{
|
|
||||||
cmd->args->iterator = NULL;
|
|
||||||
return list_size(cmd->args);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct hub_command_arg_data* hub_command_arg_next(struct hub_command* cmd, enum hub_command_arg_type type)
|
|
||||||
{
|
|
||||||
struct hub_command_arg_data* ptr = (struct hub_command_arg_data*) list_get_next(cmd->args);
|
|
||||||
if (!ptr)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
uhub_assert(ptr->type == type);
|
|
||||||
if (ptr->type != type)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int command_status(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd, struct cbuffer* msg)
|
static int command_status(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd, struct cbuffer* msg)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf = cbuf_create(cbuf_size(msg) + strlen(cmd->prefix) + 7);
|
struct cbuffer* buf = cbuf_create(cbuf_size(msg) + strlen(cmd->prefix) + 8);
|
||||||
cbuf_append_format(buf, "*** %s: %s", cmd->prefix, cbuf_get(msg));
|
cbuf_append_format(buf, "*** %s: %s", cmd->prefix, cbuf_get(msg));
|
||||||
send_message(cbase, user, buf);
|
send_message(cbase, user, buf);
|
||||||
cbuf_destroy(msg);
|
cbuf_destroy(msg);
|
||||||
@@ -285,16 +502,16 @@ static int command_help(struct command_base* cbase, struct hub_user* user, struc
|
|||||||
{
|
{
|
||||||
size_t n;
|
size_t n;
|
||||||
struct cbuffer* buf = cbuf_create(MAX_HELP_LINE);
|
struct cbuffer* buf = cbuf_create(MAX_HELP_LINE);
|
||||||
struct hub_command_arg_data* data = hub_command_arg_next(cmd, type_command);
|
struct hub_command_arg_data* data = list_get_first(cmd->args);
|
||||||
struct command_handle* command;
|
struct command_handle* command = data->data.command;
|
||||||
|
|
||||||
if (!data)
|
if (!command)
|
||||||
{
|
{
|
||||||
cbuf_append(buf, "Available commands:\n");
|
cbuf_append(buf, "Available commands:\n");
|
||||||
|
|
||||||
for (command = (struct command_handle*) list_get_first(cbase->handlers); command; command = (struct command_handle*) list_get_next(cbase->handlers))
|
for (command = (struct command_handle*) list_get_first(cbase->handlers); command; command = (struct command_handle*) list_get_next(cbase->handlers))
|
||||||
{
|
{
|
||||||
if (command_is_available(command, user->credentials))
|
if (command_is_available(command, user))
|
||||||
{
|
{
|
||||||
cbuf_append_format(buf, "!%s", command->prefix);
|
cbuf_append_format(buf, "!%s", command->prefix);
|
||||||
for (n = strlen(command->prefix); n < cbase->prefix_length_max; n++)
|
for (n = strlen(command->prefix); n < cbase->prefix_length_max; n++)
|
||||||
@@ -305,10 +522,9 @@ static int command_help(struct command_base* cbase, struct hub_user* user, struc
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
command = data->data.command;
|
if (command_is_available(command, user))
|
||||||
if (command_is_available(command, user->credentials))
|
|
||||||
{
|
{
|
||||||
cbuf_append_format(buf, "Usage: ");
|
cbuf_append_format(buf, "Usage: !%s ", command->prefix);
|
||||||
command_get_syntax(command, buf);
|
command_get_syntax(command, buf);
|
||||||
cbuf_append_format(buf, "\n%s\n", command->description);
|
cbuf_append_format(buf, "\n%s\n", command->description);
|
||||||
}
|
}
|
||||||
@@ -343,8 +559,7 @@ static int command_uptime(struct command_base* cbase, struct hub_user* user, str
|
|||||||
static int command_kick(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_kick(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf;
|
struct cbuffer* buf;
|
||||||
struct hub_command_arg_data* arg = hub_command_arg_next(cmd, type_user);
|
struct hub_user* target = list_get_first(cmd->args);
|
||||||
struct hub_user* target = arg->data.user;
|
|
||||||
|
|
||||||
buf = cbuf_create(128);
|
buf = cbuf_create(128);
|
||||||
if (target == user)
|
if (target == user)
|
||||||
@@ -359,6 +574,49 @@ static int command_kick(struct command_base* cbase, struct hub_user* user, struc
|
|||||||
return command_status(cbase, user, cmd, buf);
|
return command_status(cbase, user, cmd, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int command_ban(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
struct hub_user* target = list_get_first(cmd->args);
|
||||||
|
|
||||||
|
if (target == user)
|
||||||
|
{
|
||||||
|
cbuf_append(buf, "Cannot kick/ban yourself");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "Banning user \"%s\"", target->id.nick);
|
||||||
|
|
||||||
|
hub_disconnect_user(cbase->hub, target, quit_kicked);
|
||||||
|
acl_user_ban_nick(cbase->hub->acl, target->id.nick);
|
||||||
|
acl_user_ban_cid(cbase->hub->acl, target->id.cid);
|
||||||
|
}
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_unban(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
return command_status(cbase, user, cmd, cbuf_create_const("Not implemented"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_mute(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct hub_user* target = list_get_first(cmd->args);
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
|
||||||
|
if (strlen(cmd->prefix) == 4)
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "Muted \"%s\"", target->id.nick);
|
||||||
|
user_flag_set(target, flag_muted);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "Unmuted \"%s\"", target->id.nick);
|
||||||
|
user_flag_unset(target, flag_muted);
|
||||||
|
}
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
static int command_reload(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_reload(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
cbase->hub->status = hub_status_restart;
|
cbase->hub->status = hub_status_restart;
|
||||||
@@ -408,20 +666,20 @@ static int command_myip(struct command_base* cbase, struct hub_user* user, struc
|
|||||||
static int command_getip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_getip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf = cbuf_create(128);
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
struct hub_command_arg_data* arg = hub_command_arg_next(cmd, type_user);
|
struct hub_user* target = list_get_first(cmd->args);
|
||||||
cbuf_append_format(buf, "\"%s\" has address \"%s\"", arg->data.user->id.nick, user_get_address(arg->data.user));
|
cbuf_append_format(buf, "\"%s\" has address \"%s\"", target->id.nick, user_get_address(target));
|
||||||
return command_status(cbase, user, cmd, buf);
|
return command_status(cbase, user, cmd, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int command_whoip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_whoip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf;
|
struct cbuffer* buf;
|
||||||
struct hub_command_arg_data* arg = hub_command_arg_next(cmd, type_range);
|
struct ip_range* range = list_get_first(cmd->args);
|
||||||
struct linked_list* users = (struct linked_list*) list_create();
|
struct linked_list* users = (struct linked_list*) list_create();
|
||||||
struct hub_user* u;
|
struct hub_user* u;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
ret = uman_get_user_by_addr(cbase->hub->users, users, arg->data.range);
|
ret = uman_get_user_by_addr(cbase->hub, users, range);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
list_clear(users, &null_free);
|
list_clear(users, &null_free);
|
||||||
@@ -449,9 +707,9 @@ static int command_whoip(struct command_base* cbase, struct hub_user* user, stru
|
|||||||
|
|
||||||
static int command_broadcast(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_broadcast(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct hub_command_arg_data* arg = hub_command_arg_next(cmd, type_string);
|
size_t offset = 11;
|
||||||
char* message = arg->data.string;
|
size_t message_len = strlen(cmd->message + offset);
|
||||||
size_t message_len = strlen(message);
|
char* message = adc_msg_escape(cmd->message + offset);
|
||||||
char pm_flag[7] = "PM";
|
char pm_flag[7] = "PM";
|
||||||
char from_sid[5];
|
char from_sid[5];
|
||||||
size_t recipients = 0;
|
size_t recipients = 0;
|
||||||
@@ -485,17 +743,17 @@ static int command_broadcast(struct command_base* cbase, struct hub_user* user,
|
|||||||
|
|
||||||
cbuf_append_format(buf, "*** %s: Delivered to " PRINTF_SIZE_T " user%s", cmd->prefix, recipients, (recipients != 1 ? "s" : ""));
|
cbuf_append_format(buf, "*** %s: Delivered to " PRINTF_SIZE_T " user%s", cmd->prefix, recipients, (recipients != 1 ? "s" : ""));
|
||||||
send_message(cbase, user, buf);
|
send_message(cbase, user, buf);
|
||||||
|
hub_free(message);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int command_log(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_log(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf;
|
struct cbuffer* buf;
|
||||||
struct hub_command_arg_data* arg = hub_command_arg_next(cmd, type_string);
|
|
||||||
struct linked_list* messages = cbase->hub->logout_info;
|
struct linked_list* messages = cbase->hub->logout_info;
|
||||||
struct hub_logout_info* log;
|
struct hub_logout_info* log;
|
||||||
char* search = arg ? arg->data.string : "";
|
char* search = 0;
|
||||||
size_t search_len = strlen(search);
|
size_t search_len = 0;
|
||||||
size_t search_hits = 0;
|
size_t search_hits = 0;
|
||||||
|
|
||||||
if (!list_size(messages))
|
if (!list_size(messages))
|
||||||
@@ -506,9 +764,15 @@ static int command_log(struct command_base* cbase, struct hub_user* user, struct
|
|||||||
buf = cbuf_create(128);
|
buf = cbuf_create(128);
|
||||||
cbuf_append_format(buf, "Logged entries: " PRINTF_SIZE_T, list_size(messages));
|
cbuf_append_format(buf, "Logged entries: " PRINTF_SIZE_T, list_size(messages));
|
||||||
|
|
||||||
|
search = list_get_first(cmd->args);
|
||||||
|
if (search)
|
||||||
|
{
|
||||||
|
search_len = strlen(search);
|
||||||
|
}
|
||||||
|
|
||||||
if (search_len)
|
if (search_len)
|
||||||
{
|
{
|
||||||
cbuf_append_format(buf, ", searching for \"%s\"", search);
|
cbuf_append_format(buf, ", searching for \"%s\"", list_size(messages), search);
|
||||||
}
|
}
|
||||||
command_status(cbase, user, cmd, buf);
|
command_status(cbase, user, cmd, buf);
|
||||||
|
|
||||||
@@ -553,6 +817,115 @@ static int command_log(struct command_base* cbase, struct hub_user* user, struct
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int command_register(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
struct auth_info data;
|
||||||
|
struct hub_command_arg_data* args = (struct hub_command_arg_data*) list_get_first(cmd->args);
|
||||||
|
char* password = args->data.string;
|
||||||
|
|
||||||
|
strncpy(data.nickname, user->id.nick, MAX_NICK_LEN);
|
||||||
|
strncpy(data.password, password, MAX_PASS_LEN);
|
||||||
|
data.nickname[MAX_NICK_LEN] = '\0';
|
||||||
|
data.password[MAX_PASS_LEN] = '\0';
|
||||||
|
data.credentials = auth_cred_user;
|
||||||
|
|
||||||
|
if (acl_register_user(cbase->hub, &data))
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "User \"%s\" registered.", user->id.nick);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "Unable to register user \"%s\".", user->id.nick);
|
||||||
|
}
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_password(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
struct auth_info data;
|
||||||
|
struct hub_command_arg_data* args = (struct hub_command_arg_data*) list_get_first(cmd->args);
|
||||||
|
char* password = args->data.string;
|
||||||
|
|
||||||
|
strncpy(data.nickname, user->id.nick, MAX_NICK_LEN);
|
||||||
|
strncpy(data.password, password, MAX_PASS_LEN);
|
||||||
|
data.nickname[MAX_NICK_LEN] = '\0';
|
||||||
|
data.password[MAX_PASS_LEN] = '\0';
|
||||||
|
data.credentials = user->credentials;
|
||||||
|
|
||||||
|
if (acl_update_user(cbase->hub, &data))
|
||||||
|
{
|
||||||
|
cbuf_append(buf, "Password changed.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cbuf_append_format(buf, "Unable to change password for user \"%s\".", user->id.nick);
|
||||||
|
}
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_useradd(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
struct auth_info data;
|
||||||
|
char* nick = list_get_first(cmd->args);
|
||||||
|
char* pass = list_get_next(cmd->args);
|
||||||
|
char* cred = list_get_next(cmd->args);
|
||||||
|
enum auth_credentials credentials;
|
||||||
|
|
||||||
|
if (!(cred && auth_string_to_cred(cred, &credentials)))
|
||||||
|
credentials = auth_cred_user;
|
||||||
|
|
||||||
|
strncpy(data.nickname, nick, MAX_NICK_LEN);
|
||||||
|
strncpy(data.password, pass, MAX_PASS_LEN);
|
||||||
|
data.nickname[MAX_NICK_LEN] = '\0';
|
||||||
|
data.password[MAX_PASS_LEN] = '\0';
|
||||||
|
data.credentials = credentials;
|
||||||
|
|
||||||
|
if (acl_register_user(cbase->hub, &data))
|
||||||
|
cbuf_append_format(buf, "User \"%s\" registered.", nick);
|
||||||
|
else
|
||||||
|
cbuf_append_format(buf, "Unable to register user \"%s\".", nick);
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_userdel(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
|
char* nick = list_get_first(cmd->args);
|
||||||
|
|
||||||
|
if (acl_delete_user(cbase->hub, nick))
|
||||||
|
cbuf_append_format(buf, "User \"%s\" is deleted.", nick);
|
||||||
|
else
|
||||||
|
cbuf_append_format(buf, "Unable to delete user \"%s\".", nick);
|
||||||
|
return command_status(cbase, user, cmd, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_usermod(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
return command_status(cbase, user, cmd, cbuf_create_const("Not implemented!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_userinfo(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
return command_status(cbase, user, cmd, cbuf_create_const("Not implemented!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int command_userpass(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
return command_status(cbase, user, cmd, cbuf_create_const("Not implemented!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CRASH_DEBUG
|
||||||
|
static int command_crash(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
|
{
|
||||||
|
void (*crash)(void) = NULL;
|
||||||
|
crash();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int command_stats(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int command_stats(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
{
|
{
|
||||||
struct cbuffer* buf = cbuf_create(128);
|
struct cbuffer* buf = cbuf_create(128);
|
||||||
@@ -587,18 +960,32 @@ static struct command_handle* add_builtin(struct command_base* cbase, const char
|
|||||||
|
|
||||||
void commands_builtin_add(struct command_base* cbase)
|
void commands_builtin_add(struct command_base* cbase)
|
||||||
{
|
{
|
||||||
ADD_COMMAND("broadcast", 9, "+m",auth_cred_operator, command_broadcast,"Send a message to all users" );
|
ADD_COMMAND("ban", 3, "n", auth_cred_operator, command_ban, "Ban a user" );
|
||||||
ADD_COMMAND("getip", 5, "u", auth_cred_operator, command_getip, "Show IP address for a user" );
|
ADD_COMMAND("broadcast", 9, "m", auth_cred_operator, command_broadcast,"Send a message to all users" );
|
||||||
|
#ifdef CRASH_DEBUG
|
||||||
|
ADD_COMMAND("crash", 5, "", auth_cred_admin, command_crash, "Crash the hub (DEBUG)." );
|
||||||
|
#endif
|
||||||
|
ADD_COMMAND("getip", 5, "n", auth_cred_operator, command_getip, "Show IP address for a user" );
|
||||||
ADD_COMMAND("help", 4, "?c",auth_cred_guest, command_help, "Show this help message." );
|
ADD_COMMAND("help", 4, "?c",auth_cred_guest, command_help, "Show this help message." );
|
||||||
ADD_COMMAND("kick", 4, "u", auth_cred_operator, command_kick, "Kick a user" );
|
ADD_COMMAND("kick", 4, "n", auth_cred_operator, command_kick, "Kick a user" );
|
||||||
ADD_COMMAND("log", 3, "?m",auth_cred_operator, command_log, "Display log" ); // fail
|
ADD_COMMAND("log", 3, "?m", auth_cred_operator, command_log, "Display log" ); // fail
|
||||||
|
ADD_COMMAND("mute", 4, "n", auth_cred_operator, command_mute, "Mute user" );
|
||||||
ADD_COMMAND("myip", 4, "", auth_cred_guest, command_myip, "Show your own IP." );
|
ADD_COMMAND("myip", 4, "", auth_cred_guest, command_myip, "Show your own IP." );
|
||||||
|
ADD_COMMAND("register", 8, "p", auth_cred_guest, command_register, "Register your username." ); // fail
|
||||||
ADD_COMMAND("reload", 6, "", auth_cred_admin, command_reload, "Reload configuration files." );
|
ADD_COMMAND("reload", 6, "", auth_cred_admin, command_reload, "Reload configuration files." );
|
||||||
|
ADD_COMMAND("password", 8, "p", auth_cred_user, command_password, "Change your own password." ); // fail
|
||||||
ADD_COMMAND("shutdown", 8, "", auth_cred_admin, command_shutdown_hub, "Shutdown hub." );
|
ADD_COMMAND("shutdown", 8, "", auth_cred_admin, command_shutdown_hub, "Shutdown hub." );
|
||||||
ADD_COMMAND("stats", 5, "", auth_cred_super, command_stats, "Show hub statistics." );
|
ADD_COMMAND("stats", 5, "", auth_cred_super, command_stats, "Show hub statistics." );
|
||||||
|
ADD_COMMAND("unban", 5, "n", auth_cred_operator, command_unban, "Lift ban on a user" ); // not implemented
|
||||||
|
ADD_COMMAND("unmute", 6, "n", auth_cred_operator, command_mute, "Unmute user" );
|
||||||
ADD_COMMAND("uptime", 6, "", auth_cred_guest, command_uptime, "Display hub uptime info." );
|
ADD_COMMAND("uptime", 6, "", auth_cred_guest, command_uptime, "Display hub uptime info." );
|
||||||
|
ADD_COMMAND("useradd", 7, "np",auth_cred_operator, command_useradd, "Register a new user." ); // fail
|
||||||
|
ADD_COMMAND("userdel", 7, "n", auth_cred_operator, command_userdel, "Delete a registered user." ); // fail
|
||||||
|
ADD_COMMAND("userinfo", 8, "n", auth_cred_operator, command_userinfo, "Show registered user info." ); // fail
|
||||||
|
ADD_COMMAND("usermod", 7, "nC",auth_cred_admin, command_usermod, "Modify user credentials." ); // fail
|
||||||
|
ADD_COMMAND("userpass", 8, "np",auth_cred_operator, command_userpass, "Change password for a user." ); // fail
|
||||||
ADD_COMMAND("version", 7, "", auth_cred_guest, command_version, "Show hub version info." );
|
ADD_COMMAND("version", 7, "", auth_cred_guest, command_version, "Show hub version info." );
|
||||||
ADD_COMMAND("whoip", 5, "r", auth_cred_operator, command_whoip, "Show users matching IP range" );
|
ADD_COMMAND("whoip", 5, "a", auth_cred_operator, command_whoip, "Show users matching IP range" ); // ok
|
||||||
|
|
||||||
#ifdef DEBUG_UNLOAD_PLUGINS
|
#ifdef DEBUG_UNLOAD_PLUGINS
|
||||||
ADD_COMMAND("load", 4, "", auth_cred_admin, command_load, "Load plugins." );
|
ADD_COMMAND("load", 4, "", auth_cred_admin, command_load, "Load plugins." );
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2011, 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,12 +24,77 @@ struct command_base;
|
|||||||
struct command_handle;
|
struct command_handle;
|
||||||
struct hub_command;
|
struct hub_command;
|
||||||
|
|
||||||
|
typedef int (*command_handler)(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd);
|
||||||
|
|
||||||
|
enum command_parse_status
|
||||||
|
{
|
||||||
|
cmd_status_ok, /** <<< "Everything seems to OK" */
|
||||||
|
cmd_status_not_found, /** <<< "Command was not found" */
|
||||||
|
cmd_status_access_error, /** <<< "You don't have access to this command" */
|
||||||
|
cmd_status_syntax_error, /** <<< "Not a valid command." */
|
||||||
|
cmd_status_missing_args, /** <<< "Missing some or all required arguments." */
|
||||||
|
cmd_status_arg_nick, /** <<< "A nick argument does not match an online user. ('n')" */
|
||||||
|
cmd_status_arg_cid, /** <<< "A cid argument does not match an online user. ('i')." */
|
||||||
|
cmd_status_arg_address, /** <<< "A address range argument is not valid ('a')." */
|
||||||
|
cmd_status_arg_number, /** <<< "A number argument is not valid ('N')" */
|
||||||
|
cmd_status_arg_cred, /** <<< "A credentials argument is not valid ('C')" */
|
||||||
|
cmd_status_arg_command, /** <<< "A command argument is not valid ('c')" */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hub_command_arg_data
|
||||||
|
{
|
||||||
|
enum Type {
|
||||||
|
type_integer,
|
||||||
|
type_string,
|
||||||
|
type_user,
|
||||||
|
type_address,
|
||||||
|
type_range,
|
||||||
|
type_credentials,
|
||||||
|
type_command
|
||||||
|
} type;
|
||||||
|
|
||||||
|
union {
|
||||||
|
int integer;
|
||||||
|
char* string;
|
||||||
|
struct hub_user* user;
|
||||||
|
struct ip_addr_encap* address;
|
||||||
|
struct ip_range* range;
|
||||||
|
enum auth_credentials credentials;
|
||||||
|
struct command_handle* command;
|
||||||
|
} data;
|
||||||
|
|
||||||
|
struct hub_command_arg_data* next;
|
||||||
|
};
|
||||||
|
|
||||||
|
void hub_command_args_free(struct hub_command* command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct contains all information needed to invoke
|
||||||
|
* a command, which includes the whole message, the prefix,
|
||||||
|
* the decoded arguments (according to parameter list), and
|
||||||
|
* the user pointer (ptr) which comes from the command it was matched to.
|
||||||
|
*
|
||||||
|
* The message and prefix is generally always available, but args only
|
||||||
|
* if status == cmd_status_ok.
|
||||||
|
* Handler and ptr are NULL if status == cmd_status_not_found, or status == cmd_status_access_error.
|
||||||
|
* Ptr might also be NULL if cmd_status_ok because the command that handles it was added with a NULL ptr.
|
||||||
|
*/
|
||||||
|
struct hub_command
|
||||||
|
{
|
||||||
|
const char* message; /**<<< "The complete message." */
|
||||||
|
char* prefix; /**<<< "The prefix extracted from the message." */
|
||||||
|
struct linked_list* args; /**<<< "List of all parsed arguments from the message. Type depends on expectations." */
|
||||||
|
enum command_parse_status status; /**<<< "Status of the hub_command." */
|
||||||
|
command_handler handler; /**<<< "The function handler to call in order to invoke this command." */
|
||||||
|
const struct hub_user* user; /**<<< "The user who invoked this command." */
|
||||||
|
void* ptr; /**<<< "A pointer of data which came from struct command_handler" */
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Argument codes are used to automatically parse arguments
|
* Argument codes are used to automatically parse arguments
|
||||||
* for a a hub command.
|
* for a a hub command.
|
||||||
*
|
*
|
||||||
* u = user (must exist in hub session, or will cause error)
|
* n = nick name (must exist in hub session)
|
||||||
* n = nick name (string)
|
|
||||||
* i = CID (must exist in hub)
|
* i = CID (must exist in hub)
|
||||||
* a = (IP) address (must be a valid IPv4 or IPv6 address)
|
* a = (IP) address (must be a valid IPv4 or IPv6 address)
|
||||||
* r = (IP) address range (either: IP-IP or IP/mask, both IPv4 or IPv6 work)
|
* r = (IP) address range (either: IP-IP or IP/mask, both IPv4 or IPv6 work)
|
||||||
@@ -40,17 +105,12 @@ struct hub_command;
|
|||||||
* N = number (integer)
|
* N = number (integer)
|
||||||
*
|
*
|
||||||
* Prefix an argument with ? to make it optional.
|
* Prefix an argument with ? to make it optional.
|
||||||
* Prefix with + to make the argument greedy, which causes it to grab the rest of the line ignoring boundaries (only supported for string types).
|
* NOTE; if an argument is optional then all following arguments must also be optional.
|
||||||
*
|
|
||||||
* NOTE: if an argument is optional then all following arguments must also be optional.
|
|
||||||
* NOTE: You can combine optional and greedy, example: "?+m" would match "", "a", "a b c", etc.
|
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* "nia" means "nick cid ip"
|
* "nia" means "nick cid ip"
|
||||||
* "n?p" means "nick [password]" where password is optional.
|
* "n?p" means "nick [password]" where password is optional.
|
||||||
* "?N?N" means zero, one, or two integers.
|
*
|
||||||
* "?NN" means zero or two integers.
|
|
||||||
* "?+m" means an optional string which may contain spaces that would otherwise be split into separate arguments.
|
|
||||||
*/
|
*/
|
||||||
struct command_handle
|
struct command_handle
|
||||||
{
|
{
|
||||||
@@ -93,15 +153,22 @@ extern int command_del(struct command_base*, struct command_handle*);
|
|||||||
extern int command_invoke(struct command_base*, struct hub_user* user, const char* message);
|
extern int command_invoke(struct command_base*, struct hub_user* user, const char* message);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns 1 if the command handle can be used with the given credentials, 0 otherwise.
|
* Parse a message as a command and return a status indicating if the command
|
||||||
|
* is valid and that the arguments are sane.
|
||||||
|
*
|
||||||
|
* @param cbase Command base pointer.
|
||||||
|
* @param user User who invoked the command.
|
||||||
|
* @param message The message that is to be interpreted as a command (including the invokation prefix '!' or '+')
|
||||||
|
*
|
||||||
|
* @return a hub_command that must be freed with command_free(). @See struct hub_command.
|
||||||
*/
|
*/
|
||||||
int command_is_available(struct command_handle* handle, enum auth_credentials credentials);
|
extern struct hub_command* command_parse(struct command_base* cbase, const struct hub_user* user, const char* message);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lookup a command handle based on prefix.
|
* Free a hub_command that was created in command_parse().
|
||||||
* If no matching command handle is found then NULL is returned.
|
|
||||||
*/
|
*/
|
||||||
struct command_handle* command_handler_lookup(struct command_base* cbase, const char* prefix);
|
extern void command_free(struct hub_command* command);
|
||||||
|
|
||||||
|
|
||||||
extern void commands_builtin_add(struct command_base*);
|
extern void commands_builtin_add(struct command_base*);
|
||||||
extern void commands_builtin_remove(struct command_base*);
|
extern void commands_builtin_remove(struct command_base*);
|
||||||
|
|||||||
@@ -1,191 +1,80 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use XML::DOM;
|
use XML::Twig;
|
||||||
|
|
||||||
sub write_c_header(@);
|
sub write_c_header(@);
|
||||||
sub write_sql_dump(@);
|
sub write_c_impl_defaults(@);
|
||||||
|
sub write_c_impl_apply(@);
|
||||||
|
sub write_c_impl_free(@);
|
||||||
|
sub write_c_impl_dump(@);
|
||||||
sub get_data($);
|
sub get_data($);
|
||||||
|
|
||||||
my $dump_to_sql = 0;
|
|
||||||
|
|
||||||
# initialize parser and read the file
|
# initialize parser and read the file
|
||||||
my $input = "./config.xml";
|
my $input = "./config.xml";
|
||||||
my $parser = new XML::DOM::Parser;
|
my $parser = XML::Twig->new();
|
||||||
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
||||||
|
|
||||||
# Get data
|
# Write header file
|
||||||
my $nodes = $tree->getElementsByTagName("option");
|
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
||||||
my @options = ();
|
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\nstruct hub_config\n{\n";
|
||||||
for (my $i = 0; $i < $nodes->getLength; $i++)
|
foreach my $p ($tree->root->children("option"))
|
||||||
{
|
{
|
||||||
my @data = get_data($nodes->item($i));
|
write_c_header(get_data($p));
|
||||||
push @options, \@data;
|
|
||||||
}
|
}
|
||||||
|
print GENHEAD "};\n\n";
|
||||||
|
|
||||||
write_c_header(@options);
|
# Write c source file
|
||||||
write_sql_dump(@options) if ($dump_to_sql);
|
|
||||||
|
|
||||||
my $config_defaults = "void config_defaults(struct hub_config* config)\n{\n";
|
|
||||||
my $config_apply = "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
|
||||||
my $config_free = "void free_config(struct hub_config* config)\n{\n";
|
|
||||||
my $config_dump = "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
|
||||||
|
|
||||||
foreach my $option (@options)
|
|
||||||
{
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
|
|
||||||
my $string = ($type =~ /(string|file|message)/);
|
|
||||||
my $min = undef;
|
|
||||||
my $max = undef;
|
|
||||||
my $regexp = undef;
|
|
||||||
|
|
||||||
if (defined $check)
|
|
||||||
{
|
|
||||||
$min = $check->getAttribute("min");
|
|
||||||
$max = $check->getAttribute("max");
|
|
||||||
$regexp = $check->getAttribute("regexp");
|
|
||||||
|
|
||||||
$max = undef if ($max eq "");
|
|
||||||
$min = undef if ($min eq "");
|
|
||||||
$regexp = undef if ($regexp eq "");
|
|
||||||
}
|
|
||||||
|
|
||||||
$config_defaults .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
|
||||||
$config_defaults .= "\tconfig->$name = ";
|
|
||||||
$config_defaults .= "hub_strdup(\"" if ($string);
|
|
||||||
$config_defaults .= $default;
|
|
||||||
$config_defaults .= "\")" if ($string);
|
|
||||||
$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";
|
|
||||||
|
|
||||||
if ($type eq "int")
|
|
||||||
{
|
|
||||||
$config_apply .= "\t\tmin = $min;\n" if (defined $min);
|
|
||||||
$config_apply .= "\t\tmax = $max;\n" if (defined $max);
|
|
||||||
$config_apply .= "\t\tif (!apply_integer(key, data, &config->$name, ";
|
|
||||||
if (defined $min) { $config_apply .= "&min"; } else { $config_apply .= "0"; }
|
|
||||||
$config_apply .= ", ";
|
|
||||||
if (defined $max) { $config_apply .= "&max"; } else { $config_apply .= "0"; }
|
|
||||||
$config_apply .= "))\n";
|
|
||||||
}
|
|
||||||
elsif ($type eq "boolean")
|
|
||||||
{
|
|
||||||
$config_apply .= "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
|
||||||
}
|
|
||||||
elsif ($string)
|
|
||||||
{
|
|
||||||
$config_apply .="\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$config_apply .= "\t\t{\n" .
|
|
||||||
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
|
||||||
"\t\t\treturn -1;\n" .
|
|
||||||
"\t\t}\n" .
|
|
||||||
"\t\treturn 0;\n" .
|
|
||||||
"\t}\n";
|
|
||||||
$config_apply .= "#endif /* $ifdef */\n" if ($ifdef ne "");
|
|
||||||
$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 $val = "config->$name";
|
|
||||||
my $test = "config->$name != $default";
|
|
||||||
|
|
||||||
$out = "%d" if ($type eq "int");
|
|
||||||
$val = "config->$name ? \"yes\" : \"no\"" if ($type eq "boolean");
|
|
||||||
|
|
||||||
if ($string)
|
|
||||||
{
|
|
||||||
$out = "\\\"%s\\\"";
|
|
||||||
$test = "strcmp(config->$name, \"$default\") != 0";
|
|
||||||
}
|
|
||||||
|
|
||||||
$config_dump .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
|
||||||
$config_dump .= "\tif (!ignore_defaults || $test)\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 .= "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
|
||||||
$config_apply .= "\treturn -1;\n";
|
|
||||||
$config_apply .= "}\n\n";
|
|
||||||
$config_defaults .= "}\n\n";
|
|
||||||
$config_free .= "}\n\n";
|
|
||||||
$config_dump .= "}\n\n";
|
|
||||||
|
|
||||||
open GENIMPL, ">gen_config.c" || die "Unable to write source file";
|
open GENIMPL, ">gen_config.c" || die "Unable to write source file";
|
||||||
print GENIMPL "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
print GENIMPL "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
||||||
print GENIMPL $config_defaults;
|
|
||||||
print GENIMPL $config_apply;
|
|
||||||
print GENIMPL $config_free;
|
|
||||||
print GENIMPL $config_dump;
|
|
||||||
|
|
||||||
|
# The defaults function
|
||||||
sub get_data($)
|
print GENIMPL "void config_defaults(struct hub_config* config)\n{\n";
|
||||||
|
foreach my $p ($tree->root->children("option"))
|
||||||
{
|
{
|
||||||
my $p = shift;
|
write_c_impl_defaults(get_data($p));
|
||||||
|
|
||||||
my $short = "";
|
|
||||||
my $example = "";
|
|
||||||
my $description = "";
|
|
||||||
my $since = "";
|
|
||||||
my $ifdef = "";
|
|
||||||
|
|
||||||
$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());
|
|
||||||
$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());
|
|
||||||
my $check = $p->getElementsByTagName("check")->item(0);
|
|
||||||
$ifdef = $p->getElementsByTagName("ifdef")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("ifdef")->getLength());
|
|
||||||
|
|
||||||
my @data = (
|
|
||||||
$p->getAttribute("type"),
|
|
||||||
$p->getAttribute("name"),
|
|
||||||
$p->getAttribute("default"),
|
|
||||||
$p->getAttribute("advanced"),
|
|
||||||
$short,
|
|
||||||
$description,
|
|
||||||
$since,
|
|
||||||
$example,
|
|
||||||
$check,
|
|
||||||
$ifdef
|
|
||||||
);
|
|
||||||
return @data;
|
|
||||||
}
|
}
|
||||||
|
print GENIMPL "}\n\n";
|
||||||
|
|
||||||
|
# apply function
|
||||||
|
print GENIMPL "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
||||||
|
|
||||||
|
foreach my $p ($tree->root->children("option"))
|
||||||
|
{
|
||||||
|
write_c_impl_apply(get_data($p));
|
||||||
|
}
|
||||||
|
print GENIMPL "\t/* Still here -- unknown directive */\n";
|
||||||
|
print GENIMPL "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
||||||
|
print GENIMPL "\t\treturn -1;\n";
|
||||||
|
print GENIMPL "}\n\n";
|
||||||
|
|
||||||
|
# free function (for strings)
|
||||||
|
print GENIMPL "void free_config(struct hub_config* config)\n{\n";
|
||||||
|
foreach my $p ($tree->root->children("option"))
|
||||||
|
{
|
||||||
|
write_c_impl_free(get_data($p));
|
||||||
|
}
|
||||||
|
print GENIMPL "}\n\n";
|
||||||
|
|
||||||
|
# dump function
|
||||||
|
print GENIMPL "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
||||||
|
foreach my $p ($tree->root->children("option"))
|
||||||
|
{
|
||||||
|
write_c_impl_dump(get_data($p));
|
||||||
|
}
|
||||||
|
print GENIMPL "}\n\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Write header file
|
|
||||||
sub write_c_header(@)
|
sub write_c_header(@)
|
||||||
{
|
{
|
||||||
my @data = @_;
|
my @output = @_;
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||||
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
|
||||||
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
|
||||||
print GENHEAD "struct hub_config\n{\n";
|
|
||||||
|
|
||||||
foreach my $option (@data)
|
|
||||||
{
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
|
|
||||||
|
|
||||||
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");
|
||||||
print GENHEAD "char*" if ($string);
|
print GENHEAD "char*" if ($type =~ /(string|file|message)/);
|
||||||
print GENHEAD " " . $name . ";";
|
print GENHEAD " " . $name . ";";
|
||||||
|
|
||||||
my $comment = "";
|
my $comment = "";
|
||||||
@@ -196,14 +85,7 @@ sub write_c_header(@)
|
|||||||
elsif (defined $short && length $short > 0)
|
elsif (defined $short && length $short > 0)
|
||||||
{
|
{
|
||||||
$comment = $short;
|
$comment = $short;
|
||||||
if (defined $default)
|
$comment .= " (default: " . $default . ")" if (defined $default);
|
||||||
{
|
|
||||||
$comment .= " (default: ";
|
|
||||||
$comment .= "\"" if ($string);
|
|
||||||
$comment .= $default;
|
|
||||||
$comment .= "\"" if ($string);
|
|
||||||
$comment .= ")";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length $comment > 0)
|
if (length $comment > 0)
|
||||||
@@ -215,75 +97,145 @@ 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";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub write_c_impl_defaults(@)
|
||||||
sub write_sql_dump(@)
|
|
||||||
{
|
{
|
||||||
my @data = @_;
|
my @output = @_;
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||||
|
my $prefix = "";
|
||||||
|
my $suffix = "";
|
||||||
|
|
||||||
# Write SQL dump code
|
print GENIMPL "\tconfig->$name = ";
|
||||||
open GENSQL, ">gen_config.sql" || die "Unable to write SQL dump";
|
if ($type =~ /(string|file|message)/)
|
||||||
print GENSQL "START TRANSACTION;\n\n
|
|
||||||
DROP TABLE uhub_config IF EXISTS;\n\n
|
|
||||||
CREATE TABLE uhub_config (
|
|
||||||
name VARCHAR(32) UNIQUE NOT NULL,
|
|
||||||
defaultValue TINYTEXT NOT NULL,
|
|
||||||
description LONGTEXT NOT NULL,
|
|
||||||
type TINYTEXT NOT NULL,
|
|
||||||
advanced BOOLEAN,
|
|
||||||
example LONGTEXT,
|
|
||||||
since TINYTEXT
|
|
||||||
);\n\n";
|
|
||||||
|
|
||||||
foreach my $option (@data)
|
|
||||||
{
|
{
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
|
$prefix = "hub_strdup(\"";
|
||||||
|
$suffix = "\")"
|
||||||
if ($type =~ /(string|file|message)/ )
|
|
||||||
{
|
|
||||||
$default = "\\\"$default\\\"";
|
|
||||||
}
|
}
|
||||||
|
print GENIMPL $prefix . $default . $suffix . ";\n";
|
||||||
$desc =~ s/\"/\\\"/g;
|
|
||||||
$type =~ s/^int$/integer/;
|
|
||||||
|
|
||||||
my $stmt = "INSERT INTO uhub_config VALUES(";
|
|
||||||
$stmt .= "\"$name\", ";
|
|
||||||
$stmt .= "\"$default\", ";
|
|
||||||
$stmt .= "\"$desc\", ";
|
|
||||||
$stmt .= "\"$type\", ";
|
|
||||||
|
|
||||||
if (defined $example)
|
|
||||||
{
|
|
||||||
my $example_str = $example;
|
|
||||||
$example_str =~ s/\\/\\\\/g;
|
|
||||||
$example_str =~ s/\"/\\\"/g;
|
|
||||||
$stmt .= "\"$example_str\", ";
|
|
||||||
} else {
|
|
||||||
$stmt .= "NULL, ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $since) {
|
|
||||||
$stmt .= "\"$since\", ";
|
|
||||||
} else {
|
|
||||||
$stmt .= "NULL, ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $advanced) {
|
|
||||||
$stmt .= "\"$advanced\"";
|
|
||||||
} else {
|
|
||||||
$stmt .= "NULL";
|
|
||||||
}
|
|
||||||
|
|
||||||
$stmt .= ");\n";
|
|
||||||
|
|
||||||
print GENSQL $stmt;
|
|
||||||
}
|
|
||||||
print GENSQL "\n\nCOMMIT;\n\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub write_c_impl_apply(@)
|
||||||
|
{
|
||||||
|
my @output = @_;
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $p) = @output;
|
||||||
|
|
||||||
|
my $min;
|
||||||
|
my $max;
|
||||||
|
my $regexp;
|
||||||
|
|
||||||
|
if (defined $p)
|
||||||
|
{
|
||||||
|
$min = $p->att("min");
|
||||||
|
$max = $p->att("max");
|
||||||
|
$regexp = $p->att("regexp");
|
||||||
|
|
||||||
|
print "'check' is defined for option $name";
|
||||||
|
print ", min=$min" if (defined $min);
|
||||||
|
print ", max=$max" if (defined $max);
|
||||||
|
print ", regexp=\"$regexp\"" if (defined $regexp);
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
||||||
|
|
||||||
|
if ($type eq "int")
|
||||||
|
{
|
||||||
|
if (defined $min)
|
||||||
|
{
|
||||||
|
print GENIMPL "\t\tmin = $min;\n"
|
||||||
|
}
|
||||||
|
if (defined $max)
|
||||||
|
{
|
||||||
|
print GENIMPL "\t\tmax = $max;\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL "\t\tif (!apply_integer(key, data, &config->$name, ";
|
||||||
|
|
||||||
|
if (defined $min)
|
||||||
|
{
|
||||||
|
print GENIMPL "&min";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print GENIMPL "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL ", ";
|
||||||
|
|
||||||
|
if (defined $max)
|
||||||
|
{
|
||||||
|
print GENIMPL "&max";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print GENIMPL "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL "))\n";
|
||||||
|
}
|
||||||
|
elsif ($type eq "boolean")
|
||||||
|
{
|
||||||
|
print GENIMPL "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
||||||
|
}
|
||||||
|
elsif ($type =~ /(string|file|message)/)
|
||||||
|
{
|
||||||
|
print GENIMPL "\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL "\t\t{\n" .
|
||||||
|
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
||||||
|
"\t\t\treturn -1;\n" .
|
||||||
|
"\t\t}\n" .
|
||||||
|
"\t\treturn 0;\n" .
|
||||||
|
"\t}\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_c_impl_free(@)
|
||||||
|
{
|
||||||
|
my @output = @_;
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||||
|
|
||||||
|
if ($type =~ /(string|file|message)/)
|
||||||
|
{
|
||||||
|
print GENIMPL "\thub_free(config->" . $name . ");\n\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_c_impl_dump(@)
|
||||||
|
{
|
||||||
|
my @output = @_;
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||||
|
my $out;
|
||||||
|
my $val = "config->$name";
|
||||||
|
my $test = "config->$name != $default";
|
||||||
|
|
||||||
|
if ($type eq "int")
|
||||||
|
{
|
||||||
|
$out = "%d";
|
||||||
|
}
|
||||||
|
elsif ($type eq "boolean")
|
||||||
|
{
|
||||||
|
$out = "%s";
|
||||||
|
$val = "config->$name ? \"yes\" : \"no\"";
|
||||||
|
}
|
||||||
|
elsif ($type =~ /(string|file|message)/)
|
||||||
|
{
|
||||||
|
$out = "\\\"%s\\\"";
|
||||||
|
$test = "strcmp(config->$name, \"$default\") != 0";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENIMPL "\tif (!ignore_defaults || $test)\n";
|
||||||
|
print GENIMPL "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_data($)
|
||||||
|
{
|
||||||
|
my $p = shift;
|
||||||
|
my $check = $p->first_child_matches("check");
|
||||||
|
my @data = ($p->att("type"), $p->att("name"), $p->att("default"), $p->att("advanced"), $p->children_text("short"), $p->children_text("description"), $p->children_text("since"), $p->children_text("example"), $check);
|
||||||
|
return @data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<check min="1" max="65535" />
|
<check min="1" max="65535" />
|
||||||
<since>0.1.0</since>
|
<since>0.1.0</since>
|
||||||
<short>Server port to bind to</short>
|
<short>Server port to bind to</short>
|
||||||
<description><![CDATA[This specifies the port number the hub should listen on.]]></description>
|
<description><![CDATA[This is specifies the port number the hub should listen on.]]></description>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="server_bind_addr" type="string" default="any">
|
<option name="server_bind_addr" type="string" default="any">
|
||||||
@@ -409,7 +409,7 @@
|
|||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="tls_require" type="boolean" default="0">
|
<option name="tls_require" type="boolean" default="0">
|
||||||
<short>If SSL/TLS enabled, should it be required</short>
|
<short>If SSL/TLS enabled, should it be required (default: 0)</short>
|
||||||
<description><![CDATA[
|
<description><![CDATA[
|
||||||
If TLS/SSL support is enabled it can either be optional or mandatory.
|
If TLS/SSL support is enabled it can either be optional or mandatory.
|
||||||
If this option is disabled then SSL/TLS is not required to enter the hub, however it is possible to enter either with or without.
|
If this option is disabled then SSL/TLS is not required to enter the hub, however it is possible to enter either with or without.
|
||||||
@@ -590,7 +590,7 @@
|
|||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="msg_error_no_memory" type="message" default="No memory">
|
<option name="msg_error_no_memory" type="message" default="No memory">
|
||||||
<description><![CDATA[Hub has no more memory]]></description>
|
<description><![CDATA[]]></description>
|
||||||
<since>0.2.0</since>
|
<since>0.2.0</since>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ int event_queue_process(struct event_queue* queue)
|
|||||||
}
|
}
|
||||||
|
|
||||||
list_clear(queue->q1, event_queue_cleanup_callback);
|
list_clear(queue->q1, event_queue_cleanup_callback);
|
||||||
uhub_assert(list_size(queue->q1) == 0);
|
assert(list_size(queue->q1) == 0);
|
||||||
|
|
||||||
/* unlock queue */
|
/* unlock queue */
|
||||||
queue->locked = 0;
|
queue->locked = 0;
|
||||||
|
|||||||
@@ -102,9 +102,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "server_port"))
|
if (!strcmp(key, "server_port"))
|
||||||
{
|
{
|
||||||
min = 1;
|
if (!apply_integer(key, data, &config->server_port, 0, 0))
|
||||||
max = 65535;
|
|
||||||
if (!apply_integer(key, data, &config->server_port, &min, &max))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -124,8 +122,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "server_listen_backlog"))
|
if (!strcmp(key, "server_listen_backlog"))
|
||||||
{
|
{
|
||||||
min = 5;
|
if (!apply_integer(key, data, &config->server_listen_backlog, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->server_listen_backlog, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -247,9 +244,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_recv_buffer"))
|
if (!strcmp(key, "max_recv_buffer"))
|
||||||
{
|
{
|
||||||
min = 1024;
|
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
|
||||||
max = 1048576;
|
|
||||||
if (!apply_integer(key, data, &config->max_recv_buffer, &min, &max))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -259,8 +254,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_send_buffer"))
|
if (!strcmp(key, "max_send_buffer"))
|
||||||
{
|
{
|
||||||
min = 2048;
|
if (!apply_integer(key, data, &config->max_send_buffer, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->max_send_buffer, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -270,8 +264,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_send_buffer_soft"))
|
if (!strcmp(key, "max_send_buffer_soft"))
|
||||||
{
|
{
|
||||||
min = 1024;
|
if (!apply_integer(key, data, &config->max_send_buffer_soft, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->max_send_buffer_soft, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -291,9 +284,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_chat_history"))
|
if (!strcmp(key, "max_chat_history"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->max_chat_history, 0, 0))
|
||||||
max = 250;
|
|
||||||
if (!apply_integer(key, data, &config->max_chat_history, &min, &max))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -303,9 +294,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_logout_log"))
|
if (!strcmp(key, "max_logout_log"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->max_logout_log, 0, 0))
|
||||||
max = 2000;
|
|
||||||
if (!apply_integer(key, data, &config->max_logout_log, &min, &max))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -315,8 +304,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_user"))
|
if (!strcmp(key, "limit_max_hubs_user"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_hubs_user, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_user, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -326,8 +314,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_reg"))
|
if (!strcmp(key, "limit_max_hubs_reg"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_hubs_reg, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_reg, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -337,8 +324,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_op"))
|
if (!strcmp(key, "limit_max_hubs_op"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_hubs_op, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_op, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -348,8 +334,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs"))
|
if (!strcmp(key, "limit_max_hubs"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_hubs, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -359,8 +344,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_user"))
|
if (!strcmp(key, "limit_min_hubs_user"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_min_hubs_user, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_user, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -370,8 +354,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_reg"))
|
if (!strcmp(key, "limit_min_hubs_reg"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_min_hubs_reg, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_reg, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -381,8 +364,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_op"))
|
if (!strcmp(key, "limit_min_hubs_op"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_min_hubs_op, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_op, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -403,8 +385,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_share"))
|
if (!strcmp(key, "limit_max_share"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_share, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_share, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -414,8 +395,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_slots"))
|
if (!strcmp(key, "limit_min_slots"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_min_slots, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_min_slots, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -425,8 +405,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_slots"))
|
if (!strcmp(key, "limit_max_slots"))
|
||||||
{
|
{
|
||||||
min = 0;
|
if (!apply_integer(key, data, &config->limit_max_slots, 0, 0))
|
||||||
if (!apply_integer(key, data, &config->limit_max_slots, &min, 0))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ struct hub_config
|
|||||||
{
|
{
|
||||||
int hub_enabled; /*<<< Is server enabled (default: 1) */
|
int hub_enabled; /*<<< Is server enabled (default: 1) */
|
||||||
int server_port; /*<<< Server port to bind to (default: 1511) */
|
int server_port; /*<<< Server port to bind to (default: 1511) */
|
||||||
char* server_bind_addr; /*<<< Server bind address (default: "any") */
|
char* server_bind_addr; /*<<< Server bind address (default: any) */
|
||||||
int server_listen_backlog; /*<<< Server listen backlog (default: 50) */
|
int server_listen_backlog; /*<<< Server listen backlog (default: 50) */
|
||||||
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: "") */
|
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: ) */
|
||||||
int show_banner; /*<<< Show banner on connect (default: 1) */
|
int show_banner; /*<<< Show banner on connect (default: 1) */
|
||||||
int show_banner_sys_info; /*<<< Show banner on connect (default: 1) */
|
int show_banner_sys_info; /*<<< Show banner on connect (default: 1) */
|
||||||
int max_users; /*<<< Maximum number of users allowed on the hub (default: 500) */
|
int max_users; /*<<< Maximum number of users allowed on the hub (default: 500) */
|
||||||
@@ -14,9 +14,9 @@ struct hub_config
|
|||||||
int register_self; /*<<< Allow users to register themselves on the hub. (default: 0) */
|
int register_self; /*<<< Allow users to register themselves on the hub. (default: 0) */
|
||||||
int obsolete_clients; /*<<< Support obsolete clients using a ADC protocol prior to 1.0 (default: 0) */
|
int obsolete_clients; /*<<< Support obsolete clients using a ADC protocol prior to 1.0 (default: 0) */
|
||||||
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
||||||
char* hub_name; /*<<< Name of hub (default: "uhub") */
|
char* hub_name; /*<<< Name of hub (default: uhub) */
|
||||||
char* hub_description; /*<<< Short hub description, topic or subject. (default: "no description") */
|
char* hub_description; /*<<< Short hub description, topic or subject. (default: no description) */
|
||||||
char* redirect_addr; /*<<< A common hub redirect address. (default: "") */
|
char* redirect_addr; /*<<< A common hub redirect address. (default: ) */
|
||||||
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
||||||
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
||||||
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
||||||
@@ -41,12 +41,12 @@ struct hub_config
|
|||||||
int flood_ctl_update; /*<<< Max updates allowed in time interval (default: 0) */
|
int flood_ctl_update; /*<<< Max updates allowed in time interval (default: 0) */
|
||||||
int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */
|
int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */
|
||||||
int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */
|
int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */
|
||||||
int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) */
|
int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) (default: 0) */
|
||||||
char* tls_require_redirect_addr; /*<<< A redirect address in case a client connects using "adc://" when "adcs://" is required. (default: "") */
|
char* tls_require_redirect_addr; /*<<< A redirect address in case a client connects using "adc://" when "adcs://" is required. (default: ) */
|
||||||
char* tls_certificate; /*<<< Certificate file (default: "") */
|
char* tls_certificate; /*<<< Certificate file (default: ) */
|
||||||
char* tls_private_key; /*<<< Private key file (default: "") */
|
char* tls_private_key; /*<<< Private key file (default: ) */
|
||||||
char* file_acl; /*<<< File containing access control lists (default: "") */
|
char* file_acl; /*<<< File containing access control lists (default: ) */
|
||||||
char* file_plugins; /*<<< Plugin configuration file (default: "") */
|
char* file_plugins; /*<<< Plugin configuration file (default: ) */
|
||||||
char* msg_hub_full; /*<<< "Hub is full" */
|
char* msg_hub_full; /*<<< "Hub is full" */
|
||||||
char* msg_hub_disabled; /*<<< "Hub is disabled" */
|
char* msg_hub_disabled; /*<<< "Hub is disabled" */
|
||||||
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */
|
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2011, 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
|
||||||
@@ -76,10 +76,6 @@ int hub_handle_message(struct hub_info* hub, struct hub_user* u, const char* lin
|
|||||||
case ADC_CMD_DINF:
|
case ADC_CMD_DINF:
|
||||||
case ADC_CMD_EINF:
|
case ADC_CMD_EINF:
|
||||||
case ADC_CMD_FINF:
|
case ADC_CMD_FINF:
|
||||||
case ADC_CMD_BQUI:
|
|
||||||
case ADC_CMD_DQUI:
|
|
||||||
case ADC_CMD_EQUI:
|
|
||||||
case ADC_CMD_FQUI:
|
|
||||||
/* these must never be allowed for security reasons, so we ignore them. */
|
/* these must never be allowed for security reasons, so we ignore them. */
|
||||||
CHECK_FLOOD(extras, 1);
|
CHECK_FLOOD(extras, 1);
|
||||||
break;
|
break;
|
||||||
@@ -110,33 +106,25 @@ 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->users, cmd->target), cmd->cache) == st_deny)
|
if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub, 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->users, cmd->target)) == st_deny)
|
if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub, 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->users, cmd->target)) == st_deny)
|
if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub, 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;
|
||||||
@@ -340,7 +328,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->users, cmd->target);
|
struct hub_user* target = uman_get_user_by_sid(hub, 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
|
||||||
@@ -381,7 +369,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->users, u);
|
sid = uman_get_free_sid(hub, 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);
|
||||||
@@ -520,11 +508,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->users, user->id.nick);
|
lookup1 = uman_get_user_by_nick(hub, 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->users, user->id.cid);
|
lookup2 = uman_get_user_by_cid(hub, user->id.cid);
|
||||||
if (lookup2)
|
if (lookup2)
|
||||||
return status_msg_inf_error_cid_taken;
|
return status_msg_inf_error_cid_taken;
|
||||||
|
|
||||||
@@ -536,7 +524,7 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message
|
|||||||
int status;
|
int status;
|
||||||
struct hub_info* hub = (struct hub_info*) callback_data;
|
struct hub_info* hub = (struct hub_info*) callback_data;
|
||||||
struct hub_user* user = (struct hub_user*) message->ptr;
|
struct hub_user* user = (struct hub_user*) message->ptr;
|
||||||
uhub_assert(hub != NULL);
|
assert(hub != NULL);
|
||||||
|
|
||||||
switch (message->id)
|
switch (message->id)
|
||||||
{
|
{
|
||||||
@@ -568,8 +556,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->users, user);
|
uman_remove(hub, user);
|
||||||
uman_send_quit_message(hub, hub->users, user);
|
uman_send_quit_message(hub, 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;
|
||||||
@@ -586,7 +574,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->users, u);
|
uman_remove(hub, 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);
|
||||||
}
|
}
|
||||||
@@ -781,8 +769,7 @@ struct hub_info* hub_start_service(struct hub_config* config)
|
|||||||
hub->config = config;
|
hub->config = config;
|
||||||
hub->users = NULL;
|
hub->users = NULL;
|
||||||
|
|
||||||
hub->users = uman_init();
|
if (uman_init(hub) == -1)
|
||||||
if (!hub->users)
|
|
||||||
{
|
{
|
||||||
net_con_close(hub->server);
|
net_con_close(hub->server);
|
||||||
hub_free(hub);
|
hub_free(hub);
|
||||||
@@ -792,7 +779,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->users);
|
uman_shutdown(hub);
|
||||||
hub_free(hub);
|
hub_free(hub);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -804,7 +791,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->users);
|
uman_shutdown(hub);
|
||||||
hub_free(hub);
|
hub_free(hub);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -833,7 +820,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->users);
|
uman_shutdown(hub);
|
||||||
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);
|
||||||
@@ -914,7 +901,6 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
|
|||||||
|
|
||||||
if (hub_plugins_load(hub) < 0)
|
if (hub_plugins_load(hub) < 0)
|
||||||
{
|
{
|
||||||
LOG_FATAL("Unable to load plugins.");
|
|
||||||
hub->status = hub_status_shutdown;
|
hub->status = hub_status_shutdown;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -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, hub->users, u))
|
if (!uman_send_user_list(hub, 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->users, u);
|
uman_add(hub, 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))
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2010, 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,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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)
|
||||||
@@ -34,13 +35,13 @@ static void debug_msg(const char* prefix, struct adc_message* msg)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct ioq_recv* ioq_recv_create()
|
struct hub_recvq* hub_recvq_create()
|
||||||
{
|
{
|
||||||
struct ioq_recv* q = hub_malloc_zero(sizeof(struct ioq_recv));
|
struct hub_recvq* q = hub_malloc_zero(sizeof(struct hub_recvq));
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ioq_recv_destroy(struct ioq_recv* q)
|
void hub_recvq_destroy(struct hub_recvq* q)
|
||||||
{
|
{
|
||||||
if (q)
|
if (q)
|
||||||
{
|
{
|
||||||
@@ -49,9 +50,9 @@ void ioq_recv_destroy(struct ioq_recv* q)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ioq_recv_get(struct ioq_recv* q, void* buf, size_t bufsize)
|
size_t hub_recvq_get(struct hub_recvq* q, void* buf, size_t bufsize)
|
||||||
{
|
{
|
||||||
uhub_assert(bufsize >= q->size);
|
assert(bufsize >= q->size);
|
||||||
if (q->size)
|
if (q->size)
|
||||||
{
|
{
|
||||||
size_t n = q->size;
|
size_t n = q->size;
|
||||||
@@ -64,7 +65,7 @@ size_t ioq_recv_get(struct ioq_recv* q, void* buf, size_t bufsize)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ioq_recv_set(struct ioq_recv* q, void* buf, size_t bufsize)
|
size_t hub_recvq_set(struct hub_recvq* q, void* buf, size_t bufsize)
|
||||||
{
|
{
|
||||||
if (q->buf)
|
if (q->buf)
|
||||||
{
|
{
|
||||||
@@ -88,9 +89,9 @@ size_t ioq_recv_set(struct ioq_recv* q, void* buf, size_t bufsize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ioq_send* ioq_send_create()
|
struct hub_sendq* hub_sendq_create()
|
||||||
{
|
{
|
||||||
struct ioq_send* q = hub_malloc_zero(sizeof(struct ioq_send));
|
struct hub_sendq* q = hub_malloc_zero(sizeof(struct hub_sendq));
|
||||||
if (!q)
|
if (!q)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ static void clear_send_queue_callback(void* ptr)
|
|||||||
adc_msg_free((struct adc_message*) ptr);
|
adc_msg_free((struct adc_message*) ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ioq_send_destroy(struct ioq_send* q)
|
void hub_sendq_destroy(struct hub_sendq* q)
|
||||||
{
|
{
|
||||||
if (q)
|
if (q)
|
||||||
{
|
{
|
||||||
@@ -119,21 +120,21 @@ void ioq_send_destroy(struct ioq_send* q)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ioq_send_add(struct ioq_send* q, struct adc_message* msg_)
|
void hub_sendq_add(struct hub_sendq* 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("ioq_send_add", msg);
|
debug_msg("hub_sendq_add", msg);
|
||||||
#endif
|
#endif
|
||||||
uhub_assert(msg->cache && *msg->cache);
|
assert(msg->cache && *msg->cache);
|
||||||
list_append(q->queue, msg);
|
list_append(q->queue, msg);
|
||||||
q->size += msg->length;
|
q->size += msg->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ioq_send_remove(struct ioq_send* q, struct adc_message* msg)
|
void hub_sendq_remove(struct hub_sendq* q, struct adc_message* msg)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_SENDQ
|
#ifdef DEBUG_SENDQ
|
||||||
debug_msg("ioq_send_remove", msg);
|
debug_msg("hub_sendq_remove", msg);
|
||||||
#endif
|
#endif
|
||||||
list_remove(q->queue, msg);
|
list_remove(q->queue, msg);
|
||||||
q->size -= msg->length;
|
q->size -= msg->length;
|
||||||
@@ -141,12 +142,12 @@ void ioq_send_remove(struct ioq_send* q, struct adc_message* msg)
|
|||||||
q->offset = 0;
|
q->offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ioq_send_send(struct ioq_send* q, struct hub_user* user)
|
int hub_sendq_send(struct hub_sendq* q, struct hub_user* user)
|
||||||
{
|
{
|
||||||
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);
|
assert(msg->cache && *msg->cache);
|
||||||
ret = net_con_send(user->connection, msg->cache + q->offset, msg->length - q->offset);
|
ret = net_con_send(user->connection, msg->cache + q->offset, msg->length - q->offset);
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
@@ -155,18 +156,18 @@ int ioq_send_send(struct ioq_send* q, struct hub_user* user)
|
|||||||
if (msg->length - q->offset > 0)
|
if (msg->length - q->offset > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ioq_send_remove(q, msg);
|
hub_sendq_remove(q, msg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ioq_send_is_empty(struct ioq_send* q)
|
int hub_sendq_is_empty(struct hub_sendq* q)
|
||||||
{
|
{
|
||||||
return (q->size - q->offset) == 0;
|
return (q->size - q->offset) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ioq_send_get_bytes(struct ioq_send* q)
|
size_t hub_sendq_get_bytes(struct hub_sendq* q)
|
||||||
{
|
{
|
||||||
return q->size - q->offset;
|
return q->size - q->offset;
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2010, 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_IO_QUEUE_H
|
#ifndef HAVE_UHUB_HUB_IO_H
|
||||||
#define HAVE_UHUB_IO_QUEUE_H
|
#define HAVE_UHUB_HUB_IO_H
|
||||||
|
|
||||||
struct adc_message;
|
struct adc_message;
|
||||||
struct linked_list;
|
struct linked_list;
|
||||||
typedef int (*ioq_write)(void* desc, const void* buf, size_t len);
|
typedef int (*hub_recvq_write)(void* desc, const void* buf, size_t len);
|
||||||
typedef int (*ioq_read)(void* desc, void* buf, size_t len);
|
typedef int (*hub_recvq_read)(void* desc, void* buf, size_t len);
|
||||||
|
|
||||||
struct ioq_send
|
struct hub_sendq
|
||||||
{
|
{
|
||||||
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 adc_message) */
|
struct linked_list* queue; /** List of queued messages */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ioq_recv
|
struct hub_recvq
|
||||||
{
|
{
|
||||||
char* buf;
|
char* buf;
|
||||||
size_t size;
|
size_t size;
|
||||||
@@ -44,63 +44,63 @@ struct ioq_recv
|
|||||||
/**
|
/**
|
||||||
* Create a send queue
|
* Create a send queue
|
||||||
*/
|
*/
|
||||||
extern struct ioq_send* ioq_send_create();
|
extern struct hub_sendq* hub_sendq_create();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a send queue, and delete any queued messages.
|
* Destroy a send queue, and delete any queued messages.
|
||||||
*/
|
*/
|
||||||
extern void ioq_send_destroy(struct ioq_send*);
|
extern void hub_sendq_destroy(struct hub_sendq*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a message to the send queue.
|
* Add a message to the send queue.
|
||||||
*/
|
*/
|
||||||
extern void ioq_send_add(struct ioq_send*, struct adc_message* msg);
|
extern void hub_sendq_add(struct hub_sendq*, 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 ioq_send_send(struct ioq_send*, struct hub_user*);
|
extern int hub_sendq_send(struct hub_sendq*, struct hub_user*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns 1 if send queue is empty, 0 otherwise.
|
* @returns 1 if send queue is empty, 0 otherwise.
|
||||||
*/
|
*/
|
||||||
extern int ioq_send_is_empty(struct ioq_send*);
|
extern int hub_sendq_is_empty(struct hub_sendq*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @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 ioq_send_get_bytes(struct ioq_send*);
|
extern size_t hub_sendq_get_bytes(struct hub_sendq*);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a receive queue.
|
* Create a receive queue.
|
||||||
*/
|
*/
|
||||||
extern struct ioq_recv* ioq_recv_create();
|
extern struct hub_recvq* hub_recvq_create();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a receive queue.
|
* Destroy a receive queue.
|
||||||
*/
|
*/
|
||||||
extern void ioq_recv_destroy(struct ioq_recv*);
|
extern void hub_recvq_destroy(struct hub_recvq*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 ioq_recv_get(struct ioq_recv*, void* buf, size_t bufsize);
|
extern size_t hub_recvq_get(struct hub_recvq*, void* buf, size_t bufsize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the buffer
|
* Sets the buffer
|
||||||
*/
|
*/
|
||||||
extern size_t ioq_recv_set(struct ioq_recv*, void* buf, size_t bufsize);
|
extern size_t hub_recvq_set(struct hub_recvq*, void* buf, size_t bufsize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 1 if size is zero, 0 otherwise.
|
* @return 1 if size is zero, 0 otherwise.
|
||||||
*/
|
*/
|
||||||
extern int ioq_recv_is_empty(struct ioq_recv* buf);
|
extern int hub_recvq_is_empty(struct hub_recvq* buf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_IO_QUEUE_H */
|
#endif /* HAVE_UHUB_HUB_IO_H */
|
||||||
@@ -226,7 +226,9 @@ static int check_network(struct hub_info* hub, struct hub_user* user, struct adc
|
|||||||
static void strip_network(struct hub_user* user, struct adc_message* cmd)
|
static void strip_network(struct hub_user* user, struct adc_message* cmd)
|
||||||
{
|
{
|
||||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV6_ADDR);
|
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV6_ADDR);
|
||||||
|
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV6_UDP_PORT);
|
||||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR);
|
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR);
|
||||||
|
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_UDP_PORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nick_length_ok(const char* nick)
|
static int nick_length_ok(const char* nick)
|
||||||
@@ -325,8 +327,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->users, user->id.nick);
|
struct hub_user* lookup1 = uman_get_user_by_nick(hub, user->id.nick);
|
||||||
struct hub_user* lookup2 = uman_get_user_by_cid(hub->users, user->id.cid);
|
struct hub_user* lookup2 = uman_get_user_by_cid(hub, user->id.cid);
|
||||||
|
|
||||||
if (lookup1 == user)
|
if (lookup1 == user)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,14 +18,17 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <uhub.h>
|
#include <uhub.h>
|
||||||
#include "ioqueue.h"
|
#include "hubio.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 ioq_recv* q = user->recv_queue;
|
struct hub_recvq* q = user->recv_queue;
|
||||||
size_t buf_size = ioq_recv_get(q, buf, MAX_RECV_BUF);
|
size_t buf_size = hub_recvq_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))
|
||||||
@@ -68,9 +71,9 @@ int handle_net_read(struct hub_user* user)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (((pos - start) > 0) && user->hub->config->max_recv_buffer > (pos - start))
|
if (((pos - start) > 0) && g_hub->config->max_recv_buffer > (pos - start))
|
||||||
{
|
{
|
||||||
if (hub_handle_message(user->hub, user, start, (pos - start)) == -1)
|
if (hub_handle_message(g_hub, user, start, (pos - start)) == -1)
|
||||||
{
|
{
|
||||||
return quit_protocol_error;
|
return quit_protocol_error;
|
||||||
}
|
}
|
||||||
@@ -85,20 +88,20 @@ int handle_net_read(struct hub_user* user)
|
|||||||
|
|
||||||
if (lastPos || remaining)
|
if (lastPos || remaining)
|
||||||
{
|
{
|
||||||
if (remaining < (size_t) user->hub->config->max_recv_buffer)
|
if (remaining < (size_t) g_hub->config->max_recv_buffer)
|
||||||
{
|
{
|
||||||
ioq_recv_set(q, lastPos ? lastPos : buf, remaining);
|
hub_recvq_set(q, lastPos ? lastPos : buf, remaining);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ioq_recv_set(q, 0, 0);
|
hub_recvq_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
|
||||||
{
|
{
|
||||||
ioq_recv_set(q, 0, 0);
|
hub_recvq_set(q, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -107,9 +110,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 (ioq_send_get_bytes(user->send_queue))
|
while (hub_sendq_get_bytes(user->send_queue))
|
||||||
{
|
{
|
||||||
ret = ioq_send_send(user->send_queue, user);
|
ret = hub_sendq_send(user->send_queue, user);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -117,7 +120,7 @@ int handle_net_write(struct hub_user* user)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return quit_socket_error;
|
return quit_socket_error;
|
||||||
|
|
||||||
if (ioq_send_get_bytes(user->send_queue))
|
if (hub_sendq_get_bytes(user->send_queue))
|
||||||
{
|
{
|
||||||
user_net_io_want_write(user);
|
user_net_io_want_write(user);
|
||||||
}
|
}
|
||||||
@@ -141,7 +144,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(user->hub, user, quit_timeout);
|
hub_disconnect_user(g_hub, user, quit_timeout);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -151,7 +154,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(user->hub, user, flag_close);
|
hub_disconnect_user(g_hub, user, flag_close);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,7 +164,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(user->hub, user, flag_close);
|
hub_disconnect_user(g_hub, user, flag_close);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,10 @@ struct plugin_callback_data
|
|||||||
|
|
||||||
static struct plugin_callback_data* get_callback_data(struct plugin_handle* plugin)
|
static struct plugin_callback_data* get_callback_data(struct plugin_handle* plugin)
|
||||||
{
|
{
|
||||||
return get_internals(plugin)->callback_data;
|
struct plugin_callback_data* data;
|
||||||
|
uhub_assert(plugin && plugin->handle && plugin->handle->internals);
|
||||||
|
data = (struct plugin_callback_data*) plugin->handle->internals;
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int plugin_command_dispatch(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
static int plugin_command_dispatch(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||||
@@ -51,6 +54,26 @@ static int plugin_command_dispatch(struct command_base* cbase, struct hub_user*
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct plugin_callback_data* plugin_callback_data_create()
|
||||||
|
{
|
||||||
|
struct plugin_callback_data* data = (struct plugin_callback_data*) hub_malloc_zero(sizeof(struct plugin_callback_data));
|
||||||
|
LOG_PLUGIN("plugin_callback_data_create()");
|
||||||
|
data->commands = list_create();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void plugin_callback_data_destroy(struct plugin_callback_data* data)
|
||||||
|
{
|
||||||
|
LOG_PLUGIN("plugin_callback_data_destroy()");
|
||||||
|
if (data->commands)
|
||||||
|
{
|
||||||
|
uhub_assert(list_size(data->commands) == 0);
|
||||||
|
list_destroy(data->commands);
|
||||||
|
}
|
||||||
|
|
||||||
|
hub_free(data);
|
||||||
|
}
|
||||||
|
|
||||||
static struct hub_user* convert_user_type(struct plugin_user* user)
|
static struct hub_user* convert_user_type(struct plugin_user* user)
|
||||||
{
|
{
|
||||||
struct hub_user* huser = (struct hub_user*) user;
|
struct hub_user* huser = (struct hub_user*) user;
|
||||||
@@ -59,6 +82,7 @@ static struct hub_user* convert_user_type(struct plugin_user* user)
|
|||||||
|
|
||||||
static int cbfunc_send_message(struct plugin_handle* plugin, struct plugin_user* user, const char* message)
|
static int cbfunc_send_message(struct plugin_handle* plugin, struct plugin_user* user, const char* message)
|
||||||
{
|
{
|
||||||
|
// struct plugin_callback_data* data = get_callback_data(plugin);
|
||||||
char* buffer = adc_msg_escape(message);
|
char* buffer = adc_msg_escape(message);
|
||||||
struct adc_message* command = adc_msg_construct(ADC_CMD_IMSG, strlen(buffer) + 6);
|
struct adc_message* command = adc_msg_construct(ADC_CMD_IMSG, strlen(buffer) + 6);
|
||||||
adc_msg_add_argument(command, buffer);
|
adc_msg_add_argument(command, buffer);
|
||||||
@@ -70,6 +94,7 @@ static int cbfunc_send_message(struct plugin_handle* plugin, struct plugin_user*
|
|||||||
|
|
||||||
static int cbfunc_send_status(struct plugin_handle* plugin, struct plugin_user* user, int code, const char* message)
|
static int cbfunc_send_status(struct plugin_handle* plugin, struct plugin_user* user, int code, const char* message)
|
||||||
{
|
{
|
||||||
|
// struct plugin_callback_data* data = get_callback_data(plugin);
|
||||||
char code_str[4];
|
char code_str[4];
|
||||||
char* buffer = adc_msg_escape(message);
|
char* buffer = adc_msg_escape(message);
|
||||||
struct adc_message* command = adc_msg_construct(ADC_CMD_ISTA, strlen(buffer) + 10);
|
struct adc_message* command = adc_msg_construct(ADC_CMD_ISTA, strlen(buffer) + 10);
|
||||||
@@ -84,6 +109,7 @@ static int cbfunc_send_status(struct plugin_handle* plugin, struct plugin_user*
|
|||||||
|
|
||||||
static int cbfunc_user_disconnect(struct plugin_handle* plugin, struct plugin_user* user)
|
static int cbfunc_user_disconnect(struct plugin_handle* plugin, struct plugin_user* user)
|
||||||
{
|
{
|
||||||
|
// struct plugin_callback_data* data = get_callback_data(plugin);
|
||||||
hub_disconnect_user(plugin_get_hub(plugin), convert_user_type(user), quit_kicked);
|
hub_disconnect_user(plugin_get_hub(plugin), convert_user_type(user), quit_kicked);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -121,69 +147,6 @@ static int cbfunc_command_del(struct plugin_handle* plugin, struct plugin_comman
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t cbfunc_command_arg_reset(struct plugin_handle* plugin, struct plugin_command* cmd)
|
|
||||||
{
|
|
||||||
// TODO: Use proper function for rewriting for plugin_command -> hub_command
|
|
||||||
return hub_command_arg_reset((struct hub_command*) cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct plugin_command_arg_data* cbfunc_command_arg_next(struct plugin_handle* plugin, struct plugin_command* cmd, enum plugin_command_arg_type t)
|
|
||||||
{
|
|
||||||
// TODO: Use proper function for rewriting for plugin_command -> hub_command
|
|
||||||
return (struct plugin_command_arg_data*) hub_command_arg_next((struct hub_command*) cmd, (enum hub_command_arg_type) t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char* cbfunc_get_hub_name(struct plugin_handle* plugin)
|
|
||||||
{
|
|
||||||
struct hub_info* hub = plugin_get_hub(plugin);
|
|
||||||
char* str_encoded = adc_msg_get_named_argument(hub->command_info, ADC_INF_FLAG_NICK);
|
|
||||||
char* str = adc_msg_unescape(str_encoded);
|
|
||||||
hub_free(str_encoded);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char* cbfunc_get_hub_description(struct plugin_handle* plugin)
|
|
||||||
{
|
|
||||||
struct hub_info* hub = plugin_get_hub(plugin);
|
|
||||||
char* str_encoded = adc_msg_get_named_argument(hub->command_info, ADC_INF_FLAG_DESCRIPTION);
|
|
||||||
char* str = adc_msg_unescape(str_encoded);
|
|
||||||
hub_free(str_encoded);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cbfunc_set_hub_name(struct plugin_handle* plugin, const char* str)
|
|
||||||
{
|
|
||||||
struct hub_info* hub = plugin_get_hub(plugin);
|
|
||||||
struct adc_message* command;
|
|
||||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_name);
|
|
||||||
|
|
||||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_NICK, new_str);
|
|
||||||
|
|
||||||
// Broadcast hub name
|
|
||||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
|
||||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_NICK, new_str);
|
|
||||||
route_to_all(hub, command);
|
|
||||||
|
|
||||||
adc_msg_free(command);
|
|
||||||
hub_free(new_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cbfunc_set_hub_description(struct plugin_handle* plugin, const char* str)
|
|
||||||
{
|
|
||||||
struct hub_info* hub = plugin_get_hub(plugin);
|
|
||||||
struct adc_message* command;
|
|
||||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_description);
|
|
||||||
|
|
||||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_DESCRIPTION, new_str);
|
|
||||||
|
|
||||||
// Broadcast hub description
|
|
||||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
|
||||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_DESCRIPTION, new_str);
|
|
||||||
route_to_all(hub, command);
|
|
||||||
|
|
||||||
adc_msg_free(command);
|
|
||||||
hub_free(new_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
void plugin_register_callback_functions(struct plugin_handle* handle)
|
void plugin_register_callback_functions(struct plugin_handle* handle)
|
||||||
{
|
{
|
||||||
@@ -192,37 +155,8 @@ void plugin_register_callback_functions(struct plugin_handle* handle)
|
|||||||
handle->hub.user_disconnect = cbfunc_user_disconnect;
|
handle->hub.user_disconnect = cbfunc_user_disconnect;
|
||||||
handle->hub.command_add = cbfunc_command_add;
|
handle->hub.command_add = cbfunc_command_add;
|
||||||
handle->hub.command_del = cbfunc_command_del;
|
handle->hub.command_del = cbfunc_command_del;
|
||||||
handle->hub.command_arg_reset = cbfunc_command_arg_reset;
|
|
||||||
handle->hub.command_arg_next = cbfunc_command_arg_next;
|
|
||||||
handle->hub.get_name = cbfunc_get_hub_name;
|
|
||||||
handle->hub.set_name = cbfunc_set_hub_name;
|
|
||||||
handle->hub.get_description = cbfunc_get_hub_description;
|
|
||||||
handle->hub.set_description = cbfunc_set_hub_description;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_unregister_callback_functions(struct plugin_handle* handle)
|
void plugin_unregister_callback_functions(struct plugin_handle* handle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
struct plugin_callback_data* plugin_callback_data_create()
|
|
||||||
{
|
|
||||||
struct plugin_callback_data* data = (struct plugin_callback_data*) hub_malloc_zero(sizeof(struct plugin_callback_data));
|
|
||||||
LOG_PLUGIN("plugin_callback_data_create()");
|
|
||||||
data->commands = list_create();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void plugin_callback_data_destroy(struct plugin_handle* plugin, struct plugin_callback_data* data)
|
|
||||||
{
|
|
||||||
LOG_PLUGIN("plugin_callback_data_destroy()");
|
|
||||||
if (data->commands)
|
|
||||||
{
|
|
||||||
// delete commands not deleted by the plugin itself:
|
|
||||||
struct plugin_command_handle* cmd;
|
|
||||||
while ( (cmd = list_get_first(data->commands)) )
|
|
||||||
cbfunc_command_del(plugin, cmd);
|
|
||||||
list_destroy(data->commands);
|
|
||||||
}
|
|
||||||
|
|
||||||
hub_free(data);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct plugin_handle;
|
|||||||
struct uhub_plugin;
|
struct uhub_plugin;
|
||||||
|
|
||||||
extern struct plugin_callback_data* plugin_callback_data_create();
|
extern struct plugin_callback_data* plugin_callback_data_create();
|
||||||
extern void plugin_callback_data_destroy(struct plugin_handle* plugin, struct plugin_callback_data* data);
|
extern void plugin_callback_data_destroy(struct plugin_callback_data* data);
|
||||||
|
|
||||||
extern void plugin_register_callback_functions(struct plugin_handle* plugin);
|
extern void plugin_register_callback_functions(struct plugin_handle* plugin);
|
||||||
extern void plugin_unregister_callback_functions(struct plugin_handle* plugin);
|
extern void plugin_unregister_callback_functions(struct plugin_handle* plugin);
|
||||||
|
|||||||
@@ -82,13 +82,12 @@ static struct plugin_user* convert_user_type(struct hub_user* user)
|
|||||||
|
|
||||||
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr)
|
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr)
|
||||||
{
|
{
|
||||||
PLUGIN_INVOKE_STATUS_1(hub, on_check_ip_early, addr);
|
PLUGIN_INVOKE_STATUS_1(hub, login_check_ip_early, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin_st plugin_check_ip_late(struct hub_info* hub, struct hub_user* who, struct ip_addr_encap* addr)
|
plugin_st plugin_check_ip_late(struct hub_info* hub, struct ip_addr_encap* addr)
|
||||||
{
|
{
|
||||||
struct plugin_user* user = convert_user_type(who);
|
PLUGIN_INVOKE_STATUS_1(hub, login_check_ip_late, addr);
|
||||||
PLUGIN_INVOKE_STATUS_2(hub, on_check_ip_late, user, addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_log_connection_accepted(struct hub_info* hub, struct ip_addr_encap* ipaddr)
|
void plugin_log_connection_accepted(struct hub_info* hub, struct ip_addr_encap* ipaddr)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void plugin_log_chat_message(struct hub_info* hub, struct hub_user* from, const
|
|||||||
|
|
||||||
/* IP ban related */
|
/* IP ban related */
|
||||||
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr);
|
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr);
|
||||||
plugin_st plugin_check_ip_late(struct hub_info* hub, struct hub_user* user, struct ip_addr_encap* addr);
|
plugin_st plugin_check_ip_late(struct hub_info* hub, struct ip_addr_encap* addr);
|
||||||
|
|
||||||
/* Nickname allow/deny handling */
|
/* Nickname allow/deny handling */
|
||||||
plugin_st plugin_check_nickname_valid(struct hub_info* hub, const char* nick);
|
plugin_st plugin_check_nickname_valid(struct hub_info* hub, const char* nick);
|
||||||
|
|||||||
@@ -23,10 +23,17 @@
|
|||||||
|
|
||||||
struct plugin_callback_data;
|
struct plugin_callback_data;
|
||||||
|
|
||||||
struct plugin_hub_internals* get_internals(struct plugin_handle* handle)
|
struct plugin_hub_internals
|
||||||
|
{
|
||||||
|
struct hub_info* hub;
|
||||||
|
plugin_unregister_f unregister; /* The unregister function. */
|
||||||
|
struct plugin_callback_data* callback_data; /* callback data that is unique for the plugin */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct plugin_hub_internals* get_internals(struct plugin_handle* handle)
|
||||||
{
|
{
|
||||||
struct plugin_hub_internals* internals;
|
struct plugin_hub_internals* internals;
|
||||||
uhub_assert(handle && handle->handle && handle->handle->internals);
|
assert(handle && handle->handle && handle->handle->internals);
|
||||||
internals = (struct plugin_hub_internals*) handle->handle->internals;
|
internals = (struct plugin_hub_internals*) handle->handle->internals;
|
||||||
return internals;
|
return internals;
|
||||||
}
|
}
|
||||||
@@ -69,7 +76,7 @@ void plugin_close(struct uhub_plugin* plugin)
|
|||||||
struct plugin_hub_internals* internals = (struct plugin_hub_internals*) plugin->internals;
|
struct plugin_hub_internals* internals = (struct plugin_hub_internals*) plugin->internals;
|
||||||
|
|
||||||
LOG_PLUGIN("plugin_close: \"%s\"", plugin->filename);
|
LOG_PLUGIN("plugin_close: \"%s\"", plugin->filename);
|
||||||
plugin_callback_data_destroy(plugin->handle, internals->callback_data);
|
plugin_callback_data_destroy(internals->callback_data);
|
||||||
hub_free(internals);
|
hub_free(internals);
|
||||||
plugin->internals = NULL;
|
plugin->internals = NULL;
|
||||||
|
|
||||||
@@ -155,8 +162,8 @@ struct plugin_handle* plugin_load(const char* filename, const char* config, stru
|
|||||||
void plugin_unload(struct plugin_handle* plugin)
|
void plugin_unload(struct plugin_handle* plugin)
|
||||||
{
|
{
|
||||||
struct plugin_hub_internals* internals = get_internals(plugin);
|
struct plugin_hub_internals* internals = get_internals(plugin);
|
||||||
internals->unregister(plugin);
|
|
||||||
plugin_unregister_callback_functions(plugin);
|
plugin_unregister_callback_functions(plugin);
|
||||||
|
internals->unregister(plugin);
|
||||||
plugin_close(plugin->handle);
|
plugin_close(plugin->handle);
|
||||||
hub_free(plugin);
|
hub_free(plugin);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ struct uhub_plugin
|
|||||||
void* handle;
|
void* handle;
|
||||||
plugin_unregister_f unregister;
|
plugin_unregister_f unregister;
|
||||||
char* filename;
|
char* filename;
|
||||||
void* internals; // Hub-internal stuff (struct plugin_hub_internals)
|
void* internals; // Hub internal stuff
|
||||||
};
|
};
|
||||||
|
|
||||||
struct uhub_plugins
|
struct uhub_plugins
|
||||||
@@ -40,7 +40,7 @@ struct uhub_plugins
|
|||||||
struct linked_list* loaded;
|
struct linked_list* loaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
// High level plugin loader code
|
// High level plugin loader ode
|
||||||
extern struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub);
|
extern struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub);
|
||||||
extern void plugin_unload(struct plugin_handle* plugin);
|
extern void plugin_unload(struct plugin_handle* plugin);
|
||||||
|
|
||||||
@@ -54,14 +54,7 @@ extern void plugin_close(struct uhub_plugin*);
|
|||||||
extern void* plugin_lookup_symbol(struct uhub_plugin*, const char* symbol);
|
extern void* plugin_lookup_symbol(struct uhub_plugin*, const char* symbol);
|
||||||
|
|
||||||
// Used internally only
|
// Used internally only
|
||||||
struct plugin_hub_internals
|
|
||||||
{
|
|
||||||
struct hub_info* hub;
|
|
||||||
plugin_unregister_f unregister; /* The unregister function. */
|
|
||||||
struct plugin_callback_data* callback_data; /* callback data that is unique for the plugin */
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct plugin_hub_internals* get_internals(struct plugin_handle*);
|
|
||||||
extern struct hub_info* plugin_get_hub(struct plugin_handle*);
|
extern struct hub_info* plugin_get_hub(struct plugin_handle*);
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_PLUGIN_LOADER_H */
|
#endif /* HAVE_UHUB_PLUGIN_LOADER_H */
|
||||||
|
|
||||||
|
|||||||
@@ -76,11 +76,12 @@ 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[9], (int) probe_recvbuf[10]);
|
LOG_TRACE("Probed TLS %d.%d connection", (int) probe_recvbuf[1], (int) probe_recvbuf[2]);
|
||||||
if (user_create(probe->hub, probe->connection, &probe->addr))
|
if (user_create(probe->hub, probe->connection, &probe->addr))
|
||||||
{
|
{
|
||||||
probe->connection = 0;
|
probe->connection = 0;
|
||||||
@@ -89,7 +90,7 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_TRACE("Probed TLS %d.%d connection. TLS disabled in hub.", (int) probe_recvbuf[9], (int) probe_recvbuf[10]);
|
LOG_TRACE("Probed TLS %d.%d connection. TLS disabled in hub.", (int) probe_recvbuf[1], (int) probe_recvbuf[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -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->users, msg->target);
|
target = uman_get_user_by_sid(hub, 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->users, msg->target);
|
target = uman_get_user_by_sid(hub, msg->target);
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
route_to_user(hub, target, msg);
|
route_to_user(hub, target, msg);
|
||||||
@@ -106,19 +106,19 @@ int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_messag
|
|||||||
if (!user->connection)
|
if (!user->connection)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
uhub_assert(msg->cache && *msg->cache);
|
assert(msg->cache && *msg->cache);
|
||||||
|
|
||||||
if (ioq_send_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline))
|
if (hub_sendq_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline))
|
||||||
{
|
{
|
||||||
/* Perform oportunistic write */
|
/* Perform oportunistic write */
|
||||||
ioq_send_add(user->send_queue, msg);
|
hub_sendq_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)
|
||||||
{
|
{
|
||||||
ioq_send_add(user->send_queue, msg);
|
hub_sendq_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 (ioq_send_is_empty(u->send_queue))
|
if (hub_sendq_is_empty(u->send_queue))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
handle_net_write(u);
|
handle_net_write(u);
|
||||||
|
|||||||
@@ -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 = ioq_send_create();
|
user->send_queue = hub_sendq_create();
|
||||||
user->recv_queue = ioq_recv_create();
|
user->recv_queue = hub_recvq_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,8 +60,6 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +68,8 @@ void user_destroy(struct hub_user* user)
|
|||||||
{
|
{
|
||||||
LOG_TRACE("user_destroy(), user=%p", user);
|
LOG_TRACE("user_destroy(), user=%p", user);
|
||||||
|
|
||||||
ioq_recv_destroy(user->recv_queue);
|
hub_recvq_destroy(user->recv_queue);
|
||||||
ioq_send_destroy(user->send_queue);
|
hub_sendq_destroy(user->send_queue);
|
||||||
|
|
||||||
if (user->connection)
|
if (user->connection)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,12 +109,12 @@ struct hub_user
|
|||||||
struct hub_user_info id; /** Contains nick name and CID */
|
struct hub_user_info id; /** Contains nick name and CID */
|
||||||
enum auth_credentials credentials; /** see enum user_credentials */
|
enum auth_credentials credentials; /** see enum user_credentials */
|
||||||
enum user_state state; /** see enum user_state */
|
enum user_state state; /** see enum user_state */
|
||||||
uint32_t flags; /** see enum user_flags */
|
uint32_t flags; /** see enum user_features */
|
||||||
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 ioq_recv* recv_queue;
|
struct hub_recvq* recv_queue;
|
||||||
struct ioq_send* send_queue;
|
struct hub_sendq* 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) */
|
||||||
|
|||||||
@@ -38,48 +38,50 @@ static void clear_user_list_callback(void* ptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STATS_SUPPORT
|
void uman_update_stats(struct hub_info* hub)
|
||||||
void uman_update_stats(struct hub_user_manager* users)
|
|
||||||
{
|
{
|
||||||
const int factor = TIMEOUT_STATS;
|
const int factor = TIMEOUT_STATS;
|
||||||
struct net_statistics* total;
|
struct net_statistics* total;
|
||||||
struct net_statistics* intermediate;
|
struct net_statistics* intermediate;
|
||||||
net_stats_get(&intermediate, &total);
|
net_stats_get(&intermediate, &total);
|
||||||
|
|
||||||
users->stats.net_tx = (intermediate->tx / factor);
|
hub->stats.net_tx = (intermediate->tx / factor);
|
||||||
users->stats.net_rx = (intermediate->rx / factor);
|
hub->stats.net_rx = (intermediate->rx / factor);
|
||||||
users->stats.net_tx_peak = MAX(users->stats.net_tx, users->stats.net_tx_peak);
|
hub->stats.net_tx_peak = MAX(hub->stats.net_tx, hub->stats.net_tx_peak);
|
||||||
users->stats.net_rx_peak = MAX(users->stats.net_rx, users->stats.net_rx_peak);
|
hub->stats.net_rx_peak = MAX(hub->stats.net_rx, hub->stats.net_rx_peak);
|
||||||
users->stats.net_tx_total = total->tx;
|
hub->stats.net_tx_total = total->tx;
|
||||||
users->stats.net_rx_total = total->rx;
|
hub->stats.net_rx_total = total->rx;
|
||||||
|
|
||||||
net_stats_reset();
|
net_stats_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uman_print_stats(struct hub_user_manager* users)
|
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)",
|
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)",
|
||||||
users->users->count,
|
hub->users->count,
|
||||||
users->users->count_peak,
|
hub->users->count_peak,
|
||||||
(int) users->stats.net_tx / 1024,
|
(int) hub->stats.net_tx / 1024,
|
||||||
(int) users->stats.net_rx / 1024,
|
(int) hub->stats.net_rx / 1024,
|
||||||
(int) users->stats.net_tx_peak / 1024,
|
(int) hub->stats.net_tx_peak / 1024,
|
||||||
(int) users->stats.net_rx_peak / 1024);
|
(int) hub->stats.net_rx_peak / 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void timer_statistics(struct timeout_evt* t)
|
static void timer_statistics(struct timeout_evt* t)
|
||||||
{
|
{
|
||||||
struct hub_user_manager* users = (struct hub_user_manager*) t->ptr;
|
struct hub_info* hub = (struct hub_info*) t->ptr;
|
||||||
uman_update_stats(users);
|
uman_update_stats(hub);
|
||||||
timeout_queue_reschedule(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS);
|
timeout_queue_reschedule(net_backend_get_timeout_queue(), hub->users->timeout, TIMEOUT_STATS);
|
||||||
}
|
}
|
||||||
#endif // STATS_SUPPORT
|
|
||||||
|
|
||||||
struct hub_user_manager* uman_init()
|
int uman_init(struct hub_info* hub)
|
||||||
{
|
{
|
||||||
struct hub_user_manager* users = (struct hub_user_manager*) hub_malloc_zero(sizeof(struct hub_user_manager));
|
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 NULL;
|
return -1;
|
||||||
|
|
||||||
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());
|
||||||
@@ -88,136 +90,143 @@ struct hub_user_manager* uman_init()
|
|||||||
{
|
{
|
||||||
list_destroy(users->list);
|
list_destroy(users->list);
|
||||||
hub_free(users);
|
hub_free(users);
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STATS_SUPPORT
|
|
||||||
if (net_backend_get_timeout_queue())
|
if (net_backend_get_timeout_queue())
|
||||||
{
|
{
|
||||||
users->timeout = hub_malloc_zero(sizeof(struct timeout_evt));
|
users->timeout = hub_malloc_zero(sizeof(struct timeout_evt));
|
||||||
timeout_evt_initialize(users->timeout, timer_statistics, hub);
|
timeout_evt_initialize(users->timeout, timer_statistics, hub);
|
||||||
timeout_queue_insert(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS);
|
timeout_queue_insert(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS);
|
||||||
}
|
}
|
||||||
#endif // STATS_SUPPORT
|
|
||||||
|
|
||||||
return users;
|
hub->users = users;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int uman_shutdown(struct hub_user_manager* users)
|
int uman_shutdown(struct hub_info* hub)
|
||||||
{
|
{
|
||||||
if (!users)
|
if (!hub || !hub->users)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#ifdef STATS_SUPPORT
|
|
||||||
if (net_backend_get_timeout_queue())
|
if (net_backend_get_timeout_queue())
|
||||||
{
|
{
|
||||||
timeout_queue_remove(net_backend_get_timeout_queue(), users->timeout);
|
timeout_queue_remove(net_backend_get_timeout_queue(), hub->users->timeout);
|
||||||
hub_free(users->timeout);
|
hub_free(hub->users->timeout);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (users->list)
|
if (hub->users->list)
|
||||||
{
|
{
|
||||||
list_clear(users->list, &clear_user_list_callback);
|
list_clear(hub->users->list, &clear_user_list_callback);
|
||||||
list_destroy(users->list);
|
list_destroy(hub->users->list);
|
||||||
}
|
}
|
||||||
sid_pool_destroy(users->sids);
|
sid_pool_destroy(hub->users->sids);
|
||||||
|
hub_free(hub->users);
|
||||||
|
hub->users = 0;
|
||||||
|
|
||||||
|
|
||||||
hub_free(users);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int uman_add(struct hub_user_manager* users, struct hub_user* user)
|
int uman_add(struct hub_info* hub, struct hub_user* user)
|
||||||
{
|
{
|
||||||
if (!users || !user)
|
if (!hub || !user)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
list_append(users->list, user);
|
if (user->hub)
|
||||||
users->count++;
|
return -1;
|
||||||
users->count_peak = MAX(users->count, users->count_peak);
|
|
||||||
|
|
||||||
users->shared_size += user->limits.shared_size;
|
list_append(hub->users->list, user);
|
||||||
users->shared_files += user->limits.shared_files;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uman_remove(struct hub_user_manager* users, struct hub_user* user)
|
int uman_remove(struct hub_info* hub, struct hub_user* user)
|
||||||
{
|
{
|
||||||
if (!users || !user)
|
if (!hub || !user)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
list_remove(users->list, user);
|
list_remove(hub->users->list, user);
|
||||||
|
|
||||||
if (users->count > 0)
|
if (hub->users->count > 0)
|
||||||
{
|
{
|
||||||
users->count--;
|
hub->users->count--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uhub_assert(!"negative count!");
|
assert(!"negative count!");
|
||||||
}
|
}
|
||||||
|
|
||||||
users->shared_size -= user->limits.shared_size;
|
hub->users->shared_size -= user->limits.shared_size;
|
||||||
users->shared_files -= user->limits.shared_files;
|
hub->users->shared_files -= user->limits.shared_files;
|
||||||
|
|
||||||
|
user->hub = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid)
|
struct hub_user* uman_get_user_by_sid(struct hub_info* hub, sid_t sid)
|
||||||
{
|
{
|
||||||
return sid_lookup(users->sids, sid);
|
return sid_lookup(hub->users->sids, sid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct hub_user* uman_get_user_by_cid(struct hub_user_manager* users, const char* cid)
|
struct hub_user* uman_get_user_by_cid(struct hub_info* hub, const char* cid)
|
||||||
{
|
{
|
||||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
struct hub_user* user = (struct hub_user*) list_get_first(hub->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(users->list);
|
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct hub_user* uman_get_user_by_nick(struct hub_user_manager* users, const char* nick)
|
struct hub_user* uman_get_user_by_nick(struct hub_info* hub, const char* nick)
|
||||||
{
|
{
|
||||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
struct hub_user* user = (struct hub_user*) list_get_first(hub->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(users->list);
|
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linked_list* target, struct ip_range* range)
|
size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range)
|
||||||
{
|
{
|
||||||
size_t num = 0;
|
size_t num = 0;
|
||||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
struct hub_user* user = (struct hub_user*) list_get_first(hub->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(target, user);
|
list_append(users, user);
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
user = (struct hub_user*) list_get_next(users->list);
|
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||||
}
|
}
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* target)
|
int uman_send_user_list(struct hub_info* hub, 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(users->list); /* iterate users - only on INF or PAS msg */
|
user = (struct hub_user*) list_get_first(hub->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))
|
||||||
@@ -226,7 +235,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, st
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
user = (struct hub_user*) list_get_next(users->list);
|
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -239,7 +248,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, st
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* leaving)
|
void uman_send_quit_message(struct hub_info* hub, 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));
|
||||||
@@ -252,9 +261,9 @@ void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users
|
|||||||
adc_msg_free(command);
|
adc_msg_free(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user* user)
|
sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user)
|
||||||
{
|
{
|
||||||
sid_t sid = sid_alloc(users->sids, user);
|
sid_t sid = sid_alloc(hub->users->sids, user);
|
||||||
user->id.sid = sid;
|
user->id.sid = sid;
|
||||||
return sid;
|
return sid;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,38 +28,36 @@ 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" */
|
||||||
#ifdef STATS_SUPPORT
|
|
||||||
struct timeout_evt* timeout; /**<< "Timeout handler for statistics" */
|
struct timeout_evt* timeout; /**<< "Timeout handler for statistics" */
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 struct hub_user_manager* uman_init();
|
extern int uman_init(struct hub_info* hub);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 (invalid pointer).
|
* @return 0 on success, or -1 in an error occured (hub is invalid).
|
||||||
*/
|
*/
|
||||||
extern int uman_shutdown(struct hub_user_manager* users);
|
extern int uman_shutdown(struct hub_info* hub);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate statistics for logfiles.
|
* Generate statistics for logfiles.
|
||||||
*/
|
*/
|
||||||
extern void uman_update_stats(struct hub_user_manager* users);
|
extern void uman_update_stats(struct hub_info* hub);
|
||||||
extern void uman_print_stats(struct hub_user_manager* users);
|
extern void uman_print_stats(struct hub_info* hub);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a user to the user manager.
|
* Add a user to the user manager.
|
||||||
*
|
*
|
||||||
* @param users The usermanager to add the user to
|
* @param hub The hub 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_user_manager* users, struct hub_user* user);
|
extern int uman_add(struct hub_info* hub, struct hub_user* user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a user from the user manager.
|
* Remove a user from the user manager.
|
||||||
@@ -68,12 +66,12 @@ extern int uman_add(struct hub_user_manager* users, 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_user_manager* users, struct hub_user* user);
|
extern int uman_remove(struct hub_info* hub, 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_user_manager* users, struct hub_user* user);
|
extern sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lookup a user based on the session ID (SID).
|
* Lookup a user based on the session ID (SID).
|
||||||
@@ -88,28 +86,26 @@ extern sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_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_user_manager* users, sid_t sid);
|
extern struct hub_user* uman_get_user_by_sid(struct hub_info* hub, 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_user_manager* users, const char* cid);
|
extern struct hub_user* uman_get_user_by_cid(struct hub_info* hub, 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_user_manager* users, const char* nick);
|
extern struct hub_user* uman_get_user_by_nick(struct hub_info* hub, 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_user_manager* users, struct linked_list* target, struct ip_range* range);
|
extern size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send the user list of connected clients to 'user'.
|
* Send the user list of connected clients to 'user'.
|
||||||
@@ -117,13 +113,13 @@ extern size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linke
|
|||||||
*
|
*
|
||||||
* @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_manager* users, struct hub_user* user);
|
extern int uman_send_user_list(struct hub_info* hub, 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_manager* users, struct hub_user* user);
|
extern void uman_send_quit_message(struct hub_info* hub, struct hub_user* user);
|
||||||
|
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_USER_MANAGER_H */
|
#endif /* HAVE_UHUB_USER_MANAGER_H */
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,6 +114,13 @@ int net_destroy()
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_LIBEVENT
|
||||||
|
struct event_base* net_get_evbase()
|
||||||
|
{
|
||||||
|
return net_evbase;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void net_error_out(int fd, const char* func)
|
static void net_error_out(int fd, const char* func)
|
||||||
{
|
{
|
||||||
int err = net_error();
|
int err = net_error();
|
||||||
@@ -524,7 +531,6 @@ const char* net_address_to_string(int af, const void* src, char* dst, socklen_t
|
|||||||
sin6.sin6_family = AF_INET6;
|
sin6.sin6_family = AF_INET6;
|
||||||
sin6.sin6_port = 0;
|
sin6.sin6_port = 0;
|
||||||
sin6.sin6_addr = *addr6;
|
sin6.sin6_addr = *addr6;
|
||||||
sin6.sin6_scope_id = 0;
|
|
||||||
size = sizeof(sin6);
|
size = sizeof(sin6);
|
||||||
addr = (LPSOCKADDR) &sin6;
|
addr = (LPSOCKADDR) &sin6;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ extern int net_initialize();
|
|||||||
*/
|
*/
|
||||||
extern int net_destroy();
|
extern int net_destroy();
|
||||||
|
|
||||||
|
extern struct event_base* net_get_evbase();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the number of sockets currrently being monitored.
|
* @return the number of sockets currrently being monitored.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ int net_backend_poll_select(struct net_backend* data, int ms)
|
|||||||
struct net_backend_select* backend = (struct net_backend_select*) data;
|
struct net_backend_select* backend = (struct net_backend_select*) data;
|
||||||
|
|
||||||
tval.tv_sec = ms / 1000;
|
tval.tv_sec = ms / 1000;
|
||||||
tval.tv_usec = (ms % 1000) * 1000;
|
tval.tv_usec = ((ms % 1000) * 1000); // FIXME: correct?
|
||||||
|
|
||||||
FD_ZERO(&backend->rfds);
|
FD_ZERO(&backend->rfds);
|
||||||
FD_ZERO(&backend->wfds);
|
FD_ZERO(&backend->wfds);
|
||||||
@@ -78,11 +78,10 @@ int net_backend_poll_select(struct net_backend* data, int ms)
|
|||||||
res = select(backend->maxfd, &backend->rfds, &backend->wfds, &backend->xfds, &tval);
|
res = select(backend->maxfd, &backend->rfds, &backend->wfds, &backend->xfds, &tval);
|
||||||
if (res == -1)
|
if (res == -1)
|
||||||
{
|
{
|
||||||
if (net_error() == EINTR)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
printf("Error: %d\n", net_error());
|
printf("Error: %d\n", net_error());
|
||||||
}
|
}
|
||||||
|
if (res == -1 && net_error() == EINTR)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,19 +35,6 @@ struct plugin_command
|
|||||||
struct linked_list* args;
|
struct linked_list* args;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct plugin_command_arg_data
|
|
||||||
{
|
|
||||||
enum plugin_command_arg_type type;
|
|
||||||
union {
|
|
||||||
int integer;
|
|
||||||
char* string;
|
|
||||||
struct plugin_user* user;
|
|
||||||
struct ip_addr_encap* address;
|
|
||||||
struct ip_range* range;
|
|
||||||
enum auth_credentials credentials;
|
|
||||||
} data;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int (*plugin_command_handler)(struct plugin_handle*, struct plugin_user* to, struct plugin_command*);
|
typedef int (*plugin_command_handler)(struct plugin_handle*, struct plugin_user* to, struct plugin_command*);
|
||||||
|
|
||||||
struct plugin_command_handle
|
struct plugin_command_handle
|
||||||
@@ -75,5 +62,18 @@ struct plugin_command_handle
|
|||||||
PTR->description = DESC; \
|
PTR->description = DESC; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
extern int plugin_command_add(struct plugin_handle*, struct plugin_command_handle*);
|
||||||
|
extern int plugin_command_del(struct plugin_handle*, struct plugin_command_handle*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a message to a user.
|
||||||
|
* From the user's perspective the message will originate from the hub.
|
||||||
|
*/
|
||||||
|
extern int plugin_command_send_message(struct plugin_handle*, struct plugin_user* to, const char* message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reply to a command.
|
||||||
|
*/
|
||||||
|
extern int plugin_command_send_reply(struct plugin_handle*, struct plugin_user* user, struct plugin_command* command, const char* message);
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_PLUGIN_API_H */
|
#endif /* HAVE_UHUB_PLUGIN_API_H */
|
||||||
|
|||||||
@@ -29,6 +29,13 @@
|
|||||||
#include "util/ipcalc.h"
|
#include "util/ipcalc.h"
|
||||||
#include "plugin_api/types.h"
|
#include "plugin_api/types.h"
|
||||||
|
|
||||||
|
typedef plugin_st (*on_chat_msg_t)(struct plugin_handle*, struct plugin_user* from, const char* message);
|
||||||
|
typedef plugin_st (*on_private_msg_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, const char* message);
|
||||||
|
typedef plugin_st (*on_search_t)(struct plugin_handle*, struct plugin_user* from, const char* data);
|
||||||
|
typedef plugin_st (*on_search_result_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, const char* data);
|
||||||
|
typedef plugin_st (*on_p2p_connect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
|
||||||
|
typedef plugin_st (*on_p2p_revconnect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
|
||||||
|
|
||||||
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*);
|
||||||
typedef void (*on_connection_refused_t)(struct plugin_handle*, struct ip_addr_encap*);
|
typedef void (*on_connection_refused_t)(struct plugin_handle*, struct ip_addr_encap*);
|
||||||
|
|
||||||
@@ -44,18 +51,12 @@ typedef void (*on_hub_reloaded_t)(struct plugin_handle*, struct plugin_hub_info*
|
|||||||
typedef void (*on_hub_shutdown_t)(struct plugin_handle*, struct plugin_hub_info*);
|
typedef void (*on_hub_shutdown_t)(struct plugin_handle*, struct plugin_hub_info*);
|
||||||
typedef void (*on_hub_error_t)(struct plugin_handle*, struct plugin_hub_info*, const char* message);
|
typedef void (*on_hub_error_t)(struct plugin_handle*, struct plugin_hub_info*, const char* message);
|
||||||
|
|
||||||
typedef plugin_st (*on_check_ip_early_t)(struct plugin_handle*, struct ip_addr_encap*);
|
|
||||||
typedef plugin_st (*on_check_ip_late_t)(struct plugin_handle*, struct plugin_user*, struct ip_addr_encap*);
|
|
||||||
typedef plugin_st (*on_validate_nick_t)(struct plugin_handle*, const char* nick);
|
|
||||||
typedef plugin_st (*on_validate_cid_t)(struct plugin_handle*, const char* cid);
|
|
||||||
typedef plugin_st (*on_change_nick_t)(struct plugin_handle*, struct plugin_user*, const char* new_nick);
|
typedef plugin_st (*on_change_nick_t)(struct plugin_handle*, struct plugin_user*, const char* new_nick);
|
||||||
|
|
||||||
typedef plugin_st (*on_chat_msg_t)(struct plugin_handle*, struct plugin_user* from, const char* message);
|
typedef plugin_st (*on_check_ip_early_t)(struct plugin_handle*, struct ip_addr_encap*);
|
||||||
typedef plugin_st (*on_private_msg_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, const char* message);
|
typedef plugin_st (*on_check_ip_late_t)(struct plugin_handle*, struct ip_addr_encap*);
|
||||||
typedef plugin_st (*on_search_t)(struct plugin_handle*, struct plugin_user* from, const char* data);
|
typedef plugin_st (*on_validate_nick_t)(struct plugin_handle*, const char* nick);
|
||||||
typedef plugin_st (*on_search_result_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, const char* data);
|
typedef plugin_st (*on_validate_cid_t)(struct plugin_handle*, const char* cid);
|
||||||
typedef plugin_st (*on_p2p_connect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
|
|
||||||
typedef plugin_st (*on_p2p_revconnect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
|
|
||||||
|
|
||||||
typedef plugin_st (*auth_get_user_t)(struct plugin_handle*, const char* nickname, struct auth_info* info);
|
typedef plugin_st (*auth_get_user_t)(struct plugin_handle*, const char* nickname, struct auth_info* info);
|
||||||
typedef plugin_st (*auth_register_user_t)(struct plugin_handle*, struct auth_info* user);
|
typedef plugin_st (*auth_register_user_t)(struct plugin_handle*, struct auth_info* user);
|
||||||
@@ -64,7 +65,6 @@ typedef plugin_st (*auth_delete_user_t)(struct plugin_handle*, struct auth_info*
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* These are callbacks used for the hub to invoke functions in plugins.
|
* These are callbacks used for the hub to invoke functions in plugins.
|
||||||
* The marked ones are not being called yet.
|
|
||||||
*/
|
*/
|
||||||
struct plugin_funcs
|
struct plugin_funcs
|
||||||
{
|
{
|
||||||
@@ -76,20 +76,17 @@ struct plugin_funcs
|
|||||||
on_user_login_t on_user_login; /* A user has successfully logged in to the hub */
|
on_user_login_t on_user_login; /* A user has successfully logged in to the hub */
|
||||||
on_user_login_error_t on_user_login_error; /* A user has failed to log in to the hub */
|
on_user_login_error_t on_user_login_error; /* A user has failed to log in to the hub */
|
||||||
on_user_logout_t on_user_logout; /* A user has logged out of the hub (was previously logged in) */
|
on_user_logout_t on_user_logout; /* A user has logged out of the hub (was previously logged in) */
|
||||||
/* ! */ on_user_nick_change_t on_user_nick_change; /* A user has changed nickname */
|
on_user_nick_change_t on_user_nick_change; /* A user has changed nickname */
|
||||||
on_user_update_error_t on_user_update_error;/* A user has failed to update - nickname, etc. */
|
on_user_update_error_t on_user_update_error;/* A user has failed to update - nickname, etc. */
|
||||||
on_user_chat_msg_t on_user_chat_message;/* A user has sent a public chat message */
|
on_user_chat_msg_t on_user_chat_message;/* A user has sent a public chat message */
|
||||||
|
|
||||||
// Log hub events
|
// Log hub events
|
||||||
/* ! */ on_hub_started_t on_hub_started; /* Triggered just after plugins are loaded and the hub is started. */
|
on_hub_started_t on_hub_started; /* Triggered just after plugins are loaded and the hub is started. */
|
||||||
/* ! */ on_hub_reloaded_t on_hub_reloaded; /* Triggered immediately after hub configuration is reloaded. */
|
on_hub_reloaded_t on_hub_reloaded; /* Triggered immediately after hub configuration is reloaded. */
|
||||||
/* ! */ on_hub_shutdown_t on_hub_shutdown; /* Triggered just before the hub is being shut down and before plugins are unloaded. */
|
on_hub_shutdown_t on_hub_shutdown; /* Triggered just before the hub is being shut down and before plugins are unloaded. */
|
||||||
/* ! */ on_hub_error_t on_hub_error; /* Triggered for log-worthy error messages */
|
on_hub_error_t on_hub_error; /* Triggered for log-worthy error messages */
|
||||||
|
|
||||||
// Activity events (can be intercepted and refused/accepted by a plugin)
|
// Activity events (can be intercepted and refused/accepted by a plugin)
|
||||||
on_check_ip_early_t on_check_ip_early; /* A user has just connected (can be intercepted) */
|
|
||||||
/* ! */ on_check_ip_late_t on_check_ip_late; /* A user has logged in (can be intercepted) */
|
|
||||||
/* ! */ on_change_nick_t on_change_nick; /* A user wants to change his nick (can be intercepted) */
|
|
||||||
on_chat_msg_t on_chat_msg; /* A public chat message is about to be sent (can be intercepted) */
|
on_chat_msg_t on_chat_msg; /* A public chat message is about to be sent (can be intercepted) */
|
||||||
on_private_msg_t on_private_msg; /* A public chat message is about to be sent (can be intercepted) */
|
on_private_msg_t on_private_msg; /* A public chat message is about to be sent (can be intercepted) */
|
||||||
on_search_t on_search; /* A search is about to be sent (can be intercepted) */
|
on_search_t on_search; /* A search is about to be sent (can be intercepted) */
|
||||||
@@ -103,11 +100,12 @@ struct plugin_funcs
|
|||||||
auth_update_user_t auth_update_user; /* Update a registered user */
|
auth_update_user_t auth_update_user; /* Update a registered user */
|
||||||
auth_delete_user_t auth_delete_user; /* Delete a registered user */
|
auth_delete_user_t auth_delete_user; /* Delete a registered user */
|
||||||
|
|
||||||
|
// Login check functions
|
||||||
|
on_check_ip_early_t login_check_ip_early;
|
||||||
|
on_check_ip_late_t login_check_ip_late;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct plugin_command_handle;
|
struct plugin_command_handle;
|
||||||
struct plugin_command;
|
|
||||||
struct plugin_command_arg_data;
|
|
||||||
|
|
||||||
typedef int (*hfunc_send_message)(struct plugin_handle*, struct plugin_user* user, const char* message);
|
typedef int (*hfunc_send_message)(struct plugin_handle*, struct plugin_user* user, const char* message);
|
||||||
typedef int (*hfunc_send_status)(struct plugin_handle*, struct plugin_user* to, int code, const char* message);
|
typedef int (*hfunc_send_status)(struct plugin_handle*, struct plugin_user* to, int code, const char* message);
|
||||||
@@ -115,14 +113,6 @@ typedef int (*hfunc_user_disconnect)(struct plugin_handle*, struct plugin_user*
|
|||||||
typedef int (*hfunc_command_add)(struct plugin_handle*, struct plugin_command_handle*);
|
typedef int (*hfunc_command_add)(struct plugin_handle*, struct plugin_command_handle*);
|
||||||
typedef int (*hfunc_command_del)(struct plugin_handle*, struct plugin_command_handle*);
|
typedef int (*hfunc_command_del)(struct plugin_handle*, struct plugin_command_handle*);
|
||||||
|
|
||||||
typedef size_t (*hfunc_command_arg_reset)(struct plugin_handle*, struct plugin_command*);
|
|
||||||
typedef struct plugin_command_arg_data* (*hfunc_command_arg_next)(struct plugin_handle*, struct plugin_command*, enum plugin_command_arg_type);
|
|
||||||
|
|
||||||
typedef char* (*hfunc_get_hub_name)(struct plugin_handle*);
|
|
||||||
typedef void (*hfunc_set_hub_name)(struct plugin_handle*, const char*);
|
|
||||||
typedef char* (*hfunc_get_hub_description)(struct plugin_handle*);
|
|
||||||
typedef void (*hfunc_set_hub_description)(struct plugin_handle*, const char*);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* These are functions created and initialized by the hub and which can be used
|
* These are functions created and initialized by the hub and which can be used
|
||||||
* by plugins to access functionality internal to the hub.
|
* by plugins to access functionality internal to the hub.
|
||||||
@@ -134,14 +124,9 @@ struct plugin_hub_funcs
|
|||||||
hfunc_user_disconnect user_disconnect;
|
hfunc_user_disconnect user_disconnect;
|
||||||
hfunc_command_add command_add;
|
hfunc_command_add command_add;
|
||||||
hfunc_command_del command_del;
|
hfunc_command_del command_del;
|
||||||
hfunc_command_arg_reset command_arg_reset;
|
|
||||||
hfunc_command_arg_next command_arg_next;
|
|
||||||
hfunc_get_hub_name get_name;
|
|
||||||
hfunc_set_hub_name set_name;
|
|
||||||
hfunc_get_hub_description get_description;
|
|
||||||
hfunc_set_hub_description set_description;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct plugin_handle
|
struct plugin_handle
|
||||||
{
|
{
|
||||||
struct uhub_plugin* handle; /* Must NOT be modified by the plugin */
|
struct uhub_plugin* handle; /* Must NOT be modified by the plugin */
|
||||||
|
|||||||
@@ -93,15 +93,4 @@ struct ban_info
|
|||||||
time_t expiry; /* Time when the ban record expires */
|
time_t expiry; /* Time when the ban record expires */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum plugin_command_arg_type
|
|
||||||
{
|
|
||||||
plugin_cmd_arg_type_integer,
|
|
||||||
plugin_cmd_arg_type_string,
|
|
||||||
plugin_cmd_arg_type_user,
|
|
||||||
plugin_cmd_arg_type_address,
|
|
||||||
plugin_cmd_arg_type_range,
|
|
||||||
plugin_cmd_arg_type_credentials,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HAVE_UHUB_PLUGIN_TYPES_H */
|
#endif /* HAVE_UHUB_PLUGIN_TYPES_H */
|
||||||
|
|||||||
@@ -39,37 +39,6 @@ struct sql_data
|
|||||||
sqlite3* db;
|
sqlite3* db;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int null_callback(void* ptr, int argc, char **argv, char **colName) { return 0; }
|
|
||||||
|
|
||||||
static int sql_execute(struct sql_data* sql, int (*callback)(void* ptr, int argc, char **argv, char **colName), void* ptr, const char* sql_fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
char query[1024];
|
|
||||||
char* errMsg;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
va_start(args, sql_fmt);
|
|
||||||
vsnprintf(query, sizeof(query), sql_fmt, args);
|
|
||||||
|
|
||||||
#ifdef DEBUG_SQL
|
|
||||||
printf("SQL: %s\n", query);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rc = sqlite3_exec(sql->db, query, callback, ptr, &errMsg);
|
|
||||||
if (rc != SQLITE_OK)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_SQL
|
|
||||||
fprintf(stderr, "ERROR: %s\n", errMsg);
|
|
||||||
#endif
|
|
||||||
sqlite3_free(errMsg);
|
|
||||||
return -rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = sqlite3_changes(sql->db);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct sql_data* parse_config(const char* line, struct plugin_handle* plugin)
|
static struct sql_data* parse_config(const char* line, struct plugin_handle* plugin)
|
||||||
{
|
{
|
||||||
struct sql_data* data = (struct sql_data*) hub_malloc_zero(sizeof(struct sql_data));
|
struct sql_data* data = (struct sql_data*) hub_malloc_zero(sizeof(struct sql_data));
|
||||||
@@ -209,42 +178,17 @@ static plugin_st get_user(struct plugin_handle* plugin, const char* nickname, st
|
|||||||
static plugin_st register_user(struct plugin_handle* plugin, struct auth_info* user)
|
static plugin_st register_user(struct plugin_handle* plugin, struct auth_info* user)
|
||||||
{
|
{
|
||||||
struct sql_data* sql = (struct sql_data*) plugin->ptr;
|
struct sql_data* sql = (struct sql_data*) plugin->ptr;
|
||||||
char* nick = strdup(sql_escape_string(user->nickname));
|
if (sql->exclusive)
|
||||||
char* pass = strdup(sql_escape_string(user->password));
|
|
||||||
const char* cred = auth_cred_to_string(user->credentials);
|
|
||||||
int rc = sql_execute(sql, null_callback, NULL, "INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", nick, pass, cred);
|
|
||||||
|
|
||||||
free(nick);
|
|
||||||
free(pass);
|
|
||||||
|
|
||||||
if (rc <= 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Unable to add user \"%s\"\n", user->nickname);
|
|
||||||
return st_deny;
|
return st_deny;
|
||||||
}
|
return st_default;
|
||||||
return st_allow;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static plugin_st update_user(struct plugin_handle* plugin, struct auth_info* user)
|
static plugin_st update_user(struct plugin_handle* plugin, struct auth_info* user)
|
||||||
{
|
{
|
||||||
struct sql_data* sql = (struct sql_data*) plugin->ptr;
|
struct sql_data* sql = (struct sql_data*) plugin->ptr;
|
||||||
|
if (sql->exclusive)
|
||||||
char* nick = strdup(sql_escape_string(user->nickname));
|
|
||||||
char* pass = strdup(sql_escape_string(user->password));
|
|
||||||
const char* cred = auth_cred_to_string(user->credentials);
|
|
||||||
int rc = sql_execute(sql, null_callback, NULL, "INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", nick, pass, cred);
|
|
||||||
|
|
||||||
free(nick);
|
|
||||||
free(pass);
|
|
||||||
|
|
||||||
if (rc <= 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Unable to add user \"%s\"\n", user->nickname);
|
|
||||||
return st_deny;
|
return st_deny;
|
||||||
}
|
return st_default;
|
||||||
return st_allow;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* user)
|
static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* user)
|
||||||
@@ -257,7 +201,7 @@ static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* use
|
|||||||
|
|
||||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||||
{
|
{
|
||||||
PLUGIN_INITIALIZE(plugin, "SQLite authentication plugin", "1.0", "Authenticate users based on a SQLite database.");
|
PLUGIN_INITIALIZE(plugin, "SQLite authentication plugin", "0.1", "Authenticate users based on a SQLite database.");
|
||||||
|
|
||||||
// Authentication actions.
|
// Authentication actions.
|
||||||
plugin->funcs.auth_get_user = get_user;
|
plugin->funcs.auth_get_user = get_user;
|
||||||
|
|||||||
@@ -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;
|
||||||
size_t total = list_size(messages);
|
int total = list_size(messages);
|
||||||
|
|
||||||
if (total == 0)
|
if (total == 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -129,14 +129,13 @@ static int command_history(struct plugin_handle* plugin, struct plugin_user* use
|
|||||||
{
|
{
|
||||||
struct cbuffer* buf;
|
struct cbuffer* buf;
|
||||||
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
||||||
struct plugin_command_arg_data* arg = plugin->hub.command_arg_next(plugin, cmd, plugin_cmd_arg_type_integer);
|
int maxlines = 0;
|
||||||
int maxlines;
|
|
||||||
|
|
||||||
if (!list_size(data->chat_history))
|
if (!list_size(data->chat_history))
|
||||||
return command_status(plugin, user, cmd, cbuf_create_const("No messages."));
|
return command_status(plugin, user, cmd, cbuf_create_const("No messages."));
|
||||||
|
|
||||||
if (arg)
|
if (list_size(cmd->args) > 0)
|
||||||
maxlines = arg->data.integer;
|
maxlines = (int) (intptr_t) ((intptr_t*) (void*) list_get_first(cmd->args));
|
||||||
else
|
else
|
||||||
maxlines = data->history_default;
|
maxlines = data->history_default;
|
||||||
|
|
||||||
@@ -160,7 +159,7 @@ static struct chat_history_data* parse_config(const char* line, struct plugin_ha
|
|||||||
struct cfg_tokens* tokens = cfg_tokenize(line);
|
struct cfg_tokens* tokens = cfg_tokenize(line);
|
||||||
char* token = cfg_token_get_first(tokens);
|
char* token = cfg_token_get_first(tokens);
|
||||||
|
|
||||||
uhub_assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
||||||
data->history_max = 200;
|
data->history_max = 200;
|
||||||
data->history_default = 25;
|
data->history_default = 25;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2011, 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
|
||||||
@@ -26,9 +26,7 @@
|
|||||||
|
|
||||||
#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;
|
||||||
|
|
||||||
@@ -62,13 +60,11 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -98,7 +94,6 @@ 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;
|
||||||
@@ -107,7 +102,6 @@ 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");
|
||||||
@@ -140,7 +134,6 @@ 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))
|
||||||
@@ -151,7 +144,7 @@ static struct log_data* parse_config(const char* line, struct plugin_handle* plu
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,12 +155,10 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,25 +186,19 @@ 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)
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "plugin_api/handle.h"
|
|
||||||
#include "plugin_api/command_api.h"
|
|
||||||
#include "util/memory.h"
|
|
||||||
#include "util/cbuffer.h"
|
|
||||||
|
|
||||||
struct topic_plugin_data
|
|
||||||
{
|
|
||||||
struct plugin_command_handle* topic;
|
|
||||||
struct plugin_command_handle* cleartopic;
|
|
||||||
struct plugin_command_handle* showtopic;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int command_topic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
|
||||||
{
|
|
||||||
struct cbuffer* buf = cbuf_create(128);
|
|
||||||
struct plugin_command_arg_data* arg = plugin->hub.command_arg_next(plugin, cmd, plugin_cmd_arg_type_string);
|
|
||||||
|
|
||||||
plugin->hub.set_description(plugin, arg ? arg->data.string : NULL);
|
|
||||||
cbuf_append_format(buf, "*** %s: Topic set to \"%s\"", cmd->prefix, arg->data.string);
|
|
||||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
|
||||||
cbuf_destroy(buf);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int command_cleartopic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
|
||||||
{
|
|
||||||
struct cbuffer* buf = cbuf_create(128);
|
|
||||||
plugin->hub.set_description(plugin, NULL);
|
|
||||||
cbuf_append_format(buf, "*** %s: Topic cleared.", cmd->prefix);
|
|
||||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
|
||||||
cbuf_destroy(buf);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int command_showtopic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
|
||||||
{
|
|
||||||
struct cbuffer* buf = cbuf_create(128);
|
|
||||||
char* topic = plugin->hub.get_description(plugin);
|
|
||||||
cbuf_append_format(buf, "*** %s: Current topic is: \"%s\"", cmd->prefix, topic);
|
|
||||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
|
||||||
cbuf_destroy(buf);
|
|
||||||
hub_free(topic);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
|
||||||
{
|
|
||||||
struct topic_plugin_data* data = (struct topic_plugin_data*) hub_malloc(sizeof(struct topic_plugin_data));
|
|
||||||
|
|
||||||
data->topic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
|
||||||
data->cleartopic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
|
||||||
data->showtopic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
|
||||||
|
|
||||||
PLUGIN_INITIALIZE(plugin, "Topic plugin", "1.0", "Add commands for changing the hub topic (description)");
|
|
||||||
|
|
||||||
PLUGIN_COMMAND_INITIALIZE(data->topic, (void*) data, "topic", "+m", auth_cred_operator, command_topic_handler, "Set new topic");
|
|
||||||
PLUGIN_COMMAND_INITIALIZE(data->cleartopic, (void*) data, "cleartopic", "", auth_cred_operator, command_cleartopic_handler, "Clear the current topic");
|
|
||||||
PLUGIN_COMMAND_INITIALIZE(data->showtopic, (void*) data, "showtopic", "", auth_cred_guest, command_showtopic_handler, "Shows the current topic");
|
|
||||||
|
|
||||||
plugin->hub.command_add(plugin, data->topic);
|
|
||||||
plugin->hub.command_add(plugin, data->cleartopic);
|
|
||||||
plugin->hub.command_add(plugin, data->showtopic);
|
|
||||||
plugin->ptr = data;
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int plugin_unregister(struct plugin_handle* plugin)
|
|
||||||
{
|
|
||||||
struct topic_plugin_data* data = (struct topic_plugin_data*) plugin->ptr;
|
|
||||||
|
|
||||||
plugin->hub.command_del(plugin, data->topic);
|
|
||||||
plugin->hub.command_del(plugin, data->cleartopic);
|
|
||||||
plugin->hub.command_del(plugin, data->showtopic);
|
|
||||||
hub_free(data->topic);
|
|
||||||
hub_free(data->cleartopic);
|
|
||||||
hub_free(data->showtopic);
|
|
||||||
hub_free(data);
|
|
||||||
plugin->ptr = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#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
|
||||||
|
|
||||||
|
|||||||
11
src/system.h
11
src/system.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2009, 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
|
||||||
@@ -73,7 +73,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#if !defined(WIN32)
|
#if !defined(WIN32)
|
||||||
#include <inttypes.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
@@ -89,13 +88,12 @@
|
|||||||
#define HAVE_GETRLIMIT
|
#define HAVE_GETRLIMIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* printf support for size_t and uint64_t */
|
/* printf and size_t support */
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
|
/* Windows uses %Iu for size_t */
|
||||||
#define PRINTF_SIZE_T "%Iu"
|
#define PRINTF_SIZE_T "%Iu"
|
||||||
#define PRINTF_UINT64_T "%I64u"
|
|
||||||
#else
|
#else
|
||||||
#define PRINTF_SIZE_T "%zu"
|
#define PRINTF_SIZE_T "%zu"
|
||||||
#define PRINTF_UINT64_T ("%" PRIu64)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
@@ -103,7 +101,7 @@
|
|||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "version.h"
|
#include "../version.h"
|
||||||
|
|
||||||
#define uhub_assert assert
|
#define uhub_assert assert
|
||||||
|
|
||||||
@@ -270,7 +268,6 @@ 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
|
||||||
|
|
||||||
|
|||||||
@@ -23,9 +23,7 @@
|
|||||||
#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 ADCC_DEBUG
|
// #define ADCC_DEBUG
|
||||||
// #define ADC_CLIENT_DEBUG_PROTO
|
|
||||||
|
|
||||||
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);
|
||||||
@@ -158,25 +156,12 @@ 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); \
|
||||||
@@ -186,12 +171,9 @@ static void event_callback(struct net_connection* con, int events, void *arg)
|
|||||||
|
|
||||||
static void ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length)
|
static void 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'", line);
|
ADC_client_debug(client, "- LINE: '%s'", start);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Parse message */
|
/* Parse message */
|
||||||
@@ -228,18 +210,12 @@ 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;
|
||||||
@@ -283,33 +259,24 @@ 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_X(msg, "NI", user.name, sizeof(user.name));
|
EXTRACT_NAMED_ARG(msg, "NI", user.name);
|
||||||
EXTRACT_NAMED_ARG_X(msg, "DE", user.description, sizeof(user.description));
|
EXTRACT_NAMED_ARG(msg, "DE", user.description);
|
||||||
EXTRACT_NAMED_ARG_X(msg, "VE", user.version, sizeof(user.version));
|
EXTRACT_NAMED_ARG(msg, "VE", user.version);
|
||||||
EXTRACT_NAMED_ARG_X(msg, "ID", user.cid, sizeof(user.cid));
|
EXTRACT_NAMED_ARG(msg, "ID", user.cid);
|
||||||
EXTRACT_NAMED_ARG_X(msg, "I4", user.address, sizeof(user.address));
|
EXTRACT_NAMED_ARG(msg, "I4", 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:
|
||||||
/*
|
/*
|
||||||
@@ -393,7 +360,9 @@ void ADC_client_send(struct ADC_client* client, char* msg)
|
|||||||
void ADC_client_send_info(struct ADC_client* client)
|
void ADC_client_send_info(struct ADC_client* client)
|
||||||
{
|
{
|
||||||
ADC_TRACE;
|
ADC_TRACE;
|
||||||
client->info = adc_msg_construct_source(ADC_CMD_BINF, client->sid, 64);
|
char binf[11];
|
||||||
|
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);
|
||||||
|
|
||||||
|
|||||||
@@ -71,13 +71,6 @@ 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;
|
||||||
@@ -86,23 +79,14 @@ 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[MAX_CID_LEN+1];
|
char* cid;
|
||||||
char name[MAX_NICK_LEN+1];
|
char* name;
|
||||||
char description[MAX_DESC_LEN+1];
|
char* description;
|
||||||
char address[INET6_ADDRSTRLEN+1];
|
char* address;
|
||||||
char version[MAX_UA_LEN+1];
|
char* version;
|
||||||
};
|
|
||||||
|
|
||||||
struct ADC_client_quit_reason
|
|
||||||
{
|
|
||||||
sid_t sid;
|
|
||||||
sid_t initator; // 0 = default/hub.
|
|
||||||
char message[128]; // optional
|
|
||||||
int flags;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -112,7 +96,6 @@ 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;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,122 +19,52 @@
|
|||||||
|
|
||||||
#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:
|
||||||
status("Connecting...");
|
puts("*** Connecting...");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_CONNECTED:
|
case ADC_CLIENT_CONNECTED:
|
||||||
status("Connected.");
|
puts("*** Connected.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_DISCONNECTED:
|
case ADC_CLIENT_DISCONNECTED:
|
||||||
status("Disconnected.");
|
puts("*** Disconnected.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_SSL_HANDSHAKE:
|
case ADC_CLIENT_SSL_HANDSHAKE:
|
||||||
status("SSL handshake.");
|
puts("*** SSL handshake.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_LOGGING_IN:
|
case ADC_CLIENT_LOGGING_IN:
|
||||||
status("Logging in...");
|
puts("*** Logging in...");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_PASSWORD_REQ:
|
case ADC_CLIENT_PASSWORD_REQ:
|
||||||
status("Requesting password.");
|
puts("*** Requesting password.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_LOGGED_IN:
|
case ADC_CLIENT_LOGGED_IN:
|
||||||
status("Logged in.");
|
puts("*** Logged in.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_LOGIN_ERROR:
|
case ADC_CLIENT_LOGIN_ERROR:
|
||||||
status("Login error");
|
puts("*** Login error");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case ADC_CLIENT_MESSAGE:
|
case ADC_CLIENT_MESSAGE:
|
||||||
on_message(data->chat);
|
printf(" <%s> %s\n", sid_to_string(data->chat->from_sid), data->chat->message);
|
||||||
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:
|
||||||
user_remove(data->quit);
|
printf(" QUIT\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ADC_CLIENT_SEARCH_REQ:
|
case ADC_CLIENT_SEARCH_REQ:
|
||||||
@@ -166,8 +96,6 @@ int main(int argc, char** argv)
|
|||||||
struct ADC_client client;
|
struct ADC_client client;
|
||||||
net_initialize();
|
net_initialize();
|
||||||
|
|
||||||
memset(g_usermap, 0, sizeof(g_usermap));
|
|
||||||
|
|
||||||
ADC_client_create(&client, "uhub-admin", "stresstester");
|
ADC_client_create(&client, "uhub-admin", "stresstester");
|
||||||
ADC_client_set_callback(&client, handle);
|
ADC_client_set_callback(&client, handle);
|
||||||
ADC_client_connect(&client, argv[1]);
|
ADC_client_connect(&client, argv[1]);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2011, 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 "util/misc.h"
|
|
||||||
#include <sqlite3.h>
|
#include <sqlite3.h>
|
||||||
|
|
||||||
// #define DEBUG_SQL
|
// #define DEBUG_SQL
|
||||||
@@ -105,59 +104,6 @@ static const char* validate_cred(const char* cred_str)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* validate_username(const char* username)
|
|
||||||
{
|
|
||||||
const char* tmp;
|
|
||||||
|
|
||||||
// verify length
|
|
||||||
if (strlen(username) > MAX_NICK_LEN)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "User name is too long.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Nick must not start with a space */
|
|
||||||
if (is_white_space(username[0]))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "User name cannot start with white space.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for ASCII values below 32 */
|
|
||||||
for (tmp = username; *tmp; tmp++)
|
|
||||||
if ((*tmp < 32) && (*tmp > 0))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "User name contains illegal characters.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_valid_utf8(username))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "User name must be utf-8 encoded.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const char* validate_password(const char* password)
|
|
||||||
{
|
|
||||||
// verify length
|
|
||||||
if (strlen(password) > MAX_PASS_LEN)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Password is too long.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_valid_utf8(password))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Password must be utf-8 encoded.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return password;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void open_database()
|
static void open_database()
|
||||||
{
|
{
|
||||||
@@ -256,8 +202,8 @@ static int add(size_t argc, const char** argv)
|
|||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
print_usage("username password [credentials = user]");
|
print_usage("username password [credentials = user]");
|
||||||
|
|
||||||
user = sql_escape_string(validate_username(argv[0]));
|
user = sql_escape_string(argv[0]);
|
||||||
pass = sql_escape_string(validate_password(argv[1]));
|
pass = sql_escape_string(argv[1]);
|
||||||
cred = validate_cred(argv[2] ? argv[2] : "user");
|
cred = validate_cred(argv[2] ? argv[2] : "user");
|
||||||
|
|
||||||
rc = sql_execute("INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", user, pass, cred);
|
rc = sql_execute("INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", user, pass, cred);
|
||||||
@@ -307,7 +253,7 @@ static int pass(size_t argc, const char** argv)
|
|||||||
print_usage("username password");
|
print_usage("username password");
|
||||||
|
|
||||||
user = sql_escape_string(argv[0]);
|
user = sql_escape_string(argv[0]);
|
||||||
pass = sql_escape_string(validate_password(argv[1]));
|
pass = sql_escape_string(argv[1]);
|
||||||
|
|
||||||
rc = sql_execute("UPDATE users SET password = '%s' WHERE nickname = '%s';", pass, user);
|
rc = sql_execute("UPDATE users SET password = '%s' WHERE nickname = '%s';", pass, user);
|
||||||
|
|
||||||
@@ -329,7 +275,7 @@ static int del(size_t argc, const char** argv)
|
|||||||
char* user = NULL;
|
char* user = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (argc < 1)
|
if (argc < 2)
|
||||||
print_usage("username");
|
print_usage("username");
|
||||||
|
|
||||||
user = sql_escape_string(argv[0]);
|
user = sql_escape_string(argv[0]);
|
||||||
@@ -361,11 +307,11 @@ void main_usage(const char* binary)
|
|||||||
"\n"
|
"\n"
|
||||||
"Parameters:\n"
|
"Parameters:\n"
|
||||||
" 'filename' is a database file\n"
|
" 'filename' is a database file\n"
|
||||||
" 'username' is a nickname (UTF-8, up to %i bytes)\n"
|
" 'username' is a nickname (UTF-8, up to 64 bytes)\n"
|
||||||
" 'password' is a password (UTF-8, up to %i bytes)\n"
|
" 'password' is a password (UTF-8, up to 64 bytes)\n"
|
||||||
" 'credentials' is one of 'admin', 'super', 'op', 'user'\n"
|
" 'credentials' is one of 'admin', 'super', 'op', 'user'\n"
|
||||||
"\n"
|
"\n"
|
||||||
, binary, MAX_NICK_LEN, MAX_PASS_LEN);
|
, binary);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
@@ -384,7 +330,7 @@ int main(int argc, char** argv)
|
|||||||
for (; n < sizeof(COMMANDS) / sizeof(COMMANDS[0]); n++)
|
for (; n < sizeof(COMMANDS) / sizeof(COMMANDS[0]); n++)
|
||||||
{
|
{
|
||||||
if (!strcmp(command, COMMANDS[n].command))
|
if (!strcmp(command, COMMANDS[n].command))
|
||||||
return COMMANDS[n].handle(argc - 3, (const char**) &argv[3]);
|
return COMMANDS[n].handle(argc - 2, (const char**) &argv[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unknown command!
|
// Unknown command!
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* uhub - A tiny ADC p2p connection hub
|
* uhub - A tiny ADC p2p connection hub
|
||||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
* Copyright (C) 2007-2010, 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
|
||||||
@@ -82,13 +82,12 @@ 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/ioqueue.h"
|
#include "core/hubio.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"
|
||||||
#include "core/pluginloader.h"
|
#include "core/pluginloader.h"
|
||||||
#include "core/hub.h"
|
#include "core/hub.h"
|
||||||
#include "core/command_parser.h"
|
|
||||||
#include "core/commands.h"
|
#include "core/commands.h"
|
||||||
#include "core/inf.h"
|
#include "core/inf.h"
|
||||||
#include "core/hubevent.h"
|
#include "core/hubevent.h"
|
||||||
|
|||||||
@@ -73,10 +73,10 @@ struct cfg_tokens* cfg_tokenize(const char* line)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '"':
|
case '\"':
|
||||||
if (backslash)
|
if (backslash)
|
||||||
{
|
{
|
||||||
ADD_CHAR('"');
|
ADD_CHAR('\"');
|
||||||
backslash = 0;
|
backslash = 0;
|
||||||
}
|
}
|
||||||
else if (quote)
|
else if (quote)
|
||||||
|
|||||||
@@ -32,12 +32,7 @@ struct linked_list* list_create()
|
|||||||
void list_destroy(struct linked_list* list)
|
void list_destroy(struct linked_list* list)
|
||||||
{
|
{
|
||||||
if (list)
|
if (list)
|
||||||
{
|
|
||||||
uhub_assert(list->size == 0);
|
|
||||||
uhub_assert(list->first == NULL);
|
|
||||||
uhub_assert(list->last == NULL);
|
|
||||||
hub_free(list);
|
hub_free(list);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -84,7 +79,7 @@ void list_append(struct linked_list* list, void* data_ptr)
|
|||||||
void list_remove(struct linked_list* list, void* data_ptr)
|
void list_remove(struct linked_list* list, void* data_ptr)
|
||||||
{
|
{
|
||||||
struct node* node = list->first;
|
struct node* node = list->first;
|
||||||
uhub_assert(data_ptr);
|
assert(data_ptr);
|
||||||
|
|
||||||
list->iterator = NULL;
|
list->iterator = NULL;
|
||||||
|
|
||||||
@@ -107,7 +102,7 @@ void list_remove(struct linked_list* list, void* data_ptr)
|
|||||||
hub_free(node);
|
hub_free(node);
|
||||||
|
|
||||||
list->size--;
|
list->size--;
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
node = node->next;
|
node = node->next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ int file_read_lines(const char* file, void* data, file_line_handler_t handler)
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = read(fd, buf, MAX_RECV_BUF-1);
|
ret = read(fd, buf, MAX_RECV_BUF);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -258,9 +258,7 @@ int file_read_lines(const char* file, void* data, file_line_handler_t handler)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[ret] = 0;
|
/* Parse configuaration */
|
||||||
|
|
||||||
/* Parse configuration */
|
|
||||||
split_data.handler = handler;
|
split_data.handler = handler;
|
||||||
split_data.data = data;
|
split_data.data = data;
|
||||||
|
|
||||||
@@ -305,19 +303,47 @@ int is_number(const char* value, int* num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME: -INTMIN is wrong!
|
||||||
|
*/
|
||||||
const char* uhub_itoa(int val)
|
const char* uhub_itoa(int val)
|
||||||
{
|
{
|
||||||
|
size_t i;
|
||||||
|
int value;
|
||||||
static char buf[22];
|
static char buf[22];
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
if (!val)
|
||||||
|
{
|
||||||
|
buf[0] = '0';
|
||||||
|
buf[1] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
i = sizeof(buf) - 1;
|
||||||
|
for (value = abs(val); value && i > 0; value /= 10)
|
||||||
|
buf[--i] = "0123456789"[value % 10];
|
||||||
|
|
||||||
return snprintf(buf, sizeof(buf), "%d", val) < 0 ? NULL : buf;
|
if (val < 0 && i > 0)
|
||||||
|
buf[--i] = '-';
|
||||||
|
return buf+i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char* uhub_ulltoa(uint64_t val)
|
const char* uhub_ulltoa(uint64_t val)
|
||||||
{
|
{
|
||||||
static char buf[22];
|
size_t i;
|
||||||
|
static char buf[22] = { 0, };
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
return snprintf(buf, sizeof(buf), PRINTF_UINT64_T, val) < 0 ? NULL : buf;
|
if (!val)
|
||||||
|
{
|
||||||
|
buf[0] = '0';
|
||||||
|
buf[1] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
i = sizeof(buf) - 1;
|
||||||
|
for (; val && i > 0; val /= 10)
|
||||||
|
buf[--i] = "0123456789"[val % 10];
|
||||||
|
return buf+i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,11 +53,7 @@ extern int file_read_lines(const char* file, void* data, file_line_handler_t han
|
|||||||
*/
|
*/
|
||||||
extern int string_to_boolean(const char* str, int* boolean);
|
extern int string_to_boolean(const char* str, int* boolean);
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert number to string.
|
|
||||||
* Note: these functions are neither thread-safe nor reentrant.
|
|
||||||
* @return pointer to the resulting string, NULL on error
|
|
||||||
*/
|
|
||||||
extern const char* uhub_itoa(int val);
|
extern const char* uhub_itoa(int val);
|
||||||
extern const char* uhub_ulltoa(uint64_t val);
|
extern const char* uhub_ulltoa(uint64_t val);
|
||||||
|
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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_REVISION "@UHUB_REVISION@"
|
|
||||||
#define GIT_VERSION "@UHUB_GIT_VERSION@"
|
|
||||||
|
|
||||||
#ifndef PRODUCT
|
|
||||||
#define PRODUCT "uhub"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define REVISION GIT_REVISION
|
|
||||||
#define PRODUCT_STRING PRODUCT "/" GIT_VERSION
|
|
||||||
|
|
||||||
#ifndef COPYRIGHT
|
|
||||||
#define COPYRIGHT "Copyright (c) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>"
|
|
||||||
#endif
|
|
||||||
@@ -1,18 +1,42 @@
|
|||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
|
|
||||||
# Usage:
|
# use script
|
||||||
# cat /etc/uhub/users.conf | tools/convert_to_sqlite.pl | sqlite3 users.db
|
# sqlite3 users.db < `tools/convert_to_sqlite.pl /etc/uhub/users.conf`
|
||||||
|
|
||||||
|
my $input = $ARGV[0];
|
||||||
|
|
||||||
|
|
||||||
|
open (FILE, "$input") || die "# Unable to open input file $input: $!";
|
||||||
|
my @lines = <FILE>;
|
||||||
|
close (FILE);
|
||||||
|
|
||||||
|
print "CREATE TABLE users(nickname CHAR(64) UNIQUE, password CHAR(64), credentials CHAR(5));\n";
|
||||||
|
|
||||||
|
foreach my $line (@lines) {
|
||||||
|
|
||||||
|
chomp($line);
|
||||||
|
|
||||||
|
$line =~ s/#.*//g;
|
||||||
|
|
||||||
|
next if ($line =~ /^\s*$/);
|
||||||
|
|
||||||
|
if ($line =~ /^\s*user_(op|admin|super|reg)\s*(.+):(.+)\s*/)
|
||||||
|
{
|
||||||
|
my $cred = $1;
|
||||||
|
my $nick = $2;
|
||||||
|
my $pass = $3;
|
||||||
|
|
||||||
|
$nick =~ s/'/\\'/g;
|
||||||
|
$pass =~ s/'/\\'/g;
|
||||||
|
|
||||||
|
print "INSERT INTO users VALUES('" . $nick . "', '" . $pass . "', '" . $cred . "');\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# print "# Warning: Unrecognized line: \"" . $line . "\"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print <<_;
|
|
||||||
CREATE TABLE users(
|
|
||||||
nickname CHAR(64) UNIQUE,
|
|
||||||
password CHAR(64),
|
|
||||||
credentials CHAR(5),
|
|
||||||
created TIMESTAMP DEFAULT (DATETIME('NOW')),
|
|
||||||
activity TIMESTAMP DEFAULT (DATETIME('NOW'))
|
|
||||||
);
|
|
||||||
_
|
|
||||||
sub e($) { (my $v = shift) =~ s/'/\\'/g; $v }
|
|
||||||
s{^\s*user_(op|admin|super|reg)\s+([^#\s]+):([^#\s]+)}{
|
|
||||||
printf "INSERT INTO users (nickname, password, credentials) VALUES('%s','%s','%s');\n", e $2, e $3, $1
|
|
||||||
}eg while(<>);
|
|
||||||
|
|||||||
23
version.h
Normal file
23
version.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#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
Normal file
7
vs2010/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
*.vcproj.user
|
||||||
|
*.vcproj.filters
|
||||||
|
*.ncb
|
||||||
|
*.aps
|
||||||
|
*.suo
|
||||||
|
Debug
|
||||||
|
Release
|
||||||
73
vs2010/plugins/mod_auth_simple/mod_auth_simple.vcxproj
Normal file
73
vs2010/plugins/mod_auth_simple/mod_auth_simple.vcxproj
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?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>
|
||||||
75
vs2010/plugins/mod_auth_sqlite/mod_auth_sqlite.vcxproj
Normal file
75
vs2010/plugins/mod_auth_sqlite/mod_auth_sqlite.vcxproj
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<?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>
|
||||||
85
vs2010/plugins/mod_example/mod_example.vcxproj
Normal file
85
vs2010/plugins/mod_example/mod_example.vcxproj
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<?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>
|
||||||
78
vs2010/thirdparty/sqlite/sqlite.vcxproj
vendored
Normal file
78
vs2010/thirdparty/sqlite/sqlite.vcxproj
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<?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>
|
||||||
85
vs2010/uhub-passwd/uhub-passwd.vcxproj
Normal file
85
vs2010/uhub-passwd/uhub-passwd.vcxproj
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<?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>
|
||||||
73
vs2010/uhub.sln
Normal file
73
vs2010/uhub.sln
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
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
|
||||||
|
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
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
149
vs2010/uhub.vcxproj
Normal file
149
vs2010/uhub.vcxproj
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<?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\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\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>
|
||||||
98
vs2010/uhub_utils/uhub_utils.vcxproj
Normal file
98
vs2010/uhub_utils/uhub_utils.vcxproj
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?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>
|
||||||
Reference in New Issue
Block a user