This file is part of GNUnet.
Copyright (C) 2006-2013 GNUnet e.V.
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ Affero General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* Note that this message maybe truncated to the first BULK_TRACK_SIZE
* characters, in which case it is NOT 0-terminated!
*/
-static char last_bulk[BULK_TRACK_SIZE];
+static char last_bulk[BULK_TRACK_SIZE] __attribute__ ((nonstring));
/**
* Type of the last bulk message.
to_line = INT_MAX;
}
break;
+ default:
+ fprintf(stderr,
+ _("ERROR: Unable to parse log definition: Syntax error at `%s'.\n"),
+ p);
+ break;
}
start = p + 1;
state++;
start = p + 1;
break;
default:
+ fprintf(stderr,
+ _("ERROR: Unable to parse log definition: Syntax error at `%s'.\n"),
+ p);
break;
}
default:
static void
parse_all_definitions ()
{
- if (GNUNET_NO == gnunet_log_parsed)
- parse_definitions ("GNUNET_LOG", 0);
- gnunet_log_parsed = GNUNET_YES;
if (GNUNET_NO == gnunet_force_log_parsed)
gnunet_force_log_present =
parse_definitions ("GNUNET_FORCE_LOG", 1) > 0 ? GNUNET_YES : GNUNET_NO;
gnunet_force_log_parsed = GNUNET_YES;
+
+ if (GNUNET_NO == gnunet_log_parsed)
+ parse_definitions ("GNUNET_LOG", 0);
+ gnunet_log_parsed = GNUNET_YES;
}
#endif
if ( (NULL != GNUNET_stderr) &&
(NULL == loggers) )
{
- if (kind == GNUNET_ERROR_TYPE_MESSAGE) {
- /* The idea here is to produce "normal" output messages
- * for end users while still having the power of the
- * logging engine for developer needs. So ideally this
- * is what it should look like when CLI tools are used
- * interactively, yet the same message shouldn't look
- * this way if the output is going to logfiles or robots
- * instead. Is this the right place to do this? --lynX
- */
- FPRINTF (GNUNET_stderr,
- "* %s",
- msg);
- } else {
- FPRINTF (GNUNET_stderr,
- "%s %s %s %s",
- datestr,
- comp,
- GNUNET_error_type_to_string (kind),
- msg);
+ if (kind == GNUNET_ERROR_TYPE_MESSAGE)
+ {
+ /* The idea here is to produce "normal" output messages
+ * for end users while still having the power of the
+ * logging engine for developer needs. So ideally this
+ * is what it should look like when CLI tools are used
+ * interactively, yet the same message shouldn't look
+ * this way if the output is going to logfiles or robots
+ * instead.
+ */
+ FPRINTF (GNUNET_stderr,
+ "* %s",
+ msg);
+ }
+ else
+ {
+ FPRINTF (GNUNET_stderr,
+ "%s %s %s %s",
+ datestr,
+ comp,
+ GNUNET_error_type_to_string (kind),
+ msg);
}
fflush (GNUNET_stderr);
}
pos = loggers;
- while (pos != NULL)
+ while (NULL != pos)
{
- pos->logger (pos->logger_cls, kind, comp, datestr, msg);
+ pos->logger (pos->logger_cls,
+ kind,
+ comp,
+ datestr,
+ msg);
pos = pos->next;
}
#if WINDOWS
}
+/**
+ * @ingroup logging
+ * Convert a public key value to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param hc the hash code
+ * @return string
+ */
+const char *
+GNUNET_p2s (const struct GNUNET_CRYPTO_EddsaPublicKey *p)
+{
+ static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+ struct GNUNET_HashCode hc;
+
+ GNUNET_CRYPTO_hash (p,
+ sizeof (*p),
+ &hc);
+ GNUNET_CRYPTO_hash_to_enc (&hc,
+ &ret);
+ ret.encoding[6] = '\0';
+ return (const char *) ret.encoding;
+}
+
+
+/**
+ * @ingroup logging
+ * Convert a public key value to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param hc the hash code
+ * @return string
+ */
+const char *
+GNUNET_p2s2 (const struct GNUNET_CRYPTO_EddsaPublicKey *p)
+{
+ static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+ struct GNUNET_HashCode hc;
+
+ GNUNET_CRYPTO_hash (p,
+ sizeof (*p),
+ &hc);
+ GNUNET_CRYPTO_hash_to_enc (&hc,
+ &ret);
+ ret.encoding[6] = '\0';
+ return (const char *) ret.encoding;
+}
+
+
+/**
+ * @ingroup logging
+ * Convert a public key value to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param hc the hash code
+ * @return string
+ */
+const char *
+GNUNET_e2s (const struct GNUNET_CRYPTO_EcdhePublicKey *p)
+{
+ static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+ struct GNUNET_HashCode hc;
+
+ GNUNET_CRYPTO_hash (p,
+ sizeof (*p),
+ &hc);
+ GNUNET_CRYPTO_hash_to_enc (&hc,
+ &ret);
+ ret.encoding[6] = '\0';
+ return (const char *) ret.encoding;
+}
+
+
+/**
+ * @ingroup logging
+ * Convert a public key value to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param hc the hash code
+ * @return string
+ */
+const char *
+GNUNET_e2s2 (const struct GNUNET_CRYPTO_EcdhePublicKey *p)
+{
+ static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+ struct GNUNET_HashCode hc;
+
+ GNUNET_CRYPTO_hash (p,
+ sizeof (*p),
+ &hc);
+ GNUNET_CRYPTO_hash_to_enc (&hc,
+ &ret);
+ ret.encoding[6] = '\0';
+ return (const char *) ret.encoding;
+}
+
+
/**
* @ingroup logging
* Convert a short hash value to a string (for printing debug messages).
const char *
GNUNET_i2s (const struct GNUNET_PeerIdentity *pid)
{
- static char buf[256];
+ static char buf[5];
char *ret;
if (NULL == pid)
return "NULL";
ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
- strcpy (buf,
- ret);
+ strncpy (buf,
+ ret,
+ sizeof (buf) - 1);
GNUNET_free (ret);
buf[4] = '\0';
return buf;
const char *
GNUNET_i2s2 (const struct GNUNET_PeerIdentity *pid)
{
- static char buf[256];
+ static char buf[5];
char *ret;
if (NULL == pid)
return "NULL";
ret = GNUNET_CRYPTO_eddsa_public_key_to_string (&pid->public_key);
- strcpy (buf,
- ret);
+ strncpy (buf,
+ ret,
+ sizeof (buf) - 1);
GNUNET_free (ret);
buf[4] = '\0';
return buf;
if (addrlen != sizeof (struct sockaddr_in))
return "<invalid v4 address>";
v4 = (const struct sockaddr_in *) addr;
- inet_ntop (AF_INET, &v4->sin_addr, buf, INET_ADDRSTRLEN);
+ inet_ntop (AF_INET,
+ &v4->sin_addr,
+ buf,
+ INET_ADDRSTRLEN);
if (0 == ntohs (v4->sin_port))
return buf;
strcat (buf, ":");
- GNUNET_snprintf (b2, sizeof (b2), "%u", ntohs (v4->sin_port));
+ GNUNET_snprintf (b2,
+ sizeof (b2),
+ "%u",
+ ntohs (v4->sin_port));
strcat (buf, b2);
return buf;
case AF_INET6:
return "<invalid v4 address>";
v6 = (const struct sockaddr_in6 *) addr;
buf[0] = '[';
- inet_ntop (AF_INET6, &v6->sin6_addr, &buf[1], INET6_ADDRSTRLEN);
+ inet_ntop (AF_INET6,
+ &v6->sin6_addr,
+ &buf[1],
+ INET6_ADDRSTRLEN);
if (0 == ntohs (v6->sin6_port))
return &buf[1];
strcat (buf, "]:");
- GNUNET_snprintf (b2, sizeof (b2), "%u", ntohs (v6->sin6_port));
- strcat (buf, b2);
+ GNUNET_snprintf (b2,
+ sizeof (b2),
+ "%u",
+ ntohs (v6->sin6_port));
+ strcat (buf,
+ b2);
return buf;
case AF_UNIX:
if (addrlen <= sizeof (sa_family_t))