No need to log extra messages here.
[dhcpcd-ui] / src / libdhcpcd / misc.c
1 /*
2  * libdhcpcd
3  * Copyright 2009-2014 Roy Marples <roy@marples.name>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #include <arpa/inet.h>
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #include <libintl.h>
34
35 #define IN_LIBDHCPCD
36 #include "libdhcpcd.h"
37
38 #define _ gettext
39
40 char *
41 dhcpcd_if_message(const DHCPCD_IF *i)
42 {
43         char *msg, *p;
44         const char *reason = NULL;
45         size_t len;
46         bool showip, showssid;
47         char buf[INET6_ADDRSTRLEN];
48
49         /* Don't report non SLAAC configurations */
50         if (strcmp(i->type, "ra") == 0 &&
51             IN6_IS_ADDR_UNSPECIFIED(&i->prefix) &&
52             i->up)
53                 return NULL;
54
55         showip = true;
56         showssid = false;
57         if (strcmp(i->reason, "EXPIRE") == 0)
58                 reason = _("Expired");
59         else if (strcmp(i->reason, "CARRIER") == 0) {
60                 if (i->wireless) {
61                         reason = _("Associated with");
62                         if (*i->ssid != '\0')
63                                 showssid = true;
64                 } else
65                         reason = _("Cable plugged in");
66                 showip = false;
67         } else if (strcmp(i->reason, "NOCARRIER") == 0) {
68                 if (i->wireless) {
69                         if (*i->ssid != '\0' || i->ip.s_addr != 0) {
70                                 reason = _("Disassociated from");
71                                 showssid = true;
72                         } else
73                                 reason = _("Not associated");
74                 } else
75                         reason = _("Cable unplugged");
76                 showip = false;
77         } else if (strcmp(i->reason, "UNKNOWN") == 0)
78                 reason = _("Unknown link state");
79         else if (strcmp(i->reason, "FAIL") == 0)
80                 reason = _("Automatic configuration not possible");
81         else if (strcmp(i->reason, "3RDPARTY") == 0)
82                 reason = _("Waiting for 3rd Party configuration");
83
84         if (reason == NULL) {
85                 if (i->up)
86                         reason = _("Configured");
87                 else if (strcmp(i->type, "ra") == 0)
88                         reason = "Expired RA";
89                 else
90                         reason = i->reason;
91         }
92
93         len = strlen(i->ifname) + 3;
94         len += strlen(reason) + 1;
95         if (i->ip.s_addr != 0) {
96                 len += 16; /* 000. * 4 */
97                 if (i->cidr != 0)
98                         len += 3; /* /32 */
99         } else if (!IN6_IS_ADDR_UNSPECIFIED(&i->ip6)) {
100                 len += INET6_ADDRSTRLEN;
101         } else if (!IN6_IS_ADDR_UNSPECIFIED(&i->prefix)) {
102                 len += INET6_ADDRSTRLEN;
103                 if (i->prefix_len != 0)
104                         len += 4;
105         }
106         if (showssid)
107                 len += strlen(i->ssid) + 1;
108         msg = p = malloc(len);
109         if (msg == NULL)
110                 return NULL;
111         p += snprintf(msg, len, "%s: %s", i->ifname, reason);
112         if (showssid)
113                 p += snprintf(p, len - (size_t)(p - msg), " %s", i->ssid);
114         if (i->ip.s_addr != 0 && showip) {
115                 p += snprintf(p, len - (size_t)(p - msg), " %s",
116                     inet_ntoa(i->ip));
117                 if (i->cidr != 0)
118                         snprintf(p, len - (size_t)(p - msg), "/%d", i->cidr);
119         } else if (!IN6_IS_ADDR_UNSPECIFIED(&i->ip6) && showip) {
120                 p += snprintf(p, len - (size_t)(p - msg), " %s",
121                     inet_ntop(AF_INET6, &i->ip6, buf, INET6_ADDRSTRLEN));
122         } else if (!IN6_IS_ADDR_UNSPECIFIED(&i->prefix) && showip) {
123                 p += snprintf(p, len - (size_t)(p - msg), " %s",
124                     inet_ntop(AF_INET6, &i->prefix, buf, INET6_ADDRSTRLEN));
125                 if (i->prefix_len != 0)
126                         snprintf(p, len - (size_t)(p - msg),
127                             "/%d", i->prefix_len);
128         }
129         return msg;
130 }