int device_removable( const char* device ) { struct sysfs_device *dev; static char* hotplug_buses[] = { "usb", "ieee1394", NULL }; int removable; char blockdevpath[PATH_MAX]; dev = find_sysfs_device( device, blockdevpath, sizeof( blockdevpath ) ); if( !dev ) { debug( "device_removable: could not find a sysfs device for %s\n", device ); return 0; } debug( "device_removable: corresponding block device for %s is %s\n", device, blockdevpath ); /* check whether device has "removable" attribute with value '1' */ removable = get_blockdev_attr( blockdevpath, "removable" ); /* if not, fall back to bus scanning (regard USB and FireWire as removable) */ if( !removable ) removable = find_bus_ancestry( dev, hotplug_buses ); sysfs_close_device( dev ); if( !removable ) fprintf( stderr, _("Error: device %s is not removable\n"), device ); return removable;