socsvn commit: r271471 - soc2014/zkorchev/freebsd_head/sbin/ifconfig
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Mon Jul 28 10:51:20 UTC 2014
Author: zkorchev
Date: Mon Jul 28 10:51:16 2014
New Revision: 271471
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271471
Log:
ifconfig partial support for libsol
Modified:
soc2014/zkorchev/freebsd_head/sbin/ifconfig/Makefile
soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet6.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_link.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_nd6.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/carp.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.h
soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmac.c
soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmedia.c
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/Makefile Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/Makefile Mon Jul 28 10:51:16 2014 (r271471)
@@ -58,6 +58,9 @@
LDADD+= -ljail
.endif
+LDADD+= -lsol
+CFLAGS+= -DSOL_ON -I/usr/local/include
+
MAN= ifconfig.8
CFLAGS+= -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wnested-externs
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -50,6 +50,9 @@
#include <netinet/in_var.h>
#include <arpa/inet.h>
#include <netdb.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -67,6 +70,41 @@
if (sin == NULL)
return;
+#if defined(SOL_ON)
+ if (sol_format) {
+ const char *inet = inet_ntoa(sin->sin_addr);
+
+ SOL_MAP_KEYL(&sol_stream, "inet");
+ sol_string(&sol_stream, inet, strlen(inet));
+
+ if (ifa->ifa_flags & IFF_POINTOPOINT) {
+ sin = ifa->ifa_dstaddr ?
+ (struct sockaddr_in *)ifa->ifa_dstaddr : &null_sin;
+ inet = inet_ntoa(sin->sin_addr);
+ SOL_MAP_KEYL(&sol_stream, "-->");
+ sol_string(&sol_stream, inet, strlen(inet));
+ }
+
+ sin = ifa->ifa_netmask ?
+ (struct sockaddr_in *)ifa->ifa_netmask : &null_sin;
+ SOL_MAP_KEYL(&sol_stream, "netmask");
+ sol_uinteger(&sol_stream, ntohl(sin->sin_addr.s_addr));
+
+ if (ifa->ifa_flags & IFF_BROADCAST) {
+ sin = (struct sockaddr_in *)ifa->ifa_broadaddr;
+ if (sin != NULL && sin->sin_addr.s_addr != 0) {
+ inet = inet_ntoa(sin->sin_addr);
+ SOL_MAP_KEYL(&sol_stream, "broadcast");
+ sol_string(&sol_stream, inet, strlen(inet));
+ }
+ }
+
+ print_vhid(ifa, " ");
+
+ return;
+ }
+#endif
+
printf("\tinet %s ", inet_ntoa(sin->sin_addr));
if (ifa->ifa_flags & IFF_POINTOPOINT) {
@@ -170,7 +208,16 @@
if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, NI_NUMERICHOST) != 0)
dst[0] = '\0';
- printf("\ttunnel inet %s --> %s\n", src, dst);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "tunnel inet src");
+ sol_string(&sol_stream, src, strlen(src));
+ SOL_MAP_KEYL(&sol_stream, "tunnel inet dst");
+ sol_string(&sol_stream, dst, strlen(dst));
+ }
+ else
+#endif
+ printf("\ttunnel inet %s --> %s\n", src, dst);
}
static void
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet6.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet6.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_inet6.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -51,6 +51,9 @@
#include <netinet/in_var.h>
#include <arpa/inet.h>
#include <netdb.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include <netinet6/nd6.h> /* Define ND6_INFINITE_LIFETIME */
@@ -208,7 +211,14 @@
if (error != 0)
inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
sizeof(addr_buf));
- printf("\tinet6 %s ", addr_buf);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "inet6");
+ sol_string(&sol_stream, addr_buf, strlen(addr_buf));
+ }
+ else
+#endif
+ printf("\tinet6 %s ", addr_buf);
if (ifa->ifa_flags & IFF_POINTOPOINT) {
sin = (struct sockaddr_in6 *)ifa->ifa_dstaddr;
@@ -226,15 +236,78 @@
if (error != 0)
inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
sizeof(addr_buf));
- printf("--> %s ", addr_buf);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "-->");
+ sol_string(&sol_stream, addr_buf, strlen(addr_buf));
+ }
+ else
+#endif
+ printf("--> %s ", addr_buf);
}
}
sin = (struct sockaddr_in6 *)ifa->ifa_netmask;
if (sin == NULL)
sin = &null_sin;
- printf("prefixlen %d ", prefix(&sin->sin6_addr,
- sizeof(struct in6_addr)));
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "prefixlen");
+ sol_integer(&sol_stream, prefix(&sin->sin6_addr,
+ sizeof(struct in6_addr)));
+ }
+ else
+#endif
+ printf("prefixlen %d ", prefix(&sin->sin6_addr,
+ sizeof(struct in6_addr)));
+
+#if defined(SOL_ON)
+# define S(s) sol_string(&sol_stream, s, sizeof(s) - 1)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "inet6 iff");
+ sol_array_start(&sol_stream);
+ if ((flags6 & IN6_IFF_ANYCAST) != 0) S("anycast");
+ if ((flags6 & IN6_IFF_TENTATIVE) != 0) S("tentative");
+ if ((flags6 & IN6_IFF_DUPLICATED) != 0) S("duplicated");
+ if ((flags6 & IN6_IFF_DETACHED) != 0) S("detached");
+ if ((flags6 & IN6_IFF_DEPRECATED) != 0) S("deprecated");
+ if ((flags6 & IN6_IFF_AUTOCONF) != 0) S("autoconf");
+ if ((flags6 & IN6_IFF_TEMPORARY) != 0) S("temporary");
+ sol_array_end(&sol_stream);
+
+ if (((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id) {
+ SOL_MAP_KEYL(&sol_stream, "scopeid");
+ sol_uinteger(&sol_stream,
+ ((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id);
+ }
+
+ if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
+ SOL_MAP_KEYL(&sol_stream, "pltime");
+ if (lifetime.ia6t_preferred) {
+ const char *pltime = lifetime.ia6t_preferred < t
+ ? "0" : sec2str(lifetime.ia6t_preferred - t);
+
+ sol_string(&sol_stream, pltime, strlen(pltime));
+ } else
+ S("infty");
+
+ SOL_MAP_KEYL(&sol_stream, "vltime");
+ if (lifetime.ia6t_expire) {
+ const char *vltime = lifetime.ia6t_expire < t
+ ? "0" : sec2str(lifetime.ia6t_expire - t);
+
+ sol_string(&sol_stream, vltime, strlen(vltime));
+ } else
+ S("infty");
+ }
+
+ print_vhid(ifa, " ");
+
+ return;
+ }
+# undef S
+#endif
if ((flags6 & IN6_IFF_ANYCAST) != 0)
printf("anycast ");
@@ -253,7 +326,7 @@
if (((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id)
printf("scopeid 0x%x ",
- ((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id);
+ ((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id);
if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
printf("pltime ");
@@ -434,7 +507,16 @@
NI_NUMERICHOST) != 0)
dst[0] = '\0';
- printf("\ttunnel inet6 %s --> %s\n", src, dst);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "tunnel inet6 src");
+ sol_string(&sol_stream, src, strlen(src));
+ SOL_MAP_KEYL(&sol_stream, "tunnel inet6 dst");
+ sol_string(&sol_stream, dst, strlen(dst));
+ }
+ else
+#endif
+ printf("\ttunnel inet6 %s --> %s\n", src, dst);
}
static void
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_link.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_link.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_link.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -46,6 +46,9 @@
#include <net/if_dl.h>
#include <net/if_types.h>
#include <net/ethernet.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -56,18 +59,36 @@
{
/* XXX no const 'cuz LLADDR is defined wrong */
struct sockaddr_dl *sdl = (struct sockaddr_dl *) ifa->ifa_addr;
+ const char *address;
if (sdl != NULL && sdl->sdl_alen > 0) {
if ((sdl->sdl_type == IFT_ETHER ||
sdl->sdl_type == IFT_L2VLAN ||
sdl->sdl_type == IFT_BRIDGE) &&
- sdl->sdl_alen == ETHER_ADDR_LEN)
- printf("\tether %s\n",
- ether_ntoa((struct ether_addr *)LLADDR(sdl)));
+ sdl->sdl_alen == ETHER_ADDR_LEN) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ address = ether_ntoa((struct ether_addr *)LLADDR(sdl));
+ SOL_MAP_KEYL(&sol_stream, "ether");
+ sol_string(&sol_stream, address, strlen(address));
+ }
+ else
+#endif
+ printf("\tether %s\n",
+ ether_ntoa((struct ether_addr *)LLADDR(sdl)));
+ }
else {
int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
- printf("\tlladdr %s\n", link_ntoa(sdl) + n);
+#if defined(SOL_ON)
+ if (sol_format) {
+ address = link_ntoa(sdl) + n;
+ SOL_MAP_KEYL(&sol_stream, "lladdr");
+ sol_string(&sol_stream, address, strlen(address));
+ }
+ else
+#endif
+ printf("\tlladdr %s\n", link_ntoa(sdl) + n);
}
}
}
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_nd6.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_nd6.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/af_nd6.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -52,6 +52,9 @@
#include <netdb.h>
#include <netinet6/nd6.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -163,7 +166,15 @@
close(s6);
if (nd.ndi.flags == 0 && !isdefif)
return;
- printb("\tnd6 options",
- (unsigned int)(nd.ndi.flags | (isdefif << 15)), ND6BITS);
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format)
+ printb("nd6 options",
+ (unsigned int)(nd.ndi.flags | (isdefif << 15)), ND6BITS);
+ else
+#endif
+ {
+ printb("\tnd6 options",
+ (unsigned int)(nd.ndi.flags | (isdefif << 15)), ND6BITS);
+ putchar('\n');
+ }
}
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/carp.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/carp.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/carp.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -48,6 +48,9 @@
#include <unistd.h>
#include <err.h>
#include <errno.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -79,6 +82,33 @@
if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
return;
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "carp");
+ sol_array_start(&sol_stream);
+ for (i = 0; i < carpr[0].carpr_count; i++) {
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "state");
+ sol_string(&sol_stream, carp_states[carpr[i].carpr_state],
+ strlen(carp_states[carpr[i].carpr_state]));
+ SOL_MAP_KEYL(&sol_stream, "vhid");
+ sol_integer(&sol_stream, carpr[i].carpr_vhid);
+ SOL_MAP_KEYL(&sol_stream, "advbase");
+ sol_integer(&sol_stream, carpr[i].carpr_advbase);
+ SOL_MAP_KEYL(&sol_stream, "advskew");
+ sol_integer(&sol_stream, carpr[i].carpr_advskew);
+ if (printkeys && carpr[i].carpr_key[0] != '\0') {
+ SOL_MAP_KEYL(&sol_stream, "key");
+ sol_string(&sol_stream, carpr[i].carpr_key, strlen(carpr[i].carpr_key));
+ }
+ sol_map_end(&sol_stream);
+ }
+ sol_array_end(&sol_stream);
+
+ return;
+ }
+#endif
+
for (i = 0; i < carpr[0].carpr_count; i++) {
printf("\tcarp: %s vhid %d advbase %d advskew %d",
carp_states[carpr[i].carpr_state], carpr[i].carpr_vhid,
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -73,6 +73,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -94,6 +97,11 @@
int verbose;
int noload;
+#if defined(SOL_ON)
+struct sol_stream sol_stream;
+#endif
+int sol_format;
+
int supmedia = 0;
int printkeys = 0; /* Print keying material for interfaces. */
@@ -287,6 +295,10 @@
err(EXIT_FAILURE, "getifaddrs");
cp = NULL;
ifindex = 0;
+#if defined(SOL_ON)
+ sol_format = sol_init(&sol_stream);
+ if (sol_format) sol_map_start(&sol_stream);
+#endif
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
memset(&paifr, 0, sizeof(paifr));
strncpy(paifr.ifr_name, ifa->ifa_name, sizeof(paifr.ifr_name));
@@ -351,8 +363,15 @@
else
status(afp, sdl, ifa);
}
- if (namesonly)
- printf("\n");
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_map_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+ else
+#endif
+ if (namesonly)
+ printf("\n");
freeifaddrs(ifap);
exit(0);
@@ -931,13 +950,32 @@
if (s < 0)
err(1, "socket(family %u,SOCK_DGRAM)", ifr.ifr_addr.sa_family);
- printf("%s: ", name);
- printb("flags", ifa->ifa_flags, IFFBITS);
- if (ioctl(s, SIOCGIFMETRIC, &ifr) != -1)
- printf(" metric %d", ifr.ifr_metric);
- if (ioctl(s, SIOCGIFMTU, &ifr) != -1)
- printf(" mtu %d", ifr.ifr_mtu);
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_map_key(&sol_stream, name, strlen(name));
+ sol_map_start(&sol_stream);
+ printb("flags", ifa->ifa_flags, IFFBITS);
+ if (ioctl(s, SIOCGIFMETRIC, &ifr) != -1) {
+ SOL_MAP_KEYL(&sol_stream, "metric");
+ sol_integer(&sol_stream, ifr.ifr_metric);
+ }
+ if (ioctl(s, SIOCGIFMTU, &ifr) != -1) {
+ SOL_MAP_KEYL(&sol_stream, "mtu");
+ sol_integer(&sol_stream, ifr.ifr_mtu);
+ }
+ }
+ else
+#endif
+ {
+ printf("%s: ", name);
+ printb("flags", ifa->ifa_flags, IFFBITS);
+ if (ioctl(s, SIOCGIFMETRIC, &ifr) != -1)
+ printf(" metric %d", ifr.ifr_metric);
+ if (ioctl(s, SIOCGIFMTU, &ifr) != -1)
+ printf(" mtu %d", ifr.ifr_mtu);
+ putchar('\n');
+ }
for (;;) {
if ((descr = reallocf(descr, descrlen)) != NULL) {
@@ -945,9 +983,18 @@
ifr.ifr_buffer.length = descrlen;
if (ioctl(s, SIOCGIFDESCR, &ifr) == 0) {
if (ifr.ifr_buffer.buffer == descr) {
- if (strlen(descr) > 0)
- printf("\tdescription: %s\n",
- descr);
+ size_t len = strlen(descr);
+
+ if (len > 0) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "description");
+ sol_string(&sol_stream, descr, len);
+ }
+ else
+#endif
+ printf("\tdescription: %s\n", descr);
+ }
} else if (ifr.ifr_buffer.length > descrlen) {
descrlen = ifr.ifr_buffer.length;
continue;
@@ -960,13 +1007,25 @@
}
if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) {
- if (ifr.ifr_curcap != 0) {
- printb("\toptions", ifr.ifr_curcap, IFCAPBITS);
- putchar('\n');
- }
- if (supmedia && ifr.ifr_reqcap != 0) {
- printb("\tcapabilities", ifr.ifr_reqcap, IFCAPBITS);
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ if (ifr.ifr_curcap != 0)
+ printb("options", ifr.ifr_curcap, IFCAPBITS);
+ if (supmedia && ifr.ifr_reqcap != 0)
+ printb("capabilities", ifr.ifr_reqcap, IFCAPBITS);
+ }
+ else
+#endif
+ {
+ if (ifr.ifr_curcap != 0) {
+ printb("\toptions", ifr.ifr_curcap, IFCAPBITS);
+ putchar('\n');
+ }
+ if (supmedia && ifr.ifr_reqcap != 0) {
+ printb("\tcapabilities", ifr.ifr_reqcap, IFCAPBITS);
+ putchar('\n');
+ }
}
}
@@ -1011,6 +1070,10 @@
if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0)
printf("%s", ifs.ascii);
+#if defined(SOL_ON)
+ if (sol_format) sol_map_end(&sol_stream);
+#endif
+
close(s);
return;
}
@@ -1048,6 +1111,34 @@
int i, any = 0;
char c;
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_map_key(&sol_stream, s, strlen(s));
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "value");
+ sol_integer(&sol_stream, v);
+ SOL_MAP_KEYL(&sol_stream, "list");
+ if (++bits) {
+ const char *start;
+
+ sol_array_start(&sol_stream);
+ while ((i = *bits++) != '\0') {
+ if (v & (1 << (i-1))) {
+ start = bits;
+ while ((c = *bits) > 32)
+ bits++;
+ sol_string(&sol_stream, start, bits - start);
+ } else
+ for (; *bits > 32; bits++)
+ ;
+ }
+ sol_array_end(&sol_stream);
+ }
+ sol_map_end(&sol_stream);
+ return;
+ }
+#endif
+
if (bits && *bits == 8)
printf("%s=%o", s, v);
else
@@ -1081,8 +1172,15 @@
ifd = ifa->ifa_data;
if (ifd->ifi_vhid == 0)
return;
-
- printf("vhid %d ", ifd->ifi_vhid);
+
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "vhid");
+ sol_integer(&sol_stream, ifd->ifi_vhid);
+ }
+ else
+#endif
+ printf("vhid %d ", ifd->ifi_vhid);
}
void
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.h
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.h Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifconfig.h Mon Jul 28 10:51:16 2014 (r271471)
@@ -36,6 +36,11 @@
#define __constructor __attribute__((constructor))
+#if defined(SOL_ON)
+extern struct sol_stream sol_stream;
+#endif
+extern int sol_format;
+
struct afswtch;
struct cmd;
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmac.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmac.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmac.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -46,6 +46,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -55,6 +58,7 @@
struct ifreq ifr;
mac_t label;
char *label_text;
+ size_t len;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
@@ -69,8 +73,17 @@
if (mac_to_text(label, &label_text) == -1)
goto mac_free;
- if (strlen(label_text) != 0)
- printf("\tmaclabel %s\n", label_text);
+ len = strlen(label_text);
+ if (len != 0) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "maclabel");
+ sol_string(&sol_stream, label_text, len);
+ }
+ else
+#endif
+ printf("\tmaclabel %s\n", label_text);
+ }
free(label_text);
mac_free:
Modified: soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmedia.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmedia.c Mon Jul 28 08:22:08 2014 (r271470)
+++ soc2014/zkorchev/freebsd_head/sbin/ifconfig/ifmedia.c Mon Jul 28 10:51:16 2014 (r271471)
@@ -82,6 +82,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
#include "ifconfig.h"
@@ -133,56 +136,111 @@
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
err(1, "SIOCGIFMEDIA");
- printf("\tmedia: ");
- print_media_word(ifmr.ifm_current, 1);
- if (ifmr.ifm_active != ifmr.ifm_current) {
- putchar(' ');
- putchar('(');
- print_media_word(ifmr.ifm_active, 0);
- putchar(')');
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "media");
+ sol_map_start(&sol_stream);
+ print_media_word(ifmr.ifm_current, 1);
+ if (ifmr.ifm_active != ifmr.ifm_current) {
+ SOL_MAP_KEYL(&sol_stream, "active");
+ sol_map_start(&sol_stream);
+ print_media_word(ifmr.ifm_active, 0);
+ sol_map_end(&sol_stream);
+ }
+ sol_map_end(&sol_stream);
}
+ else
+#endif
+ {
+ printf("\tmedia: ");
+ print_media_word(ifmr.ifm_current, 1);
+ if (ifmr.ifm_active != ifmr.ifm_current) {
+ putchar(' ');
+ putchar('(');
+ print_media_word(ifmr.ifm_active, 0);
+ putchar(')');
+ }
- putchar('\n');
+ putchar('\n');
+ }
if (ifmr.ifm_status & IFM_AVALID) {
- printf("\tstatus: ");
+ const char *status = 0;
+ size_t status_len;
+
+#define set(s) do { \
+ status = s; \
+ status_len = sizeof(s) - 1; \
+} while (0)
+
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ printf("\tstatus: ");
switch (IFM_TYPE(ifmr.ifm_active)) {
case IFM_ETHER:
case IFM_ATM:
if (ifmr.ifm_status & IFM_ACTIVE)
- printf("active");
+ set("active");
else
- printf("no carrier");
+ set("no carrier");
break;
case IFM_FDDI:
case IFM_TOKEN:
if (ifmr.ifm_status & IFM_ACTIVE)
- printf("inserted");
+ set("inserted");
else
- printf("no ring");
+ set("no ring");
break;
case IFM_IEEE80211:
if (ifmr.ifm_status & IFM_ACTIVE) {
/* NB: only sta mode associates */
if (IFM_OPMODE(ifmr.ifm_active) == IFM_IEEE80211_STA)
- printf("associated");
+ set("associated");
else
- printf("running");
+ set("running");
} else
- printf("no carrier");
+ set("no carrier");
break;
}
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "status");
+ if (status_len)
+ sol_string(&sol_stream, status, status_len);
+ }
+ else
+#endif
+ putchar('\n');
+
+#undef set
}
if (ifmr.ifm_count > 0 && supmedia) {
- printf("\tsupported media:\n");
- for (i = 0; i < ifmr.ifm_count; i++) {
- printf("\t\t");
- print_media_word_ifconfig(media_list[i]);
- putchar('\n');
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "supported media");
+ sol_array_start(&sol_stream);
+ for (i = 0; i < ifmr.ifm_count; i++) {
+ sol_map_start(&sol_stream);
+ print_media_word_ifconfig(media_list[i]);
+ sol_map_end(&sol_stream);
+ }
+ sol_array_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("\tsupported media:\n");
+ for (i = 0; i < ifmr.ifm_count; i++) {
+ printf("\t\t");
+ print_media_word_ifconfig(media_list[i]);
+ putchar('\n');
+ }
}
}
@@ -703,10 +761,20 @@
desc = get_toptype_desc(ifmw);
ttos = get_toptype_ttos(ifmw);
if (desc->ifmt_string == NULL) {
- printf("<unknown type>");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ printf("<unknown type>");
return;
} else if (print_toptype) {
- printf("%s", desc->ifmt_string);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "type");
+ sol_string(&sol_stream, desc->ifmt_string, strlen(desc->ifmt_string));
+ }
+ else
+#endif
+ printf("%s", desc->ifmt_string);
}
/*
@@ -717,39 +785,87 @@
/* Find subtype. */
desc = get_subtype_desc(ifmw, ttos);
if (desc == NULL) {
- printf("<unknown subtype>");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ printf("<unknown subtype>");
return;
}
- if (print_toptype)
- putchar(' ');
-
- printf("%s", desc->ifmt_string);
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ if (print_toptype)
+ putchar(' ');
+
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "subtype");
+ sol_string(&sol_stream, desc->ifmt_string, strlen(desc->ifmt_string));
+ }
+ else
+#endif
+ printf("%s", desc->ifmt_string);
if (print_toptype) {
desc = get_mode_desc(ifmw, ttos);
- if (desc != NULL && strcasecmp("autoselect", desc->ifmt_string))
- printf(" mode %s", desc->ifmt_string);
+ if (desc != NULL && strcasecmp("autoselect", desc->ifmt_string)) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "mode");
+ sol_string(&sol_stream, desc->ifmt_string, strlen(desc->ifmt_string));
+ }
+ else
+#endif
+ printf(" mode %s", desc->ifmt_string);
+ }
}
/* Find options. */
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "options");
+ sol_array_start(&sol_stream);
+ }
+#endif
for (i = 0; ttos->options[i].desc != NULL; i++) {
if (ttos->options[i].alias)
continue;
for (desc = ttos->options[i].desc;
desc->ifmt_string != NULL; desc++) {
if (ifmw & desc->ifmt_word) {
- if (seen_option == 0)
- printf(" <");
- printf("%s%s", seen_option++ ? "," : "",
- desc->ifmt_string);
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_string(&sol_stream,
+ desc->ifmt_string, strlen(desc->ifmt_string));
+ else
+#endif
+ {
+ if (seen_option == 0)
+ printf(" <");
+ printf("%s%s", seen_option++ ? "," : "",
+ desc->ifmt_string);
+ }
}
}
}
- printf("%s", seen_option ? ">" : "");
-
- if (print_toptype && IFM_INST(ifmw) != 0)
- printf(" instance %d", IFM_INST(ifmw));
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_array_end(&sol_stream);
+ else
+#endif
+ printf("%s", seen_option ? ">" : "");
+
+ if (print_toptype && IFM_INST(ifmw) != 0) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "instance");
+ sol_integer(&sol_stream, IFM_INST(ifmw));
+ }
+ else
+#endif
+ printf(" instance %d", IFM_INST(ifmw));
+ }
}
static void
@@ -763,7 +879,10 @@
desc = get_toptype_desc(ifmw);
ttos = get_toptype_ttos(ifmw);
if (desc->ifmt_string == NULL) {
- printf("<unknown type>");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ printf("<unknown type>");
return;
}
@@ -775,33 +894,76 @@
/* Find subtype. */
desc = get_subtype_desc(ifmw, ttos);
if (desc == NULL) {
- printf("<unknown subtype>");
+#if defined(SOL_ON)
+ if (!sol_format)
+#endif
+ printf("<unknown subtype>");
return;
}
- printf("media %s", desc->ifmt_string);
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "media");
+ sol_string(&sol_stream, desc->ifmt_string, strlen(desc->ifmt_string));
+ }
+ else
+#endif
+ printf("media %s", desc->ifmt_string);
desc = get_mode_desc(ifmw, ttos);
- if (desc != NULL)
- printf(" mode %s", desc->ifmt_string);
+ if (desc != NULL) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "mode");
+ sol_string(&sol_stream, desc->ifmt_string, strlen(desc->ifmt_string));
+ }
+ else
+#endif
+ printf(" mode %s", desc->ifmt_string);
+ }
/* Find options. */
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "options");
+ sol_array_start(&sol_stream);
+ }
+#endif
for (i = 0; ttos->options[i].desc != NULL; i++) {
if (ttos->options[i].alias)
continue;
for (desc = ttos->options[i].desc;
desc->ifmt_string != NULL; desc++) {
if (ifmw & desc->ifmt_word) {
- if (seen_option == 0)
- printf(" mediaopt ");
- printf("%s%s", seen_option++ ? "," : "",
- desc->ifmt_string);
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_string(&sol_stream,
+ desc->ifmt_string, strlen(desc->ifmt_string));
+ else
+#endif
+ {
+ if (seen_option == 0)
+ printf(" mediaopt ");
+ printf("%s%s", seen_option++ ? "," : "",
+ desc->ifmt_string);
+ }
}
}
}
-
- if (IFM_INST(ifmw) != 0)
- printf(" instance %d", IFM_INST(ifmw));
+#if defined(SOL_ON)
+ if (sol_format) sol_array_end(&sol_stream);
+#endif
+
+ if (IFM_INST(ifmw) != 0) {
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "instance");
+ sol_integer(&sol_stream, IFM_INST(ifmw));
+ }
+ else
+#endif
+ printf(" instance %d", IFM_INST(ifmw));
+ }
}
/**********************************************************************
More information about the svn-soc-all
mailing list