blob: 8c3bc936d43445b47b556f1b58201ece05bd1f9e [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CROS_DISKS_DEVICE_EJECTOR_H_
#define CROS_DISKS_DEVICE_EJECTOR_H_
#include <map>
#include <memory>
#include <string>
#include <brillo/process/process_reaper.h>
#include "cros-disks/sandboxed_process.h"
namespace cros_disks {
// A class for ejecting any removable media on a device.
class DeviceEjector {
public:
explicit DeviceEjector(brillo::ProcessReaper* process_reaper);
DeviceEjector(const DeviceEjector&) = delete;
DeviceEjector& operator=(const DeviceEjector&) = delete;
virtual ~DeviceEjector();
// Ejects any removable media on a device at |device_path| using the
// 'eject' program. Returns true if the eject process has launched
// successfully (but may not complete until OnEjectProcessTerminated
// is called).
virtual bool Eject(const std::string& device_path);
private:
// Invoked when an eject process has terminated.
void OnEjectProcessTerminated(const std::string& device_path,
const siginfo_t& info);
brillo::ProcessReaper* process_reaper_;
// A list of outstanding eject processes indexed by device path.
std::map<std::string, SandboxedProcess> eject_process_;
base::WeakPtrFactory<DeviceEjector> weak_ptr_factory_;
};
} // namespace cros_disks
#endif // CROS_DISKS_DEVICE_EJECTOR_H_