// Copyright 2017 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.

#include "debugd/src/wifi_power_tool.h"

#include <linux/capability.h>
#include <net/if.h>

#include "debugd/src/process_with_output.h"

namespace debugd {

namespace {

const char kIwPath[] = "/usr/sbin/iw";
const uint64_t kIwCapabilities = CAP_TO_MASK(CAP_NET_ADMIN);

bool RunIwCommand(bool set, bool enable, std::string* output) {
  bool success = false;
  ProcessWithOutput p;
  p.SetCapabilities(kIwCapabilities);
  if (!p.Init()) {
    *output = "<process init failed>";
    return false;
  }
  p.AddArg(kIwPath);
  p.AddArg("dev");
  // Chrome OS WiFi device is either mlan0 or wlan0.
  if (if_nametoindex("mlan0")) {
    p.AddArg("mlan0");
  } else if (if_nametoindex("wlan0")) {
    p.AddArg("wlan0");
  } else {
    *output = "<no wifi device found>";
    return false;
  }
  if (set) {
    p.AddArg("set");
  } else {
    p.AddArg("get");
  }
  p.AddArg("power_save");
  if (set) {
    p.AddArg(enable ? "on" : "off");
  }
  if (p.Run() == 0) {
    success = true;
  }
  p.GetOutput(output);
  return success;
}

}  // namespace

std::string WifiPowerTool::SetWifiPowerSave(bool enable) const {
  std::string result;
  if (!RunIwCommand(true, enable, &result)) {
    return result;
  }
  // Return the new state (successful set has no output)
  return GetWifiPowerSave();
}

std::string WifiPowerTool::GetWifiPowerSave() const {
  std::string result;
  RunIwCommand(false, false, &result);
  return result;
}

}  // namespace debugd
