diff -pur eject-orig/eject.c eject/eject.c --- eject-orig/eject.c 2006-02-11 04:54:38.000000000 +0300 +++ eject/eject.c 2011-08-11 13:12:16.568112725 +0400 @@ -527,6 +527,25 @@ static void CloseTray(int fd) } /* + * Unlock tray using CDROM_LOCKDOOR ioctl. + * New kernels doesn't automatically unlock tray before ejecting, + * and the new udev automatically locks it. + */ +static int UnlockCdrom(int fd) +{ + int status = -1; + + if (v_option) + printf(_("%s: unlocking tray using CDROM_LOCKDOOR ioctl\n"), programName); + + status = ioctl(fd, CDROM_LOCKDOOR, 0); + if (v_option && status != 0) + printf(_("%s: CDROM_LOCKDOOR ioctl failed\n"), programName); + + return (status == 0); +} + +/* * Toggle tray. * * Written by Benjamin Schwenk and @@ -543,6 +562,8 @@ static void ToggleTray(int fd) #ifdef CDROMCLOSETRAY + UnlockCdrom(fd); + /* Try to open the CDROM tray and measure the time therefor * needed. In my experience the function needs less than 0.05 * seconds if the tray was already open, and at least 1.5 seconds @@ -566,7 +587,11 @@ static void ToggleTray(int fd) * was already open. In this case, close it now. Else the tray was * closed before. This would mean that we are done. */ if (time_elapsed < TRAY_WAS_ALREADY_OPEN_USECS) + { + if (v_option) + printf(_("%s: CD-ROM tray was already open, closing it\n"), programName); CloseTray(fd); + } #else fprintf(stderr, _("%s: CD-ROM tray toggle command not supported by this kernel\n"), programName); @@ -681,7 +706,7 @@ static void ListSpeedCdrom(const char *f static int EjectCdrom(int fd) { int status = -1; - + UnlockCdrom(fd); #if defined(CDROMEJECT) status = ioctl(fd, CDROMEJECT); #elif defined(CDIOCEJECT)