+ // We will try to read the conf files in the "conf.d" dir
+ if(x) {
+ char dname[PATH_MAX];
+ snprintf(dname, sizeof(dname), "%s/conf.d", confbase);
+ DIR *dir = opendir(dname);
+
+ // If we can find this dir
+ if(dir) {
+ struct dirent *ep;
+
+ // We list all the files in it
+ while(x && (ep = readdir(dir))) {
+ size_t l = strlen(ep->d_name);
+
+ // And we try to read the ones that end with ".conf"
+ if(l > 5 && !strcmp(".conf", & ep->d_name[ l - 5 ])) {
+ if((size_t)snprintf(fname, sizeof(fname), "%s/%s", dname, ep->d_name) >= sizeof(fname)) {
+ logger(LOG_ERR, "Pathname too long: %s/%s", dname, ep->d_name);
+ return false;
+ }
+
+ x = read_config_file(config_tree, fname);
+ }
+ }
+
+ closedir(dir);
+ }
+ }
+
+ if(!x && errno) {
+ logger(LOG_ERR, "Failed to read `%s': %s", fname, strerror(errno));
+ }
+
+ return x;
+}
+
+bool read_connection_config(connection_t *c) {
+ char fname[PATH_MAX];
+ bool x;
+
+ read_config_options(c->config_tree, c->name);
+
+ snprintf(fname, sizeof(fname), "%s/hosts/%s", confbase, c->name);
+ x = read_config_file(c->config_tree, fname);
+
+ return x;
+}
+
+static void disable_old_keys(const char *filename) {
+ char tmpfile[PATH_MAX] = "";
+ char buf[1024];
+ bool disabled = false;
+ FILE *r, *w;
+
+ r = fopen(filename, "r");
+
+ if(!r) {
+ return;
+ }
+
+ int len = snprintf(tmpfile, sizeof(tmpfile), "%s.tmp", filename);
+
+ if(len < 0 || len >= PATH_MAX) {
+ fprintf(stderr, "Pathname too long: %s.tmp\n", filename);
+ w = NULL;
+ } else {
+ w = fopen(tmpfile, "w");
+ }
+
+ while(fgets(buf, sizeof(buf), r)) {
+ if(!strncmp(buf, "-----BEGIN RSA", 14)) {
+ buf[11] = 'O';
+ buf[12] = 'L';
+ buf[13] = 'D';
+ disabled = true;
+ } else if(!strncmp(buf, "-----END RSA", 12)) {
+ buf[ 9] = 'O';
+ buf[10] = 'L';
+ buf[11] = 'D';
+ disabled = true;
+ }
+
+ if(w && fputs(buf, w) < 0) {
+ disabled = false;
+ break;
+ }
+ }
+
+ if(w) {
+ fclose(w);