[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] add DirBindAddress, parse the BindAddress"s when you bind
- To: or-cvs@freehaven.net
- Subject: [or-cvs] add DirBindAddress, parse the BindAddress"s when you bind
- From: arma@seul.org (Roger Dingledine)
- Date: Sat, 25 Oct 2003 08:01:11 -0400 (EDT)
- Delivered-to: archiver@seul.org
- Delivered-to: or-cvs-outgoing@seul.org
- Delivered-to: or-cvs@seul.org
- Delivery-date: Sat, 25 Oct 2003 08:01:25 -0400
- Reply-to: or-dev@freehaven.net
- Sender: owner-or-cvs@freehaven.net
Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/home2/arma/work/onion/cvs/src/or
Modified Files:
config.c connection.c main.c or.h
Log Message:
add DirBindAddress, parse the BindAddress's when you bind
exit if bind fails
add usage printfs
rearrange config options for readability
Index: config.c
===================================================================
RCS file: /home/or/cvsroot/src/or/config.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- config.c 22 Oct 2003 07:55:44 -0000 1.63
+++ config.c 25 Oct 2003 12:01:09 -0000 1.64
@@ -151,41 +151,51 @@
/* order matters here! abbreviated arguments use the first match. */
/* string options */
- config_compare(list, "LogLevel", CONFIG_TYPE_STRING, &options->LogLevel) ||
- config_compare(list, "LogFile", CONFIG_TYPE_STRING, &options->LogFile) ||
+ config_compare(list, "Address", CONFIG_TYPE_STRING, &options->Address) ||
+
+ config_compare(list, "CoinWeight", CONFIG_TYPE_DOUBLE, &options->CoinWeight) ||
+
config_compare(list, "DebugLogFile", CONFIG_TYPE_STRING, &options->DebugLogFile) ||
config_compare(list, "DataDirectory", CONFIG_TYPE_STRING, &options->DataDirectory) ||
- config_compare(list, "RouterFile", CONFIG_TYPE_STRING, &options->RouterFile) ||
- config_compare(list, "PidFile", CONFIG_TYPE_STRING, &options->PidFile) ||
- config_compare(list, "Nickname", CONFIG_TYPE_STRING, &options->Nickname) ||
- config_compare(list, "Address", CONFIG_TYPE_STRING, &options->Address) ||
+ config_compare(list, "DirPort", CONFIG_TYPE_INT, &options->DirPort) ||
+ config_compare(list, "DirBindAddress", CONFIG_TYPE_STRING, &options->DirBindAddress) ||
+ config_compare(list, "DirFetchPostPeriod",CONFIG_TYPE_INT, &options->DirFetchPostPeriod) ||
+
config_compare(list, "ExitPolicy", CONFIG_TYPE_STRING, &options->ExitPolicy) ||
- config_compare(list, "SocksBindAddress",CONFIG_TYPE_STRING,&options->SocksBindAddress) ||
- config_compare(list, "ORBindAddress", CONFIG_TYPE_STRING, &options->ORBindAddress) ||
- config_compare(list, "User", CONFIG_TYPE_STRING, &options->User) ||
+
config_compare(list, "Group", CONFIG_TYPE_STRING, &options->Group) ||
- /* int options */
- config_compare(list, "MaxConn", CONFIG_TYPE_INT, &options->MaxConn) ||
- config_compare(list, "SocksPort", CONFIG_TYPE_INT, &options->SocksPort) ||
- config_compare(list, "ORPort", CONFIG_TYPE_INT, &options->ORPort) ||
- config_compare(list, "DirPort", CONFIG_TYPE_INT, &options->DirPort) ||
- config_compare(list, "DirFetchPostPeriod",CONFIG_TYPE_INT, &options->DirFetchPostPeriod) ||
- config_compare(list, "KeepalivePeriod", CONFIG_TYPE_INT, &options->KeepalivePeriod) ||
+ config_compare(list, "IgnoreVersion", CONFIG_TYPE_BOOL, &options->IgnoreVersion) ||
+
+ config_compare(list, "KeepalivePeriod",CONFIG_TYPE_INT, &options->KeepalivePeriod) ||
+
+ config_compare(list, "LogLevel", CONFIG_TYPE_STRING, &options->LogLevel) ||
+ config_compare(list, "LogFile", CONFIG_TYPE_STRING, &options->LogFile) ||
+ config_compare(list, "LinkPadding", CONFIG_TYPE_BOOL, &options->LinkPadding) ||
+
+ config_compare(list, "MaxConn", CONFIG_TYPE_INT, &options->MaxConn) ||
config_compare(list, "MaxOnionsPending",CONFIG_TYPE_INT, &options->MaxOnionsPending) ||
+
+ config_compare(list, "Nickname", CONFIG_TYPE_STRING, &options->Nickname) ||
config_compare(list, "NewCircuitPeriod",CONFIG_TYPE_INT, &options->NewCircuitPeriod) ||
- config_compare(list, "TotalBandwidth", CONFIG_TYPE_INT, &options->TotalBandwidth) ||
- config_compare(list, "NumCpus", CONFIG_TYPE_INT, &options->NumCpus) ||
+ config_compare(list, "NumCpus", CONFIG_TYPE_INT, &options->NumCpus) ||
- config_compare(list, "OnionRouter", CONFIG_TYPE_BOOL, &options->OnionRouter) ||
- config_compare(list, "TrafficShaping", CONFIG_TYPE_BOOL, &options->TrafficShaping) ||
- config_compare(list, "LinkPadding", CONFIG_TYPE_BOOL, &options->LinkPadding) ||
- config_compare(list, "IgnoreVersion", CONFIG_TYPE_BOOL, &options->IgnoreVersion) ||
- config_compare(list, "RunAsDaemon", CONFIG_TYPE_BOOL, &options->RunAsDaemon) ||
+ config_compare(list, "ORPort", CONFIG_TYPE_INT, &options->ORPort) ||
+ config_compare(list, "ORBindAddress", CONFIG_TYPE_STRING, &options->ORBindAddress) ||
+ config_compare(list, "OnionRouter", CONFIG_TYPE_BOOL, &options->OnionRouter) ||
- /* float options */
- config_compare(list, "CoinWeight", CONFIG_TYPE_DOUBLE, &options->CoinWeight)
+ config_compare(list, "PidFile", CONFIG_TYPE_STRING, &options->PidFile) ||
+
+ config_compare(list, "RouterFile", CONFIG_TYPE_STRING, &options->RouterFile) ||
+ config_compare(list, "RunAsDaemon", CONFIG_TYPE_BOOL, &options->RunAsDaemon) ||
+
+ config_compare(list, "SocksPort", CONFIG_TYPE_INT, &options->SocksPort) ||
+ config_compare(list, "SocksBindAddress",CONFIG_TYPE_STRING,&options->SocksBindAddress) ||
+
+ config_compare(list, "TotalBandwidth", CONFIG_TYPE_INT, &options->TotalBandwidth) ||
+ config_compare(list, "TrafficShaping", CONFIG_TYPE_BOOL, &options->TrafficShaping) ||
+ config_compare(list, "User", CONFIG_TYPE_STRING, &options->User)
) {
/* then we're ok. it matched something. */
} else {
@@ -196,8 +206,22 @@
}
}
+/* prints the usage of tor. */
void print_usage(void) {
-
+ printf("tor -f <torrc> [args]\n"
+ "-d <file>\t\tDebug file\n"
+ "-e <policy>\t\tExit policy\n"
+ "-l <level>\t\tLog level\n"
+ "-m <max>\t\tMax number of connections\n"
+ "-s <IP>\t\t\tAddress to bind to for Socks\n"
+ );
+ /* split things up to be ANSI compliant */
+ printf("-n <nick>\t\tNickname of router\n"
+ "-o <port>\t\tOR port to bind to\n"
+ "-p <file>\t\tPID file\n"
+ "-r <file>\t\tRouter config file\n"
+ "-t <bandwidth>\t\tTotal bandwidth\n"
+ );
}
void free_options(or_options_t *options) {
@@ -212,6 +236,7 @@
tor_free(options->ExitPolicy);
tor_free(options->SocksBindAddress);
tor_free(options->ORBindAddress);
+ tor_free(options->DirBindAddress);
tor_free(options->User);
tor_free(options->Group);
}
@@ -223,6 +248,7 @@
options->ExitPolicy = tor_strdup("reject 127.0.0.1:*");
options->SocksBindAddress = tor_strdup("127.0.0.1");
options->ORBindAddress = tor_strdup("0.0.0.0");
+ options->DirBindAddress = tor_strdup("0.0.0.0");
options->loglevel = LOG_INFO;
options->PidFile = tor_strdup("tor.pid");
options->DataDirectory = NULL;
Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -u -d -r1.125 -r1.126
--- connection.c 22 Oct 2003 07:55:44 -0000 1.125
+++ connection.c 25 Oct 2003 12:01:09 -0000 1.126
@@ -123,28 +123,40 @@
free(conn);
}
-int connection_create_listener(struct sockaddr_in *bindaddr, int type) {
+int connection_create_listener(char *bindaddress, uint16_t bindport, int type) {
+ struct sockaddr_in bindaddr; /* where to bind */
+ struct hostent *rent;
connection_t *conn;
- int s;
+ int s; /* the socket we're going to make */
int one=1;
+ memset(&bindaddr,0,sizeof(struct sockaddr_in));
+ bindaddr.sin_family = AF_INET;
+ bindaddr.sin_port = htons(bindport);
+ rent = gethostbyname(bindaddress);
+ if (!rent) {
+ log_fn(LOG_WARN,"Can't resolve BindAddress %s",bindaddress);
+ return -1;
+ }
+ if(rent->h_length != 4)
+ return -1; /* XXX complain */
+ memcpy(&(bindaddr.sin_addr.s_addr),rent->h_addr,rent->h_length);
+
s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if (s < 0) {
log_fn(LOG_WARN,"Socket creation failed.");
return -1;
}
- setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*)&one, sizeof(one));
+ setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
- if(bind(s,(struct sockaddr *)bindaddr,sizeof(*bindaddr)) < 0) {
- log(LOG_WARN,"Could not bind to port %u: %s",ntohs(bindaddr->sin_port),
- strerror(errno));
+ if(bind(s,(struct sockaddr *)&bindaddr,sizeof(bindaddr)) < 0) {
+ log_fn(LOG_WARN,"Could not bind to port %u: %s",bindport,strerror(errno));
return -1;
}
if(listen(s,SOMAXCONN) < 0) {
- log(LOG_WARN,"Could not listen on port %u: %s",ntohs(bindaddr->sin_port),
- strerror(errno));
+ log_fn(LOG_WARN,"Could not listen on port %u: %s",bindport,strerror(errno));
return -1;
}
@@ -159,7 +171,7 @@
return -1;
}
- log_fn(LOG_DEBUG,"%s listening on port %u.",conn_type_to_string[type], ntohs(bindaddr->sin_port));
+ log_fn(LOG_DEBUG,"%s listening on port %u.",conn_type_to_string[type], bindport);
conn->state = LISTENER_STATE_READY;
connection_start_reading(conn);
@@ -275,37 +287,28 @@
}
/* start all connections that should be up but aren't */
-int retry_all_connections(uint16_t or_listenport, uint16_t ap_listenport, uint16_t dir_listenport) {
- struct sockaddr_in bindaddr; /* where to bind */
+int retry_all_connections(void) {
- if(or_listenport) {
+ if(options.ORPort) {
router_retry_connections();
}
- memset(&bindaddr,0,sizeof(struct sockaddr_in));
- bindaddr.sin_family = AF_INET;
- bindaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* anyone can connect */
-
- if(or_listenport) {
- bindaddr.sin_port = htons(or_listenport);
- if(!connection_get_by_type(CONN_TYPE_OR_LISTENER)) {
- connection_create_listener(&bindaddr, CONN_TYPE_OR_LISTENER);
- }
+ if(options.ORPort && !connection_get_by_type(CONN_TYPE_OR_LISTENER)) {
+ if(connection_create_listener(options.ORBindAddress, options.ORPort,
+ CONN_TYPE_OR_LISTENER) < 0)
+ return -1;
}
- if(dir_listenport) {
- bindaddr.sin_port = htons(dir_listenport);
- if(!connection_get_by_type(CONN_TYPE_DIR_LISTENER)) {
- connection_create_listener(&bindaddr, CONN_TYPE_DIR_LISTENER);
- }
+ if(options.DirPort && !connection_get_by_type(CONN_TYPE_DIR_LISTENER)) {
+ if(connection_create_listener(options.DirBindAddress, options.DirPort,
+ CONN_TYPE_DIR_LISTENER) < 0)
+ return -1;
}
- if(ap_listenport) {
- bindaddr.sin_port = htons(ap_listenport);
- bindaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); /* the AP listens only on localhost! */
- if(!connection_get_by_type(CONN_TYPE_AP_LISTENER)) {
- connection_create_listener(&bindaddr, CONN_TYPE_AP_LISTENER);
- }
+ if(options.SocksPort && !connection_get_by_type(CONN_TYPE_AP_LISTENER)) {
+ if(connection_create_listener(options.SocksBindAddress, options.SocksPort,
+ CONN_TYPE_AP_LISTENER) < 0)
+ return -1;
}
return 0;
Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -d -r1.141 -r1.142
--- main.c 22 Oct 2003 11:21:29 -0000 1.141
+++ main.c 25 Oct 2003 12:01:09 -0000 1.142
@@ -594,9 +594,10 @@
* non-zero. This is where we try to connect to all the other ORs,
* and start the listeners.
*/
- retry_all_connections((uint16_t) options.ORPort,
- (uint16_t) options.SocksPort,
- (uint16_t) options.DirPort);
+ if(retry_all_connections() < 0) {
+ log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
+ return -1;
+ }
for(;;) {
#ifndef MS_WINDOWS /* do signal stuff only on unix */
Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.173
retrieving revision 1.174
diff -u -d -r1.173 -r1.174
--- or.h 22 Oct 2003 09:08:10 -0000 1.173
+++ or.h 25 Oct 2003 12:01:09 -0000 1.174
@@ -101,7 +101,7 @@
#include "../common/log.h"
#include "../common/util.h"
-#define RECOMMENDED_SOFTWARE_VERSIONS "0.0.2pre8,0.0.2pre9,0.0.2pre10,0.0.2pre11,0.0.2pre12,0.0.2pre13,0.0.2pre14"
+#define RECOMMENDED_SOFTWARE_VERSIONS "0.0.2pre13,0.0.2pre14"
#define MAXCONNECTIONS 1000 /* upper bound on max connections.
can be lowered by config file */
@@ -420,41 +420,42 @@
typedef struct circuit_t circuit_t;
typedef struct {
- char *LogLevel;
- char *LogFile;
- char *DebugLogFile;
- char *DataDirectory;
- char *RouterFile;
- char *Nickname;
- char *Address;
- char *PidFile;
- char *ExitPolicy;
- char *SocksBindAddress;
- char *ORBindAddress;
- char *User;
- char *Group;
- double CoinWeight;
- int ORPort;
- int SocksPort;
- int DirPort;
- int MaxConn;
- int OnionRouter;
- int TrafficShaping;
- int LinkPadding;
- int IgnoreVersion;
- int RunAsDaemon;
- int DirRebuildPeriod;
- int DirFetchPostPeriod;
- int KeepalivePeriod;
- int MaxOnionsPending;
- int NewCircuitPeriod;
- int TotalBandwidth;
- int NumCpus;
- int Role;
- int loglevel;
+ char *LogLevel;
+ char *LogFile;
+ char *DebugLogFile;
+ char *DataDirectory;
+ char *RouterFile;
+ char *Nickname;
+ char *Address;
+ char *PidFile;
+ char *ExitPolicy;
+ char *SocksBindAddress;
+ char *ORBindAddress;
+ char *DirBindAddress;
+ char *User;
+ char *Group;
+ double CoinWeight;
+ int ORPort;
+ int SocksPort;
+ int DirPort;
+ int MaxConn;
+ int OnionRouter;
+ int TrafficShaping;
+ int LinkPadding;
+ int IgnoreVersion;
+ int RunAsDaemon;
+ int DirRebuildPeriod;
+ int DirFetchPostPeriod;
+ int KeepalivePeriod;
+ int MaxOnionsPending;
+ int NewCircuitPeriod;
+ int TotalBandwidth;
+ int NumCpus;
+ int Role;
+ int loglevel;
} or_options_t;
- /* all the function prototypes go here */
+/* all the function prototypes go here */
/********************************* buffers.c ***************************/
@@ -546,10 +547,10 @@
connection_t *connection_new(int type);
void connection_free(connection_t *conn);
-int connection_create_listener(struct sockaddr_in *bindaddr, int type);
+int connection_create_listener(char *bindaddress, uint16_t bindport, int type);
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
-int retry_all_connections(uint16_t or_listenport, uint16_t ap_listenport, uint16_t dir_listenport);
+int retry_all_connections(void);
int connection_handle_read(connection_t *conn);
int connection_read_to_buf(connection_t *conn);