Disable old RSA keys when generating new ones.
[tinc] / src / conf.c
index 5681033..803c96c 100644 (file)
@@ -2,7 +2,7 @@
     conf.c -- configuration code
     Copyright (C) 1998 Robert van der Meulen
                   1998-2005 Ivo Timmermans
-                  2000-2006 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2008 Guus Sliepen <guus@tinc-vpn.org>
                  2000 Cris van Pelt
 
     This program is free software; you can redistribute it and/or modify
@@ -301,6 +301,8 @@ static char *readline(FILE * fp, char **buf, size_t *buflen)
                        size = newsize;
                } else {
                        *newline = '\0';        /* kill newline */
+                       if(newline > p && newline[-1] == '\r')  /* and carriage return if necessary */
+                               newline[-1] = '\0';
                        break;                          /* yay */
                }
        }
@@ -343,6 +345,11 @@ int read_config_file(avl_tree_t *config_tree, const char *fname)
        buffer = xmalloc(bufsize);
 
        for(;;) {
+               if(feof(fp)) {
+                       err = 0;
+                       break;
+               }
+
                line = readline(fp, &buffer, &bufsize);
 
                if(!line) {
@@ -350,11 +357,6 @@ int read_config_file(avl_tree_t *config_tree, const char *fname)
                        break;
                }
 
-               if(feof(fp)) {
-                       err = 0;
-                       break;
-               }
-
                lineno++;
 
                if(!*line || *line == '#')
@@ -427,7 +429,7 @@ bool read_server_config()
        return x == 0;
 }
 
-FILE *ask_and_open(const char *filename, const char *what, const char *mode)
+FILE *ask_and_open(const char *filename, const char *what)
 {
        FILE *r;
        char *directory;
@@ -477,7 +479,7 @@ FILE *ask_and_open(const char *filename, const char *what, const char *mode)
 
        /* Open it first to keep the inode busy */
 
-       r = fopen(fn, mode);
+       r = fopen(fn, "r+") ?: fopen(fn, "w+");
 
        if(!r) {
                fprintf(stderr, _("Error opening file `%s': %s\n"),
@@ -490,3 +492,34 @@ FILE *ask_and_open(const char *filename, const char *what, const char *mode)
 
        return r;
 }
+
+bool disable_old_keys(FILE *f) {
+       char buf[100];
+       long pos;
+       bool disabled = false;
+
+       rewind(f);
+       pos = ftell(f);
+
+       while(fgets(buf, sizeof buf, f)) {
+               if(!strncmp(buf, "-----BEGIN RSA", 14)) {       
+                       buf[11] = 'O';
+                       buf[12] = 'L';
+                       buf[13] = 'D';
+                       fseek(f, pos, SEEK_SET);
+                       fputs(buf, f);
+                       disabled = true;
+               }
+               else if(!strncmp(buf, "-----END RSA", 12)) {    
+                       buf[ 9] = 'O';
+                       buf[10] = 'L';
+                       buf[11] = 'D';
+                       fseek(f, pos, SEEK_SET);
+                       fputs(buf, f);
+                       disabled = true;
+               }
+               pos = ftell(f);
+       }
+
+       return disabled;
+}