summaryrefslogtreecommitdiff
path: root/sbin/routed/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/routed/trace.c')
-rw-r--r--sbin/routed/trace.c92
1 files changed, 80 insertions, 12 deletions
diff --git a/sbin/routed/trace.c b/sbin/routed/trace.c
index 55add251038..3bce42f7917 100644
--- a/sbin/routed/trace.c
+++ b/sbin/routed/trace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trace.c,v 1.4 1996/09/06 13:05:02 deraadt Exp $ */
+/* $OpenBSD: trace.c,v 1.5 1996/10/02 06:51:47 mickey Exp $ */
/* $NetBSD: trace.c,v 1.13 1995/06/20 22:28:03 christos Exp $ */
/*
@@ -37,7 +37,7 @@
#if !defined(lint)
static char sccsid[] = "@(#)trace.c 8.1 (Berkeley) 6/5/93";
#else
-static char rcsid[] = "$OpenBSD: trace.c,v 1.4 1996/09/06 13:05:02 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: trace.c,v 1.5 1996/10/02 06:51:47 mickey Exp $";
#endif
#define RIPCMDS
@@ -61,6 +61,8 @@ static char *tracelevel_pat = "%s\n";
char savetracename[MAXPATHLEN+1];
+static void trace_dump(void);
+
/* convert IP address to a string, but not into a single buffer
*/
@@ -207,27 +209,31 @@ trace_on(char *filename,
}
filename = savetracename;
- } else if (lstat(filename, &stbuf) >= 0) {
- if (!trusted) {
- msglog("trace file \"%s\" already exists");
- return;
- }
- if ((stbuf.st_mode & S_IFMT) != S_IFREG) {
+ } else if (!strcmp(filename,"dump/../table")) {
+ trace_dump();
+ return;
+
+ } else {
+ if (stat(filename, &stbuf) >= 0
+ && (stbuf.st_mode & S_IFMT) != S_IFREG) {
msglog("wrong type (%#x) of trace file \"%s\"",
stbuf.st_mode, filename);
return;
}
if (!trusted
- && strcmp(filename, savetracename)
- && strncmp(filename, _PATH_TRACE, sizeof(_PATH_TRACE)-1)) {
- msglog("wrong directory for trace file: \"%s\"",
+#ifdef _PATH_TRACE
+ && (strncmp(filename, _PATH_TRACE, sizeof(_PATH_TRACE)-1)
+ || strstr(filename,"../")
+ || 0 > stat(_PATH_TRACE, &stbuf))
+#endif
+ && strcmp(filename, savetracename)) {
+ msglog("wrong directory for trace file \"%s\"",
filename);
return;
}
}
- /* XXX lstat -> fopen race */
n_ftrace = fopen(filename, "a");
if (n_ftrace == 0) {
msglog("failed to open trace file \"%s\" %s",
@@ -704,6 +710,68 @@ trace_add_del(char * action, struct rt_entry *rt)
}
+/* ARGSUSED */
+static int
+walk_trace(struct radix_node *rn,
+ struct walkarg *w)
+{
+#define RT ((struct rt_entry *)rn)
+ struct rt_spare *rts;
+ int i, age;
+
+ (void)fprintf(ftrace, " %-35s metric=%-2d ",
+ trace_pair(RT->rt_dst, RT->rt_mask,
+ naddr_ntoa(RT->rt_gate)),
+ RT->rt_metric);
+ if (RT->rt_router != RT->rt_gate)
+ (void)fprintf(ftrace, "router=%s ",
+ naddr_ntoa(RT->rt_router));
+ if (RT->rt_tag != 0)
+ (void)fprintf(ftrace, "tag=%#x ",
+ ntohs(RT->rt_tag));
+ trace_bits(rs_bits, RT->rt_state, 0);
+ (void)fprintf(ftrace, "%s ",
+ RT->rt_ifp == 0 ? "?" : RT->rt_ifp->int_name);
+ age = AGE_RT(RT->rt_state, RT->rt_ifp);
+ if (age)
+ (void)fprintf(ftrace, "%s", ts(RT->rt_time));
+
+ rts = &RT->rt_spares[1];
+ for (i = 1; i < NUM_SPARES; i++, rts++) {
+ if (rts->rts_metric != HOPCNT_INFINITY) {
+ (void)fprintf(ftrace,"\n #%d%15s%-16s metric=%-2d ",
+ i, "", naddr_ntoa(rts->rts_gate),
+ rts->rts_metric);
+ if (rts->rts_router != rts->rts_gate)
+ (void)fprintf(ftrace, "router=%s ",
+ naddr_ntoa(rts->rts_router));
+ if (rts->rts_tag != 0)
+ (void)fprintf(ftrace, "tag=%#x ",
+ ntohs(rts->rts_tag));
+ (void)fprintf(ftrace, "%s ",
+ (rts->rts_ifp == 0
+ ? "?" : rts->rts_ifp->int_name));
+ if (age)
+ (void)fprintf(ftrace, "%s", ts(rts->rts_time));
+ }
+ }
+ (void)fputc('\n',ftrace);
+
+ return 0;
+}
+
+
+static void
+trace_dump(void)
+{
+ if (ftrace == 0)
+ return;
+ lastlog();
+
+ (void)rn_walktree(rhead, walk_trace, 0);
+}
+
+
void
trace_rip(char *dir1, char *dir2,
struct sockaddr_in *who,