summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-01-16 22:13:35 +0000
committerHavoc Pennington <hp@redhat.com>2005-01-16 22:13:35 +0000
commit7f9721a6d36697a57170c604aa845af3531bd157 (patch)
tree4c621bf9671e8c855803bba07ff2d6d87b9baf3d
parent31988af4089f3793940417535f8eabaae1ac26c8 (diff)
2005-01-16 Havoc Pennington <hp@redhat.com>
* test/unused-code-gc.py: hacky script to find code that's used only by the bus (not libdbus) or used only by tests or not used at all. It has some false alarms, but looks like we can clean up a lot of size from libdbus. * dbus/dbus-sysdeps.c, dbus/dbus-sysdeps-utils.c, dbus/Makefile.am: initially move 10K of binary size out of libdbus
-rw-r--r--ChangeLog10
-rw-r--r--dbus/Makefile.am14
-rw-r--r--dbus/dbus-memory.c2
-rw-r--r--dbus/dbus-sysdeps.c570
-rw-r--r--dbus/dbus-userdb.c43
-rw-r--r--dbus/dbus-userdb.h5
-rwxr-xr-xtest/unused-code-gc.py240
7 files changed, 282 insertions, 602 deletions
diff --git a/ChangeLog b/ChangeLog
index 45eaa6d2..af5c2073 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2005-01-16 Havoc Pennington <hp@redhat.com>
+ * test/unused-code-gc.py: hacky script to find code that's used
+ only by the bus (not libdbus) or used only by tests or not used at
+ all. It has some false alarms, but looks like we can clean up a
+ lot of size from libdbus.
+
+ * dbus/dbus-sysdeps.c, dbus/dbus-sysdeps-utils.c,
+ dbus/Makefile.am: initially move 10K of binary size out of libdbus
+
+2005-01-16 Havoc Pennington <hp@redhat.com>
+
* Add and fix docs according to Doxygen warnings throughout
source.
diff --git a/dbus/Makefile.am b/dbus/Makefile.am
index 12c9444f..88749a8b 100644
--- a/dbus/Makefile.am
+++ b/dbus/Makefile.am
@@ -75,8 +75,6 @@ DBUS_LIB_SOURCES= \
dbus-server-unix.h \
dbus-sha.c \
dbus-sha.h \
- dbus-test.c \
- dbus-test.h \
dbus-timeout.c \
dbus-timeout.h \
dbus-threads.c \
@@ -109,8 +107,6 @@ DBUS_SHARED_SOURCES= \
dbus-memory.c \
dbus-mempool.c \
dbus-mempool.h \
- dbus-spawn.c \
- dbus-spawn.h \
dbus-string.c \
dbus-string.h \
dbus-string-private.h \
@@ -126,7 +122,13 @@ DBUS_SHARED_SOURCES= \
### to be unless they move to DBUS_SHARED_SOURCES later)
DBUS_UTIL_SOURCES= \
dbus-mainloop.c \
- dbus-mainloop.h
+ dbus-mainloop.h \
+ dbus-spawn.c \
+ dbus-spawn.h \
+ dbus-sysdeps-util.c \
+ dbus-sysdeps-util.h \
+ dbus-test.c \
+ dbus-test.h
libdbus_1_la_SOURCES= \
$(DBUS_LIB_SOURCES) \
@@ -167,7 +169,7 @@ noinst_PROGRAMS=$(TESTS)
dbus_test_SOURCES= \
dbus-test-main.c
-dbus_test_LDADD= $(DBUS_CLIENT_LIBS) libdbus-1.la
+dbus_test_LDADD=libdbus-convenience.la
## mop up the gcov files
clean-local:
diff --git a/dbus/dbus-memory.c b/dbus/dbus-memory.c
index b28c6b11..c36601ae 100644
--- a/dbus/dbus-memory.c
+++ b/dbus/dbus-memory.c
@@ -231,6 +231,7 @@ _dbus_get_fail_alloc_failures (void)
return n_failures_per_failure;
}
+#ifdef DBUS_BUILD_TESTS
/**
* Called when about to alloc some memory; if
* it returns #TRUE, then the allocation should
@@ -272,6 +273,7 @@ _dbus_decrement_fail_alloc_counter (void)
return FALSE;
}
}
+#endif /* DBUS_BUILD_TESTS */
/**
* Get the number of outstanding malloc()'d blocks.
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c
index c1ff46ce..5547d6c6 100644
--- a/dbus/dbus-sysdeps.c
+++ b/dbus/dbus-sysdeps.c
@@ -26,7 +26,7 @@
#include "dbus-sysdeps.h"
#include "dbus-threads.h"
#include "dbus-protocol.h"
-#include "dbus-test.h"
+#include "dbus-string.h"
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
@@ -71,6 +71,7 @@
* @addtogroup DBusInternalsUtils
* @{
*/
+#ifndef DBUS_DISABLE_ASSERT
/**
* Aborts the program with SIGABRT (dumping core).
*/
@@ -86,6 +87,7 @@ _dbus_abort (void)
abort ();
_exit (1); /* in case someone manages to ignore SIGABRT */
}
+#endif
/**
* Wrapper for setenv(). If the value is #NULL, unsets
@@ -1051,6 +1053,7 @@ _dbus_string_append_uint (DBusString *str,
return TRUE;
}
+#ifdef DBUS_BUILD_TESTS
/**
* Appends a double to a DBusString.
*
@@ -1087,6 +1090,7 @@ _dbus_string_append_double (DBusString *str,
return TRUE;
}
+#endif /* DBUS_BUILD_TESTS */
/**
* Parses an integer contained in a DBusString. Either return parameter
@@ -1169,6 +1173,7 @@ _dbus_string_parse_uint (const DBusString *str,
}
#endif /* DBUS_BUILD_TESTS */
+#ifdef DBUS_BUILD_TESTS
static dbus_bool_t
ascii_isspace (char c)
{
@@ -1179,13 +1184,17 @@ ascii_isspace (char c)
c == '\t' ||
c == '\v');
}
+#endif /* DBUS_BUILD_TESTS */
+#ifdef DBUS_BUILD_TESTS
static dbus_bool_t
ascii_isdigit (char c)
{
return c >= '0' && c <= '9';
}
+#endif /* DBUS_BUILD_TESTS */
+#ifdef DBUS_BUILD_TESTS
static dbus_bool_t
ascii_isxdigit (char c)
{
@@ -1193,8 +1202,9 @@ ascii_isxdigit (char c)
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F'));
}
+#endif /* DBUS_BUILD_TESTS */
-
+#ifdef DBUS_BUILD_TESTS
/* Calls strtod in a locale-independent fashion, by looking at
* the locale data and patching the decimal comma to a point.
*
@@ -1323,8 +1333,9 @@ ascii_strtod (const char *nptr,
return val;
}
+#endif /* DBUS_BUILD_TESTS */
-
+#ifdef DBUS_BUILD_TESTS
/**
* Parses a floating point number contained in a DBusString. Either
* return parameter may be #NULL if you aren't interested in it. The
@@ -1363,6 +1374,7 @@ _dbus_string_parse_double (const DBusString *str,
return TRUE;
}
+#endif /* DBUS_BUILD_TESTS */
/** @} */ /* DBusString group */
@@ -2416,34 +2428,6 @@ _dbus_create_directory (const DBusString *filename,
}
/**
- * Removes a directory; Directory must be empty
- *
- * @param filename directory filename
- * @param error initialized error object
- * @returns #TRUE on success
- */
-dbus_bool_t
-_dbus_delete_directory (const DBusString *filename,
- DBusError *error)
-{
- const char *filename_c;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- filename_c = _dbus_string_get_const_data (filename);
-
- if (rmdir (filename_c) != 0)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Failed to remove directory %s: %s\n",
- filename_c, _dbus_strerror (errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
* Appends the given filename to the given directory.
*
* @todo it might be cute to collapse multiple '/' such as "foo//"
@@ -2484,69 +2468,6 @@ _dbus_concat_dir_and_file (DBusString *dir,
}
/**
- * Get the directory name from a complete filename
- * @param filename the filename
- * @param dirname string to append directory name to
- * @returns #FALSE if no memory
- */
-dbus_bool_t
-_dbus_string_get_dirname (const DBusString *filename,
- DBusString *dirname)
-{
- int sep;
-
- _dbus_assert (filename != dirname);
- _dbus_assert (filename != NULL);
- _dbus_assert (dirname != NULL);
-
- /* Ignore any separators on the end */
- sep = _dbus_string_get_length (filename);
- if (sep == 0)
- return _dbus_string_append (dirname, "."); /* empty string passed in */
-
- while (sep > 0 && _dbus_string_get_byte (filename, sep - 1) == '/')
- --sep;
-
- _dbus_assert (sep >= 0);
-
- if (sep == 0)
- return _dbus_string_append (dirname, "/");
-
- /* Now find the previous separator */
- _dbus_string_find_byte_backward (filename, sep, '/', &sep);
- if (sep < 0)
- return _dbus_string_append (dirname, ".");
-
- /* skip multiple separators */
- while (sep > 0 && _dbus_string_get_byte (filename, sep - 1) == '/')
- --sep;
-
- _dbus_assert (sep >= 0);
-
- if (sep == 0 &&
- _dbus_string_get_byte (filename, 0) == '/')
- return _dbus_string_append (dirname, "/");
- else
- return _dbus_string_copy_len (filename, 0, sep - 0,
- dirname, _dbus_string_get_length (dirname));
-}
-
-/**
- * Checks whether the filename is an absolute path
- *
- * @param filename the filename
- * @returns #TRUE if an absolute path
- */
-dbus_bool_t
-_dbus_path_is_absolute (const DBusString *filename)
-{
- if (_dbus_string_get_length (filename) > 0)
- return _dbus_string_get_byte (filename, 0) == '/';
- else
- return FALSE;
-}
-
-/**
* Internals of directory iterator
*/
struct DBusDirIter
@@ -2938,45 +2859,6 @@ _dbus_exit (int code)
}
/**
- * stat() wrapper.
- *
- * @param filename the filename to stat
- * @param statbuf the stat info to fill in
- * @param error return location for error
- * @returns #FALSE if error was set
- */
-dbus_bool_t
-_dbus_stat (const DBusString *filename,
- DBusStat *statbuf,
- DBusError *error)
-{
- const char *filename_c;
- struct stat sb;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- filename_c = _dbus_string_get_const_data (filename);
-
- if (stat (filename_c, &sb) < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "%s", _dbus_strerror (errno));
- return FALSE;
- }
-
- statbuf->mode = sb.st_mode;
- statbuf->nlink = sb.st_nlink;
- statbuf->uid = sb.st_uid;
- statbuf->gid = sb.st_gid;
- statbuf->size = sb.st_size;
- statbuf->atime = sb.st_atime;
- statbuf->mtime = sb.st_mtime;
- statbuf->ctime = sb.st_ctime;
-
- return TRUE;
-}
-
-/**
* Creates a full-duplex pipe (as in socketpair()).
* Sets both ends of the pipe nonblocking.
*
@@ -3099,6 +2981,7 @@ _dbus_set_fd_nonblocking (int fd,
return TRUE;
}
+#if !defined (DBUS_DISABLE_ASSERT) || defined(DBUS_BUILD_TESTS)
/**
* On GNU libc systems, print a crude backtrace to the verbose log.
* On other systems, print "no backtrace support"
@@ -3129,425 +3012,6 @@ _dbus_print_backtrace (void)
_dbus_verbose (" D-BUS not compiled with backtrace support\n");
#endif
}
-
-/**
- * Does the chdir, fork, setsid, etc. to become a daemon process.
- *
- * @param pidfile #NULL, or pidfile to create
- * @param print_pid_fd file descriptor to print pid to, or -1 for none
- * @param error return location for errors
- * @returns #FALSE on failure
- */
-dbus_bool_t
-_dbus_become_daemon (const DBusString *pidfile,
- int print_pid_fd,
- DBusError *error)
-{
- const char *s;
- pid_t child_pid;
- int dev_null_fd;
-
- _dbus_verbose ("Becoming a daemon...\n");
-
- _dbus_verbose ("chdir to /\n");
- if (chdir ("/") < 0)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Could not chdir() to root directory");
- return FALSE;
- }
-
- _dbus_verbose ("forking...\n");
- switch ((child_pid = fork ()))
- {
- case -1:
- _dbus_verbose ("fork failed\n");
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to fork daemon: %s", _dbus_strerror (errno));
- return FALSE;
- break;
-
- case 0:
- _dbus_verbose ("in child, closing std file descriptors\n");
-
- /* silently ignore failures here, if someone
- * doesn't have /dev/null we may as well try
- * to continue anyhow
- */
-
- dev_null_fd = open ("/dev/null", O_RDWR);
- if (dev_null_fd >= 0)
- {
- dup2 (dev_null_fd, 0);
- dup2 (dev_null_fd, 1);
-
- s = _dbus_getenv ("DBUS_DEBUG_OUTPUT");
- if (s == NULL || *s == '\0')
- dup2 (dev_null_fd, 2);
- else
- _dbus_verbose ("keeping stderr open due to DBUS_DEBUG_OUTPUT\n");
- }
-
- /* Get a predictable umask */
- _dbus_verbose ("setting umask\n");
- umask (022);
- break;
-
- default:
- if (pidfile)
- {
- _dbus_verbose ("parent writing pid file\n");
- if (!_dbus_write_pid_file (pidfile,
- child_pid,
- error))
- {
- _dbus_verbose ("pid file write failed, killing child\n");
- kill (child_pid, SIGTERM);
- return FALSE;
- }
- }
-
- /* Write PID if requested */
- if (print_pid_fd >= 0)
- {
- DBusString pid;
- int bytes;
-
- if (!_dbus_string_init (&pid))
- {
- _DBUS_SET_OOM (error);
- kill (child_pid, SIGTERM);
- return FALSE;
- }
-
- if (!_dbus_string_append_int (&pid, _dbus_getpid ()) ||
- !_dbus_string_append (&pid, "\n"))
- {
- _dbus_string_free (&pid);
- _DBUS_SET_OOM (error);
- kill (child_pid, SIGTERM);
- return FALSE;
- }
-
- bytes = _dbus_string_get_length (&pid);
- if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED,
- "Printing message bus PID: %s\n",
- _dbus_strerror (errno));
- _dbus_string_free (&pid);
- kill (child_pid, SIGTERM);
- return FALSE;
- }
-
- _dbus_string_free (&pid);
- }
- _dbus_verbose ("parent exiting\n");
- _exit (0);
- break;
- }
-
- _dbus_verbose ("calling setsid()\n");
- if (setsid () == -1)
- _dbus_assert_not_reached ("setsid() failed");
-
- return TRUE;
-}
-
-/**
- * Creates a file containing the process ID.
- *
- * @param filename the filename to write to
- * @param pid our process ID
- * @param error return location for errors
- * @returns #FALSE on failure
- */
-dbus_bool_t
-_dbus_write_pid_file (const DBusString *filename,
- unsigned long pid,
- DBusError *error)
-{
- const char *cfilename;
- int fd;
- FILE *f;
-
- cfilename = _dbus_string_get_const_data (filename);
-
- fd = open (cfilename, O_WRONLY|O_CREAT|O_EXCL|O_BINARY, 0644);
-
- if (fd < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to open \"%s\": %s", cfilename,
- _dbus_strerror (errno));
- return FALSE;
- }
-
- if ((f = fdopen (fd, "w")) == NULL)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to fdopen fd %d: %s", fd, _dbus_strerror (errno));
- close (fd);
- return FALSE;
- }
-
- if (fprintf (f, "%lu\n", pid) < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to write to \"%s\": %s", cfilename,
- _dbus_strerror (errno));
- return FALSE;
- }
-
- if (fclose (f) == EOF)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to close \"%s\": %s", cfilename,
- _dbus_strerror (errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
- * Changes the user and group the bus is running as.
- *
- * @param uid the new user ID
- * @param gid the new group ID
- * @param error return location for errors
- * @returns #FALSE on failure
- */
-dbus_bool_t
-_dbus_change_identity (dbus_uid_t uid,
- dbus_gid_t gid,
- DBusError *error)
-{
- /* setgroups() only works if we are a privileged process,
- * so we don't return error on failure; the only possible
- * failure is that we don't have perms to do it.
- * FIXME not sure this is right, maybe if setuid()
- * is going to work then setgroups() should also work.
- */
- if (setgroups (0, NULL) < 0)
- _dbus_warn ("Failed to drop supplementary groups: %s\n",
- _dbus_strerror (errno));
-
- /* Set GID first, or the setuid may remove our permission
- * to change the GID
- */
- if (setgid (gid) < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to set GID to %lu: %s", gid,
- _dbus_strerror (errno));
- return FALSE;
- }
-
- if (setuid (uid) < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (errno),
- "Failed to set UID to %lu: %s", uid,
- _dbus_strerror (errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-/** Installs a UNIX signal handler
- *
- * @param sig the signal to handle
- * @param handler the handler
- */
-void
-_dbus_set_signal_handler (int sig,
- DBusSignalHandler handler)
-{
- struct sigaction act;
- sigset_t empty_mask;
-
- sigemptyset (&empty_mask);
- act.sa_handler = handler;
- act.sa_mask = empty_mask;
- act.sa_flags = 0;
- sigaction (sig, &act, 0);
-}
-
-/** Checks if a file exists
-*
-* @param file full path to the file
-* @returns #TRUE if file exists
-*/
-dbus_bool_t
-_dbus_file_exists (const char *file)
-{
- return (access (file, F_OK) == 0);
-}
-
-/** Checks if user is at the console
-*
-* @param username user to check
-* @param error return location for errors
-* @returns #TRUE is the user is at the consolei and there are no errors
-*/
-dbus_bool_t
-_dbus_user_at_console (const char *username,
- DBusError *error)
-{
-
- DBusString f;
- dbus_bool_t result;
-
- result = FALSE;
- if (!_dbus_string_init (&f))
- {
- _DBUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_append (&f, DBUS_CONSOLE_DIR))
- {
- _DBUS_SET_OOM (error);
- goto out;
- }
-
-
- if (!_dbus_string_append (&f, username))
- {
- _DBUS_SET_OOM (error);
- goto out;
- }
-
- result = _dbus_file_exists (_dbus_string_get_const_data (&f));
-
- out:
- _dbus_string_free (&f);
-
- return result;
-}
-
-#ifdef DBUS_BUILD_TESTS
-#include <stdlib.h>
-static void
-check_dirname (const char *filename,
- const char *dirname)
-{
- DBusString f, d;
-
- _dbus_string_init_const (&f, filename);
-
- if (!_dbus_string_init (&d))
- _dbus_assert_not_reached ("no memory");
-
- if (!_dbus_string_get_dirname (&f, &d))
- _dbus_assert_not_reached ("no memory");
-
- if (!_dbus_string_equal_c_str (&d, dirname))
- {
- _dbus_warn ("For filename \"%s\" got dirname \"%s\" and expected \"%s\"\n",
- filename,
- _dbus_string_get_const_data (&d),
- dirname);
- exit (1);
- }
-
- _dbus_string_free (&d);
-}
-
-static void
-check_path_absolute (const char *path,
- dbus_bool_t expected)
-{
- DBusString p;
-
- _dbus_string_init_const (&p, path);
-
- if (_dbus_path_is_absolute (&p) != expected)
- {
- _dbus_warn ("For path \"%s\" expected absolute = %d got %d\n",
- path, expected, _dbus_path_is_absolute (&p));
- exit (1);
- }
-}
-
-/**
- * Unit test for dbus-sysdeps.c.
- *
- * @returns #TRUE on success.
- */
-dbus_bool_t
-_dbus_sysdeps_test (void)
-{
- DBusString str;
- double val;
- int pos;
-
- check_dirname ("foo", ".");
- check_dirname ("foo/bar", "foo");
- check_dirname ("foo//bar", "foo");
- check_dirname ("foo///bar", "foo");
- check_dirname ("foo/bar/", "foo");
- check_dirname ("foo//bar/", "foo");
- check_dirname ("foo///bar/", "foo");
- check_dirname ("foo/bar//", "foo");
- check_dirname ("foo//bar////", "foo");
- check_dirname ("foo///bar///////", "foo");
- check_dirname ("/foo", "/");
- check_dirname ("////foo", "/");
- check_dirname ("/foo/bar", "/foo");
- check_dirname ("/foo//bar", "/foo");
- check_dirname ("/foo///bar", "/foo");
- check_dirname ("/", "/");
- check_dirname ("///", "/");
- check_dirname ("", ".");
-
-
- _dbus_string_init_const (&str, "3.5");
- if (!_dbus_string_parse_double (&str,
- 0, &val, &pos))
- {
- _dbus_warn ("Failed to parse double");
- exit (1);
- }
- if (ABS(3.5 - val) > 1e-6)
- {
- _dbus_warn ("Failed to parse 3.5 correctly, got: %f", val);
- exit (1);
- }
- if (pos != 3)
- {
- _dbus_warn ("_dbus_string_parse_double of \"3.5\" returned wrong position %d", pos);
- exit (1);
- }
-
- _dbus_string_init_const (&str, "0xff");
- if (!_dbus_string_parse_double (&str,
- 0, &val, &pos))
- {
- _dbus_warn ("Failed to parse double");
- exit (1);
- }
- if (ABS (0xff - val) > 1e-6)
- {
- _dbus_warn ("Failed to parse 0xff correctly, got: %f\n", val);
- exit (1);
- }
- if (pos != 4)
- {
- _dbus_warn ("_dbus_string_parse_double of \"0xff\" returned wrong position %d", pos);
- exit (1);
- }
-
- check_path_absolute ("/", TRUE);
- check_path_absolute ("/foo", TRUE);
- check_path_absolute ("", FALSE);
- check_path_absolute ("foo", FALSE);
- check_path_absolute ("foo/bar", FALSE);
-
- return TRUE;
-}
-#endif /* DBUS_BUILD_TESTS */
+#endif /* asserts or tests enabled */
/** @} end of sysdeps */
-
diff --git a/dbus/dbus-userdb.c b/dbus/dbus-userdb.c
index d8477cd2..aa9aaf2a 100644
--- a/dbus/dbus-userdb.c
+++ b/dbus/dbus-userdb.c
@@ -65,7 +65,7 @@ free_group_info (void *data)
dbus_free (info);
}
-static DBusUserInfo*
+DBusUserInfo*
_dbus_user_database_lookup (DBusUserDatabase *db,
dbus_uid_t uid,
const DBusString *username,
@@ -400,47 +400,6 @@ _dbus_get_user_id (const DBusString *username,
}
/**
- * Checks to see if the UID sent in is the console user
- *
- * @param uid UID of person to check
- * @param error return location for errors
- * @returns #TRUE if the UID is the same as the console user and there are no errors
- */
-dbus_bool_t
-_dbus_is_console_user (dbus_uid_t uid,
- DBusError *error)
-{
-
- DBusUserDatabase *db;
- const DBusUserInfo *info;
- dbus_bool_t result = FALSE;
-
- _dbus_user_database_lock_system ();
-
- db = _dbus_user_database_get_system ();
- if (db == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED, "Could not get system database.");
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- info = _dbus_user_database_lookup (db, uid, NULL, error);
-
- if (info == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- result = _dbus_user_at_console (info->username, error);
-
- _dbus_user_database_unlock_system ();
-
- return result;
-}
-
-/**
* Gets group ID given groupname
*
* @param groupname the groupname
diff --git a/dbus/dbus-userdb.h b/dbus/dbus-userdb.h
index c66031f6..fa4f9f71 100644
--- a/dbus/dbus-userdb.h
+++ b/dbus/dbus-userdb.h
@@ -54,7 +54,10 @@ dbus_bool_t _dbus_user_database_get_groupname (DBusUserDatabase *db,
const DBusString *groupname,
const DBusGroupInfo **info,
DBusError *error);
-
+DBusUserInfo* _dbus_user_database_lookup (DBusUserDatabase *db,
+ dbus_uid_t uid,
+ const DBusString *username,
+ DBusError *error);
DBusUserDatabase* _dbus_user_database_get_system (void);
void _dbus_user_database_lock_system (void);
diff --git a/test/unused-code-gc.py b/test/unused-code-gc.py
new file mode 100755
index 00000000..7bc1930b
--- /dev/null
+++ b/test/unused-code-gc.py
@@ -0,0 +1,240 @@
+#! /usr/bin/python
+
+import os
+import sys
+import string
+import re
+
+## hash from symbol name to list of symbols with that name,
+## where the list of symbols contains a list representing each symbol
+symbols = {}
+roots = {}
+
+def createBacklinks(name, syms):
+ for s in syms:
+ refs = s[2]
+ for r in refs:
+ ## for each ref, add ourselves as a referencer
+ if symbols.has_key(r):
+ targets = symbols[r]
+ for t in targets:
+ if name not in t[5]:
+ t[5].append(name)
+
+def markSymbol(frm, name):
+ if not symbols.has_key(name):
+ print "%s referenced but was not in the objdump"
+ syms = symbols[name]
+ ## print ambiguous references unless they are internal noise like ".L129"
+ if len(syms) > 1 and name[0] != '.':
+ print "Reference to symbol '%s' from '%s' is ambiguous, marking all '%s'" % (name, frm, name)
+ print syms
+ for s in syms:
+ if s[4]:
+ pass ## already marked
+ else:
+ s[4] = 1
+ refs = s[2]
+ for r in refs:
+ markSymbol(s[0], r)
+
+def cmpFilename(a, b):
+ v = cmp(a[1], b[1])
+ if v == 0:
+ v = cmp(a[0], b[0])
+ return v
+
+def sizeAsString(bytes):
+ if bytes < 1024:
+ return "%d bytes" % bytes
+ elif bytes < 1024*1024:
+ return "%.2gK" % (bytes / 1024.0)
+ else:
+ return "%.2gM" % (bytes / 1024.0 / 1024.0)
+
+def printLost():
+ list = []
+ filename = None
+ for (name, syms) in symbols.items():
+ s = syms[0] ## we always mark all or none for now
+ if not s[4] and name[0] != '.': ## skip .L129 type symbols
+ filename = s[3]
+ if not filename:
+ filename = "unknown file"
+ list.append ((name, filename, s[5], s[7]))
+
+ file_summaries = []
+ total_unused = 0
+ total_this_file = 0
+ filename = None
+ list.sort(cmpFilename)
+ for l in list:
+ next_filename = l[1]
+ if next_filename != filename:
+ if total_this_file > 0:
+ file_summaries.append (" %s may be unused in %s" % (sizeAsString(total_this_file), filename))
+ print "%s has these symbols not reachable from exported symbols:" % next_filename
+ filename = next_filename
+ total_this_file = 0
+ print " %s %s" % (l[0], sizeAsString(l[3]))
+ total_unused = total_unused + l[3]
+ total_this_file = total_this_file + l[3]
+ for trace in l[2]:
+ print " referenced from %s" % trace
+
+ for fs in file_summaries:
+ print fs
+ print "%s total may be unused" % sizeAsString(total_unused)
+
+def main():
+
+ ## 0001aa44 <_dbus_message_get_network_data>:
+ sym_re = re.compile ('([0-9a-f]+) <([^>]+)>:')
+ ## 1aa49: e8 00 00 00 00 call 1aa4e <_dbus_message_get_network_data+0xa>
+ ref_re = re.compile (' <([^>]+)> *$')
+ ## /home/hp/dbus-cvs/dbus/dbus/dbus-message.c:139
+ file_re = re.compile ('^(\/[^:].*):[0-9]+$')
+ ## _dbus_message_get_network_data+0xa
+ funcname_re = re.compile ('([^+]+)\+[0-9a-fx]+')
+ ## 00005410 T dbus_address_entries_free
+ dynsym_re = re.compile ('T ([^ \n]+)$')
+
+ filename = sys.argv[1]
+
+ command = """
+ objdump -D --demangle -l %s
+ """ % filename
+
+ command = string.strip (command)
+
+ print "Running: %s" % command
+
+ f = os.popen(command)
+
+ ## first we find which functions reference which other functions
+ current_sym = None
+ lines = f.readlines()
+ for l in lines:
+ addr = None
+ name = None
+ target = None
+ file = None
+
+ match = sym_re.match(l)
+ if match:
+ addr = match.group(1)
+ name = match.group(2)
+ else:
+ match = ref_re.search(l)
+ if match:
+ target = match.group(1)
+ else:
+ match = file_re.match(l)
+ if match:
+ file = match.group(1)
+
+ if name:
+ ## 0 symname, 1 address, 2 references, 3 filename, 4 reached, 5 referenced-by 6 backlinked 7 approx size
+ item = [name, addr, [], None, 0, [], 0, 0]
+ if symbols.has_key(name):
+ symbols[name].append(item)
+ else:
+ symbols[name] = [item]
+
+ if current_sym:
+ prev_addr = long(current_sym[1], 16)
+ our_addr = long(item[1], 16)
+ item[7] = our_addr - prev_addr
+ if item[7] < 0:
+ print "Computed negative size %d for %s" % (item[7], item[0])
+ item[7] = 0
+
+ current_sym = item
+
+ elif target and current_sym:
+ match = funcname_re.match(target)
+ if match:
+ ## dump the "+address"
+ target = match.group(1)
+ if target == current_sym[0]:
+ pass ## skip self-references
+ else:
+ current_sym[2].append (target)
+
+ elif file and current_sym:
+ if file.startswith('/usr/include'):
+ ## inlined libc thingy
+ pass
+ elif current_sym[0].startswith('.debug'):
+ ## debug info
+ pass
+ elif current_sym[3] and current_sym[3] != file:
+ raise Exception ("%s in both %s and %s" % (current_sym[0], current_sym[3], file))
+ else:
+ current_sym[3] = file
+
+ ## now we need to find the roots (exported symbols)
+ command = "nm -D %s" % filename
+ print "Running: %s" % command
+ f = os.popen(command)
+ lines = f.readlines ()
+ for l in lines:
+ match = dynsym_re.search(l)
+ if match:
+ name = match.group(1)
+ if roots.has_key(name):
+ raise Exception("symbol %s exported twice?" % name)
+ else:
+ roots[name] = 1
+
+ print "%d symbols exported from this object" % len(roots)
+
+ ## these functions are used only indirectly, so we don't
+ ## notice they are used. Manually add them as roots...
+ vtable_roots = ['unix_finalize',
+ 'unix_handle_watch',
+ 'unix_disconnect',
+ 'unix_connection_set',
+ 'unix_do_iteration',
+ 'unix_live_messages_changed',
+ 'unix_get_unix_fd',
+ 'handle_client_data_cookie_sha1_mech',
+ 'handle_client_data_external_mech',
+ 'handle_server_data_cookie_sha1_mech',
+ 'handle_server_data_external_mech',
+ 'handle_client_initial_response_cookie_sha1_mech',
+ 'handle_client_initial_response_external_mech',
+ 'handle_client_shutdown_cookie_sha1_mech',
+ 'handle_client_shutdown_external_mech',
+ 'handle_server_shutdown_cookie_sha1_mech',
+ 'handle_server_shutdown_external_mech'
+ ]
+
+ for vr in vtable_roots:
+ if roots.has_key(vr):
+ raise Exception("%s is already a root" % vr)
+ roots[vr] = 1
+
+ for k in roots.keys():
+ markSymbol("root", k)
+
+ for (k, v) in symbols.items():
+ createBacklinks(k, v)
+
+ print """
+
+The symbols mentioned below don't appear to be reachable starting from
+the dynamic exports of the library. However, this program is pretty
+dumb; a limitation that creates false positives is that it can only
+trace 'reachable' through hardcoded function calls, if a function is
+called only through a vtable, it won't be marked reachable (and
+neither will its children in the call graph).
+
+"""
+
+ print "The following are hardcoded in as vtable roots: %s" % vtable_roots
+
+ printLost()
+
+if __name__ == "__main__":
+ main()