From b3db0e6ee14315d20ca91eff91e348e18dd119e6 Mon Sep 17 00:00:00 2001
From: Richard van der Hoff <richard@matrix.org>
Date: Fri, 13 May 2016 11:53:33 +0100
Subject: translate logging.cpp to C

---
 include/olm/logging.h  | 44 +++++++++++++++++++++++++++++++++++++++++++
 include/olm/logging.hh | 38 -------------------------------------
 include/olm/olm.hh     |  6 +++---
 src/account.cpp        |  8 ++++----
 src/logging.c          | 47 ++++++++++++++++++++++++++++++++++++++++++++++
 src/logging.cpp        | 51 --------------------------------------------------
 src/message.cpp        |  6 +++---
 src/olm.cpp            |  8 +-------
 src/ratchet.cpp        | 24 ++++++++++++------------
 src/session.cpp        | 30 ++++++++++++++---------------
 10 files changed, 129 insertions(+), 133 deletions(-)
 create mode 100644 include/olm/logging.h
 delete mode 100644 include/olm/logging.hh
 create mode 100644 src/logging.c
 delete mode 100644 src/logging.cpp

diff --git a/include/olm/logging.h b/include/olm/logging.h
new file mode 100644
index 0000000..c713992
--- /dev/null
+++ b/include/olm/logging.h
@@ -0,0 +1,44 @@
+/* Copyright 2016 OpenMarket Ltd
+ *
+ * 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.
+ */
+
+#ifndef OLM_LOGGING_H_
+#define OLM_LOGGING_H_
+
+#include "olm/olm.hh"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define OLM_LOG_FATAL   1
+#define OLM_LOG_ERROR   2
+#define OLM_LOG_WARNING 3
+#define OLM_LOG_INFO    4
+#define OLM_LOG_DEBUG   5
+#define OLM_LOG_TRACE   6
+
+/* returns non-zero if logging is enabled for this level */
+int olm_log_enabled_for(unsigned int level, const char *category);
+
+__attribute__((__format__ (__printf__, 3, 4)))
+void olm_logf(unsigned int level, const char *category,
+          const char *format, ...);
+
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif /* OLM_LOGGING_H_ */
diff --git a/include/olm/logging.hh b/include/olm/logging.hh
deleted file mode 100644
index ff84615..0000000
--- a/include/olm/logging.hh
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright 2016 OpenMarket Ltd
- *
- * 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.
- */
-
-#ifndef OLM_LOGGING_HH_
-#define OLM_LOGGING_HH_
-
-namespace olm {
-
-const unsigned int LOG_FATAL   = 1;
-const unsigned int LOG_ERROR   = 2;
-const unsigned int LOG_WARNING = 3;
-const unsigned int LOG_INFO    = 4;
-const unsigned int LOG_DEBUG   = 5;
-const unsigned int LOG_TRACE   = 6;
-
-void set_log_level(unsigned int log_level);
-
-bool log_enabled_for(unsigned int level, const char *category);
-
-__attribute__((__format__ (__printf__, 3, 4)))
-void logf(unsigned int level, const char *category,
-          const char *format, ...);
-
-} // namespace olm
-
-#endif /* OLM_LOGGING_HH_ */
diff --git a/include/olm/olm.hh b/include/olm/olm.hh
index ceb8be9..ffecb10 100644
--- a/include/olm/olm.hh
+++ b/include/olm/olm.hh
@@ -25,9 +25,9 @@ extern "C" {
 static const size_t OLM_MESSAGE_TYPE_PRE_KEY = 0;
 static const size_t OLM_MESSAGE_TYPE_MESSAGE = 1;
 
-struct OlmAccount;
-struct OlmSession;
-struct OlmUtility;
+typedef struct OlmAccount OlmAccount;
+typedef struct OlmSession OlmSession;
+typedef struct OlmUtility OlmUtility;
 
 /** The size of an account object in bytes */
 size_t olm_account_size();
diff --git a/src/account.cpp b/src/account.cpp
index 4fca953..d34110a 100644
--- a/src/account.cpp
+++ b/src/account.cpp
@@ -14,7 +14,7 @@
  */
 #include "olm/account.hh"
 #include "olm/base64.hh"
-#include "olm/logging.hh"
+#include "olm/logging.h"
 #include "olm/pickle.hh"
 #include "olm/memory.hh"
 
@@ -45,11 +45,11 @@ std::size_t olm::Account::remove_key(
         if (olm::array_equal(i->key.public_key, public_key.public_key)) {
             std::uint32_t id = i->id;
             one_time_keys.erase(i);
-            olm::logf(olm::LOG_INFO, LOG_CATEGORY, "removed key id %i", id);
+            olm_logf(OLM_LOG_INFO, LOG_CATEGORY, "removed key id %i", id);
             return id;
         }
     }
-    olm::logf(olm::LOG_WARNING, LOG_CATEGORY, "Couldn't find key to remove");
+    olm_logf(OLM_LOG_WARNING, LOG_CATEGORY, "Couldn't find key to remove");
     return std::size_t(-1);
 }
 
@@ -69,7 +69,7 @@ std::size_t olm::Account::new_account(
     random += KEY_LENGTH;
     olm::curve25519_generate_key(random, identity_keys.curve25519_key);
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Created new account");
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Created new account");
 
     return 0;
 }
diff --git a/src/logging.c b/src/logging.c
new file mode 100644
index 0000000..ce17167
--- /dev/null
+++ b/src/logging.c
@@ -0,0 +1,47 @@
+/* Copyright 2016 OpenMarket Ltd
+ *
+ * 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.
+ */
+
+#include "olm/logging.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+static unsigned int log_level = 1;
+
+void olm_set_log_level(unsigned int level) {
+    log_level = level;
+}
+
+int olm_log_enabled_for(unsigned int level, const char *category)
+{
+    return level <= log_level;
+}
+
+void olm_logf(unsigned int level, const char *category,
+          const char *format, ...) {
+    if (level > log_level) {
+        return;
+    }
+
+    fputs(category, stdout);
+    fputs(": ", stdout);
+
+    va_list ap;
+    va_start(ap, format);
+    vprintf(format, ap);
+    va_end(ap);
+
+    putchar('\n');
+}
diff --git a/src/logging.cpp b/src/logging.cpp
deleted file mode 100644
index 4819e1c..0000000
--- a/src/logging.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright 2016 OpenMarket Ltd
- *
- * 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.
- */
-
-#include "olm/logging.hh"
-
-#include <cstdarg>
-#include <cstdio>
-
-namespace olm {
-
-static unsigned int log_level = 1;
-
-void set_log_level(unsigned int level) {
-    log_level = level;
-}
-
-bool log_enabled_for(unsigned int level, const char *category)
-{
-    return level <= log_level;
-}
-
-void logf(unsigned int level, const char *category,
-          const char *format, ...) {
-    if (level > log_level) {
-        return;
-    }
-
-    fputs(category, stdout);
-    fputs(": ", stdout);
-
-    va_list ap;
-    va_start(ap, format);
-    vprintf(format, ap);
-    va_end(ap);
-
-    putchar('\n');
-}
-
-} // namespace olm
diff --git a/src/message.cpp b/src/message.cpp
index 23ec823..ff03903 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -14,7 +14,7 @@
  */
 #include "olm/message.hh"
 
-#include "olm/logging.hh"
+#include "olm/logging.h"
 #include "olm/memory.hh"
 
 namespace {
@@ -239,7 +239,7 @@ void olm::decode_message(
         }
         unknown = pos;
     }
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY,
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY,
               "Decoded message ver=%i ratchet_key=%s chain_idx=%i ciphertext=%s",
               reader.version,
               olm::bytes_to_string(reader.ratchet_key, reader.ratchet_key_length).c_str(),
@@ -335,7 +335,7 @@ void olm::decode_one_time_key_message(
         unknown = pos;
     }
 
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY,
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY,
               "Decoded pre-key message ver=%i one_time_key[Eb]=%s "
               "base_key[Ea]=%s identity_key[Ia]=%s message=%s",
               reader.version,
diff --git a/src/olm.cpp b/src/olm.cpp
index 6db8724..afbbbc6 100644
--- a/src/olm.cpp
+++ b/src/olm.cpp
@@ -19,7 +19,7 @@
 #include "olm/base64.hh"
 #include "olm/cipher.hh"
 #include "olm/memory.hh"
-#include "olm/logging.hh"
+#include "olm/logging.h"
 
 #include <new>
 #include <cstring>
@@ -819,10 +819,4 @@ size_t olm_ed25519_verify(
     );
 }
 
-void olm_set_log_level(
-    unsigned int level
-) {
-    olm::set_log_level(level);
-}
-
 }
diff --git a/src/ratchet.cpp b/src/ratchet.cpp
index 03a0478..06912af 100644
--- a/src/ratchet.cpp
+++ b/src/ratchet.cpp
@@ -17,7 +17,7 @@
 #include "olm/memory.hh"
 #include "olm/cipher.hh"
 #include "olm/pickle.hh"
-#include "olm/logging.hh"
+#include "olm/logging.h"
 
 #include <cstring>
 
@@ -79,7 +79,7 @@ static void advance_chain_key(
         new_chain_key.key
     );
     new_chain_key.index = chain_key.index + 1;
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Derived chain key C(%i,%i)",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Derived chain key C(%i,%i)",
               chain_index, new_chain_key.index);
 }
 
@@ -95,7 +95,7 @@ static void create_message_keys(
         message_key.key
     );
     message_key.index = chain_key.index;
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Created message key with chain key C(%i,%i)",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Created message key with chain key C(%i,%i)",
               chain_index, message_key.index);
 }
 
@@ -176,7 +176,7 @@ static std::size_t verify_mac_and_decrypt_for_new_chain(
         new_chain.ratchet_key, session.kdf_info,
         new_root_key, new_chain.chain_key
     );
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Calculated new receiver chain R(%i)",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Calculated new receiver chain R(%i)",
                   chain_index);
 
     std::size_t result = verify_mac_and_decrypt_for_existing_chain(
@@ -219,7 +219,7 @@ void olm::Ratchet::initialise_as_bob(
     receiver_chains[0].ratchet_key = their_ratchet_key;
     chain_index = 0;
     olm::unset(derived_secrets);
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised receiver chain R(0)");
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised receiver chain R(0)");
 }
 
 
@@ -242,7 +242,7 @@ void olm::Ratchet::initialise_as_alice(
     sender_chain[0].ratchet_key = our_ratchet_key;
     chain_index = 0;
     olm::unset(derived_secrets);
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised sender chain R(0)");
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised sender chain R(0)");
 }
 
 namespace olm {
@@ -450,7 +450,7 @@ std::size_t olm::Ratchet::encrypt(
     if (sender_chain.empty()) {
         sender_chain.insert();
         olm::curve25519_generate_key(random, sender_chain[0].ratchet_key);
-        olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Created new ratchet key T(%i) %s",
+        olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Created new ratchet key T(%i) %s",
                   chain_index + 1,
                   sender_chain[0].ratchet_key.to_string().c_str());
         create_chain_key(
@@ -460,7 +460,7 @@ std::size_t olm::Ratchet::encrypt(
             kdf_info,
             root_key, sender_chain[0].chain_key
         );
-        olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised new sender chain R(%i)",
+        olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised new sender chain R(%i)",
                   chain_index + 1);
         chain_index++;
     }
@@ -491,7 +491,7 @@ std::size_t olm::Ratchet::encrypt(
         output, output_length
     );
 
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY,
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY,
               "Encoded message ver=%i ratchet_key=%s chain_idx=%i ciphertext=%s",
               PROTOCOL_VERSION,
               olm::bytes_to_string(writer.ratchet_key, olm::KEY_LENGTH).c_str(),
@@ -525,7 +525,7 @@ std::size_t olm::Ratchet::decrypt(
     std::uint8_t const * input, std::size_t input_length,
     std::uint8_t * plaintext, std::size_t max_plaintext_length
 ) {
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY,
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY,
               "Decrypting message %s",
               olm::bytes_to_string(input, input_length).c_str());
 
@@ -580,7 +580,7 @@ std::size_t olm::Ratchet::decrypt(
     std::size_t result = std::size_t(-1);
 
     if (!chain) {
-        olm::logf(olm::LOG_DEBUG, LOG_CATEGORY,
+        olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY,
                   "Sender ratchet key does not match known chain; starting new one");
         result = verify_mac_and_decrypt_for_new_chain(
             *this, reader, plaintext, max_plaintext_length
@@ -642,7 +642,7 @@ std::size_t olm::Ratchet::decrypt(
         olm::unset(sender_chain[0]);
         sender_chain.erase(sender_chain.begin());
         receiver_chain_index = ++chain_index;
-        olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised new receiver chain R(%i)",
+        olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised new receiver chain R(%i)",
                   chain_index);
     }
 
diff --git a/src/session.cpp b/src/session.cpp
index 6a9bb7e..816dd26 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -16,7 +16,7 @@
 #include "olm/cipher.hh"
 #include "olm/crypto.hh"
 #include "olm/account.hh"
-#include "olm/logging.hh"
+#include "olm/logging.h"
 #include "olm/memory.hh"
 #include "olm/message.hh"
 #include "olm/pickle.hh"
@@ -68,7 +68,7 @@ std::size_t olm::Session::new_outbound_session(
         return std::size_t(-1);
     }
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY,
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY,
               "Creating new outbound session to receiver identity IB %s, "
               "receiver ephemeral EB %s", identity_key.to_string().c_str(),
               one_time_key.to_string().c_str()
@@ -76,12 +76,12 @@ std::size_t olm::Session::new_outbound_session(
 
     olm::Curve25519KeyPair base_key;
     olm::curve25519_generate_key(random, base_key);
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Created new ephemeral key EA %s",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Created new ephemeral key EA %s",
               base_key.to_string().c_str());
 
     olm::Curve25519KeyPair ratchet_key;
     olm::curve25519_generate_key(random + olm::KEY_LENGTH, ratchet_key);
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Created new ratchet key T(0) %s",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Created new ratchet key T(0) %s",
               ratchet_key.to_string().c_str());
 
     olm::Curve25519KeyPair const & alice_identity_key_pair = (
@@ -108,7 +108,7 @@ std::size_t olm::Session::new_outbound_session(
     olm::unset(ratchet_key);
     olm::unset(secret);
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised outbound session");
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised outbound session");
     return std::size_t(0);
 }
 
@@ -151,7 +151,7 @@ std::size_t olm::Session::new_inbound_session(
             their_identity_key->public_key, reader.identity_key, olm::KEY_LENGTH
         );
         if (!same) {
-            olm::logf(olm::LOG_INFO, LOG_CATEGORY,
+            olm_logf(OLM_LOG_INFO, LOG_CATEGORY,
                       "Identity key on received message is incorrect "
                       "(expected %s, got %s)",
                       their_identity_key->to_string().c_str(),
@@ -167,7 +167,7 @@ std::size_t olm::Session::new_inbound_session(
     olm::load_array(alice_base_key.public_key, reader.base_key);
     olm::load_array(bob_one_time_key.public_key, reader.one_time_key);
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY,
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY,
               "Creating new inbound session from sender identity IA %s, "
               "sender ephemeral EA %s, our ephemeral EB %s",
               alice_identity_key.to_string().c_str(),
@@ -189,7 +189,7 @@ std::size_t olm::Session::new_inbound_session(
     olm::Curve25519PublicKey ratchet_key;
     olm::load_array(ratchet_key.public_key, message_reader.ratchet_key);
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY,
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY,
               "Received ratchet key T(0) %s", ratchet_key.to_string().c_str());
 
     olm::OneTimeKey const * our_one_time_key = local_account.lookup_key(
@@ -197,7 +197,7 @@ std::size_t olm::Session::new_inbound_session(
     );
 
     if (!our_one_time_key) {
-        olm::logf(olm::LOG_INFO, LOG_CATEGORY,
+        olm_logf(OLM_LOG_INFO, LOG_CATEGORY,
                   "Session uses unknown ephemeral key %s",
                   bob_one_time_key.to_string().c_str());
         last_error = olm::ErrorCode::BAD_MESSAGE_KEY_ID;
@@ -221,7 +221,7 @@ std::size_t olm::Session::new_inbound_session(
 
     olm::unset(secret);
 
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Initialised inbound session");
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Initialised inbound session");
     return std::size_t(0);
 }
 
@@ -320,7 +320,7 @@ std::size_t olm::Session::encrypt(
     std::uint8_t const * random, std::size_t random_length,
     std::uint8_t * message, std::size_t message_length
 ) {
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Encrypting '%.*s'",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Encrypting '%.*s'",
               (int)plaintext_length, plaintext);
 
     if (message_length < encrypt_message_length(plaintext_length)) {
@@ -351,7 +351,7 @@ std::size_t olm::Session::encrypt(
         message_body = writer.message;
 
 
-        olm::logf(olm::LOG_DEBUG, LOG_CATEGORY,
+        olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY,
                   "Encoded pre-key message ver=%i one_time_key[Eb]=%s "
                   "base_key[Ea]=%s identity_key[Ia]=%s",
                   PROTOCOL_VERSION,
@@ -373,7 +373,7 @@ std::size_t olm::Session::encrypt(
         return result;
     }
 
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY, "Encrypted message %s",
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY, "Encrypted message %s",
               olm::bytes_to_string(message_body, result).c_str());
 
     return result;
@@ -417,7 +417,7 @@ std::size_t olm::Session::decrypt(
     std::uint8_t const * message, std::size_t message_length,
     std::uint8_t * plaintext, std::size_t max_plaintext_length
 ) {
-    olm::logf(olm::LOG_TRACE, LOG_CATEGORY, "Decrypting %smessage",
+    olm_logf(OLM_LOG_TRACE, LOG_CATEGORY, "Decrypting %smessage",
               message_type == olm::MessageType::MESSAGE ? "" : "pre-key ");
 
     std::uint8_t const * message_body;
@@ -447,7 +447,7 @@ std::size_t olm::Session::decrypt(
     }
 
     received_message = true;
-    olm::logf(olm::LOG_DEBUG, LOG_CATEGORY, "Decrypted '%.*s'",
+    olm_logf(OLM_LOG_DEBUG, LOG_CATEGORY, "Decrypted '%.*s'",
               (int)result, plaintext);
     return result;
 }
-- 
cgit v1.2.3-70-g09d2