summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nest/config.Y3
-rw-r--r--nest/password.c28
-rw-r--r--nest/password.h7
3 files changed, 36 insertions, 2 deletions
diff --git a/nest/config.Y b/nest/config.Y
index b0634a62..bb1328cc 100644
--- a/nest/config.Y
+++ b/nest/config.Y
@@ -19,7 +19,7 @@ CF_DECLS
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE)
-CF_KEYWORDS(PASSWORD, FROM, TO, ID)
+CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID)
%type <i> idval
%type <f> imexport
@@ -148,6 +148,7 @@ password_items:
/* empty */ { }
| FROM datetime password_items { last_password_item->from = $2; }
| TO datetime password_items { last_password_item->to = $2; }
+ | PASSIVE datetime password_items { last_password_item->passive = $2; }
| ID NUM password_items { last_password_item->id = $2; }
;
diff --git a/nest/password.c b/nest/password.c
index ff084b41..ce7941ea 100644
--- a/nest/password.c
+++ b/nest/password.c
@@ -10,3 +10,31 @@
#include "nest/password.h"
struct password_item *last_password_item = NULL;
+
+static int
+password_goodness(struct password_item *i)
+{
+ if (i->from > now)
+ return 0;
+ if (i->to < now)
+ return 0;
+ if (i->passive < now)
+ return 1;
+ return 2;
+}
+
+struct password_item *
+get_best_password(struct password_item *head, int flags)
+{
+ int good = -1;
+ struct password_item *best = NULL;
+
+ while (head) {
+ int cur = password_goodness(head);
+ if (cur > good) {
+ good = cur;
+ best = head;
+ }
+ }
+ return best;
+}
diff --git a/nest/password.h b/nest/password.h
index b457495a..16f4385a 100644
--- a/nest/password.h
+++ b/nest/password.h
@@ -8,12 +8,17 @@
#ifndef PASSWORD_H
#define PASSWORD_H
+#include "lib/timer.h"
+
struct password_item {
struct password_item *next;
char *password;
int id;
- unsigned int from, to; /* We really don't care about time before 1970 */
+ bird_clock_t from, passive, to;
};
extern struct password_item *last_password_item;
+
+struct password_item *get_best_password(struct password_item *head, int flags);
+
#endif