From: Nick Mathewson Date: Mon, 16 May 2011 15:10:17 +0000 (-0400) Subject: Merge remote-tracking branch 'public/bug2850' into maint-0.2.2 X-Git-Tag: tor-0.2.3.2-alpha~114^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=919bf6ff3cfb1387f3f9ecf9ce97d8e95e330a05;p=thirdparty%2Ftor.git Merge remote-tracking branch 'public/bug2850' into maint-0.2.2 Fixed a trivial conflict where this and the ControlSocketGroupWritable code both added different functions to the same part of connection.c. Conflicts: src/or/connection.c --- 919bf6ff3cfb1387f3f9ecf9ce97d8e95e330a05 diff --cc src/or/connection.c index b7d6fe408d,e90e13ffa0..5054909df9 --- a/src/or/connection.c +++ b/src/or/connection.c @@@ -853,43 -851,25 +853,62 @@@ warn_too_many_conns(void } } +#ifdef HAVE_SYS_UN_H +/** Check whether we should be willing to open an AF_UNIX socket in + * path. Return 0 if we should go ahead and -1 if we shouldn't. */ +static int +check_location_for_unix_socket(or_options_t *options, const char *path) +{ + int r = -1; + char *p = tor_strdup(path); + cpd_check_t flags = CPD_CHECK_MODE_ONLY; + if (get_parent_directory(p)<0) + goto done; + + if (options->ControlSocketsGroupWritable) + flags |= CPD_GROUP_OK; + + if (check_private_dir(p, flags) < 0) { + char *escpath, *escdir; + escpath = esc_for_log(path); + escdir = esc_for_log(p); + log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the " + "directory %s needs to exist, and to be accessible only by the " + "user%s account that is running Tor. (On some Unix systems, " + "anybody who can list a socket can conect to it, so Tor is " + "being careful.)", escpath, escdir, + options->ControlSocketsGroupWritable ? " and group" : ""); + tor_free(escpath); + tor_free(escdir); + goto done; + } + + r = 0; + done: + tor_free(p); + return r; +} +#endif + + /** Tell the TCP stack that it shouldn't wait for a long time after + * sock has closed before reusing its port. */ + static void + make_socket_reuseable(int sock) + { + #ifdef MS_WINDOWS + (void) sock; + #else + int one=1; + + /* REUSEADDR on normal places means you can rebind to the port + * right after somebody else has let it go. But REUSEADDR on win32 + * means you can bind to the port _even when somebody else + * already has it bound_. So, don't do that on Win32. */ + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one, + (socklen_t)sizeof(one)); + #endif + } + /** Bind a new non-blocking socket listening to the socket described * by listensockaddr. * @@@ -912,11 -891,7 +931,8 @@@ connection_create_listener(const struc } if (listensockaddr->sa_family == AF_INET) { + tor_addr_t addr; int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER); - #ifndef MS_WINDOWS - int one=1; - #endif if (is_tcp) start_reading = 1;