12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /* -*- 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"
- };
- std::vector<std::pair<int, int>> fdMap = {
- { pipefd[1], STDOUT_FILENO }
- };
- base::ProcessHandle process;
- base::LaunchApp(argv, fdMap, true, &process);
- close(pipefd[1]);
- if (!process) {
- 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
|