diff --git a/src/or/config.c b/src/or/config.c
index fba4adef3aa7ac59789fefc3eb5e29ab917a47b5..e638dcf67174624c5131127cb43d6b9022c92d32 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -29,7 +29,7 @@ typedef enum config_type_t {
 #define CONFIG_LINE_T_MAXLEN 4096
 
 static struct config_line_t *config_get_commandlines(int argc, char **argv);
-static struct config_line_t *config_get_lines(FILE *f);
+static int config_get_lines(FILE *f, struct config_line_t **result);
 static void config_free_lines(struct config_line_t *front);
 static int config_compare(struct config_line_t *c, const char *key, config_type_t type, void *arg);
 static int config_assign(or_options_t *options, struct config_line_t *list);
@@ -80,21 +80,27 @@ config_line_prepend(struct config_line_t *front,
 }
 
 /** Helper: parse the config file and strdup into key/value
- * strings. Return list, or NULL if parsing the file failed.  Warn and
- * ignore any misformatted lines. */
-static struct config_line_t *config_get_lines(FILE *f) {
+ * strings. Set *result to the list, or NULL if parsing the file
+ * failed.  Return 0 on success, -1 on failure. Warn and ignore any
+ * misformatted lines. */
+static int config_get_lines(FILE *f,
+                            struct config_line_t **result) {
 
   struct config_line_t *front = NULL;
   char line[CONFIG_LINE_T_MAXLEN];
-  int result;
+  int r;
   char *key, *value;
 
-  while( (result=parse_line_from_file(line,sizeof(line),f,&key,&value)) > 0) {
+  while( (r=parse_line_from_file(line,sizeof(line),f,&key,&value)) > 0) {
     front = config_line_prepend(front, key, value);
   }
-  if(result < 0)
-    return NULL;
-  return front;
+  if(r < 0) {
+    *result = NULL;
+    return -1;
+  } else {
+    *result = front;
+    return 0;
+  }
 }
 
 /**
@@ -396,9 +402,6 @@ static int config_assign_defaults(or_options_t *options) {
   config_free_lines(options->ExitPolicy);
   options->ExitPolicy = config_line_prepend(NULL, "ExitPolicy", "reject *:*");
 
-  /* plus give them a dirservers file */
-  if(config_assign_default_dirservers() < 0)
-    return -1;
   return 0;
 }
 
@@ -656,14 +659,14 @@ int getconfig(int argc, char **argv, or_options_t *options) {
   tor_assert(fname);
   log(LOG_DEBUG,"Opening config file '%s'",fname);
 
+  if(config_assign_defaults(options) < 0) {
+    return -1;
+  }
   cf = fopen(fname, "r");
   if(!cf) {
     if(using_default_torrc == 1) {
       log(LOG_NOTICE, "Configuration file '%s' not present, using reasonable defaults.",fname);
       tor_free(fname);
-      if(config_assign_defaults(options) < 0) {
-        return -1;
-      }
     } else {
       log(LOG_WARN, "Unable to open configuration file '%s'.",fname);
       tor_free(fname);
@@ -671,8 +674,8 @@ int getconfig(int argc, char **argv, or_options_t *options) {
     }
   } else { /* it opened successfully. use it. */
     tor_free(fname);
-    cl = config_get_lines(cf);
-    if(!cl) return -1;
+    if (config_get_lines(cf, &cl)<0)
+      return -1;
     if(config_assign(options,cl) < 0)
       return -1;
     config_free_lines(cl);
diff --git a/src/or/main.c b/src/or/main.c
index 41a9ec4e157ae09df33aa62ac890ed132dd26977..9e558315aa9ec0aac23c37e676d4afa9997264e0 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -781,13 +781,16 @@ static int do_main_loop(void) {
     return -1;
   }
 
-  /* load the routers file */
+  /* load the routers file, or assign the defaults. */
   if(options.RouterFile) {
     routerlist_clear_trusted_directories();
     if (router_load_routerlist_from_file(options.RouterFile, 1) < 0) {
       log_fn(LOG_ERR,"Error loading router list.");
       return -1;
     }
+  } else {
+    if(config_assign_default_dirservers() < 0)
+      return -1;
   }
 
   if(authdir_mode()) {