Because dbus is portable to Windows, AIX and other such horrors, the main loop glue in particular has to have interesting contortions to work around things like OSs with no poll(), OSs that can't aggregate a bunch of fds and timeouts into one big meta-fd via modern designs like timerfd/epoll, and so on.
Moving on to look at other libraries in the ecosystem around dbus, let's look at Avahi. It has its own implementation of a linked list; a hash table; a priority queue; several alternative (!) simple main loops; main-loop integration glue for "full-fat" main loops like GLib and Qt; UTF-8 validation; hey this is all looking remarkably familiar.
systemd? Linked list; hash table; main loop (although at least systemd doesn't aim to be portable beyond Linux, so it can assume timerfd and epoll); UTF-8; again, all rather familiar.
systemd's competitor, Upstart? Well there's a library called libnih, that's clearly an excellent start. I haven't looked at it in detail but I'm pretty sure it has all the same sorts of things in.
Let's try something a bit different: Cairo, a rendering library. Oh look, there's the linked list. And the hash table. And some Unicode support. At least I haven't seen a main loop yet.
libxml, perhaps? Linked list, check. Unicode, check. Their hash table is called "dict", their I/O abstraction is 4k lines long and includes http and ftp, and I don't immediately see a main loop but I wasn't looking very hard.
I have to wonder, how many partial "make C not awful" libraries are there on my Linux laptop, and how many copies of GLib could I fit in the same amount of space they use? :-)
Hence my tendency to recommend "if you can, use GLib or similar; if you think you can't, reconsider your constraints before proceeding" over reinventing it for the nth time.