]> git.saurik.com Git - apple/network_cmds.git/blob - rtsol.tproj/dump.c
c42f8f545d4ec6a8a7f865d966112f4e3b39012e
[apple/network_cmds.git] / rtsol.tproj / dump.c
1 /*
2 * Copyright (c) 2009 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29 /* $KAME: dump.c,v 1.8 2000/10/05 22:20:39 itojun Exp $ */
30
31 /*
32 * Copyright (C) 1999 WIDE Project.
33 * All rights reserved.
34 *
35 * Redistribution and use in source and binary forms, with or without
36 * modification, are permitted provided that the following conditions
37 * are met:
38 * 1. Redistributions of source code must retain the above copyright
39 * notice, this list of conditions and the following disclaimer.
40 * 2. Redistributions in binary form must reproduce the above copyright
41 * notice, this list of conditions and the following disclaimer in the
42 * documentation and/or other materials provided with the distribution.
43 * 3. Neither the name of the project nor the names of its contributors
44 * may be used to endorse or promote products derived from this software
45 * without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * SUCH DAMAGE.
58 *
59 * $FreeBSD: src/usr.sbin/rtsold/dump.c,v 1.1.2.3 2001/07/03 11:02:16 ume Exp $
60 */
61
62 #include <sys/types.h>
63 #include <sys/time.h>
64 #include <sys/socket.h>
65
66 #include <net/if.h>
67 #include <netinet/in.h>
68 #include <netinet/icmp6.h>
69
70 #include <syslog.h>
71 #include <time.h>
72 #include <stdio.h>
73 #include <string.h>
74 #include <errno.h>
75
76 #include "rtsold.h"
77
78 static FILE *fp;
79
80 extern struct ifinfo *iflist;
81
82 static void dump_interface_status __P((void));
83 static char *sec2str __P((time_t));
84 char *ifstatstr[] = {"IDLE", "DELAY", "PROBE", "DOWN", "TENTATIVE"};
85
86 static void
87 dump_interface_status()
88 {
89 struct ifinfo *ifinfo;
90 struct timeval now;
91
92 gettimeofday(&now, NULL);
93
94 for (ifinfo = iflist; ifinfo; ifinfo = ifinfo->next) {
95 fprintf(fp, "Interface %s\n", ifinfo->ifname);
96 fprintf(fp, " probe interval: ");
97 if (ifinfo->probeinterval) {
98 fprintf(fp, "%d\n", ifinfo->probeinterval);
99 fprintf(fp, " probe timer: %d\n", ifinfo->probetimer);
100 }
101 else {
102 fprintf(fp, "infinity\n");
103 fprintf(fp, " no probe timer\n");
104 }
105 fprintf(fp, " interface status: %s\n",
106 ifinfo->active > 0 ? "active" : "inactive");
107 fprintf(fp, " rtsold status: %s\n", ifstatstr[ifinfo->state]);
108 fprintf(fp, " carrier detection: %s\n",
109 ifinfo->mediareqok ? "available" : "unavailable");
110 fprintf(fp, " probes: %d, dadcount = %d\n",
111 ifinfo->probes, ifinfo->dadcount);
112 if (ifinfo->timer.tv_sec == tm_max.tv_sec &&
113 ifinfo->timer.tv_usec == tm_max.tv_usec)
114 fprintf(fp, " no timer\n");
115 else {
116 fprintf(fp, " timer: interval=%d:%d, expire=%s\n",
117 (int)ifinfo->timer.tv_sec,
118 (int)ifinfo->timer.tv_usec,
119 (ifinfo->expire.tv_sec < now.tv_sec) ? "expired"
120 : sec2str(ifinfo->expire.tv_sec - now.tv_sec));
121 }
122 fprintf(fp, " number of valid RAs: %d\n", ifinfo->racnt);
123 }
124 }
125
126 void
127 rtsold_dump_file(dumpfile)
128 char *dumpfile;
129 {
130 if ((fp = fopen(dumpfile, "w")) == NULL) {
131 warnmsg(LOG_WARNING, __FUNCTION__, "open a dump file(%s): %s",
132 dumpfile, strerror(errno));
133 return;
134 }
135
136 dump_interface_status();
137
138 fclose(fp);
139 }
140
141 static char *
142 sec2str(total)
143 time_t total;
144 {
145 static char result[256];
146 int days, hours, mins, secs;
147 int first = 1;
148 char *p = result;
149
150 days = total / 3600 / 24;
151 hours = (total / 3600) % 24;
152 mins = (total / 60) % 60;
153 secs = total % 60;
154
155 if (days) {
156 first = 0;
157 p += snprintf(p, sizeof(result) - (p - result), "%dd", days);
158 }
159 if (!first || hours) {
160 first = 0;
161 p += snprintf(p, sizeof(result) - (p - result), "%dh", hours);
162 }
163 if (!first || mins) {
164 first = 0;
165 p += snprintf(p, sizeof(result) - (p - result), "%dm", mins);
166 }
167 snprintf(p, sizeof(result) - (p - result), "%ds", secs);
168
169 return(result);
170 }