summaryrefslogtreecommitdiffstats
path: root/src/daemon/comm_layer_inner.cpp
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-01-21 00:44:39 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-01-21 00:44:39 +0100
commita387e6c91cd45ffc35c03e42bde7ba926231de4b (patch)
tree14f83cca9a0a81539de37dce061599b7063d52e0 /src/daemon/comm_layer_inner.cpp
parent320724188859d96b0a974d9e84bacd49a614f97d (diff)
downloadabrt-a387e6c91cd45ffc35c03e42bde7ba926231de4b.tar.gz
abrt-a387e6c91cd45ffc35c03e42bde7ba926231de4b.tar.xz
abrt-a387e6c91cd45ffc35c03e42bde7ba926231de4b.zip
Remove CCrashWatcher and CObserver classes; merge libabrt_daemon into abrtd
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/daemon/comm_layer_inner.cpp')
-rw-r--r--src/daemon/comm_layer_inner.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/daemon/comm_layer_inner.cpp b/src/daemon/comm_layer_inner.cpp
new file mode 100644
index 00000000..59f7c3f3
--- /dev/null
+++ b/src/daemon/comm_layer_inner.cpp
@@ -0,0 +1,93 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program 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 2 of the License, or
+ (at your option) any later version.
+
+ This program 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.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#include <pthread.h>
+#include <map>
+#include "abrtlib.h"
+#include "Daemon.h"
+#include "comm_layer_inner.h"
+
+typedef std::map<uint64_t, std::string> map_uint_str_t;
+static map_uint_str_t s_mapClientID;
+static pthread_mutex_t s_map_mutex;
+static bool s_map_mutex_inited;
+
+/* called via [p]error_msg() */
+static void warn_client(const char *msg)
+{
+ uint64_t key = uint64_t(pthread_self());
+
+ pthread_mutex_lock(&s_map_mutex);
+ map_uint_str_t::const_iterator ki = s_mapClientID.find(key);
+ const char* peer = (ki != s_mapClientID.end() ? ki->second.c_str() : NULL);
+ pthread_mutex_unlock(&s_map_mutex);
+
+ if (peer)
+ {
+ VERB1 log("Warning('%s'): %s", peer, msg);
+ if (g_pCommLayer != NULL)
+ g_pCommLayer->Warning(msg, peer);
+ }
+}
+
+void init_daemon_logging(void)
+{
+ if (!s_map_mutex_inited)
+ {
+ s_map_mutex_inited = true;
+ pthread_mutex_init(&s_map_mutex, NULL);
+ g_custom_logger = &warn_client;
+ }
+}
+
+void set_client_name(const char *name)
+{
+ uint64_t key = uint64_t(pthread_self());
+
+ pthread_mutex_lock(&s_map_mutex);
+ if (!name) {
+ s_mapClientID.erase(key);
+ } else {
+ s_mapClientID[key] = name;
+ }
+ pthread_mutex_unlock(&s_map_mutex);
+}
+
+void update_client(const char *fmt, ...)
+{
+ uint64_t key = uint64_t(pthread_self());
+
+ pthread_mutex_lock(&s_map_mutex);
+ map_uint_str_t::const_iterator ki = s_mapClientID.find(key);
+ const char* peer = (ki != s_mapClientID.end() ? ki->second.c_str() : NULL);
+ pthread_mutex_unlock(&s_map_mutex);
+
+ if (!peer)
+ return;
+
+ va_list p;
+ va_start(p, fmt);
+ char *msg = xvasprintf(fmt, p);
+ va_end(p);
+
+ VERB1 log("Update('%s'): %s", peer, msg);
+ if (g_pCommLayer != NULL)
+ g_pCommLayer->Update(msg, peer);
+
+ free(msg);
+}