+static void deltree(const char *dirname) {
+ DIR *d = opendir(dirname);
+ if(d) {
+ struct dirent *ent;
+ while((ent = readdir(d))) {
+ if(ent->d_name[0] == '.')
+ continue;
+ char filename[PATH_MAX];
+ snprintf(filename, sizeof filename, "%s" SLASH "%s", dirname, ent->d_name);
+ if(unlink(filename))
+ deltree(filename);
+ }
+ closedir(d);
+ }
+ rmdir(dirname);
+ return;
+}
+
+bool meshlink_destroy(const char *confbase) {
+ if(!confbase) {
+ meshlink_errno = MESHLINK_EINVAL;
+ return false;
+ }
+
+ char filename[PATH_MAX];
+ snprintf(filename, sizeof filename, "%s" SLASH "meshlink.conf", confbase);
+
+ if(unlink(filename)) {
+ if(errno == ENOENT) {
+ meshlink_errno = MESHLINK_ENOENT;
+ return false;
+ } else {
+ logger(NULL, MESHLINK_ERROR, "Cannot delete %s: %s\n", filename, strerror(errno));
+ meshlink_errno = MESHLINK_ESTORAGE;
+ return false;
+ }
+ }
+
+ deltree(confbase);
+
+ return true;
+}
+