aboutsummaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/unix-formats.c
diff options
context:
space:
mode:
Diffstat (limited to 'vppinfra/vppinfra/unix-formats.c')
-rw-r--r--vppinfra/vppinfra/unix-formats.c918
1 files changed, 0 insertions, 918 deletions
diff --git a/vppinfra/vppinfra/unix-formats.c b/vppinfra/vppinfra/unix-formats.c
deleted file mode 100644
index a4c81ca2f70..00000000000
--- a/vppinfra/vppinfra/unix-formats.c
+++ /dev/null
@@ -1,918 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifdef __KERNEL__
-
-# include <linux/unistd.h>
-# include <linux/signal.h>
-
-#else /* ! __KERNEL__ */
-
-#define _GNU_SOURCE /* to get REG_* in ucontext.h */
-#include <ucontext.h>
-#undef _GNU_SOURCE
-#undef __USE_GNU
-
-#include <unistd.h>
-#include <signal.h>
-
-#include <time.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <math.h>
-
-#include <vppinfra/time.h>
-
-#ifdef AF_NETLINK
-#include <linux/types.h>
-#include <linux/netlink.h>
-#endif
-
-#endif /* ! __KERNEL__ */
-
-
-#ifdef __KERNEL__
-# include <linux/socket.h>
-# include <linux/in.h>
-# include <linux/ip.h>
-# include <linux/tcp.h>
-# include <linux/udp.h>
-# include <linux/icmp.h>
-# include <linux/if_ether.h>
-# include <linux/if_arp.h>
-#else
-# include <net/if.h> /* struct ifnet may live here */
-# include <netinet/in.h>
-# include <netinet/ip.h>
-# include <netinet/tcp.h>
-# include <netinet/udp.h>
-# include <netinet/ip_icmp.h>
-# include <netinet/if_ether.h>
-#endif /* __KERNEL__ */
-
-#include <vppinfra/bitops.h> /* foreach_set_bit */
-#include <vppinfra/format.h>
-#include <vppinfra/error.h>
-
-/* Format unix network address family (e.g. AF_INET). */
-u8 * format_address_family (u8 * s, va_list * va)
-{
- uword family = va_arg (*va, uword);
- u8 * t = (u8 *) "UNKNOWN";
- switch (family)
- {
-#define _(x) case PF_##x: t = (u8 *) #x; break
- _ (UNSPEC);
- _ (UNIX); /* Unix domain sockets */
- _ (INET); /* Internet IP Protocol */
-#ifdef PF_AX25
- _ (AX25); /* Amateur Radio AX.25 */
-#endif
-#ifdef PF_IPX
- _ (IPX); /* Novell IPX */
-#endif
-#ifdef PF_APPLETALK
- _ (APPLETALK); /* AppleTalk DDP */
-#endif
-#ifdef PF_NETROM
- _ (NETROM); /* Amateur Radio NET/ROM */
-#endif
-#ifdef PF_BRIDGE
- _ (BRIDGE); /* Multiprotocol bridge */
-#endif
-#ifdef PF_ATMPVC
- _ (ATMPVC); /* ATM PVCs */
-#endif
-#ifdef PF_X25
- _ (X25); /* Reserved for X.25 project */
-#endif
-#ifdef PF_INET6
- _ (INET6); /* IP version 6 */
-#endif
-#ifdef PF_ROSE
- _ (ROSE); /* Amateur Radio X.25 PLP */
-#endif
-#ifdef PF_DECnet
- _ (DECnet); /* Reserved for DECnet project */
-#endif
-#ifdef PF_NETBEUI
- _ (NETBEUI); /* Reserved for 802.2LLC project*/
-#endif
-#ifdef PF_SECURITY
- _ (SECURITY); /* Security callback pseudo AF */
-#endif
-#ifdef PF_KEY
- _ (KEY); /* PF_KEY key management API */
-#endif
-#ifdef PF_NETLINK
- _ (NETLINK);
-#endif
-#ifdef PF_PACKET
- _ (PACKET); /* Packet family */
-#endif
-#ifdef PF_ASH
- _ (ASH); /* Ash */
-#endif
-#ifdef PF_ECONET
- _ (ECONET); /* Acorn Econet */
-#endif
-#ifdef PF_ATMSVC
- _ (ATMSVC); /* ATM SVCs */
-#endif
-#ifdef PF_SNA
- _ (SNA); /* Linux SNA Project */
-#endif
-#ifdef PF_IRDA
- _ (IRDA); /* IRDA sockets */
-#endif
-#undef _
- }
- vec_add (s, t, strlen ((char *) t));
- return s;
-}
-
-u8 * format_network_protocol (u8 * s, va_list * args)
-{
- uword family = va_arg (*args, uword);
- uword protocol = va_arg (*args, uword);
-
-#ifndef __KERNEL__
- struct protoent * p = getprotobynumber (protocol);
-
- ASSERT (family == AF_INET);
- if (p)
- return format (s, "%s", p->p_name);
- else
- return format (s, "%d", protocol);
-#else
- return format (s, "%d/%d", family, protocol);
-#endif
-}
-
-u8 * format_network_port (u8 * s, va_list * args)
-{
- uword proto = va_arg (*args, uword);
- uword port = va_arg (*args, uword);
-
-#ifndef __KERNEL__
- struct servent * p = getservbyport (port, proto == IPPROTO_UDP ? "udp" : "tcp");
-
- if (p)
- return format (s, "%s", p->s_name);
- else
- return format (s, "%d", port);
-#else
- return format (s, "%s/%d", proto == IPPROTO_UDP ? "udp" : "tcp", port);
-#endif
-}
-
-/* Format generic network address: takes two arguments family and address.
- Assumes network byte order. */
-u8 * format_network_address (u8 * s, va_list * args)
-{
- uword family = va_arg (*args, uword);
- u8 * addr = va_arg (*args, u8 *);
-
- switch (family)
- {
- case AF_INET:
- s = format (s, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
- break;
-
- case AF_UNSPEC:
- /* We use AF_UNSPEC for ethernet addresses. */
- s = format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
- addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
-
- default:
- clib_error ("unsupported address family %d", family);
- }
-
- return s;
-}
-
-u8 * format_sockaddr (u8 * s, va_list * args)
-{
- void * v = va_arg (*args, void *);
- struct sockaddr * sa = v;
-
- switch (sa->sa_family)
- {
- case AF_INET:
- {
- struct sockaddr_in * i = v;
- s = format (s, "%U:%U",
- format_network_address, AF_INET, &i->sin_addr.s_addr,
- format_network_port, IPPROTO_TCP, ntohs (i->sin_port));
- }
- break;
-
-#ifndef __KERNEL__
-#ifdef AF_NETLINK
- case AF_NETLINK:
- {
- struct sockaddr_nl * n = v;
- s = format (s, "KERNEL-NETLINK");
- if (n->nl_groups)
- s = format (s, " (groups 0x%x)", n->nl_groups);
- break;
- }
-#endif
-#endif
-
- default:
- s = format (s, "sockaddr family %d", sa->sa_family);
- break;
- }
-
- return s;
-}
-
-u8 * format_tcp4_packet (u8 * s, va_list * args)
-{
- u8 * p = va_arg (*args, u8 *);
- struct iphdr * ip = (void *) p;
- struct tcphdr * tcp = (void *) (ip + 1);
-
- s = format (s, "tcp %U:%U -> %U:%U",
- format_network_address, AF_INET, &ip->saddr,
- format_network_port, IPPROTO_TCP, ntohs (tcp->source),
- format_network_address, AF_INET, &ip->daddr,
- format_network_port, IPPROTO_TCP, ntohs (tcp->dest));
-
- s = format (s, ", seq 0x%08x -> 0x%08x", tcp->seq, tcp->ack_seq);
-#define _(f) if (tcp->f) s = format (s, ", " #f);
- _ (syn); _ (ack); _ (fin); _ (rst); _ (psh); _ (urg);
-#undef _
-
- if (tcp->window)
- s = format (s, ", window 0x%04x", tcp->window);
- if (tcp->urg)
- s = format (s, ", urg 0x%04x", tcp->urg_ptr);
-
- return s;
-}
-
-u8 * format_udp4_packet (u8 * s, va_list * args)
-{
- u8 * p = va_arg (*args, u8 *);
- struct iphdr * ip = (void *) p;
- struct udphdr * udp = (void *) (ip + 1);
-
- s = format (s, "udp %U:%U -> %U:%U",
- format_network_address, AF_INET, &ip->saddr,
- format_network_port, IPPROTO_UDP, ntohs (udp->source),
- format_network_address, AF_INET, &ip->daddr,
- format_network_port, IPPROTO_UDP, ntohs (udp->dest));
-
- return s;
-}
-
-u8 * format_icmp4_type_and_code (u8 * s, va_list * args)
-{
- uword icmp_type = va_arg (*args, uword);
- uword icmp_code = va_arg (*args, uword);
-
- switch (icmp_type)
- {
-#define _(f,str) case ICMP_##f: s = format (s, str); break;
- _ (ECHOREPLY, "echo reply");
- _ (DEST_UNREACH, "unreachable");
- _ (SOURCE_QUENCH, "source quench");
- _ (REDIRECT, "redirect");
- _ (ECHO, "echo request");
- _ (TIME_EXCEEDED, "time exceeded");
- _ (PARAMETERPROB, "parameter problem");
- _ (TIMESTAMP, "timestamp request");
- _ (TIMESTAMPREPLY, "timestamp reply");
- _ (INFO_REQUEST, "information request");
- _ (INFO_REPLY, "information reply");
- _ (ADDRESS, "address mask request");
- _ (ADDRESSREPLY, "address mask reply");
-#undef _
- default:
- s = format (s, "unknown type 0x%x", icmp_type);
- }
-
- if (icmp_type == ICMP_DEST_UNREACH)
- {
- switch (icmp_code)
- {
-#define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
- _ (NET_UNREACH, "network");
- _ (HOST_UNREACH, "host");
- _ (PROT_UNREACH, "protocol");
- _ (PORT_UNREACH, "port");
- _ (FRAG_NEEDED, ": fragmentation needed/DF set");
- _ (SR_FAILED, "source route failed");
- _ (NET_UNKNOWN, "network unknown");
- _ (HOST_UNKNOWN, "host unknown");
- _ (HOST_ISOLATED, "host isolated");
- _ (NET_ANO, "network: admin. prohibited");
- _ (HOST_ANO, "host: admin. prohibited");
- _ (NET_UNR_TOS, "network for type-of-service");
- _ (HOST_UNR_TOS, "host for type-of-service");
- _ (PKT_FILTERED, ": packet filtered");
- _ (PREC_VIOLATION, "precedence violation");
- _ (PREC_CUTOFF, "precedence cut off");
-#undef _
- default:
- s = format (s, "unknown code 0x%x", icmp_code);
- }
- }
- else if (icmp_type == ICMP_REDIRECT)
- {
- switch (icmp_code)
- {
-#define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
- _ (REDIR_NET, "network");
- _ (REDIR_HOST, "host");
- _ (REDIR_NETTOS, "network for type-of-service");
- _ (REDIR_HOSTTOS, "host for type-of-service");
-#undef _
- default:
- s = format (s, "unknown code 0x%x", icmp_code);
- }
- }
- else if (icmp_type == ICMP_TIME_EXCEEDED)
- {
- switch (icmp_code)
- {
-#define _(f,str) case ICMP_##f: s = format (s, " " # str); break;
- _ (EXC_TTL, "time-to-live zero in transit");
- _ (EXC_FRAGTIME, "time-to-live zero during reassembly");
-#undef _
- default:
- s = format (s, "unknown code 0x%x", icmp_code);
- }
- }
-
- return s;
-}
-
-typedef struct {
- u8 type;
- u8 code;
- u16 checksum;
-} icmp4_t;
-
-u8 * format_icmp4_packet (u8 * s, va_list * args)
-{
- u8 * p = va_arg (*args, u8 *);
- struct iphdr * ip = (void *) p;
- icmp4_t * icmp = (void *) (ip + 1);
- s = format (s, "icmp %U %U -> %U",
- format_icmp4_type_and_code, icmp->type, icmp->code,
- format_network_address, AF_INET, &ip->saddr,
- format_network_address, AF_INET, &ip->daddr);
-
- return s;
-}
-
-u8 * format_ip4_tos_byte (u8 * s, va_list * args)
-{
- uword tos = va_arg (*args, uword);
-
- if (tos & IPTOS_LOWDELAY)
- s = format (s, "minimize-delay, ");
- if (tos & IPTOS_MINCOST)
- s = format (s, "minimize-cost, ");
- if (tos & IPTOS_THROUGHPUT)
- s = format (s, "maximize-throughput, ");
- if (tos & IPTOS_RELIABILITY)
- s = format (s, "maximize-reliability, ");
-
- switch (IPTOS_PREC (tos))
- {
-#define _(x,y) case IPTOS_PREC_##x: s = format (s, y); break
- _ (NETCONTROL, "network");
- _ (INTERNETCONTROL, "internet");
- _ (CRITIC_ECP, "critical");
- _ (FLASH, "flash");
- _ (FLASHOVERRIDE, "flash-override");
- _ (IMMEDIATE, "immediate");
- _ (PRIORITY, "priority");
- _ (ROUTINE, "routine");
-#undef _
- }
-
- return s;
-}
-
-u8 * format_ip4_packet (u8 * s, va_list * args)
-{
- u8 * p = va_arg (*args, u8 *);
- struct iphdr * ip = (void *) p;
-
- static format_function_t * f[256];
-
- if (! f[IPPROTO_TCP])
- {
- f[IPPROTO_TCP] = format_tcp4_packet;
- f[IPPROTO_UDP] = format_udp4_packet;
- f[IPPROTO_ICMP] = format_icmp4_packet;
- }
-
- if (f[ip->protocol])
- return format (s, "%U", f[ip->protocol], p);
-
- s = format (s, "%U: %U -> %U",
- format_network_protocol, AF_INET, ip->protocol,
- format_network_address, AF_INET, &ip->saddr,
- format_network_address, AF_INET, &ip->daddr);
-
- return s;
-}
-
-#define foreach_unix_arphrd_type \
- _ (NETROM, 0) \
- _ (ETHER, 1) \
- _ (EETHER, 2) \
- _ (AX25, 3) \
- _ (PRONET, 4) \
- _ (CHAOS, 5) \
- _ (IEEE802, 6) \
- _ (ARCNET, 7) \
- _ (APPLETLK, 8) \
- _ (DLCI, 15) \
- _ (ATM, 19) \
- _ (METRICOM, 23) \
- _ (IEEE1394, 24) \
- _ (EUI64, 27) \
- _ (INFINIBAND, 32) \
- _ (SLIP, 256) \
- _ (CSLIP, 257) \
- _ (SLIP6, 258) \
- _ (CSLIP6, 259) \
- _ (RSRVD, 260) \
- _ (ADAPT, 264) \
- _ (ROSE, 270) \
- _ (X25, 271) \
- _ (HWX25, 272) \
- _ (PPP, 512) \
- _ (HDLC, 513) \
- _ (LAPB, 516) \
- _ (DDCMP, 517) \
- _ (RAWHDLC, 518) \
- _ (TUNNEL, 768) \
- _ (TUNNEL6, 769) \
- _ (FRAD, 770) \
- _ (SKIP, 771) \
- _ (LOOPBACK, 772) \
- _ (LOCALTLK, 773) \
- _ (FDDI, 774) \
- _ (BIF, 775) \
- _ (SIT, 776) \
- _ (IPDDP, 777) \
- _ (IPGRE, 778) \
- _ (PIMREG, 779) \
- _ (HIPPI, 780) \
- _ (ASH, 781) \
- _ (ECONET, 782) \
- _ (IRDA, 783) \
- _ (FCPP, 784) \
- _ (FCAL, 785) \
- _ (FCPL, 786) \
- _ (FCFABRIC, 787) \
- _ (IEEE802_TR, 800) \
- _ (IEEE80211, 801) \
- _ (IEEE80211_PRISM, 802) \
- _ (IEEE80211_RADIOTAP, 803) \
- _ (VOID, 0xFFFF) \
- _ (NONE, 0xFFFE)
-
-u8 * format_unix_arphrd (u8 * s, va_list * args)
-{
-#ifndef __COVERITY__ /* doesn't understand this at all... */
- u32 x = va_arg (*args, u32);
- char * t;
- switch (x)
- {
-#define _(f,n) case ARPHRD_##f: t = #f; break;
- foreach_unix_arphrd_type
-#undef _
- default:
- t = 0;
- break;
- }
-
- if (t)
- s = format (s, "%s", t);
- else
- s = format (s, "unknown 0x%x", x);
-#endif
- return s;
-}
-
-#define foreach_unix_interface_flag \
- _ (up) \
- _ (broadcast) \
- _ (debug) \
- _ (loopback) \
- _ (pointopoint) \
- _ (notrailers) \
- _ (running) \
- _ (noarp) \
- _ (promisc) \
- _ (allmulti) \
- _ (master) \
- _ (slave) \
- _ (multicast) \
- _ (portsel) \
- _ (automedia) \
- _ (dynamic) \
- _ (lower_up) \
- _ (dormant) \
- _ (echo)
-
-static char * unix_interface_flag_names[] = {
-#define _(f) #f,
- foreach_unix_interface_flag
-#undef _
-};
-
-u8 * format_unix_interface_flags (u8 * s, va_list * args)
-{
- u32 x = va_arg (*args, u32);
- u32 i;
-
- if (x == 0)
- s = format (s, "none");
- else foreach_set_bit (i, x, ({
- if (i < ARRAY_LEN (unix_interface_flag_names))
- s = format (s, "%s", unix_interface_flag_names[i]);
- else
- s = format (s, "unknown %d", i);
- if (x >> (i + 1))
- s = format (s, ", ");
- }));
- return s;
-}
-
-typedef struct {
- u16 ar_hrd; /* format of hardware address */
- u16 ar_pro; /* format of protocol address */
- u8 ar_hln; /* length of hardware address */
- u8 ar_pln; /* length of protocol address */
- u16 ar_op; /* ARP opcode (command) */
- u8 ar_sha[6]; /* sender hardware address */
- u8 ar_spa[4]; /* sender IP address */
- u8 ar_tha[6]; /* target hardware address */
- u8 ar_tpa[4]; /* target IP address */
-} arp_ether_ip4_t;
-
-u8 * format_arp_packet (u8 * s, va_list * args)
-{
- arp_ether_ip4_t * a = va_arg (*args, arp_ether_ip4_t *);
- char * op = "unknown";
-
- if (a->ar_pro != ETH_P_IP ||
- a->ar_hrd != ARPHRD_ETHER)
- return s;
-
- switch (a->ar_op)
- {
-#define _(f) case ARPOP_##f: op = #f; break;
- _ (REQUEST);
- _ (REPLY);
- _ (RREQUEST);
- _ (RREPLY);
-#undef _
- }
-
- s = format (s, "%s %U %U -> %U %U",
- op,
- format_network_address, AF_INET, a->ar_spa,
- format_network_address, AF_UNSPEC, a->ar_sha,
- format_network_address, AF_INET, a->ar_tpa,
- format_network_address, AF_UNSPEC, a->ar_tha);
- return s;
-}
-
-u8 * format_ethernet_proto (u8 * s, va_list * args)
-{
- uword type = va_arg (*args, uword);
- char * t = 0;
-
- switch (type)
- {
- case 0: t = "BPDU"; break;
-#define _(f) case ETH_P_##f: t = #f; break;
- _ (LOOP);
- _ (PUP);
-#ifdef ETH_P_PUPAT
- _ (PUPAT);
-#endif
- _ (IP);
- _ (X25);
- _ (ARP);
- _ (BPQ);
-#ifdef ETH_P_PUPAT
- _ (IEEEPUP);
- _ (IEEEPUPAT);
-#endif
- _ (DEC);
- _ (DNA_DL);
- _ (DNA_RC);
- _ (DNA_RT);
- _ (LAT);
- _ (DIAG);
- _ (CUST);
- _ (SCA);
- _ (RARP);
- _ (ATALK);
- _ (AARP);
- _ (IPX);
- _ (IPV6);
-#ifdef ETH_P_PPP_DISC
- _ (PPP_DISC);
- _ (PPP_SES);
-#endif
-#ifdef ETH_P_ATMMPOA
- _ (ATMMPOA);
- _ (ATMFATE);
-#endif
- _ (802_3);
- _ (AX25);
- _ (ALL);
- _ (802_2);
- _ (SNAP);
- _ (DDCMP);
- _ (WAN_PPP);
- _ (PPP_MP);
- _ (LOCALTALK);
- _ (PPPTALK);
- _ (TR_802_2);
- _ (MOBITEX);
- _ (CONTROL);
- _ (IRDA);
-#ifdef ETH_P_ECONET
- _ (ECONET);
-#endif
-#undef _
- }
-
- if (t)
- vec_add (s, t, strlen (t));
- else
- s = format (s, "ether-type 0x%x", type);
- return s;
-}
-
-u8 * format_ethernet_packet (u8 * s, va_list * args)
-{
- struct ethhdr * h = va_arg (*args, struct ethhdr *);
- uword proto = h->h_proto;
- u8 * payload = (void *) (h + 1);
- uword indent;
-
- /* Check for 802.2/802.3 encapsulation. */
- if (proto < ETH_DATA_LEN)
- {
- typedef struct {
- u8 dsap, ssap, control;
- u8 orig_code[3];
- u16 proto;
- } ethhdr_802_t;
- ethhdr_802_t * h1 = (void *) (h + 1);
- proto = h1->proto;
- payload = (void *) (h1 + 1);
- }
-
- indent = format_get_indent (s);
-
- s = format (s, "%U: %U -> %U",
- format_ethernet_proto, proto,
- format_network_address, AF_UNSPEC, h->h_source,
- format_network_address, AF_UNSPEC, h->h_dest);
-
- switch (proto)
- {
- case ETH_P_ARP:
- s = format (s, "\n%U%U",
- format_white_space, indent,
- format_arp_packet, payload);
- break;
- }
-
- return s;
-}
-
-#ifndef __KERNEL__
-u8 * format_hostname (u8 * s, va_list * args)
-{
- char buffer[1024];
- char * b = buffer;
- if (gethostname (b, sizeof (buffer)) < 0)
- b = "noname";
- return format (s, "%s", b);
-}
-#endif
-
-#ifndef __KERNEL__
-u8 * format_timeval (u8 * s, va_list * args)
-{
- char * fmt = va_arg (*args, char *);
- struct timeval * tv = va_arg (*args, struct timeval *);
- struct tm * tm;
- word msec;
- char * f, c;
-
- if (! fmt)
- fmt = "y/m/d H:M:S:F";
-
- if (! tv)
- {
- static struct timeval now;
- gettimeofday (&now, 0);
- tv = &now;
- }
-
- msec = flt_round_nearest (1e-3 * tv->tv_usec);
- if (msec >= 1000)
- { msec = 0; tv->tv_sec++; }
-
- {
- time_t t = tv->tv_sec;
- tm = localtime (&t);
- }
-
- for (f = fmt; *f; f++)
- {
- uword what;
- char * what_fmt = "%d";
-
- switch (c = *f)
- {
- default:
- vec_add1 (s, c);
- continue;
-
- case 'y':
- what = 1900 + tm->tm_year;
- what_fmt = "%4d";
- break;
- case 'm':
- what = tm->tm_mon + 1;
- what_fmt = "%2d";
- break;
- case 'd':
- what = tm->tm_mday;
- what_fmt = "%2d";
- break;
- case 'H':
- what = tm->tm_hour;
- what_fmt = "%02d";
- break;
- case 'M':
- what = tm->tm_min;
- what_fmt = "%02d";
- break;
- case 'S':
- what = tm->tm_sec;
- what_fmt = "%02d";
- break;
- case 'F':
- what = msec;
- what_fmt = "%03d";
- break;
- }
-
- s = format (s, what_fmt, what);
- }
-
- return s;
-}
-
-u8 * format_time_float (u8 * s, va_list * args)
-{
- u8 * fmt = va_arg (*args, u8 *);
- f64 t = va_arg (*args, f64);
- struct timeval tv;
- if (t <= 0)
- t = unix_time_now ();
- tv.tv_sec = t;
- tv.tv_usec = 1e6*(t - tv.tv_sec);
- return format (s, "%U", format_timeval, fmt, &tv);
-}
-
-u8 * format_signal (u8 * s, va_list * args)
-{
- uword signum = va_arg (*args, uword);
- char * t = 0;
- switch (signum)
- {
-#define _(x) case x: t = #x; break;
- _ (SIGHUP);
- _ (SIGINT);
- _ (SIGQUIT);
- _ (SIGILL);
- _ (SIGTRAP);
- _ (SIGABRT);
- _ (SIGBUS);
- _ (SIGFPE);
- _ (SIGKILL);
- _ (SIGUSR1);
- _ (SIGSEGV);
- _ (SIGUSR2);
- _ (SIGPIPE);
- _ (SIGALRM);
- _ (SIGTERM);
-#ifdef SIGSTKFLT
- _ (SIGSTKFLT);
-#endif
- _ (SIGCHLD);
- _ (SIGCONT);
- _ (SIGSTOP);
- _ (SIGTSTP);
- _ (SIGTTIN);
- _ (SIGTTOU);
- _ (SIGURG);
- _ (SIGXCPU);
- _ (SIGXFSZ);
- _ (SIGVTALRM);
- _ (SIGPROF);
- _ (SIGWINCH);
- _ (SIGIO);
- _ (SIGPWR);
-#ifdef SIGSYS
- _ (SIGSYS);
-#endif
-#undef _
- default:
- return format (s, "unknown %d", signum);
- }
-
- vec_add (s, t, strlen (t));
- return s;
-}
-
-u8 * format_ucontext_pc (u8 * s, va_list * args)
-{
- ucontext_t * uc __attribute__((unused));
- unsigned long * regs = 0;
- uword reg_no = 0;
-
- uc = va_arg (*args, ucontext_t *);
-
-#if defined (powerpc)
- regs = &uc->uc_mcontext.uc_regs->gregs[0];
-#elif defined (powerpc64)
- regs = &uc->uc_mcontext.uc_regs->gp_regs[0];
-#elif defined (i386) || defined (__x86_64__)
- regs = (void *) &uc->uc_mcontext.gregs[0];
-#endif
-
-#if defined (powerpc) || defined (powerpc64)
- reg_no = PT_NIP;
-#elif defined (i386)
- reg_no = REG_EIP;
-#elif defined (__x86_64__)
- reg_no = REG_RIP;
-#else
- reg_no = 0;
- regs = 0;
-#endif
-
- if (! regs)
- return format (s, "unsupported");
- else
- return format (s, "%p", regs[reg_no]);
-}
-
-#endif /* __KERNEL__ */