- timeout.tv_sec = timeout_seconds;
- timeout.tv_usec = 0;
- ret = select(ret + 1, &fds, NULL, NULL, &timeout);
- if(ret == 0) return;
- for (sock = sockets->data; sock; sock = sock->next) {
- if((sock->flags & SOCKET_FLAG_CONNECTED) && FD_ISSET(sock->sock, &fds)) {
- if(sock->bufferpos != 0) {
- #ifdef WIN32
- bytes = recv(sock->sock, buffer, sizeof(buffer), 0);
- #else
- bytes = read(sock->sock, buffer, sizeof(buffer));
- #endif
- if(bytes > 0) {
- for(i = 0; i < bytes; i++) {
- if(sock->bufferpos + i == BUF_SIZ*2) break; //buffer overflow
- sock->buffer[sock->bufferpos + i] = buffer[i];
- }
- sock->bufferpos += i;
- }
- } else {
- #ifdef WIN32
- bytes = recv(sock->sock, sock->buffer, sizeof(sock->buffer), 0);
- #else
- bytes = read(sock->sock, sock->buffer, sizeof(sock->buffer));
- #endif
- if(bytes > 0)
- sock->bufferpos = bytes;
- }
- if(bytes <= 0) {
- //error
- sock->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY);
- bot_disconnect(sock);
- if(sock->queue)
- queue_destroy(sock);
- } else {
- sock->traffic_in += bytes;
- int used = parse_lines(sock, sock->buffer, sock->bufferpos);
- 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;
- }
- }
- } else if(!(sock->flags & SOCKET_FLAG_CONNECTED) && (sock->flags & SOCKET_FLAG_RECONNECT)) {
- if(time(0) - sock->connection_time >= SOCKET_RECONNECT_TIME) {
- connect_socket(sock);
- }
+ entry = malloc(sizeof(*entry));
+ entry->tid = tid;
+ entry->next = NULL;
+ if(last)
+ last->next = entry;
+ else
+ parse_order = entry;
+ DESYNCHRONIZE(whohandler_sync);
+}
+
+static void clientsocket_end_of_recv(unsigned int tid) {
+ SYNCHRONIZE(whohandler_sync);
+ struct ParseOrder *entry, *last = NULL;
+ for(entry = parse_order; entry; entry = entry->next) {
+ if(entry->tid == tid) {
+ if(last)
+ last->next = entry->next;
+ else
+ parse_order = entry->next;
+ free(entry);
+ break;
+ } else
+ last = entry;
+ }
+ DESYNCHRONIZE(whohandler_sync);
+}
+
+int clientsocket_parseorder_top(unsigned int tid) {
+ if(parse_order && parse_order->tid == tid)
+ return 1;
+ else
+ return 0;
+}
+#endif
+
+static IOHANDLER_CALLBACK(socket_callback) {
+ struct ClientSocket *client = event->iofd->data;
+ #ifdef HAVE_THREADS
+ unsigned int tid;
+ #endif
+ switch(event->type) {
+ case IOEVENT_CONNECTED:
+ client->flags |= SOCKET_FLAG_CONNECTED;
+ if(client->pass && strcmp(client->pass, ""))
+ putsock(client, "PASS :%s", client->pass);
+ putsock(client, "USER %s 0 0 :%s", client->ident, client->realname);
+ putsock(client, "NICK %s", client->nick);
+ break;
+ case IOEVENT_NOTCONNECTED:
+ case IOEVENT_CLOSED:
+ close_socket(client);
+ if(client->flags & SOCKET_FLAG_RECONNECT) {
+ struct timeval timeout;
+ gettimeofday(&timeout, NULL);
+ timeout.tv_sec += SOCKET_RECONNECT_TIME;
+ client->iofd = iohandler_timer(timeout, socket_callback);
+ client->iofd->data = client;