build: get rid of HTTPINFO_PUD define
[olsrd.git] / lib / httpinfo / src / olsrd_httpinfo.c
index 6bee0e4..3c329c1 100644 (file)
@@ -1,7 +1,11 @@
-
 /*
- * HTTP Info plugin for the olsr.org OLSR daemon
- * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "olsr_cfg.h"
 #include "interfaces.h"
 #include "gateway.h"
+#include "gateway_costs.h"
 #include "olsr_protocol.h"
 #include "net_olsr.h"
 #include "link_set.h"
 #include "ipcalc.h"
+#include "defs.h"
 #include "lq_plugin.h"
 #include "common/autobuf.h"
-#ifdef HTTPINFO_PUD
-  #include <pud/src/receiver.h>
-  #include <pud/src/pud.h>
-  #include <nmea/info.h>
-  #include <nmea/sentence.h>
-#endif /* HTTPINFO_PUD */
+#include <pud/src/receiver.h>
+#include <pud/src/pud.h>
+#include <nmea/info.h>
+#include <nmea/sentence.h>
 
 #include "olsrd_httpinfo.h"
 #include "admin_interface.h"
@@ -95,9 +99,6 @@
 #define OS "Undefined"
 #endif /* OS */
 
-static char copyright_string[] __attribute__ ((unused)) =
-  "olsr.org HTTPINFO plugin Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved.";
-
 #define MAX_CLIENTS 3
 
 #define MAX_HTTPREQ_SIZE (1024 * 10)
@@ -190,9 +191,7 @@ static void build_all_body(struct autobuf *);
 static void build_sgw_body(struct autobuf *);
 #endif /* __linux__ */
 
-#ifdef HTTPINFO_PUD
 static void build_pud_body(struct autobuf *);
-#endif /* HTTPINFO_PUD */
 
 static void build_about_body(struct autobuf *);
 
@@ -227,9 +226,7 @@ static const struct tab_entry tab_entries[] = {
 #ifdef __linux__
   {"Smart Gateway", "sgw", build_sgw_body, true},
 #endif /* __linux__ */
-#ifdef HTTPINFO_PUD
   {"Position", "position", build_pud_body, true},
-#endif /* HTTPINFO_PUD */
   {"All", "all", build_all_body, true},
 #ifdef ADMIN_INTERFACE
   {"Admin", "admin", build_admin_body, true},
@@ -321,8 +318,7 @@ olsrd_plugin_init(void)
   http_socket = get_http_socket(http_port != 0 ? http_port : DEFAULT_TCP_PORT);
 
   if (http_socket < 0) {
-    fprintf(stderr, "(HTTPINFO) could not initialize HTTP socket\n");
-    exit(1);
+    olsr_exit("HTTPINFO: could not initialize HTTP socket", EXIT_FAILURE);
   }
 
   /* Register socket */
@@ -406,7 +402,7 @@ parse_http_request(int fd, void *data __attribute__ ((unused)), unsigned int fla
   }
 
   olsr_printf(1, "Request: %s\nfile: %s\nVersion: %s\n\n", req_type, filename, http_version);
-  abuf_init(&body_abuf, 102400);
+  abuf_init(&body_abuf, AUTOBUFCHUNK);
 
   if (!strcmp(req_type, "POST")) {
 #ifdef ADMIN_INTERFACE
@@ -507,7 +503,7 @@ parse_http_request(int fd, void *data __attribute__ ((unused)), unsigned int fla
       stats.ok_hits++;
 
       abuf_appendf(&body_abuf,
-                 "</table>\n" "<div id=\"footer\">\n" "<center>\n" "(C)2005 Andreas T&oslash;nnesen<br/>\n"
+                 "</table>\n" "<div id=\"footer\">\n" "<center><br/>\n"
                  "<a href=\"http://www.olsr.org/\">http://www.olsr.org</a>\n" "</center>\n" "</div>\n" "</body>\n" "</html>\n");
 
 #ifdef NETDIRECT
@@ -637,7 +633,7 @@ build_http_header(http_header_type type, bool is_html, uint32_t msgsize, char *b
   size += strftime(&buf[size], bufsize - size, "Date: %a, %d %b %Y %H:%M:%S GMT\r\n", localtime(&currtime));
 
   /* Server version */
-  size += snprintf(&buf[size], bufsize - size, "Server: %s %s %s\r\n", PLUGIN_NAME, PLUGIN_VERSION, HTTP_VERSION);
+  size += snprintf(&buf[size], bufsize - size, "Server: %s %s\r\n", PLUGIN_NAME, HTTP_VERSION);
 
   /* connection-type */
   size += snprintf(&buf[size], bufsize - size, "Connection: closed\r\n");
@@ -912,7 +908,7 @@ build_config_body(struct autobuf *abuf)
   abuf_puts(abuf, "<h2>Interfaces</h2>\n");
   abuf_puts(abuf, "<table width=\"100%%\" border=\"0\">\n");
   for (ifs = olsr_cnf->interfaces; ifs != NULL; ifs = ifs->next) {
-    const struct interface *const rifs = ifs->interf;
+    const struct interface_olsr *const rifs = ifs->interf;
     abuf_appendf(abuf, "<tr><th colspan=\"3\">%s</th>\n", ifs->name);
     if (!rifs) {
       abuf_puts(abuf, "<tr><td colspan=\"3\">Status: DOWN</td></tr>\n");
@@ -1110,12 +1106,8 @@ build_all_body(struct autobuf *abuf)
 #ifdef __linux__
   build_sgw_body(abuf);
 #endif /* __linux__ */
-#ifdef HTTPINFO_PUD
   build_pud_body(abuf);
-#endif /* HTTPINFO_PUD */
 }
-
-#ifdef HTTPINFO_PUD
 /**
  * Determine if a nmeaINFO structure has a certain field.
  * We need this function locally because nmealib might not be loaded.
@@ -1124,7 +1116,7 @@ build_all_body(struct autobuf *abuf)
  * @param fieldName use a name from nmeaINFO_FIELD
  * @return a boolean, true when the structure has the requested field
  */
-static inline bool nmea_INFO_is_present_local(uint32_t present, nmeaINFO_FIELD fieldName) {
+static INLINE bool nmea_INFO_is_present_local(uint32_t present, nmeaINFO_FIELD fieldName) {
   return ((present & fieldName) != 0);
 }
 
@@ -1173,7 +1165,7 @@ static void build_pud_body(struct autobuf *abuf) {
                if (datePresent) {
                        abuf_appendf(abuf, "%04d%02d%02d",
                                txGpsInfo->txPosition.nmeaInfo.utc.year + 1900,
-                               txGpsInfo->txPosition.nmeaInfo.utc.mon,
+                               txGpsInfo->txPosition.nmeaInfo.utc.mon + 1,
                                txGpsInfo->txPosition.nmeaInfo.utc.day);
                }
                if (datePresent && timePresent) {
@@ -1522,7 +1514,6 @@ static void build_pud_body(struct autobuf *abuf) {
                );
        }
 }
-#endif /* HTTPINFO_PUD */
 
 #ifdef __linux__
 
@@ -1553,6 +1544,7 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6) {
     abuf_puts(abuf, "      <th><center>Prefix</center></th>\n");
     abuf_puts(abuf, "      <th><center>Uplink (kbps)</center></th>\n");
     abuf_puts(abuf, "      <th><center>Downlink (kbps)</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Path Cost</center></th>\n");
     abuf_puts(abuf, "      <th><center>IPv4</center></th>\n");
     abuf_puts(abuf, "      <th><center>IPv4 NAT</center></th>\n");
     abuf_puts(abuf, "      <th><center>IPv6</center></th>\n");
@@ -1563,45 +1555,48 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6) {
 
     current_gw = olsr_get_inet_gateway(false);
     OLSR_FOR_ALL_GWS(&list->head, gw) {
-      if (gw) {
-        bool is_current = (current_gw && (gw->gw == current_gw));
+      struct gwtextbuffer gwbuf;
+      bool is_current = (current_gw && (gw->gw == current_gw));
 
-        if (is_current) {
-          abuf_puts(abuf, "    <tr bgcolor=\"lime\">\n");
-        } else {
-          abuf_puts(abuf, "    <tr>\n");
-        }
+      if (is_current) {
+        abuf_puts(abuf, "    <tr bgcolor=\"lime\">\n");
+      } else {
+        abuf_puts(abuf, "    <tr>\n");
+      }
 
-        if (!gw->gw) {
-          int i;
-          for (i = 0; i < 7; i++) {
-            abuf_puts(abuf, "      <td></td>\n");
-          }
-        } else {
-          abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->gw->originator, buf, sizeof(buf)));
-          abuf_appendf(abuf, "      <td>%s</td>\n", olsr_ip_prefix_to_string(&gw->gw->external_prefix));
-          abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->uplink);
-          abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->downlink);
-          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4 ? "yes" : "no");
-          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4nat ? "yes" : "no");
-          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv6 ? "yes" : "no");
+      if (!gw->gw) {
+        int i;
+        for (i = 0; i < 8; i++) {
+          abuf_puts(abuf, "      <td></td>\n");
         }
-        if (!gw->tunnel) {
-          int i;
-          for (i = 0; i < 2; i++) {
-            abuf_puts(abuf, "      <td></td>\n");
-          }
-        } else {
-          abuf_appendf(abuf, "      <td>%s</td>\n", gw->tunnel->if_name);
-          abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, buf, sizeof(buf)));
+      } else {
+        struct tc_entry* tc = olsr_lookup_tc_entry(&gw->gw->originator);
+        olsr_linkcost etx = ROUTE_COST_BROKEN;
+        struct lqtextbuffer lcbuf;
+        if (tc) {
+          etx = tc->path_cost;
         }
-        if (!gw->gw) {
+
+        abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->gw->originator, buf, sizeof(buf)));
+        abuf_appendf(abuf, "      <td>%s</td>\n", olsr_ip_prefix_to_string(&gw->gw->external_prefix));
+        abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->uplink);
+        abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->downlink);
+        abuf_appendf(abuf, "      <td>%s</td>\n", get_linkcost_text(etx, true, &lcbuf));
+        abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4 ? "yes" : "no");
+        abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4nat ? "yes" : "no");
+        abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv6 ? "yes" : "no");
+      }
+      if (!gw->tunnel) {
+        int i;
+        for (i = 0; i < 2; i++) {
           abuf_puts(abuf, "      <td></td>\n");
-        } else {
-          abuf_appendf(abuf, "      <td>%llu</td>\n", (long long unsigned int)gw->path_cost);
         }
-        abuf_puts(abuf, "    </tr>\n");
+      } else {
+        abuf_appendf(abuf, "      <td>%s</td>\n", gw->tunnel->if_name);
+        abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, buf, sizeof(buf)));
       }
+      abuf_appendf(abuf, "      <td>%s</td>\n", get_gwcost_text(!gw->gw ? INT64_MAX : gw->gw->path_cost, &gwbuf));
+      abuf_puts(abuf, "    </tr>\n");
     } OLSR_FOR_ALL_GWS_END(gw);
     abuf_puts(abuf, "  </tbody>\n");
     abuf_puts(abuf, "</table>\n");
@@ -1626,7 +1621,7 @@ static void
 build_about_body(struct autobuf *abuf)
 {
   abuf_appendf(abuf,
-                  "<strong>" PLUGIN_NAME " version " PLUGIN_VERSION "</strong><br/>\n" "by Andreas T&oslash;nnesen (C)2005.<br/>\n"
+                  "<strong>" PLUGIN_NAME "</strong><br/><br/>\n"
                   "Compiled "
 #ifdef ADMIN_INTERFACE
                   "<em>with experimental admin interface</em> "