[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    icecream
From:       Stephan Kulow <coolo () kde ! org>
Date:       2012-06-01 11:58:44
Message-ID: 20120601115844.0D42CAC76E () svn ! kde ! org
[Download RAW message or body]

SVN commit 1297686 by coolo:

- let the daemon create a UNIX domain socket and listen to it
  additionally to the TCP socket
- let the client try the UNIX domain socket first before trying TCP


 M  +11 -1     client/main.cpp  
 M  +1 -1      configure.in  
 M  +93 -51    daemon/main.cpp  
 M  +27 -1     services/comm.cpp  
 M  +1 -0      services/comm.h  


--- trunk/icecream/client/main.cpp #1297685:1297686
@@ -269,8 +269,18 @@
     if ( icecc && !strcasecmp(icecc, "no") )
         return build_local( job, 0 );
 
-    MsgChannel *local_daemon = Service::createChannel( "127.0.0.1", 10245, 0/*timeout*/);
+    /* try several options to reach the local daemon - 2 sockets, one TCP */
+    MsgChannel *local_daemon = Service::createChannel( "/var/run/iceccd.socket" );
     if ( ! local_daemon ) {
+        string path = getenv("HOME");
+        path += "/.iceccd.socket";
+        local_daemon = Service::createChannel( path );
+    }
+
+    if (!local_daemon)
+        local_daemon = Service::createChannel( "127.0.0.1", 10245, 0/*timeout*/);
+
+    if ( ! local_daemon ) {
         log_warning() << "no local daemon found\n";
         return build_local( job, 0 );
     }
--- trunk/icecream/configure.in #1297685:1297686
@@ -13,7 +13,7 @@
 AC_PROG_CXX
 if test "$GCC" = yes 
 then
-    CFLAGS="-g -W -Wall -Wimplicit \
+    CFLAGS="-g -W -Wall \
 -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings \
 -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes \
 -Wnested-externs $CFLAGS"
--- trunk/icecream/daemon/main.cpp #1297685:1297686
@@ -1,4 +1,4 @@
-/*
+/* -*- c-file-style: "java"; indent-tabs-mode: nil -*-
     This file is part of Icecream.
 
     Copyright (c) 2004 Stephan Kulow <coolo@suse.de>
@@ -367,49 +367,6 @@
   exit(1);
 }
 
-int setup_listen_fd()
-{
-    int listen_fd;
-    if ((listen_fd = socket (PF_INET, SOCK_STREAM, 0)) < 0) {
-        log_perror ("socket()");
-        return -1;
-    }
-
-    int optval = 1;
-    if (setsockopt (listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
-        log_perror ("setsockopt()");
-        return -1;
-    }
-
-    int count = 5;
-    while ( count ) {
-        struct sockaddr_in myaddr;
-        myaddr.sin_family = AF_INET;
-        myaddr.sin_port = htons (PORT);
-        myaddr.sin_addr.s_addr = INADDR_ANY;
-        if (bind (listen_fd, (struct sockaddr *) &myaddr,
-                  sizeof (myaddr)) < 0) {
-            log_perror ("bind()");
-            sleep( 2 );
-            if ( !--count )
-                return -1;
-            continue;
-        } else
-            break;
-    }
-
-    if (listen (listen_fd, 20) < 0)
-    {
-      log_perror ("listen()");
-      return -1;
-    }
-
-    fcntl(listen_fd, F_SETFD, FD_CLOEXEC);
-
-    return listen_fd;
-}
-
-
 struct timeval last_stat;
 int mem_limit = 100;
 unsigned int max_kids = 0;
@@ -424,7 +381,8 @@
     string envbasedir;
     uid_t nobody_uid;
     gid_t nobody_gid;
-    int listen_fd;
+    int tcp_listen_fd;
+    int unix_listen_fd;
     string machine_name;
     string nodename;
     bool noremote;
@@ -452,7 +410,8 @@
         envbasedir = "/tmp/icecc-envs";
         nobody_uid = 65534;
         nobody_gid = 65533;
-        listen_fd = -1;
+        tcp_listen_fd = -1;
+	unix_listen_fd = -1;
         new_client_id = 0;
         next_scheduler_connect = 0;
         cache_size = 0;
@@ -496,8 +455,79 @@
     void close_scheduler();
     bool reconnect();
     int working_loop();
+    bool setup_listen_fds();
 };
 
+bool Daemon::setup_listen_fds()
+{
+    tcp_listen_fd = -1;
+    if (!noremote) { // if we only listen to local clients, there is no point in going TCP
+	if ((tcp_listen_fd = socket (PF_INET, SOCK_STREAM, 0)) < 0) {
+            log_perror ("socket()");
+            return false;
+        }
+
+        int optval = 1;
+        if (setsockopt (tcp_listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
+            log_perror ("setsockopt()");
+            return false;
+        }
+        
+        int count = 5;
+        while ( count ) {
+            struct sockaddr_in myaddr;
+            myaddr.sin_family = AF_INET;
+            myaddr.sin_port = htons (PORT);
+            myaddr.sin_addr.s_addr = INADDR_ANY;
+            if (bind (tcp_listen_fd, (struct sockaddr *) &myaddr,
+                      sizeof (myaddr)) < 0) {
+                log_perror ("bind()");
+                sleep( 2 );
+                if ( !--count )
+                    return false;
+                continue;
+            } else
+                break;
+        }
+        
+        if (listen (tcp_listen_fd, 20) < 0) {
+            log_perror ("listen()");
+            return false;
+        }
+        
+        fcntl(tcp_listen_fd, F_SETFD, FD_CLOEXEC);
+    }
+    
+    if ((unix_listen_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+        log_perror ("socket()");
+        return false;
+    }
+    struct sockaddr_un myaddr;
+    memset(&myaddr, 0, sizeof(myaddr));
+    myaddr.sun_family = AF_UNIX;
+    if (getuid()==0) {
+        strncpy(myaddr.sun_path, "/var/run/iceccd.socket", sizeof(myaddr.sun_path)-1);
+    } else {
+        strncpy(myaddr.sun_path, getenv("HOME"), sizeof(myaddr.sun_path)-1);
+        strncat(myaddr.sun_path, "/.iceccd.socket", sizeof(myaddr.sun_path)-1-strlen(myaddr.sun_path));
+        unlink(myaddr.sun_path);
+    }
+
+    if (bind(unix_listen_fd, (struct sockaddr*)&myaddr, sizeof(myaddr)) < 0) {
+        log_perror("bind()");
+        return false;
+    }
+
+    if (listen (unix_listen_fd, 20) < 0) {
+        log_perror ("listen()");
+        return false;
+    }
+    
+    fcntl(unix_listen_fd, F_SETFD, FD_CLOEXEC);
+    
+    return true;
+}
+
 void Daemon::determine_system()
 {
     struct utsname uname_buf;
@@ -1250,8 +1280,14 @@
     struct timeval tv;
 
     FD_ZERO( &listen_set );
-    FD_SET( listen_fd, &listen_set );
-    int max_fd = listen_fd;
+    int max_fd = 0;
+    if (tcp_listen_fd != -1) {
+      FD_SET( tcp_listen_fd, &listen_set );
+      max_fd = tcp_listen_fd;
+    }
+    FD_SET( unix_listen_fd, &listen_set );
+    if (unix_listen_fd > max_fd) // very likely
+      max_fd = unix_listen_fd;
 
     for (map<int, MsgChannel *>::const_iterator it = fd2chan.begin();
          it != fd2chan.end();) {
@@ -1339,7 +1375,13 @@
             }
         }
 
-        if ( FD_ISSET( listen_fd, &listen_set ) ) {
+	int listen_fd = -1;
+	if ( tcp_listen_fd != -1 && FD_ISSET( tcp_listen_fd, &listen_set ) )
+	  listen_fd = tcp_listen_fd;
+	if ( FD_ISSET( unix_listen_fd, &listen_set ) )
+	  listen_fd = unix_listen_fd;
+
+        if ( listen_fd != -1) {
             struct sockaddr cli_addr;
             socklen_t cli_len = sizeof cli_addr;
             int acc_fd = accept(listen_fd, &cli_addr, &cli_len);
@@ -1673,9 +1715,9 @@
     for (list<string>::const_iterator it = nl.begin(); it != nl.end(); ++it)
         trace() << *it << endl;
 
-    d.listen_fd = setup_listen_fd();
-    if ( d.listen_fd == -1 ) // error
+    if ( !d.setup_listen_fds() ) // error
         return 1;
 
     return d.working_loop();
 }
+
--- trunk/icecream/services/comm.cpp #1297685:1297686
@@ -26,6 +26,7 @@
 #include <sys/types.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 #include <arpa/inet.h>
 #include <sys/select.h>
 #include <netinet/in.h>
@@ -656,13 +657,38 @@
       if (connect (remote_fd, (struct sockaddr *) &remote_addr, sizeof (remote_addr)) < 0)
         {
           close( remote_fd );
-	  trace() << "connect failed\n";
+	  trace() << "connect failed on " << hostname << endl;
           return 0;
         }
     }
+  trace() << "connected to " << hostname << endl;
   return createChannel(remote_fd, (struct sockaddr *)&remote_addr, sizeof( remote_addr ));
 }
 
+MsgChannel *Service::createChannel (const string &socket_path)
+{
+  int remote_fd;
+  struct sockaddr_un remote_addr;
+
+  if ((remote_fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
+    {
+      log_perror("socket()");
+      return 0;
+    }
+
+  remote_addr.sun_family = AF_UNIX;
+  strncpy(remote_addr.sun_path, socket_path.c_str(), sizeof(remote_addr.sun_path) - 1);
+
+  if (connect (remote_fd, (struct sockaddr *) &remote_addr, sizeof (remote_addr)) < 0)
+    {
+      close( remote_fd );
+      trace() << "connect failed on " << socket_path << endl; 
+      return 0;
+    }
+  trace() << "connected to " << socket_path << endl;
+  return createChannel(remote_fd, (struct sockaddr *)&remote_addr, sizeof( remote_addr ));
+}
+
 static std::string
 shorten_filename(const std::string& str)
 {
--- trunk/icecream/services/comm.h #1297685:1297686
@@ -212,6 +212,7 @@
 class Service {
 public:
   static MsgChannel *createChannel( const std::string &host, unsigned short p, int timeout);
+  static MsgChannel *createChannel( const std::string &domain_socket );
   static MsgChannel *createChannel( int remote_fd, struct sockaddr *, socklen_t );
 };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic