[CFLAGS='-g -O0 -Wall -Wshadow -Werror'],
[CFLAGS='-g -O2'])
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+
# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h windows.h winsock2.h])
#ifdef HAVE_THREADS
static pthread_mutex_t synchronized;
+static pthread_mutex_t synchronized_recv;
#endif
//the magic list :P
void init_sockets() {
THREAD_MUTEX_INIT(synchronized);
+ THREAD_MUTEX_INIT(synchronized_recv);
sockets = malloc(sizeof(*sockets));
if (!sockets)
void socket_loop(int timeout_seconds) {
if(sockets == NULL) return;
int is_synchronized = 1;
- SYNCHRONIZE(synchronized);
+ SYNCHRONIZE(synchronized_recv);
fd_set fds;
struct timeval timeout;
struct ClientSocket *sock, *next;
timeout.tv_usec = 0;
ret = select(ret + 1, &fds, NULL, NULL, &timeout);
if(ret == 0) {
- DEDESYNCHRONIZE(synchronized);
+ DESYNCHRONIZE(synchronized_recv);
return;
}
for (sock = sockets->data; sock; sock = next) {
sock->flags |= SOCKET_FLAG_QUITTED;
} else {
sock->traffic_in += bytes;
+ #ifdef HAVE_THREADS
+ char linesbuf[BUF_SIZ*2];
+ strcpy(linesbuf, sock->buffer);
+ int used = 0;
+ for(i = 0; i < sock->bufferpos; i++) {
+ if(sock->buffer[i] == '\n') {
+ used = i+1;
+ }
+ }
+ if(used == sock->bufferpos + 1) {
+ //used all bytes so just reset the bufferpos
+ sock->bufferpos = 0;
+ } else {
+ for(i = 0; i < sock->bufferpos - used; i++) {
+ sock->buffer[i] = sock->buffer[i+used];
+ }
+ sock->bufferpos -= used;
+ }
is_synchronized = 0;
- DESYNCHRONIZE(synchronized);
+ DESYNCHRONIZE(synchronized_recv);
+ parse_lines(sock, linesbuf, used);
+ #else
int used = parse_lines(sock, sock->buffer, sock->bufferpos);
if(used == sock->bufferpos + 1) {
//used all bytes so just reset the bufferpos
}
sock->bufferpos -= used;
}
+ is_synchronized = 0;
+ DESYNCHRONIZE(synchronized_recv);
+ #endif
#ifdef HAVE_THREADS
FD_ZERO(&fds); //zero out all other pending sockets here (we have other threads receiving from them)
#endif
}
}
if(is_synchronized) {
- DESYNCHRONIZE(synchronized);
+ DESYNCHRONIZE(synchronized_recv);
}
}
}
}
printf_mysql_query("INSERT INTO `helpserv_requests` (`botid`, `host`, `hand`, `nick`, `status`, `supporter`, `time`, `text`) VALUES ('%d', '%s@%s', '%s', '%s', '0', '-1', UNIX_TIMESTAMP(), '%s')", client->clientid, escape_string(user->ident), escape_string(user->host), ((user->flags & USERFLAG_ISAUTHED) ? escape_string(user->auth) : "*"), escape_string(user->nick), escape_string(message));
- helpnode->suppid = (int) mysql_insert_id(mysql_conn);
+ helpnode->suppid = (int) mysql_insert_id(get_mysql_conn());
helpnode->log = NULL;
helpnode->next = ((client->flags & SOCKET_HAVE_HELPNODE) ? client->botclass_helpnode : NULL);
client->botclass_helpnode = helpnode;
{"NS_NETINFO_USER", " User:"},
{"NS_NETINFO_CHANUSER", " Channel-User:"},
{"NS_NETINFO_OTHER", " Other:"},
+ {"NS_NETINFO_THREADS", "Threads:"},
{"NS_NETINFO_VERSION", "Version:"},
{"NS_NETINFO_CODE", "Code:"},
{"NS_NETINFO_CODE_VALUE", "%s lines c code (view it at http://git.pk910.de/?p=NeonServV5.git;a=summary)"}, /* {ARGS: 20} */
return;
}
printf_mysql_query("INSERT INTO `bots` (`nick`, `botclass`) VALUES ('%s', '%d')", escape_string(argv[0]), botid);
- botid = (int) mysql_insert_id(mysql_conn);
+ botid = (int) mysql_insert_id(get_mysql_conn());
reply(getTextBot(), user, "NS_ADDBOT_DONE", argv[0], botid);
logEvent(event);
}
userid = atoi(row[0]);
} else {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
- userid = (int) mysql_insert_id(mysql_conn);
+ userid = (int) mysql_insert_id(get_mysql_conn());
}
}
if(client->botid)
printf_mysql_query("UPDATE `channels` SET `channel_registered` = UNIX_TIMESTAMP(), `channel_registrator` = '%d' WHERE `channel_id` = '%d'", adminid, chanid);
} else {
printf_mysql_query("INSERT INTO `channels` (`channel_name`, `channel_registered`, `channel_registrator`) VALUES ('%s', UNIX_TIMESTAMP(), '%d')", escape_string(channel), adminid);
- chanid = (int) mysql_insert_id(mysql_conn);
+ chanid = (int) mysql_insert_id(get_mysql_conn());
}
struct ClientSocket *bot;
for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
return;
//add the ban
printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(mask), (unsigned long) (time(0) + duration), userid, escape_string(reason));
- int banid = (int) mysql_insert_id(mysql_conn);
+ int banid = (int) mysql_insert_id(get_mysql_conn());
putsock(client, "MODE %s +b %s", chan->name, mask);
for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
cuser = chanuser->user;
}
} else {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
- userid = (int) mysql_insert_id(mysql_conn);
+ userid = (int) mysql_insert_id(get_mysql_conn());
}
printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chan->channel_id, userid, caccess);
reply(textclient, user, "NS_ADDUSER_DONE", nick, chan->name, caccess);
neonserv_cmd_chanservsync_synchronize_user(neonserv_cmd_chanservsync_used->client, neonserv_cmd_chanservsync_used->textclient, neonserv_cmd_chanservsync_used->user, neonserv_cmd_chanservsync_used->chan, username, userid, caccess, seen_time, flags, 0);
} else if(!stricmp(user->nick, "chanserv")) {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(username));
- userid = (int) mysql_insert_id(mysql_conn);
+ userid = (int) mysql_insert_id(get_mysql_conn());
neonserv_cmd_chanservsync_synchronize_user(neonserv_cmd_chanservsync_used->client, neonserv_cmd_chanservsync_used->textclient, neonserv_cmd_chanservsync_used->user, neonserv_cmd_chanservsync_used->chan, username, userid, caccess, seen_time, flags, 1);
} else {
//lookup auth
struct neonserv_cmd_chanservsync_auth_cache *cache = data;
if(exists) {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
- int userid = (int) mysql_insert_id(mysql_conn);
+ int userid = (int) mysql_insert_id(get_mysql_conn());
neonserv_cmd_chanservsync_synchronize_user(cache->client, cache->textclient, cache->user, cache->chan, auth, userid, cache->caccess, cache->seen, cache->flags, 1);
}
free(cache);
userid = atoi(row[0]);
} else {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth));
- userid = (int) mysql_insert_id(mysql_conn);
+ userid = (int) mysql_insert_id(get_mysql_conn());
}
//check if already added
printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_seen` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
userid = atoi(row[0]);
} else {
printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth));
- userid = (int) mysql_insert_id(mysql_conn);
+ userid = (int) mysql_insert_id(get_mysql_conn());
}
printf_mysql_query("INSERT INTO `noinvite` (`uid`, `cid`) VALUES ('%d', '%d')", userid, chan->channel_id);
noinvite = 1;
duration = 3600;
banmask = generate_banmask(user, banmaskBuf);
printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(banmask), (unsigned long) (time(0) + duration), 0, escape_string(reason));
- int banid = (int) mysql_insert_id(mysql_conn);
+ int banid = (int) mysql_insert_id(get_mysql_conn());
char nameBuf[MAXLEN];
char banidBuf[20];
sprintf(nameBuf, "ban_%d", banid);
duration = 3600;
banmask = generate_banmask(user, banmaskBuf);
printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(banmask), (unsigned long) (time(0) + duration), 0, escape_string(reason));
- int banid = (int) mysql_insert_id(mysql_conn);
+ int banid = (int) mysql_insert_id(get_mysql_conn());
char nameBuf[MAXLEN];
char banidBuf[20];
sprintf(nameBuf, "ban_%d", banid);
banmask = generate_banmask(chanuser->user, banmaskBuf);
printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chanuser->chan->channel_id, escape_string(banmask), (unsigned long) (punish_time ? (time(0) + punish_time) : 0), 0, escape_string(reason));
if(punish_time) {
- int banid = (int) mysql_insert_id(mysql_conn);
+ int banid = (int) mysql_insert_id(get_mysql_conn());
char nameBuf[MAXLEN];
char banidBuf[20];
sprintf(nameBuf, "ban_%d", banid);
banmask = generate_banmask(chanuser->user, banmaskBuf);
printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chanuser->chan->channel_id, escape_string(banmask), (unsigned long) (duration ? (time(0) + duration) : 0), 0, escape_string(reason));
if(duration) {
- int banid = (int) mysql_insert_id(mysql_conn);
+ int banid = (int) mysql_insert_id(get_mysql_conn());
char nameBuf[MAXLEN];
char banidBuf[20];
sprintf(nameBuf, "ban_%d", banid);
statistics_enabled = get_int_field("statistics.enable");
queue_init();
+ init_sockets();
init_timeq();
init_lang();
ssl_init();
#define NEONSERV_VERSION "5.3"
#define VERSION_PATCHLEVEL 543
+#include <features.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define THREAD_MUTEX_INIT(var) { \
pthread_mutexattr_t mutex_attr; \
pthread_mutexattr_init(&mutex_attr);\
- pthread_mutexattr_setkind_np(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\
- pthread_mutex_init(&var, mutex_attr); \
+ pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\
+ pthread_mutex_init(&var, &mutex_attr); \
}
#define SYNCHRONIZE(var) pthread_mutex_lock(&var)
#define DESYNCHRONIZE(var) pthread_mutex_unlock(&var)
struct mysql_conn_struct {
unsigned long tid;
- MYSQL *mysql_conn = NULL;
+ MYSQL *mysql_conn;
struct used_result *used_results;
struct escaped_string *escaped_strings;
struct mysql_conn_struct *next;
return mysql_conn;
}
}
- mysql_conn = malloc(*mysql_conn);
+ mysql_conn = malloc(sizeof(*mysql_conn));
mysql_conn->mysql_conn = mysql_init(NULL);
mysql_conn->tid = tid;
mysql_conn->used_results = NULL;