]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - dccp_send.c
log the IP address of the connecting client.
[paraslash.git] / dccp_send.c
index ace92dee9f13ae2037e34279751494bf4245a00e..57e2a70ccb30b0cef8550fd288991ef005d30b1e 100644 (file)
@@ -1,3 +1,26 @@
+/*
+ * Copyright (C) 2006 Andre Noll <maan@systemlinux.org>
+ *
+ *     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 2 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, write to the Free Software
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ */
+
+/*
+ * based on server.c of dccp-cs-0.01.tar.bz2,
+ * (C) 2005 Ian McDonald <imcdnzl@gmail.com>
+ */
+
 #include "server.h"
 #include "net.h"
 #include "list.h"
@@ -41,14 +64,13 @@ static void dccp_post_select(__unused struct audio_format *af, fd_set *rfds,
 
        if (!FD_ISSET(listen_fd, rfds))
                return;
-       PARA_NOTICE_LOG("%s", "accepting...\n");
        dc = para_calloc(sizeof(struct dccp_client));
        ret = para_accept(listen_fd, &dc->addr, sizeof(struct sockaddr_in));
        if (ret < 0) {
                PARA_ERROR_LOG("%s", PARA_STRERROR(-ret));
                return;
        }
-       PARA_NOTICE_LOG("%s", "connection\n");
+       PARA_NOTICE_LOG("connection from %s\n", inet_ntoa(dc->addr.sin_addr));
        dc->fd = ret;
        list_add(&dc->node, &clients);
 }
@@ -99,7 +121,12 @@ static void dccp_send(__unused struct audio_format *af,
                return;
 
        list_for_each_entry_safe(dc, tmp, &clients, node) {
-               if (!_write_ok(dc->fd))
+               ret = write_ok(dc->fd);
+               if (ret < 0) {
+                       dccp_shutdown_client(dc);
+                       continue;
+               }
+               if (!ret)
                        continue;
                if (!dc->header_sent && af->get_header_info && current_chunk) {
                        header_buf = af->get_header_info(&header_len);
@@ -107,13 +134,22 @@ static void dccp_send(__unused struct audio_format *af,
                                continue; /* header not yet available */
                        ret = write(dc->fd, header_buf, header_len);
                        if (ret != header_len) {
+                               int err = errno;
+                               PARA_ERROR_LOG("header write: %d/%d (%s)\n",
+                                       ret, header_len, ret < 0?
+                                       strerror(err) : "");
+                               dccp_shutdown_client(dc);
+                               continue;
+                       }
+                       ret = write_ok(dc->fd);
+                       if (ret < 0) {
                                dccp_shutdown_client(dc);
                                continue;
                        }
-                       if (!_write_ok(dc->fd))
+                       if (!ret)
                                continue;
                }
-               PARA_DEBUG_LOG("writing %d bytes to fd %d\n", len, dc->fd);
+//             PARA_DEBUG_LOG("writing %d bytes to fd %d\n", len, dc->fd);
                ret = write(dc->fd, buf, len);
                if (ret != len)
                        dccp_shutdown_client(dc);
@@ -137,7 +173,7 @@ static char *dccp_info(void)
        free(buf);
        list_for_each_entry_safe(dc, tmp, &clients, node)
                num_clients++;
-       buf = make_message("%d connected clients\n", num_clients);
+       buf = make_message("dccp connected clients: %d\n", num_clients);
        return buf;
 }