#include <unistd.h>
  #include <stdio.h>
  #include <algorithm>
- 
+ #include <dlfcn.h>
  
  #include "indexcopy.h"
  
     
     return !_error->PendingError();
  }
 -
 +                                                                      /*}}}*/
  // Score - We compute a 'score' for a path                            /*{{{*/
  // ---------------------------------------------------------------------
  /* Paths are scored based on how close they come to what I consider
  
     return Res;
  }
 -
                                                                        /*}}}*/
  // DropBinaryArch - Dump dirs with a string like /binary-<foo>/               /*{{{*/
  // ---------------------------------------------------------------------
     
     return true;
  }
 -
 -
 +                                                                      /*}}}*/
  // DropRepeats - Drop repeated files resulting from symlinks          /*{{{*/
  // ---------------------------------------------------------------------
  /* Here we go and stat every file that we found and strip dup inodes. */
     return true;
  }
                                                                        /*}}}*/
 -
  // ReduceSourceList - Takes the path list and reduces it              /*{{{*/
  // ---------------------------------------------------------------------
  /* This takes the list of source list expressed entires and collects
     
     return true;
  }
 -
 -
 -bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log)
 +                                                                      /*}}}*/
 +bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log)              /*{{{*/
  {
     stringstream msg;
  
  
     return true;
  }
 -
 -
 -bool pkgCdrom::Add(pkgCdromStatus *log)
 +                                                                      /*}}}*/
 +bool pkgCdrom::Add(pkgCdromStatus *log)                                       /*{{{*/
  {
     stringstream msg;
  
  
     return true;
  }
 -
 -
 -pkgUdevCdromDevices::pkgUdevCdromDevices() 
 +                                                                      /*}}}*/
++pkgUdevCdromDevices::pkgUdevCdromDevices()                                    /*{{{*/
+    : libudev_handle(NULL)
+ {
+ 
+ }
++                                                                      /*}}}*/
+ 
+ bool
 -pkgUdevCdromDevices::Dlopen()
++pkgUdevCdromDevices::Dlopen()                                         /*{{{*/
+ {
+    // alread open
+    if(libudev_handle != NULL)
+       return true;
+ 
+    // see if we can get libudev
+    void *h = ::dlopen("libudev.so.0", RTLD_LAZY);
+    if(h == NULL)
+       return false;
+ 
+    // get the pointers to the udev structs
+    libudev_handle = h;
+    udev_new = (udev* (*)(void)) dlsym(h, "udev_new");
+    udev_enumerate_add_match_property = (int (*)(udev_enumerate*, const char*, const char*))dlsym(h, "udev_enumerate_add_match_property");
+    udev_enumerate_scan_devices = (int (*)(udev_enumerate*))dlsym(h, "udev_enumerate_scan_devices");
+    udev_enumerate_get_list_entry = (udev_list_entry* (*)(udev_enumerate*))dlsym(h, "udev_enumerate_get_list_entry");
+    udev_device_new_from_syspath = (udev_device* (*)(udev*, const char*))dlsym(h, "udev_device_new_from_syspath");
+    udev_enumerate_get_udev = (udev* (*)(udev_enumerate*))dlsym(h, "udev_enumerate_get_udev");
+    udev_list_entry_get_name = (const char* (*)(udev_list_entry*))dlsym(h, "udev_list_entry_get_name");
+    udev_device_get_devnode = (const char* (*)(udev_device*))dlsym(h, "udev_device_get_devnode");
+    udev_enumerate_new = (udev_enumerate* (*)(udev*))dlsym(h, "udev_enumerate_new");
+    udev_list_entry_get_next = (udev_list_entry* (*)(udev_list_entry*))dlsym(h, "udev_list_entry_get_next");
+    udev_device_get_property_value = (const char* (*)(udev_device *, const char *))dlsym(h, "udev_device_get_property_value");
+ 
+    return true;
+ }
 -
++                                                                      /*}}}*/
+ vector<CdromDevice>
 -pkgUdevCdromDevices::Scan()
++pkgUdevCdromDevices::Scan()                                             /*{{{*/
+ {
+    vector<CdromDevice> cdrom_devices;
+    struct udev_enumerate *enumerate;
+    struct udev_list_entry *l, *devices;
+    struct udev *udev_ctx;
+ 
+    if(libudev_handle == NULL)
+       return cdrom_devices;
+ 
+    udev_ctx = udev_new();
+    enumerate = udev_enumerate_new (udev_ctx);
+    udev_enumerate_add_match_property(enumerate, "ID_CDROM", "1");
+ 
+    udev_enumerate_scan_devices (enumerate);
+    devices = udev_enumerate_get_list_entry (enumerate);
+    for (l = devices; l != NULL; l = udev_list_entry_get_next (l))
+    {
+       CdromDevice cdrom;
+       struct udev_device *udevice;
+       udevice = udev_device_new_from_syspath (udev_enumerate_get_udev (enumerate), udev_list_entry_get_name (l));
+       if (udevice == NULL)
+        continue;
+       const char* devnode = udev_device_get_devnode(udevice);
+       const char* mountpath = udev_device_get_property_value(udevice, "FSTAB_DIR");
+ 
+       // fill in the struct
+       cdrom.DeviceName = string(devnode);
+       if (mountpath) {
+        cdrom.MountPath = mountpath;
+        string s = string(mountpath);
+        cdrom.Mounted = IsMounted(s);
+       } else {
+        cdrom.Mounted = false;
+        cdrom.MountPath = "";
+       }
+       cdrom_devices.push_back(cdrom);
+    } 
+    return cdrom_devices;
+ }
++                                                                      /*}}}*/
+ 
 -
 -pkgUdevCdromDevices::~pkgUdevCdromDevices()
++pkgUdevCdromDevices::~pkgUdevCdromDevices()                             /*{{{*/
+ { 
+    dlclose(libudev_handle);
+ }
++                                                                      /*}}}*/
 
 -apt (0.7.22) unstable; urgency=low
 +apt (0.7.22) UNRELEASED; urgency=low
  
 -  * add Acquire::Cdrom::mount "apt-udev-auto" magic to allow
 -    dynamically finding the cdrom device
 -
 - -- Michael Vogt <michael.vogt@ubuntu.com>  Wed, 22 Jul 2009 18:00:53 +0200
 -
 -apt (0.7.21) UNRELEASED; urgency=low
 -
 -  [ Osamu Aoki ]
 -  * Updated cron script to support backups by hardlinks and 
 -    verbose levels.  All features turned off by default. 
 -  * Added more error handlings.  Closes: #438803, #462734, #454989, 
 -  * Refactored condition structure to make download and upgrade performed 
 -    if only previous steps succeeded. Closes: #341970
 -  * Documented all cron script related configuration items in 
 -    configure-index.
 +  The 'not dead yet' release
 +  
 +  [ Christian Perrier ]
 +  * Documentation translations:
 +    - Fix a typo in apt-get(8) French translation. Closes: #525043
 +      Thanks to Guillaume Delacour for spotting it.
 +    - Updated apt.conf(5) manpgae French translation.
 +      Thanks to Aurélien Couderc.
 +  * Translations:
 +    - fr.po
 +    - sk.po. Closes: #525857 
 +    - ru.po. Closes: #526816
 +    - eu.po. Closes: #528985
 +    - zh_CN.po. Closes: #531390
 +    - fr.po
 +    - it.po. Closes: #531758
 +    - ca.po. Closes: #531921
 +    - de.po. Closes: #536430
 +  * Added translations
 +    - ast.po (Asturian by Marcos Alvareez Costales).
 +      Closes: #529007, #529730, #535328
 +  
 +  [ David Kalnischkies ]
 +  * [ABI break] support '#' in apt.conf and /etc/apt/preferences
 +    (closes: #189866)
 +  * [ABI break] Allow pinning by codename (closes: #97564)
 +  * support running "--simulate" as user
 +  * add depth information to the debug output and show what depends
 +    type triggers a autoinst (closes: #458389)
 +  * add Debug::pkgDepCache::Marker with more detailed debug output 
 +    (closes: #87520)
 +  * add Debug::pkgProblemResolver::ShowScores and make the scores
 +    adjustable
 +  * do not write state file in simulate mode (closes: #433007)
 +  * add hook for MarkInstall and MarkDelete (closes: #470035)
 +  * fix typo in apt-pkg/acquire.cc which prevents Dl-Limit to work
 +    correctly when downloading from multiple sites (Closes: #534752)
 +  * add the various foldmarkers in apt-pkg & cmdline (no code change)
 +  * versions with a pin of -1 shouldn't be a candidate (Closes: #355237)
 +  * prefer mmap as memory allocator in MMap instead of a static char
 +    array which can (at least in theory) grow dynamic
 +  * eliminate (hopefully all) segfaults in pkgcachegen.cc and mmap.cc
 +    which can arise if cache doesn't fit into the mmap (Closes: #535218)
 +  * display warnings instead of errors if the parts dirs doesn't exist
  
    [ Michael Vogt ]
 +  * honor the dpkg hold state in new Marker hooks (closes: #64141)
 +  * debian/apt.cron.daily:
 +    - if the timestamp is too far in the future, delete it
    * apt-pkg/acquire.cc:
      - make the max pipeline depth of the acquire queue configurable
        via Acquire::Max-Pipeline-Depth
      - add Dpkg::UseIoNice boolean option to run dpkg with ionice -c3
        (off by default)
      - send "dpkg-exec" message on the status fd when dpkg is run
 +    - provide DPkg::Chroot-Directory config option (useful for testing)
 +    - fix potential hang when in a backgroud process group
    * apt-pkg/algorithms.cc:
      - consider recommends when making the scores for the problem 
        resolver
    * methods/http.cc:
      - ignore SIGPIPE, we deal with EPIPE from write in 
        HttpMethod::ServerDie() (LP: #385144)
 -
 - -- Michael Vogt <michael.vogt@ubuntu.com>  Thu, 28 May 2009 17:51:42 +0200
 -
 -  [ Michael Vogt ]
 +  * Only run Download-Upgradable and Unattended-Upgrades if the initial
 +    update was successful Closes: #341970
    * apt-pkg/indexcopy.cc:
      - support having CDs with no Packages file (just a Packages.gz)
        by not forcing a verification on non-existing files
       (LP: #255545)
      - remove the gettext from a string that consists entirely 
        of variables (LP: #56792)
 -  * doc/makefile:
 -    - add examples/apt-https-method-example.conf
    * apt-pkg/cacheiterators.h:
      - add missing checks for Owner == 0 in end()
 -  * apt-pkg/deb/dpkgpm.cc:
 -    - fix potential hang when in a backgroud process group
    * apt-pkg/indexrecords.cc:
      - fix some i18n issues
    * apt-pkg/contrib/strutl.h:
      - add new strprintf() function to make i18n strings easier
 -  * methods/gpgv.cc:
      - fix compiler warning
 -  * cmdline/apt-get.cc:
 -    - fix "apt-get source pkg=ver" if binary name != source name
 -      and show a message (LP: #202219)
 -    - fix "apt-get source pkg" if there is a binary package and
 -      a source package of the same name but from different 
 -      packages (LP: #330103)
    * apt-pkg/deb/debsystem.cc:
      - make strings i18n able 
 -  * apt-pkg/contrib/strutl.cc:
 -    - fix TimeToStr i18n (LP: #289807)
 -  * [ABI break] merge support for http redirects, thanks to
 -    Jeff Licquia and Anthony Towns
 -  * [ABI break] use int for the package IDs (thanks to Steve Cotton)
 -  * apt-pkg/pkgcache.cc:
 -    - do not run "dpkg --configure pkg" if pkg is in trigger-awaited
 -      state (LP: #322955)
 -  * methods/https.cc:
 -    - add Acquire::https::AllowRedirect support
 -  * methods/gpgv.cc:
 -    - properly check for expired and revoked keys (closes: #433091)
    * fix problematic use of tolower() when calculating the version 
      hash by using locale independant tolower_ascii() function. 
      Thanks to M. Vefa Bicakci (LP: #80248)
    * build fixes for g++-4.4
    * cmdline/apt-mark:
      - add "showauto" option to show automatically installed packages
 +  * document --install-recommends and --no-install-recommends
 +    (thanks to Dereck Wonnacott, LP: #126180)
 +  * doc/apt.conf.5.xml:
 +    - merged patch from Aurélien Couderc to improve the text
 +      (thanks!)
++  * [ABI] merged the libudev-dlopen branch, this allows to pass
++    "apt-udev-auto" to Acquire::Cdrom::mount and the cdrom method will  
++    dynamically find/mount the cdrom device (if libhal is available)
 +
 +  [ Julian Andres Klode ]
 +  * apt-pkg/contrib/configuration.cc: Fix a small memory leak in
 +    ReadConfigFile.
 +  * Introduce support for the Enhances field. (Closes: #137583) 
 +  * Support /etc/apt/preferences.d, by adding ReadPinDir() (Closes: #535512)
 +  * configure-index: document Dir::Etc::SourceParts and some other options
 +    (Closes: #459605)
 +  * Remove Eugene V. Lyubimkin from uploaders as requested.
 +  * apt-pkg/contrib/hashes.cc, apt-pkg/contrib/md5.cc:
 +    - Support reading until EOF if Size=0 to match behaviour of
 +      SHA1Summation and SHA256Summation
 +
 +  [ Osamu Aoki ]
 +  * Updated cron script to support backups by hardlinks and 
 +    verbose levels.  All features turned off by default. 
 +  * Added more error handlings.  Closes: #438803, #462734, #454989, 
 +  * Documented all cron script related configuration items in 
 +    configure-index.
  
    [ Dereck Wonnacott ]
    * apt-ftparchive might write corrupt Release files (LP: #46439)
    * Apply --important option to apt-cache depends (LP: #16947) 
 -  * Clarify the --help for 'purge' (LP: #243948)
  
 + -- Julian Andres Klode <jak@debian.org>  Fri, 03 Jul 2009 08:27:35 +0200
 +
 +apt (0.7.21) unstable; urgency=low
 +
 +  [ Christian Perrier ]
 +  * Translations:
 +    - bg.po. Closes: #513211
 +    - zh_TW.po. Closes: #513311
 +    - nb.po. Closes: #513843
 +    - fr.po. Closes: #520430
 +    - sv.po. Closes: #518070
 +    - sk.po. Closes: #520403
 +    - it.po. Closes: #522222
 +    - sk.po. Closes: #520403
 +  
 +  [ Jamie Strandboge ]
 +  * apt.cron.daily: catch invalid dates due to DST time changes
 +    in the stamp files
 +
 +  [ Michael Vogt ]
 +  * methods/gpgv.cc:
 +    - properly check for expired and revoked keys (closes: #433091)
 +  * apt-pkg/contrib/strutl.cc:
 +    - fix TimeToStr i18n (LP: #289807)
 +  * [ABI break] merge support for http redirects, thanks to
 +    Jeff Licquia and Anthony Towns
 +  * [ABI break] use int for the package IDs (thanks to Steve Cotton)
 +  * apt-pkg/pkgcache.cc:
 +    - do not run "dpkg --configure pkg" if pkg is in trigger-awaited
 +      state (LP: #322955)
 +  * methods/https.cc:
 +    - add Acquire::https::AllowRedirect support
 +  * Clarify the --help for 'purge' (LP: #243948)
 +  * cmdline/apt-get.cc
 +    - fix "apt-get source pkg" if there is a binary package and
 +      a source package of the same name but from different 
 +      packages (LP: #330103)
  
    [ Colin Watson ]
    * cmdline/acqprogress.cc:
      - Call pkgAcquireStatus::Pulse even if quiet, so that we still get
        dlstatus messages on the status-fd (LP: #290234).
  
 - -- Michael Vogt <michael.vogt@ubuntu.com>  Fri, 12 Sep 2008 11:34:24 +0200
 + -- Michael Vogt <mvo@debian.org>  Tue, 14 Apr 2009 14:12:51 +0200
 +
 +apt (0.7.20.2) unstable; urgency=medium
 +
 +  [ Eugene V. Lyubimkin ]
 +  * Urgency set to medium due to RC bug fix.
 +  * doc/apt.ent, apt-get.8.xml:
 +    - Fix invalid XML entities. (Closes: #514402)
 +
 + -- Eugene V. Lyubimkin <jackyf.devel@gmail.com>  Sat, 07 Feb 2009 16:48:21 +0200
 +
 +apt (0.7.20.1) unstable; urgency=low
 +
 +  [ Michael Vogt ]
 +  * apt-pkg/pkgcachegen.cc:
 +    - fix apt-cache search for localized description 
 +      (closes: #512110)
 +  
 +  [ Christian Perrier ]
 +  * Translations:
 +    - fr.po: fix spelling error to "défectueux". Thanks to Thomas Péteul.
 +
 + -- Michael Vogt <mvo@debian.org>  Tue, 20 Jan 2009 09:35:05 +0100
  
  apt (0.7.20) unstable; urgency=low
  
        (Closes: #457265)
      - Mentioned 'APT::Periodic' and 'APT::Archives' groups of options.
        (Closes: #438559)
 -
 -  [ Michael Vogt ]
 -  * apt-pkg/depcache.cc:
 -    - when checking for new important deps, skip critical ones
 -      (LP: #236360)
 -  * document --install-recommends and --no-install-recommends
 -    (thanks to Dereck Wonnacott, LP: #126180)
 -  * make "apt-get build-dep" installed packages marked automatic
 -    by default. This can be changed by setting the value of
 -    APT::Get::Build-Dep-Automatic to false (thanks to Aaron 
 -    Haviland, closes: #44874, LP: #248268)
 -
 - -- Eugene V. Lyubimkin <jackyf.devel@gmail.com>  Sat, 06 Dec 2008 20:57:00 +0200
 -
 -apt (0.7.20~exp2) unstable; urgency=low
 -
 -  [ Eugene V. Lyubimkin ]
 +    - Mentioned '/* ... */' comments. (Closes: #507601)
    * doc/examples/sources.list:
      - Removed obsolete commented non-us deb-src entry, replaced it with
        'deb-src security.debian.org' one. (Closes: #411298)
    * apt-pkg/contrib/mmap.cc:
      - Added instruction how to work around MMap error in MMap error message.
        (Closes: #385674, 436028)
 +  * COPYING:
 +    - Actualized. Removed obsolete Qt section, added GPLv2 clause.
 +      (Closes: #440049, #509337)
 +
 +  [ Michael Vogt ]
 +  * add option to "apt-get build-dep" to mark the needed 
 +    build-dep packages as automatic installed. 
 +    This is controlled via the value of
 +    APT::Get::Build-Dep-Automatic and is set "false" by default.  
 +    Thanks to Aaron Haviland, closes: #448743
 +  * apt-inst/contrib/arfile.cc:
 +    - support members ending with '/' as well (thanks to Michal Cihr,
 +      closes: #500988)
  
    [ Christian Perrier ]
    * Translations:
 +    - Finnish updated. Closes: #508449 
 +    - Galician updated. Closes: #509151
 +    - Catalan updated. Closes: #509375
 +    - Vietnamese updated. Closes: #509422
 +    - Traditional Chinese added. Closes: #510664
      - French corrected (remove awful use of first person) 
  
 - -- Michael Vogt <mvo@debian.org>  Tue, 02 Dec 2008 20:30:14 +0100
 + -- Michael Vogt <mvo@debian.org>  Mon, 05 Jan 2009 08:59:20 +0100
  
  apt (0.7.19) unstable; urgency=low
  
        is a request to install only one package and it is not installable.
        (Closes: #419521)
  
 -
    [ Michael Vogt ]
      - fix SIGHUP handling (closes: #463030)