Index: chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.cc |
=================================================================== |
--- chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.cc (revision 0) |
+++ chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.cc (revision 0) |
@@ -0,0 +1,75 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.h" |
+ |
+#include <dlfcn.h> |
+#include <stdio.h> |
+ |
+namespace keyring_proxy { |
+ |
+#define GNOME_KEYRING_DEFINE_POINTER(name) \ |
+ typeof(&::gnome_keyring_##name) GnomeKeyringLoader::gnome_keyring_##name; |
+GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_DEFINE_POINTER) |
+#undef GNOME_KEYRING_DEFINE_POINTER |
+ |
+bool GnomeKeyringLoader::keyring_loaded = false; |
+ |
+#if defined(DLOPEN_GNOME_KEYRING) |
+ |
+#define GNOME_KEYRING_FUNCTION_INFO(name) \ |
+ {"gnome_keyring_"#name, reinterpret_cast<void**>(&gnome_keyring_##name)}, |
+const GnomeKeyringLoader::FunctionInfo GnomeKeyringLoader::functions[] = { |
+ GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_FUNCTION_INFO) |
+ {NULL, NULL} |
+}; |
+#undef GNOME_KEYRING_FUNCTION_INFO |
+ |
+// Load the library and initialize the function pointers. |
+bool GnomeKeyringLoader::LoadGnomeKeyring() { |
+ if (keyring_loaded) |
+ return true; |
+ |
+ void* handle = dlopen("libgnome-keyring.so.0", RTLD_NOW | RTLD_GLOBAL); |
+ if (!handle) { |
+ // We wanted to use GNOME Keyring, but we couldn't load it. Warn, because |
+ // either the user asked for this, or we autodetected it incorrectly. (Or |
+ // the system has broken libraries, which is also good to warn about.) |
+ fprintf(stderr, "Could not load libgnome-keyring.so.0: %s\n", dlerror()); |
+ return false; |
+ } |
+ |
+ for (size_t i = 0; functions[i].name; ++i) { |
+ dlerror(); |
+ *functions[i].pointer = dlsym(handle, functions[i].name); |
+ const char* error = dlerror(); |
+ if (error) { |
+ fprintf(stderr, "Unable to load symbol %s: %s\n", |
+ functions[i].name, error); |
+ dlclose(handle); |
+ return false; |
+ } |
+ } |
+ |
+ keyring_loaded = true; |
+ // We leak the library handle. That's OK: this function is called only once. |
+ return true; |
+} |
+ |
+#else // defined(DLOPEN_GNOME_KEYRING) |
+ |
+bool GnomeKeyringLoader::LoadGnomeKeyring() { |
+ if (keyring_loaded) |
+ return true; |
+#define GNOME_KEYRING_ASSIGN_POINTER(name) \ |
+ gnome_keyring_##name = &::gnome_keyring_##name; |
+ GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_ASSIGN_POINTER) |
+#undef GNOME_KEYRING_ASSIGN_POINTER |
+ keyring_loaded = true; |
+ return true; |
+} |
+ |
+#endif // defined(DLOPEN_GNOME_KEYRING) |
+ |
+} // namespace keyring_proxy |
Property changes on: chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |