Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
David Goulet
Tor
Commits
c25fbd26
Commit
c25fbd26
authored
Dec 06, 2003
by
Roger Dingledine
Browse files
break routers.c into router.c for stuff the router does,
and routerlist.c for handling routerlist. svn:r887
parent
e0952d07
Changes
6
Hide whitespace changes
Inline
Side-by-side
src/or/Makefile.am
View file @
c25fbd26
...
...
@@ -6,14 +6,14 @@ bin_PROGRAMS = tor
tor_SOURCES
=
buffers.c circuit.c command.c connection.c
\
connection_or.c config.c dirserv.c
\
onion.c router
s
.c directory.c dns.c connection_edge.c
\
onion.c router
.c routerlist
.c directory.c dns.c connection_edge.c
\
cpuworker.c main.c tor_main.c
tor_LDADD
=
../common/libor.a
test_SOURCES
=
buffers.c circuit.c command.c connection.c
\
connection_or.c config.c dirserv.c
\
onion.c router
s
.c directory.c dns.c connection_edge.c
\
onion.c router
.c routerlist
.c directory.c dns.c connection_edge.c
\
cpuworker.c main.c test.c
test_LDADD
=
../common/libor.a
...
...
src/or/main.c
View file @
c25fbd26
...
...
@@ -34,42 +34,8 @@ static int please_reset=0; /* whether we just got a sighup */
static
int
please_reap_children
=
0
;
/* whether we should waitpid for exited children */
#endif
/* signal stuff */
/* private keys */
static
crypto_pk_env_t
*
onionkey
=
NULL
;
static
crypto_pk_env_t
*
linkkey
=
NULL
;
static
crypto_pk_env_t
*
identitykey
=
NULL
;
/********* END VARIABLES ************/
void
set_onion_key
(
crypto_pk_env_t
*
k
)
{
onionkey
=
k
;
}
crypto_pk_env_t
*
get_onion_key
(
void
)
{
assert
(
onionkey
);
return
onionkey
;
}
void
set_link_key
(
crypto_pk_env_t
*
k
)
{
linkkey
=
k
;
}
crypto_pk_env_t
*
get_link_key
(
void
)
{
assert
(
linkkey
);
return
linkkey
;
}
void
set_identity_key
(
crypto_pk_env_t
*
k
)
{
identitykey
=
k
;
}
crypto_pk_env_t
*
get_identity_key
(
void
)
{
assert
(
identitykey
);
return
identitykey
;
}
/****************************************************************************
*
* This section contains accessors and other methods on the connection_array
...
...
@@ -427,174 +393,6 @@ static int prepare_for_poll(void) {
return
(
1000
-
(
now
.
tv_usec
/
1000
));
/* how many milliseconds til the next second? */
}
static
crypto_pk_env_t
*
init_key_from_file
(
const
char
*
fname
)
{
crypto_pk_env_t
*
prkey
=
NULL
;
int
fd
=
-
1
;
FILE
*
file
=
NULL
;
if
(
!
(
prkey
=
crypto_new_pk_env
(
CRYPTO_PK_RSA
)))
{
log
(
LOG_ERR
,
"Error creating crypto environment."
);
goto
error
;
}
switch
(
file_status
(
fname
))
{
case
FN_DIR
:
case
FN_ERROR
:
log
(
LOG_ERR
,
"Can't read key from %s"
,
fname
);
goto
error
;
case
FN_NOENT
:
log
(
LOG_INFO
,
"No key found in %s; generating fresh key."
,
fname
);
if
(
crypto_pk_generate_key
(
prkey
))
{
log
(
LOG_ERR
,
"Error generating key: %s"
,
crypto_perror
());
goto
error
;
}
if
(
crypto_pk_check_key
(
prkey
)
<=
0
)
{
log
(
LOG_ERR
,
"Generated key seems invalid"
);
goto
error
;
}
log
(
LOG_INFO
,
"Generated key seems valid"
);
if
(
crypto_pk_write_private_key_to_filename
(
prkey
,
fname
))
{
log
(
LOG_ERR
,
"Couldn't write generated key to %s."
,
fname
);
goto
error
;
}
return
prkey
;
case
FN_FILE
:
if
(
crypto_pk_read_private_key_from_filename
(
prkey
,
fname
))
{
log
(
LOG_ERR
,
"Error loading private key."
);
goto
error
;
}
return
prkey
;
default:
assert
(
0
);
}
error:
if
(
prkey
)
crypto_free_pk_env
(
prkey
);
if
(
fd
>=
0
&&
!
file
)
close
(
fd
);
if
(
file
)
fclose
(
file
);
return
NULL
;
}
static
int
init_keys
(
void
)
{
char
keydir
[
512
];
char
fingerprint
[
FINGERPRINT_LEN
+
MAX_NICKNAME_LEN
+
3
];
char
*
cp
;
const
char
*
tmp
,
*
mydesc
;
crypto_pk_env_t
*
prkey
;
/* OP's don't need keys. Just initialize the TLS context.*/
if
(
!
options
.
ORPort
)
{
assert
(
!
options
.
DirPort
);
if
(
tor_tls_context_new
(
NULL
,
0
,
NULL
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error creating TLS context for OP."
);
return
-
1
;
}
return
0
;
}
assert
(
options
.
DataDirectory
);
if
(
strlen
(
options
.
DataDirectory
)
>
(
512
-
128
))
{
log_fn
(
LOG_ERR
,
"DataDirectory is too long."
);
return
-
1
;
}
if
(
check_private_dir
(
options
.
DataDirectory
,
1
))
{
return
-
1
;
}
sprintf
(
keydir
,
"%s/keys"
,
options
.
DataDirectory
);
if
(
check_private_dir
(
keydir
,
1
))
{
return
-
1
;
}
cp
=
keydir
+
strlen
(
keydir
);
/* End of string. */
/* 1. Read identity key. Make it if none is found. */
strcpy
(
cp
,
"/identity.key"
);
log_fn
(
LOG_INFO
,
"Reading/making identity key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_identity_key
(
prkey
);
/* 2. Read onion key. Make it if none is found. */
strcpy
(
cp
,
"/onion.key"
);
log_fn
(
LOG_INFO
,
"Reading/making onion key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_onion_key
(
prkey
);
/* 3. Initialize link key and TLS context. */
strcpy
(
cp
,
"/link.key"
);
log_fn
(
LOG_INFO
,
"Reading/making link key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_link_key
(
prkey
);
if
(
tor_tls_context_new
(
prkey
,
1
,
options
.
Nickname
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error initializing TLS context"
);
return
-
1
;
}
/* 4. Dump router descriptor to 'router.desc' */
/* Must be called after keys are initialized. */
if
(
!
(
router_get_my_descriptor
()))
{
log_fn
(
LOG_ERR
,
"Error initializing descriptor."
);
return
-
1
;
}
/* We need to add our own fingerprint so it gets recognized. */
if
(
dirserv_add_own_fingerprint
(
options
.
Nickname
,
get_identity_key
()))
{
log_fn
(
LOG_ERR
,
"Error adding own fingerprint to approved set"
);
return
-
1
;
}
tmp
=
mydesc
=
router_get_my_descriptor
();
if
(
dirserv_add_descriptor
(
&
tmp
))
{
log
(
LOG_ERR
,
"Unable to add own descriptor to directory."
);
return
-
1
;
}
sprintf
(
keydir
,
"%s/router.desc"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Dumping descriptor to %s..."
,
keydir
);
if
(
write_str_to_file
(
keydir
,
mydesc
))
{
return
-
1
;
}
/* 5. Dump fingerprint to 'fingerprint' */
sprintf
(
keydir
,
"%s/fingerprint"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Dumping fingerprint to %s..."
,
keydir
);
assert
(
strlen
(
options
.
Nickname
)
<=
MAX_NICKNAME_LEN
);
strcpy
(
fingerprint
,
options
.
Nickname
);
strcat
(
fingerprint
,
" "
);
if
(
crypto_pk_get_fingerprint
(
get_identity_key
(),
fingerprint
+
strlen
(
fingerprint
))
<
0
)
{
log_fn
(
LOG_ERR
,
"Error computing fingerprint"
);
return
-
1
;
}
strcat
(
fingerprint
,
"
\n
"
);
if
(
write_str_to_file
(
keydir
,
fingerprint
))
return
-
1
;
if
(
!
options
.
DirPort
)
return
0
;
/* 6. [dirserver only] load approved-routers file */
sprintf
(
keydir
,
"%s/approved-routers"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Loading approved fingerprints from %s..."
,
keydir
);
if
(
dirserv_parse_fingerprint_file
(
keydir
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error loading fingerprints"
);
return
-
1
;
}
/* 7. [dirserver only] load old directory, if it's there */
sprintf
(
keydir
,
"%s/cached-directory"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Loading cached directory from %s..."
,
keydir
);
cp
=
read_file_to_str
(
keydir
);
if
(
!
cp
)
{
log_fn
(
LOG_INFO
,
"Cached directory %s not present. Ok."
,
keydir
);
}
else
{
if
(
dirserv_init_from_directory_string
(
cp
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Cached directory %s is corrupt"
,
keydir
);
free
(
cp
);
return
-
1
;
}
free
(
cp
);
}
/* success */
return
0
;
}
static
int
init_from_config
(
int
argc
,
char
**
argv
)
{
static
int
have_daemonized
=
0
;
...
...
src/or/onion.c
View file @
c25fbd26
...
...
@@ -383,16 +383,16 @@ static routerinfo_t *choose_good_exit_server(routerlist_t *dir)
}
cpath_build_state_t
*
onion_new_cpath_build_state
(
void
)
{
routerlist_t
*
di
r
;
routerlist_t
*
r
l
;
int
r
;
cpath_build_state_t
*
info
;
routerinfo_t
*
exit
;
router_get_routerlist
(
&
di
r
);
r
=
new_route_len
(
options
.
PathlenCoinWeight
,
di
r
->
routers
,
di
r
->
n_routers
);
router_get_routerlist
(
&
r
l
);
r
=
new_route_len
(
options
.
PathlenCoinWeight
,
r
l
->
routers
,
r
l
->
n_routers
);
if
(
r
<
0
)
return
NULL
;
exit
=
choose_good_exit_server
(
di
r
);
exit
=
choose_good_exit_server
(
r
l
);
if
(
!
exit
)
return
NULL
;
info
=
tor_malloc
(
sizeof
(
cpath_build_state_t
));
...
...
src/or/or.h
View file @
c25fbd26
...
...
@@ -674,11 +674,6 @@ int dns_resolve(connection_t *exitconn);
/********************************* main.c ***************************/
void
set_onion_key
(
crypto_pk_env_t
*
k
);
crypto_pk_env_t
*
get_onion_key
(
void
);
void
set_identity_key
(
crypto_pk_env_t
*
k
);
crypto_pk_env_t
*
get_identity_key
(
void
);
crypto_pk_env_t
*
get_link_key
(
void
);
int
connection_add
(
connection_t
*
conn
);
int
connection_remove
(
connection_t
*
conn
);
void
connection_set_poll_socket
(
connection_t
*
conn
);
...
...
@@ -692,8 +687,6 @@ void connection_start_reading(connection_t *conn);
void
connection_stop_writing
(
connection_t
*
conn
);
void
connection_start_writing
(
connection_t
*
conn
);
const
char
*
router_get_my_descriptor
(
void
);
int
main
(
int
argc
,
char
*
argv
[]);
/********************************* onion.c ***************************/
...
...
@@ -728,44 +721,45 @@ int onion_skin_client_handshake(crypto_dh_env_t *handshake_state,
cpath_build_state_t
*
onion_new_cpath_build_state
(
void
);
/********************************* routers.c ***************************/
/********************************* router.c ***************************/
void
set_onion_key
(
crypto_pk_env_t
*
k
);
crypto_pk_env_t
*
get_onion_key
(
void
);
void
set_identity_key
(
crypto_pk_env_t
*
k
);
crypto_pk_env_t
*
get_identity_key
(
void
);
crypto_pk_env_t
*
get_link_key
(
void
);
int
init_keys
(
void
);
void
router_retry_connections
(
void
);
void
router_upload_desc_to_dirservers
(
void
);
int
router_compare_to_my_exit_policy
(
connection_t
*
conn
);
const
char
*
router_get_my_descriptor
(
void
);
int
router_rebuild_descriptor
(
void
);
int
router_dump_router_to_string
(
char
*
s
,
int
maxlen
,
routerinfo_t
*
router
,
crypto_pk_env_t
*
ident_key
);
/********************************* routerlist.c ***************************/
routerinfo_t
*
router_pick_directory_server
(
void
);
routerinfo_t
*
router_pick_randomly_from_running
(
void
);
void
router_upload_desc_to_dirservers
(
void
);
routerinfo_t
*
router_get_by_addr_port
(
uint32_t
addr
,
uint16_t
port
);
routerinfo_t
*
router_get_by_link_pk
(
crypto_pk_env_t
*
pk
);
routerinfo_t
*
router_get_by_nickname
(
char
*
nickname
);
void
router_get_directory
(
routerlist_t
**
pdirectory
);
void
router_get_routerlist
(
routerlist_t
**
prouterlist
);
void
routerinfo_free
(
routerinfo_t
*
router
);
void
router_mark_as_down
(
char
*
nickname
);
int
router_get_list_from_file
(
char
*
routerfile
);
int
router_get_router_hash
(
char
*
s
,
char
*
digest
);
int
router_set_routerlist_from_file
(
char
*
routerfile
);
int
router_get_dir_hash
(
char
*
s
,
char
*
digest
);
/* Reads a list of known routers, unsigned. */
int
router_get_list_from_string
(
char
*
s
);
/* Exported for debugging */
int
router_get_list_from_string_impl
(
char
**
s
,
routerlist_t
**
dest
,
int
n_good_nicknames
,
const
char
*
good_nickname_lst
[]);
/* Reads a signed directory. */
int
router_get_dir_from_string
(
char
*
s
,
crypto_pk_env_t
*
pkey
);
/* Exported or debugging */
int
router_get_dir_from_string_impl
(
char
*
s
,
routerlist_t
**
dest
,
crypto_pk_env_t
*
pkey
);
routerinfo_t
*
router_get_entry_from_string
(
char
**
s
);
int
router_get_router_hash
(
char
*
s
,
char
*
digest
);
int
router_set_routerlist_from_directory
(
char
*
s
,
crypto_pk_env_t
*
pkey
);
routerinfo_t
*
router_get_entry_from_string
(
char
**
s
);
int
router_add_exit_policy_from_string
(
routerinfo_t
*
router
,
char
*
s
);
int
router_supports_exit_address
(
uint32_t
addr
,
uint16_t
port
,
routerinfo_t
*
router
);
int
router_compare_to_my_exit_policy
(
connection_t
*
conn
);
int
router_compare_addr_to_exit_policy
(
uint32_t
addr
,
uint16_t
port
,
struct
exit_policy_t
*
policy
);
void
routerinfo_free
(
routerinfo_t
*
router
);
int
router_dump_router_to_string
(
char
*
s
,
int
maxlen
,
routerinfo_t
*
router
,
crypto_pk_env_t
*
ident_key
);
int
router_exit_policy_all_routers_reject
(
uint32_t
addr
,
uint16_t
port
);
int
router_exit_policy_rejects_all
(
routerinfo_t
*
router
);
const
char
*
router_get_my_descriptor
(
void
);
int
router_rebuild_descriptor
(
void
);
int
connection_ap_can_use_exit
(
connection_t
*
conn
,
routerinfo_t
*
exit
);
/********************************* dirserv.c ***************************/
int
dirserv_add_own_fingerprint
(
const
char
*
nickname
,
crypto_pk_env_t
*
pk
);
...
...
src/or/router.c
0 → 100644
View file @
c25fbd26
/* Copyright 2001,2002,2003 Roger Dingledine, Matej Pfajfar. */
/* See LICENSE for licensing information */
/* $Id$ */
#include
"or.h"
extern
or_options_t
options
;
/* command-line and config-file options */
/************************************************************/
/* private keys */
static
crypto_pk_env_t
*
onionkey
=
NULL
;
static
crypto_pk_env_t
*
linkkey
=
NULL
;
static
crypto_pk_env_t
*
identitykey
=
NULL
;
void
set_onion_key
(
crypto_pk_env_t
*
k
)
{
onionkey
=
k
;
}
crypto_pk_env_t
*
get_onion_key
(
void
)
{
assert
(
onionkey
);
return
onionkey
;
}
void
set_link_key
(
crypto_pk_env_t
*
k
)
{
linkkey
=
k
;
}
crypto_pk_env_t
*
get_link_key
(
void
)
{
assert
(
linkkey
);
return
linkkey
;
}
void
set_identity_key
(
crypto_pk_env_t
*
k
)
{
identitykey
=
k
;
}
crypto_pk_env_t
*
get_identity_key
(
void
)
{
assert
(
identitykey
);
return
identitykey
;
}
/************************************************************/
static
crypto_pk_env_t
*
init_key_from_file
(
const
char
*
fname
)
{
crypto_pk_env_t
*
prkey
=
NULL
;
int
fd
=
-
1
;
FILE
*
file
=
NULL
;
if
(
!
(
prkey
=
crypto_new_pk_env
(
CRYPTO_PK_RSA
)))
{
log
(
LOG_ERR
,
"Error creating crypto environment."
);
goto
error
;
}
switch
(
file_status
(
fname
))
{
case
FN_DIR
:
case
FN_ERROR
:
log
(
LOG_ERR
,
"Can't read key from %s"
,
fname
);
goto
error
;
case
FN_NOENT
:
log
(
LOG_INFO
,
"No key found in %s; generating fresh key."
,
fname
);
if
(
crypto_pk_generate_key
(
prkey
))
{
log
(
LOG_ERR
,
"Error generating key: %s"
,
crypto_perror
());
goto
error
;
}
if
(
crypto_pk_check_key
(
prkey
)
<=
0
)
{
log
(
LOG_ERR
,
"Generated key seems invalid"
);
goto
error
;
}
log
(
LOG_INFO
,
"Generated key seems valid"
);
if
(
crypto_pk_write_private_key_to_filename
(
prkey
,
fname
))
{
log
(
LOG_ERR
,
"Couldn't write generated key to %s."
,
fname
);
goto
error
;
}
return
prkey
;
case
FN_FILE
:
if
(
crypto_pk_read_private_key_from_filename
(
prkey
,
fname
))
{
log
(
LOG_ERR
,
"Error loading private key."
);
goto
error
;
}
return
prkey
;
default:
assert
(
0
);
}
error:
if
(
prkey
)
crypto_free_pk_env
(
prkey
);
if
(
fd
>=
0
&&
!
file
)
close
(
fd
);
if
(
file
)
fclose
(
file
);
return
NULL
;
}
int
init_keys
(
void
)
{
char
keydir
[
512
];
char
fingerprint
[
FINGERPRINT_LEN
+
MAX_NICKNAME_LEN
+
3
];
char
*
cp
;
const
char
*
tmp
,
*
mydesc
;
crypto_pk_env_t
*
prkey
;
/* OP's don't need keys. Just initialize the TLS context.*/
if
(
!
options
.
ORPort
)
{
assert
(
!
options
.
DirPort
);
if
(
tor_tls_context_new
(
NULL
,
0
,
NULL
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error creating TLS context for OP."
);
return
-
1
;
}
return
0
;
}
assert
(
options
.
DataDirectory
);
if
(
strlen
(
options
.
DataDirectory
)
>
(
512
-
128
))
{
log_fn
(
LOG_ERR
,
"DataDirectory is too long."
);
return
-
1
;
}
if
(
check_private_dir
(
options
.
DataDirectory
,
1
))
{
return
-
1
;
}
sprintf
(
keydir
,
"%s/keys"
,
options
.
DataDirectory
);
if
(
check_private_dir
(
keydir
,
1
))
{
return
-
1
;
}
cp
=
keydir
+
strlen
(
keydir
);
/* End of string. */
/* 1. Read identity key. Make it if none is found. */
strcpy
(
cp
,
"/identity.key"
);
log_fn
(
LOG_INFO
,
"Reading/making identity key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_identity_key
(
prkey
);
/* 2. Read onion key. Make it if none is found. */
strcpy
(
cp
,
"/onion.key"
);
log_fn
(
LOG_INFO
,
"Reading/making onion key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_onion_key
(
prkey
);
/* 3. Initialize link key and TLS context. */
strcpy
(
cp
,
"/link.key"
);
log_fn
(
LOG_INFO
,
"Reading/making link key %s..."
,
keydir
);
prkey
=
init_key_from_file
(
keydir
);
if
(
!
prkey
)
return
-
1
;
set_link_key
(
prkey
);
if
(
tor_tls_context_new
(
prkey
,
1
,
options
.
Nickname
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error initializing TLS context"
);
return
-
1
;
}
/* 4. Dump router descriptor to 'router.desc' */
/* Must be called after keys are initialized. */
if
(
!
(
router_get_my_descriptor
()))
{
log_fn
(
LOG_ERR
,
"Error initializing descriptor."
);
return
-
1
;
}
/* We need to add our own fingerprint so it gets recognized. */
if
(
dirserv_add_own_fingerprint
(
options
.
Nickname
,
get_identity_key
()))
{
log_fn
(
LOG_ERR
,
"Error adding own fingerprint to approved set"
);
return
-
1
;
}
tmp
=
mydesc
=
router_get_my_descriptor
();
if
(
dirserv_add_descriptor
(
&
tmp
))
{
log
(
LOG_ERR
,
"Unable to add own descriptor to directory."
);
return
-
1
;
}
sprintf
(
keydir
,
"%s/router.desc"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Dumping descriptor to %s..."
,
keydir
);
if
(
write_str_to_file
(
keydir
,
mydesc
))
{
return
-
1
;
}
/* 5. Dump fingerprint to 'fingerprint' */
sprintf
(
keydir
,
"%s/fingerprint"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Dumping fingerprint to %s..."
,
keydir
);
assert
(
strlen
(
options
.
Nickname
)
<=
MAX_NICKNAME_LEN
);
strcpy
(
fingerprint
,
options
.
Nickname
);
strcat
(
fingerprint
,
" "
);
if
(
crypto_pk_get_fingerprint
(
get_identity_key
(),
fingerprint
+
strlen
(
fingerprint
))
<
0
)
{
log_fn
(
LOG_ERR
,
"Error computing fingerprint"
);
return
-
1
;
}
strcat
(
fingerprint
,
"
\n
"
);
if
(
write_str_to_file
(
keydir
,
fingerprint
))
return
-
1
;
if
(
!
options
.
DirPort
)
return
0
;
/* 6. [dirserver only] load approved-routers file */
sprintf
(
keydir
,
"%s/approved-routers"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Loading approved fingerprints from %s..."
,
keydir
);
if
(
dirserv_parse_fingerprint_file
(
keydir
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Error loading fingerprints"
);
return
-
1
;
}
/* 7. [dirserver only] load old directory, if it's there */
sprintf
(
keydir
,
"%s/cached-directory"
,
options
.
DataDirectory
);
log_fn
(
LOG_INFO
,
"Loading cached directory from %s..."
,
keydir
);
cp
=
read_file_to_str
(
keydir
);
if
(
!
cp
)
{
log_fn
(
LOG_INFO
,
"Cached directory %s not present. Ok."
,
keydir
);
}
else
{
if
(
dirserv_init_from_directory_string
(
cp
)
<
0
)
{
log_fn
(
LOG_ERR
,
"Cached directory %s is corrupt"
,
keydir
);
free
(
cp
);
return
-
1
;
}
free
(
cp
);
}
/* success */
return
0
;
}
/************************************************************/
static
routerinfo_t
*
desc_routerinfo
=
NULL
;
/* my descriptor */
static
char
descriptor
[
8192
];
/* string representation of my descriptor */
void
router_retry_connections
(
void
)
{
int
i
;
routerinfo_t
*
router
;
routerlist_t
*
rl
;
router_get_routerlist
(
&
rl
);
for
(
i
=
0
;
i
<
rl
->
n_routers
;
i
++
)
{
router
=
rl
->
routers
[
i
];
if
(
!
connection_exact_get_by_addr_port
(
router
->
addr
,
router
->
or_port
))
{
/* not in the list */
log_fn
(
LOG_DEBUG
,
"connecting to OR %s:%u."
,
router
->
address
,
router
->
or_port
);
connection_or_connect
(
router
);
}
}
}
void
router_upload_desc_to_dirservers
(
void
)
{
int
i
;
routerinfo_t
*
router
;
routerlist_t
*
rl
;
router_get_routerlist
(
&
rl
);
if
(
!
rl
)
return
;
if
(
!
router_get_my_descriptor
())
{
log_fn
(
LOG_WARN
,
"No descriptor; skipping upload"
);
return
;
}
for
(
i
=
0
;
i
<
rl
->
n_routers
;
i
++
)
{
router
=
rl
->
routers
[
i
];
if
(
router
->
dir_port
>
0
)
directory_initiate_command
(
router
,
DIR_CONN_STATE_CONNECTING_UPLOAD
);
}
}
static
void
router_add_exit_policy_from_config
(
routerinfo_t
*
router
)
{
char
*
s
=
options
.
ExitPolicy
,
*
e
;
int
last
=
0
;
char
line
[
1024
];
if
(
!
s
)
{
log_fn
(
LOG_INFO
,
"No exit policy configured. Ok."
);
return
;
/* nothing to see here */
}
if
(
!*
s
)
{
log_fn
(
LOG_INFO
,
"Exit policy is empty. Ok."
);
return
;
/* nothing to see here */
}
for
(;;)
{
e
=
strchr
(
s
,
','
);
if
(
!
e
)
{
last
=
1
;
strncpy
(
line
,
s
,
1023
);
}
else
{
memcpy
(
line
,
s
,
((
e
-
s
)
<
1023
)
?
(
e
-
s
)
:
1023
);
line
[
e
-
s
]
=
0
;
}