diff --git a/.hgignore b/.hgignore
new file mode 100644
index 00000000..4b97af97
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1,15 @@
+# Binaries
+\.dll$
+\.exe$
+\.so$
+
+# Files generated by Visual Studio
+\.aps$
+\.ncb$
+\.suo$
+\.user$
+
+# Build directories
+/CrazyDebug.*
+/Debug.*
+/Release.*
diff --git a/configs/core.cfg b/configs/core.cfg
index 70b897f2..86163810 100644
--- a/configs/core.cfg
+++ b/configs/core.cfg
@@ -106,7 +106,7 @@
/**
* Sets the server to connect to for auotmatic gamedata updates.
*/
- "AutoUpdateServer" "hayate.alliedmods.net"
+ "AutoUpdateServer" "smupdate.alliedmods.net"
/**
* Sets the port to connect to on the AutoUpdateServer server
diff --git a/core/Makefile b/core/Makefile
index 899a6e67..38ea2128 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -5,8 +5,7 @@ SMSDK = ..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../hl2sdk
HL2SDK_OB = ../../hl2sdk-ob
-SOURCEMM14 = ../../sourcemm-1.4
-SOURCEMM16 = ../../sourcemm-1.6
+MMSOURCE17 = ../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -51,7 +50,7 @@ ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK_ORIG)/public
HL2LIB = $(HL2SDK_ORIG)/linux_sdk
- METAMOD = $(SOURCEMM14)
+ METAMOD = $(MMSOURCE17)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
BINARY = sourcemod.1.ep1.so
@@ -62,7 +61,7 @@ ifeq "$(ENGINE)" "orangebox"
HL2PUB = $(HL2SDK_OB)/public
HL2LIB = $(HL2SDK_OB)/lib/linux
CFLAGS += -DORANGEBOX_BUILD
- METAMOD = $(SOURCEMM16)
+ METAMOD = $(MMSOURCE17)/core
INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
BINARY = sourcemod.2.ep2.so
@@ -71,14 +70,10 @@ endif
LINK += $(HL2LIB)/tier1_i486.a $(HL2LIB)/mathlib_i486.a vstdlib_i486.so \
tier0_i486.so -lpthread -static-libgcc
-
-INCLUDE_SMSDK = -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
-
-INCLUDE_SM16 = -I. -I.. -I$(SOURCEMM16)/sourcehook $(INCLUDE_SMSDK)
INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \
-I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) -I$(METAMOD)/sourcehook \
- -I$(METAMOD)/sourcemm -Isystems $(INCLUDE_SMSDK)
+ -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
CFLAGS += -D_LINUX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror \
@@ -120,7 +115,7 @@ all: check
$(MAKE) -f Makefile sourcemod
check:
- if [ "$(ENGSET)" == "false" ]; then \
+ if [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=orangebox or ENGINE=original"; \
exit 1; \
fi
diff --git a/core/msvc8/sourcemod_mm.vcproj b/core/msvc8/sourcemod_mm.vcproj
index 9aea667c..b8206d2c 100644
--- a/core/msvc8/sourcemod_mm.vcproj
+++ b/core/msvc8/sourcemod_mm.vcproj
@@ -39,9 +39,8 @@
/>
+
+
+
+
@@ -877,6 +888,14 @@
RelativePath="..\HalfLife2.cpp"
>
+
+
+
+
@@ -925,10 +944,22 @@
RelativePath="..\PlayerManager.cpp"
>
+
+
+
+
+
+
@@ -1043,6 +1074,14 @@
RelativePath="..\EventManager.h"
>
+
+
+
+
@@ -1059,6 +1098,14 @@
RelativePath="..\HalfLife2.h"
>
+
+
+
+
@@ -1107,10 +1154,22 @@
RelativePath="..\PlayerManager.h"
>
+
+
+
+
+
+
@@ -1281,79 +1340,6 @@
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
LocalToString(params[2], &buffer);
+ if (params[4] != -1)
+ {
+ if (size_t(params[4]) > size_t(params[3]))
+ {
+ return pContext->ThrowNativeError("read_count (%u) is greater than buffer size (%u)",
+ params[4],
+ params[3]);
+ }
+
+ num_read = (cell_t)fread(buffer, 1, params[4], pFile);
+
+ if (num_read != params[4] && ferror(pFile))
+ {
+ return -1;
+ }
+
+ return num_read;
+ }
+
char val;
while (1)
{
- /* If we're in stop mode, break as soon as the buffer is full. */
- if (params[4] && (params[3] == 0 || num_read >= params[3] - 1))
+ if (params[3] == 0 || num_read >= params[3] - 1)
{
break;
}
diff --git a/extensions/bintools/Makefile b/extensions/bintools/Makefile
index 60a5df27..bcd84c29 100644
--- a/extensions/bintools/Makefile
+++ b/extensions/bintools/Makefile
@@ -5,8 +5,7 @@ SMSDK = ../..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = ../../../hl2sdk-ob
-SOURCEMM14 = ../../../sourcemm-1.4
-SOURCEMM16 = ../../../sourcemm-1.6
+MMSOURCE17 = ../../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -34,7 +33,7 @@ ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK_ORIG)/public
HL2LIB = $(HL2SDK_ORIG)/linux_sdk
- METAMOD = $(SOURCEMM14)
+ METAMOD = $(MMSOURCE17)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
override ENGSET = true
@@ -44,7 +43,7 @@ ifeq "$(ENGINE)" "orangebox"
HL2PUB = $(HL2SDK_OB)/public
HL2LIB = $(HL2SDK_OB)/lib/linux
CFLAGS += -DORANGEBOX_BUILD
- METAMOD = $(SOURCEMM16)
+ METAMOD = $(MMSOURCE17)/core
INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
override ENGSET = true
@@ -56,8 +55,7 @@ ifeq "$(USEMETA)" "true"
LINK += $(LINK_HL2)
INCLUDE += -I. -I.. -Isdk -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
- -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(METAMOD)/sourcemm -I$(SMSDK)/public \
- -I$(SMSDK)/public/sourcepawn
+ -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
else
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/extensions -I$(SMSDK)/public/jit \
-I$(SMSDK)/public/jit/x86 -I$(SMSDK)/public/sourcepawn
@@ -101,14 +99,14 @@ $(BIN_DIR)/%.o: %.cpp
all: check
mkdir -p $(BIN_DIR)/sdk
- if [ "$(USEMETA)" == "true" ]; then \
+ if [ "$(USEMETA)" = "true" ]; then \
ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so; \
ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so; \
fi
$(MAKE) -f Makefile extension
check:
- if [ "$(USEMETA)" == "true" ] && [ "$(ENGSET)" == "false" ]; then \
+ if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=orangebox or ENGINE=original"; \
exit 1; \
fi
diff --git a/extensions/clientprefs/Makefile b/extensions/clientprefs/Makefile
index b951a39f..74c1c915 100644
--- a/extensions/clientprefs/Makefile
+++ b/extensions/clientprefs/Makefile
@@ -5,8 +5,7 @@ SMSDK = ../..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = ../../../hl2sdk-ob
-SOURCEMM14 = ../../../sourcemm-1.4
-SOURCEMM16 = ../../../sourcemm-1.6
+MMSOURCE17 = ../../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -34,7 +33,7 @@ ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK_ORIG)/public
HL2LIB = $(HL2SDK_ORIG)/linux_sdk
- METAMOD = $(SOURCEMM14)
+ METAMOD = $(MMSOURCE17)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
override ENGSET = true
@@ -44,7 +43,7 @@ ifeq "$(ENGINE)" "orangebox"
HL2PUB = $(HL2SDK_OB)/public
HL2LIB = $(HL2SDK_OB)/lib/linux
CFLAGS += -DORANGEBOX_BUILD
- METAMOD = $(SOURCEMM16)
+ METAMOD = $(MMSOURCE17)/core
INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
override ENGSET = true
@@ -56,11 +55,10 @@ ifeq "$(USEMETA)" "true"
LINK += $(LINK_HL2)
INCLUDE += -I. -I.. -Isdk -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
- -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(METAMOD)/sourcemm -I$(SMSDK)/public \
- -I$(SMSDK)/public/sourcepawn
+ -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
else
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn -I$(SMSDK)/public/extensions \
- -I$(SOURCEMM16)/sourcehook
+ -I$(MMSOURCE17)/core/sourcehook
endif
LINK += -static-libgcc
@@ -101,14 +99,14 @@ $(BIN_DIR)/%.o: %.cpp
all: check
mkdir -p $(BIN_DIR)/sdk
- if [ "$(USEMETA)" == "true" ]; then \
+ if [ "$(USEMETA)" = "true" ]; then \
ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so; \
ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so; \
fi
$(MAKE) -f Makefile extension
check:
- if [ "$(USEMETA)" == "true" ] && [ "$(ENGSET)" == "false" ]; then \
+ if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=orangebox or ENGINE=original"; \
exit 1; \
fi
diff --git a/extensions/clientprefs/msvc8/clientprefs.vcproj b/extensions/clientprefs/msvc8/clientprefs.vcproj
index 47d6402a..855e1e8b 100644
--- a/extensions/clientprefs/msvc8/clientprefs.vcproj
+++ b/extensions/clientprefs/msvc8/clientprefs.vcproj
@@ -40,7 +40,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
max_size.
diff --git a/plugins/include/sdktools_stocks.inc b/plugins/include/sdktools_stocks.inc
index f71b4b1c..13e2159a 100644
--- a/plugins/include/sdktools_stocks.inc
+++ b/plugins/include/sdktools_stocks.inc
@@ -58,7 +58,7 @@ stock FindTeamByName(const String:name[])
{
GetTeamName(i, team_name, sizeof(team_name));
- if (strncmp(team_name, name, name_len) == 0)
+ if (strncmp(team_name, name, name_len, false) == 0)
{
if (found_team >= 0)
{
diff --git a/plugins/sql-admin-manager.sp b/plugins/sql-admin-manager.sp
index 1926985f..9b085847 100644
--- a/plugins/sql-admin-manager.sp
+++ b/plugins/sql-admin-manager.sp
@@ -828,9 +828,9 @@ public Action:Command_AddAdmin(client, args)
decl String:password[32];
decl String:safe_password[80];
- if (args > 4)
+ if (args >= 6)
{
- GetCmdArg(5, password, sizeof(password));
+ GetCmdArg(6, password, sizeof(password));
SQL_EscapeString(db, password, safe_password, sizeof(safe_password));
} else {
safe_password[0] = '\0';
diff --git a/plugins/testsuite/filetest.sp b/plugins/testsuite/filetest.sp
new file mode 100644
index 00000000..7a6a1f1e
--- /dev/null
+++ b/plugins/testsuite/filetest.sp
@@ -0,0 +1,62 @@
+#include
+
+public Plugin:myinfo =
+{
+ name = "File test",
+ author = "AlliedModders LLC",
+ description = "Tests file functions",
+ version = "1.0.0.0",
+ url = "http://www.sourcemod.net/"
+};
+
+public OnPluginStart()
+{
+ RegServerCmd("test_fread1", Test_ReadBinStr);
+}
+
+Handle:OpenFile2(const String:path[], const String:mode[])
+{
+ new Handle:file = OpenFile(path, mode);
+ if (file == INVALID_HANDLE)
+ PrintToServer("Failed to open file %s for %s", path, mode);
+ else
+ PrintToServer("Opened file handle %x: %s", file, path);
+ return file;
+}
+
+public Action:Test_ReadBinStr(args)
+{
+ new items[] = {1, 3, 5, 7, 0, 92, 193, 26, 0, 84, 248, 2};
+ new Handle:of = OpenFile2("smbintest", "wb");
+ if (of == INVALID_HANDLE)
+ return Plugin_Handled;
+ WriteFile(of, items, sizeof(items), 1);
+ CloseHandle(of);
+
+ new Handle:inf = OpenFile2("smbintest", "rb");
+ new String:buffer[sizeof(items)];
+ ReadFileString(inf, buffer, sizeof(items), sizeof(items));
+ FileSeek(inf, 0, SEEK_SET);
+ new items2[sizeof(items)];
+ ReadFile(inf, items2, sizeof(items), 1);
+ CloseHandle(inf);
+
+ for (new i = 0; i < sizeof(items); i++)
+ {
+ if (buffer[i] != items[i])
+ {
+ PrintToServer("FAILED ON INDEX %d: %d != %d", i, buffer[i], items[i]);
+ return Plugin_Handled;
+ }
+ else if (items2[i] != items[i])
+ {
+ PrintToServer("FAILED ON INDEX %d: %d != %d", i, items2[i], items[i]);
+ return Plugin_Handled;
+ }
+ }
+
+ PrintToServer("Test passed!");
+
+ return Plugin_Handled;
+}
+
diff --git a/public/mms_sample_ext/Makefile b/public/mms_sample_ext/Makefile
index 87801801..8d55d366 100644
--- a/public/mms_sample_ext/Makefile
+++ b/public/mms_sample_ext/Makefile
@@ -5,8 +5,7 @@ SMSDK = ..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = ../../../hl2sdk-ob
-SOURCEMM14 = ../../../sourcemm-1.4
-SOURCEMM16 = ../../../sourcemm-1.6
+MMSOURCE17 = ../../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -31,7 +30,7 @@ ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK_ORIG)/public
HL2LIB = $(HL2SDK_ORIG)/linux_sdk
- METAMOD = $(SOURCEMM14)
+ METAMOD = $(MMSOURCE17)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
override ENGSET = true
@@ -41,7 +40,7 @@ ifeq "$(ENGINE)" "orangebox"
HL2PUB = $(HL2SDK_OB)/public
HL2LIB = $(HL2SDK_OB)/lib/linux
CFLAGS += -DORANGEBOX_BUILD
- METAMOD = $(SOURCEMM16)
+ METAMOD = $(MMSOURCE17)/core
INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
override ENGSET = true
@@ -50,8 +49,8 @@ endif
LINK = vstdlib_i486.so tier0_i486.so -static-libgcc
INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
- -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(METAMOD)/sourcemm -I$(SMSDK) -I$(SMSDK)/jit \
- -I$(SMSDK)/jit/x86 -I$(SMSDK)/extensions -I$(SMSDK)/sourcepawn
+ -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK) -I$(SMSDK)/jit -I$(SMSDK)/jit/x86 \
+ -I$(SMSDK)/extensions -I$(SMSDK)/sourcepawn
CFLAGS += -D_LINUX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror -mfpmath=sse \
@@ -90,7 +89,7 @@ all: check
$(MAKE) -f Makefile mms_ext
check:
- if [ "$(ENGSET)" == "false" ]; then \
+ if [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=orangebox or ENGINE=original"; \
exit 1; \
fi
diff --git a/public/sample_ext/Makefile b/public/sample_ext/Makefile
index b68f5bd1..ea256b8c 100644
--- a/public/sample_ext/Makefile
+++ b/public/sample_ext/Makefile
@@ -5,8 +5,7 @@ SMSDK = ../..
SRCDS_BASE = ~/srcds
HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = ../../../hl2sdk-ob
-SOURCEMM14 = ../../../sourcemm-1.4
-SOURCEMM16 = ../../../sourcemm-1.6
+MMSOURCE17 = ../../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -34,7 +33,7 @@ ifeq "$(ENGINE)" "original"
HL2SDK = $(HL2SDK_ORIG)
HL2PUB = $(HL2SDK_ORIG)/public
HL2LIB = $(HL2SDK_ORIG)/linux_sdk
- METAMOD = $(SOURCEMM14)
+ METAMOD = $(MMSOURCE17)/core-legacy
INCLUDE += -I$(HL2SDK)/public/dlls
SRCDS = $(SRCDS_BASE)
override ENGSET = true
@@ -44,7 +43,7 @@ ifeq "$(ENGINE)" "orangebox"
HL2PUB = $(HL2SDK_OB)/public
HL2LIB = $(HL2SDK_OB)/lib/linux
CFLAGS += -DORANGEBOX_BUILD
- METAMOD = $(SOURCEMM16)
+ METAMOD = $(MMSOURCE17)/core
INCLUDE += -I$(HL2SDK)/public/game/server
SRCDS = $(SRCDS_BASE)/orangebox
override ENGSET = true
@@ -56,8 +55,7 @@ ifeq "$(USEMETA)" "true"
LINK += $(LINK_HL2)
INCLUDE += -I. -I.. -Isdk -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
- -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(METAMOD)/sourcemm -I$(SMSDK)/public \
- -I$(SMSDK)/public/sourcepawn
+ -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
else
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
endif
@@ -100,14 +98,14 @@ $(BIN_DIR)/%.o: %.cpp
all: check
mkdir -p $(BIN_DIR)/sdk
- if [ "$(USEMETA)" == "true" ]; then \
+ if [ "$(USEMETA)" = "true" ]; then \
ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so; \
ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so; \
fi
$(MAKE) -f Makefile extension
check:
- if [ "$(USEMETA)" == "true" ] && [ "$(ENGSET)" == "false" ]; then \
+ if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
echo "You must supply ENGINE=orangebox or ENGINE=original"; \
exit 1; \
fi
diff --git a/public/sample_ext/msvc8/sdk.vcproj b/public/sample_ext/msvc8/sdk.vcproj
index d0ad2229..0016aec1 100644
--- a/public/sample_ext/msvc8/sdk.vcproj
+++ b/public/sample_ext/msvc8/sdk.vcproj
@@ -201,7 +201,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pushbuild.txt b/pushbuild.txt
index d25d059a..089db4f9 100644
--- a/pushbuild.txt
+++ b/pushbuild.txt
@@ -1 +1,2 @@
-a billion and TRILLIONS
\ No newline at end of file
+a billion and TRILLIONS
+timeout dance
\ No newline at end of file
diff --git a/sourcepawn/jit/Makefile b/sourcepawn/jit/Makefile
index 51df620e..e1c429f7 100644
--- a/sourcepawn/jit/Makefile
+++ b/sourcepawn/jit/Makefile
@@ -2,7 +2,7 @@
# Makefile written by David "BAILOPAN" Anderson
SMSDK = ../..
-SOURCEHOOK = ../../../sourcemm-1.6/sourcehook
+MMSOURCE17 = ../../../mmsource-1.7
#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
@@ -47,7 +47,7 @@ CPP = gcc-4.1
LINK = -static-libgcc
INCLUDE = -I. -I.. -I$(SMSDK)/public -I$(SMSDK)/public/jit -I$(SMSDK)/public/jit/x86 \
- -I$(SMSDK)/public/sourcepawn -I$(SOURCEHOOK) -I$(SMSDK)/knight/shared -Ix86
+ -I$(SMSDK)/public/sourcepawn -I$(MMSOURCE17)/core/sourcehook -I$(SMSDK)/knight/shared -Ix86
CFLAGS += -D_LINUX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -DHAVE_STDINT_H \
diff --git a/sourcepawn/jit/msvc8/jit-x86.vcproj b/sourcepawn/jit/msvc8/jit-x86.vcproj
index 86122d5b..0cb5da49 100644
--- a/sourcepawn/jit/msvc8/jit-x86.vcproj
+++ b/sourcepawn/jit/msvc8/jit-x86.vcproj
@@ -40,7 +40,7 @@
-
-
-
-
-
-
#include "smud.h"
#include "smud_threads.h"
@@ -8,6 +9,7 @@ char fileNames[NUM_FILES][30] = {
"core.games.txt",
"sdktools.games.txt",
"sdktools.games.ep2.txt",
+ "sdktools.games.l4d.txt",
"sm-cstrike.games.txt",
"sm-tf2.games.txt",
};
@@ -29,7 +31,9 @@ int main(int argc, char **argv)
char filename[100];
struct stat sbuf;
- printf("Loading Gamedata files into memory\n");
+#if defined DEBUG
+ fprintf(stdout, "Loading Gamedata files into memory\n");
+#endif
for (int i=0; iStart())
{
+ fprintf(stderr, "Could not initialize thread pool!\n");
return 1;
}
+#if defined DEBUG
printf("Create Server Socket\n");
+#endif
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
@@ -76,6 +90,7 @@ int main(int argc, char **argv)
if (pProtocol == NULL)
{
+ fprintf(stderr, "Could not get tcp proto: %s", strerror(errno));
return 1;
}
@@ -83,6 +98,7 @@ int main(int argc, char **argv)
if (serverSocket < 0)
{
+ fprintf(stderr, "Could not open socket: %s", strerror(errno));
return 1;
}
@@ -91,34 +107,45 @@ int main(int argc, char **argv)
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0)
{
+ fprintf(stderr, "Could not bind socket: %s", strerror(errno));
return 1;
}
if (listen(serverSocket, LISTEN_QUEUE_LENGTH) < 0)
{
+ fprintf(stderr, "Could not listen on socket: %s", strerror(errno));
return 1;
}
- printf("Entering Main Loop\n");
+ fprintf(stdout, "Server has started.\n");
while (1)
{
addressLen = sizeof(clientAddress);
- if ( (clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, (socklen_t *)&addressLen)) < 0)
+ clientSocket = accept(serverSocket,
+ (struct sockaddr *)&clientAddress,
+ (socklen_t *)&addressLen);
+ if (clientSocket < 0)
{
+ fprintf(stderr, "Could not accept client: %s", strerror(errno));
continue;
}
opts = fcntl(clientSocket, F_GETFL, 0);
if (fcntl(clientSocket, F_SETFL, opts|O_NONBLOCK) < 0)
{
+ fprintf(stderr, "Could not non-block client: %s", strerror(errno));
closesocket(clientSocket);
continue;
}
-
- printf("Connection Received!\n");
+#if defined DEBUG
+ fprintf(stdout,
+ "Accepting connection from client (sock %d, ip %s)",
+ clientSocket,
+ inet_ntoa(clientAddress.sin_addr));
+#endif
pool->AddConnection(clientSocket);
}
diff --git a/tools/daemon/smud.h b/tools/daemon/smud.h
index 468024ca..5c047fb8 100644
--- a/tools/daemon/smud.h
+++ b/tools/daemon/smud.h
@@ -16,7 +16,7 @@
#define closesocket close
-#define NUM_FILES 5
+#define NUM_FILES 6
extern char fileNames[NUM_FILES][30];
extern void *fileLocations[NUM_FILES];
diff --git a/tools/daemon/smud_connections.cpp b/tools/daemon/smud_connections.cpp
index 89624d61..3ffddd68 100644
--- a/tools/daemon/smud_connections.cpp
+++ b/tools/daemon/smud_connections.cpp
@@ -1,3 +1,4 @@
+#include
#include "smud_connections.h"
#include "smud.h"
@@ -19,8 +20,6 @@ void ConnectionPool::AddConnection( int fd )
pthread_mutex_lock(&m_AddLock);
m_AddQueue.push_back(connection);
pthread_mutex_unlock(&m_AddLock);
-
- printf("New Connection Added\n");
}
void ConnectionPool::Process( bool *terminate )
@@ -48,9 +47,10 @@ void ConnectionPool::Process( bool *terminate )
/* Add all connections that want processing to the sets */
while (iter != m_Links.end())
{
- con = (smud_connection *)*iter;
+ con = *iter;
pollReturn = poll(&(con->pollData), 1, 0);
+ assert(pollReturn <= 1);
if (pollReturn == -1)
{
@@ -66,11 +66,11 @@ void ConnectionPool::Process( bool *terminate )
if (result == QueryResult_Complete)
{
iter = m_Links.erase(iter);
+#if defined DEBUG
+ fprintf(stdout, "Closing socket %d\n", con->fd);
+#endif
closesocket(con->fd);
delete con;
-
- printf("Connection Completed!\n");
-
continue;
}
@@ -145,31 +145,61 @@ QueryResult ConnectionPool::ProcessConnection( smud_connection *con )
void ConnectionPool::ReadQueryHeader( smud_connection *con )
{
- char data[11];
+ if (con->buffer == NULL)
+ {
+ con->buffer = new char[QUERY_HEADER_SIZE];
+ con->writtenCount = 0;
+ }
+
+ int bytesReceived = 0;
- if (recv(con->fd, data, sizeof(data), 0) == -1)
+ bytesReceived = recv(con->fd, con->buffer+con->writtenCount, QUERY_HEADER_SIZE-con->writtenCount, 0);
+
+ if (bytesReceived == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ delete [] con->buffer;
+ con->buffer = NULL;
+ con->writtenCount = 0;
}
return;
}
- if (data[0] != 'A' || data[1] != 'G')
+ con->writtenCount += bytesReceived;
+
+ assert(con->writtenCount <= QUERY_HEADER_SIZE);
+
+ if (con->writtenCount < QUERY_HEADER_SIZE)
+ {
+ /* Don't change the connection status, so next cycle we will come back to here and continue receiving data */
+ return;
+ }
+
+ if (con->buffer[0] != 'A' || con->buffer[1] != 'G')
{
con->state = ConnectionState_Complete;
+ delete [] con->buffer;
+ con->buffer = NULL;
+ con->writtenCount = 0;
return;
}
//Ignore the next 8 bytes for the moment. Versioning data is currently unused
// uint16[4] - source version major/minor/something/rev
- con->sentSums = data[10];
+ con->sentSums = con->buffer[10];
con->state = ConnectionState_ReadQueryData;
- printf("Query Header Read Complete, %i md5's expected\n", con->sentSums);
+#if defined DEBUG
+ fprintf(stdout, "Query Header Read Complete, %i md5's expected\n", con->sentSums);
+#endif
+
+ delete [] con->buffer;
+ con->buffer = NULL;
+ con->writtenCount = 0;
}
void ConnectionPool::ReplyQuery(smud_connection *con)
@@ -186,35 +216,68 @@ void ConnectionPool::ReplyQuery(smud_connection *con)
data[11] = (char)con->sendCount;
- if (send(con->fd, data, sizeof(data), 0) == -1)
+ int bytesSent = send(con->fd, data+con->writtenCount, sizeof(data)-con->writtenCount, 0);
+
+ if (bytesSent == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ con->writtenCount = 0;
}
return;
}
-
- //Now we need more send sub functions for all the damn files. Geh.
- //Alternatively we could just send all at once here. Could make for a damn big query. 100k anyone?
+ con->writtenCount += bytesSent;
+
+ assert(con->writtenCount <= 12);
+
+ if (con->writtenCount < 12)
+ {
+ /** Still more data needs to be sent - Return so we come back here next cycle */
+ return;
+ }
+
con->state = ConnectionState_SendingFiles;
+ con->writtenCount = 0;
+#if defined DEBUG
printf("Query Reply Header Complete\n");
+#endif
}
void ConnectionPool::ReadQueryContent( smud_connection *con )
{
- char *data = new char[16*(con->sentSums)]();
+ if (con->buffer == NULL)
+ {
+ con->buffer = new char[QUERY_CONTENT_SIZE*con->sentSums];
+ con->writtenCount = 0;
+ }
- if (recv(con->fd, data, 16*(con->sentSums), 0) == -1)
+ int bytesReceived = 0;
+
+ bytesReceived = recv(con->fd, con->buffer+con->writtenCount, (QUERY_CONTENT_SIZE*con->sentSums)-con->writtenCount, 0);
+
+ if (bytesReceived == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ delete [] con->buffer;
+ con->buffer = NULL;
+ con->writtenCount = 0;
}
- delete [] data;
+ return;
+ }
+
+ con->writtenCount += bytesReceived;
+
+ assert(con->writtenCount <= (QUERY_CONTENT_SIZE*con->sentSums));
+
+ if (con->writtenCount < (QUERY_CONTENT_SIZE*con->sentSums))
+ {
+ /* Don't change the connection status, so next cycle we will come back to here and continue receiving data */
return;
}
@@ -225,11 +288,13 @@ void ConnectionPool::ReadQueryContent( smud_connection *con )
for (int i=0; isentSums; i++)
{
con->fileLocation[i] = -1;
- con->shouldSend[i] = GetMD5UpdateStatus(data + (16*i), con, i);
+ con->shouldSend[i] = GetMD5UpdateStatus(con->buffer + (QUERY_CONTENT_SIZE*i), con, i);
if (con->shouldSend[i] == MD5Status_NeedsUpdate)
{
- printf("File %i needs updating\n", i);
+#if defined DEBUG
+ fprintf(stdout, "File %i needs updating\n", i);
+#endif
con->sendCount++;
con->headerSent[i] = false;
continue;
@@ -237,15 +302,21 @@ void ConnectionPool::ReadQueryContent( smud_connection *con )
if (con->shouldSend[i] == MD5Status_Unknown)
{
- printf("File %i is unknown\n", i);
+#if defined DEBUG
+ fprintf(stdout, "File %i is unknown\n", i);
+#endif
con->unknownCount++;
}
}
con->state = ConnectionState_ReplyQuery;
con->pollData.events = POLLOUT;
- delete [] data;
- printf("Query Data Read Complete\n");
+ delete [] con->buffer;
+ con->buffer = NULL;
+ con->writtenCount = 0;
+#if defined DEBUG
+ fprintf(stdout, "Query Data Read Complete\n");
+#endif
}
MD5Status ConnectionPool::GetMD5UpdateStatus( const char *md5 , smud_connection *con, int fileNum)
@@ -263,7 +334,9 @@ MD5Status ConnectionPool::GetMD5UpdateStatus( const char *md5 , smud_connection
strcat(path, md5String);
- printf("checking for file \"%s\"\n", path);
+#if defined DEBUG
+ fprintf(stdout, "checking for file \"%s\"\n", path);
+#endif
FILE *file = fopen(path, "r");
@@ -275,7 +348,9 @@ MD5Status ConnectionPool::GetMD5UpdateStatus( const char *md5 , smud_connection
char latestMD5[33];
fgets(latestMD5, 33, file);
- printf("Latest md5 is: %s\n", latestMD5);
+#if defined DEBUG
+ fprintf(stdout, "Latest md5 is: %s\n", latestMD5);
+#endif
if (strcmp(latestMD5, md5String) == 0)
{
@@ -298,7 +373,9 @@ MD5Status ConnectionPool::GetMD5UpdateStatus( const char *md5 , smud_connection
fclose(file);
- printf("Filename is %s\n", filename);
+#if defined DEBUG
+ fprintf(stdout, "Filename is %s\n", filename);
+#endif
//We now need to match this filename with one of our mmap'd files in memory and store it until send gets called.
for (int i=0; ifileLocation[fileNum] = i;
- printf("File %i mapped to local file %i\n", fileNum, i);
+#if defined DEBUG
+ fprintf(stdout, "File %i mapped to local file %i\n", fileNum, i);
+#endif
return MD5Status_NeedsUpdate;
}
}
@@ -317,7 +396,8 @@ MD5Status ConnectionPool::GetMD5UpdateStatus( const char *md5 , smud_connection
void ConnectionPool::SendFile( smud_connection *con )
{
//Find the next file to send.
- while (con->currentFile < con->sentSums &&
+ while (con->writtenCount == 0 &&
+ con->currentFile < con->sentSums &&
con->shouldSend[con->currentFile] != MD5Status_NeedsUpdate)
{
con->currentFile++;
@@ -326,16 +406,26 @@ void ConnectionPool::SendFile( smud_connection *con )
//All files have been sent.
if (con->currentFile >= con->sentSums)
{
- printf("All files sent!\n");
+#if defined DEBUG
+ fprintf(stdout, "All files sent!\n");
+#endif
con->state = ConnectionState_SendUnknownList;
+ con->writtenCount = 0;
return;
}
void *file = fileLocations[con->fileLocation[con->currentFile]];
int filelength = fileLength[con->fileLocation[con->currentFile]];
- printf("Sending file of length %i\n", filelength);
- printf("Current file index is: %i, maps to file index: %i\n", con->currentFile, con->fileLocation[con->currentFile]);
+#if defined DEBUG
+ fprintf(stdout, "Sending file of length %i\n", filelength);
+ fprintf(stdout,
+ "Current file index is: %i, maps to file index: %i\n",
+ con->currentFile,
+ con->fileLocation[con->currentFile]);
+#endif
+
+ int sentBytes = 0;
if (!con->headerSent[con->currentFile])
{
@@ -343,31 +433,59 @@ void ConnectionPool::SendFile( smud_connection *con )
buffer[0] = con->currentFile;
*((int *)&buffer[1]) = filelength;
- if (send(con->fd, buffer, 5, 0) == -1)
+ sentBytes = send(con->fd, buffer+con->writtenCount, 5-con->writtenCount, 0);
+
+ if (sentBytes == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ con->writtenCount = 0;
}
return;
}
+ con->writtenCount += sentBytes;
+
+ assert(con->writtenCount <= 5);
+
+ if (con->writtenCount < 5)
+ {
+ return;
+ }
+
con->headerSent[con->currentFile] = true;
+ con->writtenCount = 0;
}
- if (send(con->fd, file, filelength, 0) == -1)
+ sentBytes = send(con->fd, (unsigned char *)file+con->writtenCount, filelength-con->writtenCount, 0);
+
+ if (sentBytes == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ con->writtenCount = 0;
}
return;
}
+ con->writtenCount += sentBytes;
+
+ assert(con->writtenCount <= filelength);
+
+ if (con->writtenCount < filelength)
+ {
+ return;
+ }
+
con->currentFile++;
- printf("Sent a file!: %s\n", fileNames[con->fileLocation[con->currentFile-1]]);
+ con->writtenCount = 0;
+#if defined DEBUG
+ fprintf(stdout, "Sent a file!: %s\n", fileNames[con->fileLocation[con->currentFile-1]]);
+#endif
}
void ConnectionPool::SendUnknownList( smud_connection *con )
@@ -377,7 +495,9 @@ void ConnectionPool::SendUnknownList( smud_connection *con )
packet[0] = con->unknownCount;
- printf("%i Files are unknown\n", con->unknownCount);
+#if defined DEBUG
+ fprintf(stdout, "%i Files are unknown\n", con->unknownCount);
+#endif
int i=1;
@@ -390,16 +510,32 @@ void ConnectionPool::SendUnknownList( smud_connection *con )
}
}
- if (send(con->fd, packet, size, 0) == -1)
+ int sentBytes = send(con->fd, packet+con->writtenCount, size-con->writtenCount, 0);
+
+ if (sentBytes == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
{
con->state = ConnectionState_Complete;
+ con->writtenCount = 0;
}
return;
}
+ con->writtenCount += sentBytes;
+
+ assert(con->writtenCount <= size);
+
+ if (con->writtenCount < size)
+ {
+ return;
+ }
+
con->state = ConnectionState_Complete;
- printf("Unknown's Sent\n");
+ con->writtenCount = 0;
+#if defined DEBUG
+ fprintf(stdout, "Unknowns Sent\n");
+#endif
}
+
diff --git a/tools/daemon/smud_connections.h b/tools/daemon/smud_connections.h
index 5fe29d68..dbc75ac3 100644
--- a/tools/daemon/smud_connections.h
+++ b/tools/daemon/smud_connections.h
@@ -5,6 +5,9 @@
#include
#include "poll.h"
+#define QUERY_HEADER_SIZE 11
+#define QUERY_CONTENT_SIZE 16
+
enum ConnectionState
{
ConnectionState_ReadQueryHeader,
@@ -54,6 +57,8 @@ struct smud_connection
state = ConnectionState_ReadQueryHeader;
this->fd = fd;
pollData.fd = fd;
+ buffer = NULL;
+ writtenCount = 0;
}
~smud_connection()
@@ -77,6 +82,8 @@ struct smud_connection
int unknownCount; /** Number of files that were unknown */
int currentFile; /** Current file being sent (index into the above 3 arrays) */
pollfd pollData; /** Data to be passed into poll() */
+ char *buffer; /** Temporary storage buffer to hold data until all of it is available */
+ int writtenCount; /** Number of bytes written into the storage buffer */
};