widget/LSBUtils.cpp
author Dorel Luca <dluca@mozilla.com>
Mon, 04 Dec 2017 18:01:09 +0200
changeset 394844 58fec9a96e269a57cc6f84bfe3a6dc6800acd955
parent 391614 f53d4e3b563526a4191ea488d374cb0ebc7b597e
child 426571 a299ae02fc4c0a7c507e4410c28414a9fdb25b90
permissions -rw-r--r--
Backed out 7 changesets (bug 1377007) for failing build bustage on Linux pgo and faling Cpp's jsapi-tests r=backout on a CLOSED TREE Backed out changeset 9428a4ed7dec (bug 1377007) Backed out changeset 4407b43a8aff (bug 1377007) Backed out changeset 65a37a7f78a5 (bug 1377007) Backed out changeset 276fe6d9b716 (bug 1377007) Backed out changeset 1de46e60ffba (bug 1377007) Backed out changeset 893e303e17ec (bug 1377007) Backed out changeset 081a241e25d4 (bug 1377007)

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "LSBUtils.h"

#include <unistd.h>
#include "base/process_util.h"

namespace mozilla {
namespace widget {
namespace lsb {

static const char* gLsbReleasePath = "/usr/bin/lsb_release";

bool
GetLSBRelease(nsACString& aDistributor,
              nsACString& aDescription,
              nsACString& aRelease,
              nsACString& aCodename)
{
  if (access(gLsbReleasePath, R_OK) != 0)
    return false;

  int pipefd[2];
  if (pipe(pipefd) == -1) {
    NS_WARNING("pipe() failed!");
    return false;
  }

  std::vector<std::string> argv = {
    gLsbReleasePath, "-idrc"
  };

  base::LaunchOptions options;
  options.fds_to_remap.push_back({ pipefd[1], STDOUT_FILENO });
  options.wait = true;

  base::ProcessHandle process;
  bool ok = base::LaunchApp(argv, options, &process);
  close(pipefd[1]);
  if (!ok) {
    NS_WARNING("Failed to spawn lsb_release!");
    close(pipefd[0]);
    return false;
  }

  FILE* stream = fdopen(pipefd[0], "r");
  if (!stream) {
    NS_WARNING("Could not wrap fd!");
    close(pipefd[0]);
    return false;
  }

  char dist[256], desc[256], release[256], codename[256];
  if (fscanf(stream, "Distributor ID:\t%255[^\n]\n"
                     "Description:\t%255[^\n]\n"
                     "Release:\t%255[^\n]\n"
                     "Codename:\t%255[^\n]\n",
             dist, desc, release, codename) != 4)
  {
    NS_WARNING("Failed to parse lsb_release!");
    fclose(stream);
    close(pipefd[0]);
    return false;
  }
  fclose(stream);
  close(pipefd[0]);

  aDistributor.Assign(dist);
  aDescription.Assign(desc);
  aRelease.Assign(release);
  aCodename.Assign(codename);
  return true;
}

}  // namespace lsb
}  // namespace widget
}  // namespace mozilla