diff --git a/GNUmakefile b/GNUmakefile
index 40dfa67..b0cb5a4 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -166,6 +166,7 @@ libadc_common_SOURCES := \
src/adc/sid.c
libutils_SOURCES := \
+ src/util/cbuffer.c \
src/util/config_token.c \
src/util/credentials.c \
src/util/floodctl.c \
diff --git a/src/core/commands.c b/src/core/commands.c
index 6c783e2..0cef4ff 100644
--- a/src/core/commands.c
+++ b/src/core/commands.c
@@ -31,89 +31,8 @@ static int send_command_not_found(struct command_base* cbase, struct hub_user* u
static int send_command_syntax_error(struct command_base* cbase, struct hub_user* user);
static int send_command_missing_arguments(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd);
-#define CBUF_FLAG_CONST_BUFFER 0x01
-
static void null_free(void* ptr) { }
-struct command_buffer
-{
- size_t capacity;
- size_t size;
- size_t flags;
- char* buf;
-};
-
-static struct command_buffer* cbuf_create(size_t capacity)
-{
- struct command_buffer* buf = hub_malloc(sizeof(struct command_buffer));
- buf->capacity = capacity;
- buf->size = 0;
- buf->flags = 0;
- buf->buf = hub_malloc(capacity + 1);
- return buf;
-}
-
-static struct command_buffer* cbuf_create_const(const char* buffer)
-{
- struct command_buffer* buf = hub_malloc(sizeof(struct command_buffer));
- buf->capacity = 0;
- buf->size = strlen(buffer);
- buf->flags = CBUF_FLAG_CONST_BUFFER;
- buf->buf = (char*) buffer;
- return buf;
-}
-
-static void cbuf_destroy(struct command_buffer* buf)
-{
- if (!(buf->flags & CBUF_FLAG_CONST_BUFFER))
- {
- hub_free(buf->buf);
- }
- hub_free(buf);
-}
-
-static void cbuf_resize(struct command_buffer* buf, size_t capacity)
-{
- uhub_assert(buf->flags == 0);
- buf->capacity = capacity;
- buf->buf = hub_realloc(buf->buf, capacity + 1);
-}
-
-static void cbuf_append_bytes(struct command_buffer* buf, const char* msg, size_t len)
-{
- uhub_assert(buf->flags == 0);
- if (buf->size + len >= buf->capacity)
- cbuf_resize(buf, buf->size + len);
-
- memcpy(buf->buf + buf->size, msg, len);
- buf->size += len;
- buf->buf[buf->size] = '\0';
-}
-
-static void cbuf_append(struct command_buffer* buf, const char* msg)
-{
- size_t len = strlen(msg);
- uhub_assert(buf->flags == 0);
- cbuf_append_bytes(buf, msg, len);
-}
-
-static void cbuf_append_format(struct command_buffer* buf, const char* format, ...)
-{
- static char tmp[1024];
- va_list args;
- int bytes;
- uhub_assert(buf->flags == 0);
- va_start(args, format);
- bytes = vsnprintf(tmp, 1024, format, args);
- va_end(args);
- cbuf_append_bytes(buf, tmp, bytes);
-}
-
-static const char* cbuf_get(struct command_buffer* buf)
-{
- return buf->buf;
-}
-
struct command_base
{
struct hub_info* hub;
@@ -394,7 +313,7 @@ command_parse_cleanup:
return cmd;
}
-void command_get_syntax(struct command_handle* handler, struct command_buffer* buf)
+void command_get_syntax(struct command_handle* handler, struct cbuffer* buf)
{
size_t n = 0;
int opt = 0;
@@ -425,7 +344,7 @@ void command_get_syntax(struct command_handle* handler, struct command_buffer* b
}
-void send_message(struct command_base* cbase, struct hub_user* user, struct command_buffer* buf)
+void send_message(struct command_base* cbase, struct hub_user* user, struct cbuffer* buf)
{
char* buffer = adc_msg_escape(cbuf_get(buf));
struct adc_message* command = adc_msg_construct(ADC_CMD_IMSG, strlen(buffer) + 6);
@@ -438,7 +357,7 @@ void send_message(struct command_base* cbase, struct hub_user* user, struct comm
static int send_command_access_denied(struct command_base* cbase, struct hub_user* user, const char* prefix)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
cbuf_append_format(buf, "*** %s: Access denied.", prefix);
send_message(cbase, user, buf);
return 0;
@@ -446,7 +365,7 @@ static int send_command_access_denied(struct command_base* cbase, struct hub_use
static int send_command_not_found(struct command_base* cbase, struct hub_user* user, const char* prefix)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
cbuf_append_format(buf, "*** %s: Command not found.", prefix);
send_message(cbase, user, buf);
return 0;
@@ -454,7 +373,7 @@ static int send_command_not_found(struct command_base* cbase, struct hub_user* u
static int send_command_syntax_error(struct command_base* cbase, struct hub_user* user)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
cbuf_append(buf, "*** Syntax error.");
send_message(cbase, user, buf);
return 0;
@@ -462,7 +381,7 @@ static int send_command_syntax_error(struct command_base* cbase, struct hub_user
static int send_command_missing_arguments(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(512);
+ struct cbuffer* buf = cbuf_create(512);
cbuf_append_format(buf, "*** Missing argument: See !help !%s\n", cmd->prefix);
send_message(cbase, user, buf);
return 0;
@@ -532,9 +451,9 @@ int command_invoke(struct command_base* cbase, struct hub_user* user, const char
return ret;
}
-static int command_status(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd, struct command_buffer* msg)
+static int command_status(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd, struct cbuffer* msg)
{
- struct command_buffer* buf = cbuf_create(msg->size + strlen(cmd->prefix) + 8);
+ struct cbuffer* buf = cbuf_create(cbuf_size(msg) + strlen(cmd->prefix) + 8);
cbuf_append_format(buf, "*** %s: %s", cmd->prefix, cbuf_get(msg));
send_message(cbase, user, buf);
cbuf_destroy(msg);
@@ -543,7 +462,7 @@ static int command_status(struct command_base* cbase, struct hub_user* user, str
static int command_help(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(MAX_HELP_LINE);
+ struct cbuffer* buf = cbuf_create(MAX_HELP_LINE);
struct command_handle* command = list_get_first(cmd->args);
if (!command)
@@ -576,7 +495,7 @@ static int command_help(struct command_base* cbase, struct hub_user* user, struc
static int command_uptime(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
size_t d;
size_t h;
size_t m;
@@ -596,7 +515,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)
{
- struct command_buffer* buf;
+ struct cbuffer* buf;
struct hub_user* target = list_get_first(cmd->args);
buf = cbuf_create(128);
@@ -614,7 +533,7 @@ static int command_kick(struct command_base* cbase, struct hub_user* user, struc
static int command_ban(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct hub_user* target = list_get_first(cmd->args);
if (target == user)
@@ -640,7 +559,7 @@ static int command_unban(struct command_base* cbase, struct hub_user* user, stru
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 command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
if (strlen(cmd->prefix) == 4)
{
@@ -669,7 +588,7 @@ static int command_shutdown_hub(struct command_base* cbase, struct hub_user* use
static int command_version(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf;
+ struct cbuffer* buf;
if (cbase->hub->config->show_banner_sys_info)
buf = cbuf_create_const("Powered by " PRODUCT_STRING " on " OPSYS "/" CPUINFO);
else
@@ -679,14 +598,14 @@ static int command_version(struct command_base* cbase, struct hub_user* user, st
static int command_myip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
cbuf_append_format(buf, "Your address is \"%s\"", user_get_address(user));
return command_status(cbase, user, cmd, buf);
}
static int command_getip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct hub_user* target = list_get_first(cmd->args);
cbuf_append_format(buf, "\"%s\" has address \"%s\"", target->id.nick, user_get_address(target));
return command_status(cbase, user, cmd, buf);
@@ -694,7 +613,7 @@ static int command_getip(struct command_base* cbase, struct hub_user* user, stru
static int command_whoip(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf;
+ struct cbuffer* buf;
struct ip_range* range = list_get_first(cmd->args);
struct linked_list* users = (struct linked_list*) list_create();
struct hub_user* u;
@@ -735,7 +654,7 @@ static int command_broadcast(struct command_base* cbase, struct hub_user* user,
char from_sid[5];
size_t recipients = 0;
struct hub_user* target;
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
memcpy(from_sid, sid_to_string(user->id.sid), sizeof(from_sid));
memcpy(pm_flag + 2, from_sid, sizeof(from_sid));
@@ -768,7 +687,7 @@ static int command_broadcast(struct command_base* cbase, struct hub_user* user,
static int command_history(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf;
+ struct cbuffer* buf;
struct linked_list* messages = cbase->hub->chat_history;
char* message;
char* maxlines_str = list_get_first(cmd->args);
@@ -811,7 +730,7 @@ static int command_history(struct command_base* cbase, struct hub_user* user, st
static int command_log(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf;
+ struct cbuffer* buf;
struct linked_list* messages = cbase->hub->logout_info;
struct hub_logout_info* log;
char* search = 0;
@@ -883,7 +802,7 @@ static int command_log(struct command_base* cbase, struct hub_user* user, struct
static int command_register(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct auth_info data;
char* password = list_get_first(cmd->args);
@@ -906,7 +825,7 @@ static int command_register(struct command_base* cbase, struct hub_user* user, s
static int command_password(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct auth_info data;
char* password = list_get_first(cmd->args);
@@ -929,7 +848,7 @@ static int command_password(struct command_base* cbase, struct hub_user* user, s
static int command_useradd(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct auth_info data;
char* nick = list_get_first(cmd->args);
char* pass = list_get_next(cmd->args);
@@ -954,7 +873,7 @@ static int command_useradd(struct command_base* cbase, struct hub_user* user, st
static int command_userdel(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
char* nick = list_get_first(cmd->args);
if (acl_delete_user(cbase->hub, nick))
@@ -1004,7 +923,7 @@ static int command_crash(struct command_base* cbase, struct hub_user* user, stru
static int command_stats(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
- struct command_buffer* buf = cbuf_create(128);
+ struct cbuffer* buf = cbuf_create(128);
struct hub_info* hub = cbase->hub;
cbuf_append_format(buf, PRINTF_SIZE_T " users, peak: " PRINTF_SIZE_T ". Network (up/down): %d/%d KB/s, peak: %d/%d KB/s",
diff --git a/src/uhub.h b/src/uhub.h
index e26ae01..b0dff42 100644
--- a/src/uhub.h
+++ b/src/uhub.h
@@ -58,6 +58,7 @@ extern "C" {
#include "adc/adcconst.h"
+#include "util/cbuffer.h"
#include "util/config_token.h"
#include "util/credentials.h"
#include "util/floodctl.h"
diff --git a/src/util/cbuffer.c b/src/util/cbuffer.c
new file mode 100644
index 0000000..5b73cfe
--- /dev/null
+++ b/src/util/cbuffer.c
@@ -0,0 +1,115 @@
+/*
+ * uhub - A tiny ADC p2p connection hub
+ * Copyright (C) 2007-2011, 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 .
+ *
+ */
+
+#include "uhub.h"
+
+#define CBUF_FLAG_CONST_BUFFER 0x01
+
+struct cbuffer
+{
+ size_t capacity;
+ size_t size;
+ size_t flags;
+ char* buf;
+};
+
+extern struct cbuffer* cbuf_create(size_t capacity)
+{
+ struct cbuffer* buf = hub_malloc(sizeof(struct cbuffer));
+ buf->capacity = capacity;
+ buf->size = 0;
+ buf->flags = 0;
+ buf->buf = hub_malloc(capacity + 1);
+ return buf;
+}
+
+struct cbuffer* cbuf_create_const(const char* buffer)
+{
+ struct cbuffer* buf = hub_malloc(sizeof(struct cbuffer));
+ buf->capacity = 0;
+ buf->size = strlen(buffer);
+ buf->flags = CBUF_FLAG_CONST_BUFFER;
+ buf->buf = (char*) buffer;
+ return buf;
+}
+
+void cbuf_destroy(struct cbuffer* buf)
+{
+ if (!(buf->flags & CBUF_FLAG_CONST_BUFFER))
+ {
+ hub_free(buf->buf);
+ }
+ hub_free(buf);
+}
+
+void cbuf_resize(struct cbuffer* buf, size_t capacity)
+{
+ uhub_assert(buf->flags == 0);
+ buf->capacity = capacity;
+ buf->buf = hub_realloc(buf->buf, capacity + 1);
+}
+
+void cbuf_append_bytes(struct cbuffer* buf, const char* msg, size_t len)
+{
+ uhub_assert(buf->flags == 0);
+ if (buf->size + len >= buf->capacity)
+ cbuf_resize(buf, buf->size + len);
+
+ memcpy(buf->buf + buf->size, msg, len);
+ buf->size += len;
+ buf->buf[buf->size] = '\0';
+}
+
+void cbuf_append(struct cbuffer* buf, const char* msg)
+{
+ size_t len = strlen(msg);
+ uhub_assert(buf->flags == 0);
+ cbuf_append_bytes(buf, msg, len);
+}
+
+void cbuf_append_format(struct cbuffer* buf, const char* format, ...)
+{
+ static char tmp[1024];
+ va_list args;
+ int bytes;
+ uhub_assert(buf->flags == 0);
+ va_start(args, format);
+ bytes = vsnprintf(tmp, 1024, format, args);
+ va_end(args);
+ cbuf_append_bytes(buf, tmp, bytes);
+}
+
+void cbuf_append_strftime(struct cbuffer* buf, const char* format, const struct tm* tm)
+{
+ static char tmp[1024];
+ int bytes;
+ uhub_assert(buf->flags == 0);
+ bytes = strftime(tmp, sizeof(tmp), format, tm);
+ cbuf_append_bytes(buf, tmp, bytes);
+}
+
+const char* cbuf_get(struct cbuffer* buf)
+{
+ return buf->buf;
+}
+
+size_t cbuf_size(struct cbuffer* buf)
+{
+ return buf->size;
+}
\ No newline at end of file
diff --git a/src/util/cbuffer.h b/src/util/cbuffer.h
new file mode 100644
index 0000000..0c47c12
--- /dev/null
+++ b/src/util/cbuffer.h
@@ -0,0 +1,38 @@
+/*
+ * uhub - A tiny ADC p2p connection hub
+ * Copyright (C) 2007-2011, 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 .
+ *
+ */
+
+#ifndef HAVE_UTIL_CBUFFER_H
+#define HAVE_UTIL_CBUFFER_H
+
+struct cbuffer;
+
+extern struct cbuffer* cbuf_create(size_t capacity);
+extern struct cbuffer* cbuf_create_const(const char* buffer);
+extern void cbuf_destroy(struct cbuffer* buf);
+extern void cbuf_resize(struct cbuffer* buf, size_t capacity);
+extern void cbuf_append_bytes(struct cbuffer* buf, const char* msg, size_t len);
+extern void cbuf_append(struct cbuffer* buf, const char* msg);
+extern void cbuf_append_format(struct cbuffer* buf, const char* format, ...);
+extern void cbuf_append_strftime(struct cbuffer* buf, const char* format, const struct tm* tm);
+
+extern const char* cbuf_get(struct cbuffer* buf);
+extern size_t cbuf_size(struct cbuffer* buf);
+
+
+#endif /* HAVE_UTIL_CBUFFER_H */