From 34a672b8b8351df6c0e4be36369629e87b3b1475 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 4 Mar 2020 23:13:16 +0100 Subject: [PATCH] Split cross.cc into windows,osx,linux --- src/lib/cross_linux.cc | 355 +++++++++++++++++++++++++ src/lib/cross_osx.cc | 303 +++++++++++++++++++++ src/lib/{cross.cc => cross_windows.cc} | 351 +----------------------- src/lib/wscript | 6 +- 4 files changed, 669 insertions(+), 346 deletions(-) create mode 100644 src/lib/cross_linux.cc create mode 100644 src/lib/cross_osx.cc rename src/lib/{cross.cc => cross_windows.cc} (57%) diff --git a/src/lib/cross_linux.cc b/src/lib/cross_linux.cc new file mode 100644 index 000000000..a609e19f0 --- /dev/null +++ b/src/lib/cross_linux.cc @@ -0,0 +1,355 @@ +/* + Copyright (C) 2012-2020 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "cross.h" +#include "compose.hpp" +#include "log.h" +#include "dcpomatic_log.h" +#include "config.h" +#include "exceptions.h" +#include +#include +extern "C" { +#include +} +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i18n.h" + +using std::pair; +using std::list; +using std::ifstream; +using std::string; +using std::wstring; +using std::make_pair; +using std::vector; +using std::cerr; +using std::cout; +using std::runtime_error; +using boost::shared_ptr; +using boost::optional; + +/** @param s Number of seconds to sleep for */ +void +dcpomatic_sleep_seconds (int s) +{ + sleep (s); +} + +void +dcpomatic_sleep_milliseconds (int ms) +{ + usleep (ms * 1000); +} + +/** @return A string of CPU information (model name etc.) */ +string +cpu_info () +{ + string info; + + /* This use of ifstream is ok; the filename can never + be non-Latin + */ + ifstream f ("/proc/cpuinfo"); + while (f.good ()) { + string l; + getline (f, l); + if (boost::algorithm::starts_with (l, "model name")) { + string::size_type const c = l.find (':'); + if (c != string::npos) { + info = l.substr (c + 2); + } + } + } + + return info; +} + +boost::filesystem::path +shared_path () +{ + char const * p = getenv ("DCPOMATIC_LINUX_SHARE_PREFIX"); + if (p) { + return p; + } + return boost::filesystem::canonical (LINUX_SHARE_PREFIX); +} + +void +run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) +{ + string ffprobe = "ffprobe \"" + content.string() + "\" 2> \"" + out.string() + "\""; + LOG_GENERAL (N_("Probing with %1"), ffprobe); + system (ffprobe.c_str ()); +} + +list > +mount_info () +{ + list > m; + + FILE* f = setmntent ("/etc/mtab", "r"); + if (!f) { + return m; + } + + while (true) { + struct mntent* mnt = getmntent (f); + if (!mnt) { + break; + } + + m.push_back (make_pair (mnt->mnt_dir, mnt->mnt_type)); + } + + endmntent (f); + + return m; +} + +boost::filesystem::path +openssl_path () +{ + return "dcpomatic2_openssl"; +} + +/* Apparently there is no way to create an ofstream using a UTF-8 + filename under Windows. We are hence reduced to using fopen + with this wrapper. +*/ +FILE * +fopen_boost (boost::filesystem::path p, string t) +{ + return fopen (p.c_str(), t.c_str ()); +} + +int +dcpomatic_fseek (FILE* stream, int64_t offset, int whence) +{ + return fseek (stream, offset, whence); +} + +void +Waker::nudge () +{ + +} + +Waker::Waker () +{ + +} + +Waker::~Waker () +{ + +} + +void +start_tool (boost::filesystem::path dcpomatic, string executable, string) +{ + boost::filesystem::path batch = dcpomatic.parent_path() / executable; + + pid_t pid = fork (); + if (pid == 0) { + int const r = system (batch.string().c_str()); + exit (WEXITSTATUS (r)); + } +} + +void +start_batch_converter (boost::filesystem::path dcpomatic) +{ + start_tool (dcpomatic, "dcpomatic2_batch", "DCP-o-matic\\ 2\\ Batch\\ Converter.app"); +} + +void +start_player (boost::filesystem::path dcpomatic) +{ + start_tool (dcpomatic, "dcpomatic2_player", "DCP-o-matic\\ 2\\ Player.app"); +} + +uint64_t +thread_id () +{ + return (uint64_t) pthread_self (); +} + +int +avio_open_boost (AVIOContext** s, boost::filesystem::path file, int flags) +{ + return avio_open (s, file.c_str(), flags); +} + + +boost::filesystem::path +home_directory () +{ + return getenv("HOME"); +} + +string +command_and_read (string cmd) +{ + FILE* pipe = popen (cmd.c_str(), "r"); + if (!pipe) { + throw runtime_error ("popen failed"); + } + + string result; + char buffer[128]; + try { + while (fgets(buffer, sizeof(buffer), pipe)) { + result += buffer; + } + } catch (...) { + pclose (pipe); + throw; + } + + pclose (pipe); + return result; +} + +/** @return true if this process is a 32-bit one running on a 64-bit-capable OS */ +bool +running_32_on_64 () +{ + /* I'm assuming nobody does this on Linux */ + return false; +} + +vector +get_drives () +{ + vector drives; + + using namespace boost::filesystem; + list mounted_devices; + std::ifstream f("/proc/mounts"); + string line; + while (f.good()) { + getline(f, line); + vector bits; + boost::algorithm::split (bits, line, boost::is_any_of(" ")); + if (bits.size() > 0 && boost::algorithm::starts_with(bits[0], "/dev/")) { + mounted_devices.push_back(bits[0]); + LOG_DIST("Mounted device %1", bits[0]); + } + } + + for (directory_iterator i = directory_iterator("/sys/block"); i != directory_iterator(); ++i) { + string const name = i->path().filename().string(); + path device_type_file("/sys/block/" + name + "/device/type"); + optional device_type; + if (exists(device_type_file)) { + device_type = dcp::file_to_string (device_type_file); + boost::trim(*device_type); + } + /* Device type 5 is "SCSI_TYPE_ROM" in blkdev.h; seems usually to be a CD/DVD drive */ + if (!boost::algorithm::starts_with(name, "loop") && (!device_type || *device_type != "5")) { + uint64_t const size = dcp::raw_convert(dcp::file_to_string(*i / "size")) * 512; + if (size == 0) { + continue; + } + bool mounted = false; + optional vendor; + try { + vendor = dcp::file_to_string("/sys/block/" + name + "/device/vendor"); + boost::trim(*vendor); + } catch (...) {} + optional model; + try { + model = dcp::file_to_string("/sys/block/" + name + "/device/model"); + boost::trim(*model); + } catch (...) {} + BOOST_FOREACH (string j, mounted_devices) { + if (boost::algorithm::starts_with(j, "/dev/" + name)) { + mounted = true; + } + } + drives.push_back(Drive(i->path().filename().string(), size, mounted, vendor, model)); + LOG_DIST("Block device %1 size %2 %3 vendor %4 model %5", name, size, mounted ? "mounted" : "not mounted", vendor.get_value_or("[none]"), model.get_value_or("[none]")); + } + } + + return drives; +} + +string +Drive::description () const +{ + char gb[64]; + snprintf(gb, 64, "%.1f", _size / 1000000000.0); + + string name; + if (_vendor) { + name += *_vendor; + } + if (_model) { + if (name.size() > 0) { + name += " " + *_model; + } + } + if (name.size() == 0) { + name = _("Unknown"); + } + + return String::compose("%1 (%2 GB) [%3]", name, gb, _internal_name); +} + +void +unprivileged () +{ + uid_t ruid, euid, suid; + if (getresuid(&ruid, &euid, &suid) == -1) { + cerr << "getresuid() failed.\n"; + exit (EXIT_FAILURE); + } + seteuid (ruid); +} + +PrivilegeEscalator::~PrivilegeEscalator () +{ + unprivileged (); +} + +PrivilegeEscalator::PrivilegeEscalator () +{ + seteuid (0); +} + +boost::filesystem::path +config_path () +{ + boost::filesystem::path p; + p /= g_get_user_config_dir (); + p /= "dcpomatic2"; + return p; +} diff --git a/src/lib/cross_osx.cc b/src/lib/cross_osx.cc new file mode 100644 index 000000000..2f6066285 --- /dev/null +++ b/src/lib/cross_osx.cc @@ -0,0 +1,303 @@ +/* + Copyright (C) 2012-2020 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "cross.h" +#include "compose.hpp" +#include "log.h" +#include "dcpomatic_log.h" +#include "config.h" +#include "exceptions.h" +#include +#include +extern "C" { +#include +} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i18n.h" + +using std::pair; +using std::list; +using std::ifstream; +using std::string; +using std::wstring; +using std::make_pair; +using std::vector; +using std::cerr; +using std::cout; +using std::runtime_error; +using boost::shared_ptr; +using boost::optional; + +/** @param s Number of seconds to sleep for */ +void +dcpomatic_sleep_seconds (int s) +{ + sleep (s); +} + +void +dcpomatic_sleep_milliseconds (int ms) +{ + usleep (ms * 1000); +} + +/** @return A string of CPU information (model name etc.) */ +string +cpu_info () +{ + string info; + + char buffer[64]; + size_t N = sizeof (buffer); + if (sysctlbyname ("machdep.cpu.brand_string", buffer, &N, 0, 0) == 0) { + info = buffer; + } + + return info; +} + +/** @return Path of the Contents directory in the .app */ +boost::filesystem::path +app_contents () +{ + uint32_t size = 1024; + char buffer[size]; + if (_NSGetExecutablePath (buffer, &size)) { + throw runtime_error ("_NSGetExecutablePath failed"); + } + + boost::filesystem::path path (buffer); + path = boost::filesystem::canonical (path); + path = path.parent_path (); + path = path.parent_path (); + return path; +} + +boost::filesystem::path +shared_path () +{ + return app_contents() / "Resources"; +} + +void +run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) +{ + boost::filesystem::path path = app_contents(); + path /= "MacOS"; + path /= "ffprobe"; + + string ffprobe = "\"" + path.string() + "\" \"" + content.string() + "\" 2> \"" + out.string() + "\""; + LOG_GENERAL (N_("Probing with %1"), ffprobe); + system (ffprobe.c_str ()); +} + +list > +mount_info () +{ + list > m; + return m; +} + +boost::filesystem::path +openssl_path () +{ + boost::filesystem::path path = app_contents(); + path /= "MacOS"; + path /= "openssl"; + return path; +} + +/* Apparently there is no way to create an ofstream using a UTF-8 + filename under Windows. We are hence reduced to using fopen + with this wrapper. +*/ +FILE * +fopen_boost (boost::filesystem::path p, string t) +{ + return fopen (p.c_str(), t.c_str ()); +} + +int +dcpomatic_fseek (FILE* stream, int64_t offset, int whence) +{ + return fseek (stream, offset, whence); +} + +void +Waker::nudge () +{ + +} + +Waker::Waker () +{ + boost::mutex::scoped_lock lm (_mutex); + /* We should use this */ + // IOPMAssertionCreateWithName (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR ("Encoding DCP"), &_assertion_id); + /* but it's not available on 10.5, so we use this */ + IOPMAssertionCreate (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &_assertion_id); +} + +Waker::~Waker () +{ + boost::mutex::scoped_lock lm (_mutex); + IOPMAssertionRelease (_assertion_id); +} + +void +start_tool (boost::filesystem::path dcpomatic, string executable, string app) +{ + boost::filesystem::path batch = dcpomatic.parent_path (); + batch = batch.parent_path (); // MacOS + batch = batch.parent_path (); // Contents + batch = batch.parent_path (); // DCP-o-matic.app + batch = batch.parent_path (); // Applications + batch /= app; + batch /= "Contents"; + batch /= "MacOS"; + batch /= executable; + + pid_t pid = fork (); + if (pid == 0) { + int const r = system (batch.string().c_str()); + exit (WEXITSTATUS (r)); + } +} + +void +start_batch_converter (boost::filesystem::path dcpomatic) +{ + start_tool (dcpomatic, "dcpomatic2_batch", "DCP-o-matic\\ 2\\ Batch\\ Converter.app"); +} + +void +start_player (boost::filesystem::path dcpomatic) +{ + start_tool (dcpomatic, "dcpomatic2_player", "DCP-o-matic\\ 2\\ Player.app"); +} + +uint64_t +thread_id () +{ + return (uint64_t) pthread_self (); +} + +int +avio_open_boost (AVIOContext** s, boost::filesystem::path file, int flags) +{ + return avio_open (s, file.c_str(), flags); +} + +boost::filesystem::path +home_directory () +{ + return getenv("HOME"); +} + +string +command_and_read (string cmd) +{ + return ""; +} + +/** @return true if this process is a 32-bit one running on a 64-bit-capable OS */ +bool +running_32_on_64 () +{ + /* I'm assuming nobody does this on OS X */ + return false; +} + +static void +disk_appeared(DADiskRef disk, void* context) +{ + const char* name = DADiskGetBSDName (disk); + if (name) { + list* drives = reinterpret_cast*> (context); + drives->push_back (Drive(name, 0, false, optional(), optional())); + } +} + +vector +get_drives () +{ + vector drives; + + DASessionRef session = DASessionCreate(kCFAllocatorDefault); + if (!session) { + return drives; + } + + DARegisterDiskAppearedCallback (session, NULL, disk_appeared, &drives); + CFRunLoopRef run_loop = CFRunLoopGetCurrent (); + DASessionScheduleWithRunLoop (session, run_loop, kCFRunLoopDefaultMode); + CFRunLoopStop (run_loop); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.05, 0); + DAUnregisterCallback(session, (void *) disk_appeared, &drives); + CFRelease(session); + + return drives; +} + +string +Drive::description () const +{ + char gb[64]; + snprintf(gb, 64, "%.1f", _size / 1000000000.0); + + string name; + if (_vendor) { + name += *_vendor; + } + if (_model) { + if (name.size() > 0) { + name += " " + *_model; + } + } + if (name.size() == 0) { + name = _("Unknown"); + } + + return String::compose("%1 (%2 GB) [%3]", name, gb, _internal_name); +} + +boost::filesystem::path +config_path () +{ + boost::filesystem::path p; + p /= g_get_home_dir (); + p /= "Library"; + p /= "Preferences"; + p /= "com.dcpomatic"; + p /= "2"; + return p; +} diff --git a/src/lib/cross.cc b/src/lib/cross_windows.cc similarity index 57% rename from src/lib/cross.cc rename to src/lib/cross_windows.cc index b008d1741..2b7696b68 100644 --- a/src/lib/cross.cc +++ b/src/lib/cross_windows.cc @@ -31,31 +31,12 @@ extern "C" { } #include #include -#ifdef DCPOMATIC_LINUX -#include -#include -#endif -#ifdef DCPOMATIC_WINDOWS #include #include #undef DATADIR #include #include #include -#endif -#ifdef DCPOMATIC_OSX -#include -#include -#include -#include -#include -#endif -#ifdef DCPOMATIC_POSIX -#include -#include -#include -#include -#endif #include #include "i18n.h" @@ -77,23 +58,13 @@ using boost::optional; void dcpomatic_sleep_seconds (int s) { -#ifdef DCPOMATIC_POSIX - sleep (s); -#endif -#ifdef DCPOMATIC_WINDOWS Sleep (s * 1000); -#endif } void dcpomatic_sleep_milliseconds (int ms) { -#ifdef DCPOMATIC_POSIX - usleep (ms * 1000); -#endif -#ifdef DCPOMATIC_WINDOWS Sleep (ms); -#endif } /** @return A string of CPU information (model name etc.) */ @@ -102,32 +73,6 @@ cpu_info () { string info; -#ifdef DCPOMATIC_LINUX - /* This use of ifstream is ok; the filename can never - be non-Latin - */ - ifstream f ("/proc/cpuinfo"); - while (f.good ()) { - string l; - getline (f, l); - if (boost::algorithm::starts_with (l, "model name")) { - string::size_type const c = l.find (':'); - if (c != string::npos) { - info = l.substr (c + 2); - } - } - } -#endif - -#ifdef DCPOMATIC_OSX - char buffer[64]; - size_t N = sizeof (buffer); - if (sysctlbyname ("machdep.cpu.brand_string", buffer, &N, 0, 0) == 0) { - info = buffer; - } -#endif - -#ifdef DCPOMATIC_WINDOWS HKEY key; if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &key) != ERROR_SUCCESS) { return info; @@ -153,56 +98,22 @@ cpu_info () RegCloseKey (key); -#endif - return info; } -#ifdef DCPOMATIC_OSX -/** @return Path of the Contents directory in the .app */ -boost::filesystem::path -app_contents () -{ - uint32_t size = 1024; - char buffer[size]; - if (_NSGetExecutablePath (buffer, &size)) { - throw runtime_error ("_NSGetExecutablePath failed"); - } - - boost::filesystem::path path (buffer); - path = boost::filesystem::canonical (path); - path = path.parent_path (); - path = path.parent_path (); - return path; -} -#endif - boost::filesystem::path shared_path () { -#ifdef DCPOMATIC_LINUX - char const * p = getenv ("DCPOMATIC_LINUX_SHARE_PREFIX"); - if (p) { - return p; - } - return boost::filesystem::canonical (LINUX_SHARE_PREFIX); -#endif -#ifdef DCPOMATIC_WINDOWS wchar_t dir[512]; GetModuleFileName (GetModuleHandle (0), dir, sizeof (dir)); PathRemoveFileSpec (dir); boost::filesystem::path path = dir; return path.parent_path(); -#endif -#ifdef DCPOMATIC_OSX - return app_contents() / "Resources"; -#endif } void run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) { -#ifdef DCPOMATIC_WINDOWS SECURITY_ATTRIBUTES security; security.nLength = sizeof (security); security.bInheritHandle = TRUE; @@ -265,55 +176,18 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) CloseHandle (process_info.hProcess); CloseHandle (process_info.hThread); CloseHandle (child_stderr_read); -#endif - -#ifdef DCPOMATIC_LINUX - string ffprobe = "ffprobe \"" + content.string() + "\" 2> \"" + out.string() + "\""; - LOG_GENERAL (N_("Probing with %1"), ffprobe); - system (ffprobe.c_str ()); -#endif - -#ifdef DCPOMATIC_OSX - boost::filesystem::path path = app_contents(); - path /= "MacOS"; - path /= "ffprobe"; - - string ffprobe = "\"" + path.string() + "\" \"" + content.string() + "\" 2> \"" + out.string() + "\""; - LOG_GENERAL (N_("Probing with %1"), ffprobe); - system (ffprobe.c_str ()); -#endif } list > mount_info () { list > m; - -#ifdef DCPOMATIC_LINUX - FILE* f = setmntent ("/etc/mtab", "r"); - if (!f) { - return m; - } - - while (true) { - struct mntent* mnt = getmntent (f); - if (!mnt) { - break; - } - - m.push_back (make_pair (mnt->mnt_dir, mnt->mnt_type)); - } - - endmntent (f); -#endif - return m; } boost::filesystem::path openssl_path () { -#ifdef DCPOMATIC_WINDOWS wchar_t dir[512]; GetModuleFileName (GetModuleHandle (0), dir, sizeof (dir)); PathRemoveFileSpec (dir); @@ -321,18 +195,6 @@ openssl_path () boost::filesystem::path path = dir; path /= "openssl.exe"; return path; -#endif - -#ifdef DCPOMATIC_OSX - boost::filesystem::path path = app_contents(); - path /= "MacOS"; - path /= "openssl"; - return path; -#endif - -#ifdef DCPOMATIC_LINUX - return "dcpomatic2_openssl"; -#endif } @@ -343,87 +205,39 @@ openssl_path () FILE * fopen_boost (boost::filesystem::path p, string t) { -#ifdef DCPOMATIC_WINDOWS wstring w (t.begin(), t.end()); /* c_str() here should give a UTF-16 string */ return _wfopen (p.c_str(), w.c_str ()); -#else - return fopen (p.c_str(), t.c_str ()); -#endif } int dcpomatic_fseek (FILE* stream, int64_t offset, int whence) { -#ifdef DCPOMATIC_WINDOWS return _fseeki64 (stream, offset, whence); -#else - return fseek (stream, offset, whence); -#endif } void Waker::nudge () { -#ifdef DCPOMATIC_WINDOWS boost::mutex::scoped_lock lm (_mutex); SetThreadExecutionState (ES_SYSTEM_REQUIRED); -#endif } Waker::Waker () { -#ifdef DCPOMATIC_OSX - boost::mutex::scoped_lock lm (_mutex); - /* We should use this */ - // IOPMAssertionCreateWithName (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR ("Encoding DCP"), &_assertion_id); - /* but it's not available on 10.5, so we use this */ - IOPMAssertionCreate (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &_assertion_id); -#endif + } Waker::~Waker () { -#ifdef DCPOMATIC_OSX - boost::mutex::scoped_lock lm (_mutex); - IOPMAssertionRelease (_assertion_id); -#endif + } void -start_tool (boost::filesystem::path dcpomatic, string executable, -#ifdef DCPOMATIC_OSX - string app -#else - string -#endif - ) +start_tool (boost::filesystem::path dcpomatic, string executable, string) { -#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_WINDOWS) boost::filesystem::path batch = dcpomatic.parent_path() / executable; -#endif - -#ifdef DCPOMATIC_OSX - boost::filesystem::path batch = dcpomatic.parent_path (); - batch = batch.parent_path (); // MacOS - batch = batch.parent_path (); // Contents - batch = batch.parent_path (); // DCP-o-matic.app - batch = batch.parent_path (); // Applications - batch /= app; - batch /= "Contents"; - batch /= "MacOS"; - batch /= executable; -#endif - -#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_OSX) - pid_t pid = fork (); - if (pid == 0) { - int const r = system (batch.string().c_str()); - exit (WEXITSTATUS (r)); - } -#endif -#ifdef DCPOMATIC_WINDOWS STARTUPINFO startup_info; ZeroMemory (&startup_info, sizeof (startup_info)); startup_info.cb = sizeof (startup_info); @@ -434,7 +248,6 @@ start_tool (boost::filesystem::path dcpomatic, string executable, wchar_t cmd[512]; MultiByteToWideChar (CP_UTF8, 0, batch.string().c_str(), -1, cmd, sizeof(cmd)); CreateProcess (0, cmd, 0, 0, FALSE, 0, 0, 0, &startup_info, &process_info); -#endif } void @@ -452,29 +265,20 @@ start_player (boost::filesystem::path dcpomatic) uint64_t thread_id () { -#ifdef DCPOMATIC_WINDOWS return (uint64_t) GetCurrentThreadId (); -#else - return (uint64_t) pthread_self (); -#endif } int avio_open_boost (AVIOContext** s, boost::filesystem::path file, int flags) { -#ifdef DCPOMATIC_WINDOWS int const length = (file.string().length() + 1) * 2; char* utf8 = new char[length]; WideCharToMultiByte (CP_UTF8, 0, file.c_str(), -1, utf8, length, 0, 0); int const r = avio_open (s, utf8, flags); delete[] utf8; return r; -#else - return avio_open (s, file.c_str(), flags); -#endif } -#ifdef DCPOMATIC_WINDOWS void maybe_open_console () { @@ -494,43 +298,16 @@ maybe_open_console () *stdin = *hf_in; } } -#endif boost::filesystem::path home_directory () { -#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_OSX) - return getenv("HOME"); -#endif -#ifdef DCPOMATIC_WINDOWS - return boost::filesystem::path(getenv("HOMEDRIVE")) / boost::filesystem::path(getenv("HOMEPATH")); -#endif + return boost::filesystem::path(getenv("HOMEDRIVE")) / boost::filesystem::path(getenv("HOMEPATH")); } string command_and_read (string cmd) { -#ifdef DCPOMATIC_LINUX - FILE* pipe = popen (cmd.c_str(), "r"); - if (!pipe) { - throw runtime_error ("popen failed"); - } - - string result; - char buffer[128]; - try { - while (fgets(buffer, sizeof(buffer), pipe)) { - result += buffer; - } - } catch (...) { - pclose (pipe); - throw; - } - - pclose (pipe); - return result; -#endif - return ""; } @@ -538,34 +315,16 @@ command_and_read (string cmd) bool running_32_on_64 () { -#ifdef DCPOMATIC_WINDOWS BOOL p; IsWow64Process (GetCurrentProcess(), &p); return p; -#endif - /* XXX: assuming nobody does this on Linux / OS X */ - return false; -} - -#ifdef DCPOMATIC_OSX -static void -disk_appeared(DADiskRef disk, void* context) -{ - const char* name = DADiskGetBSDName (disk); - if (name) { - list* drives = reinterpret_cast*> (context); - drives->push_back (Drive(name, 0, false, optional(), optional())); - } } -#endif vector get_drives () { vector drives; -#ifdef DCPOMATIC_WINDOWS - const GUID GUID_DEVICE_INTERFACE_DISK = { 0x53F56307L, 0xB6BF, 0x11D0, { 0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B } }; @@ -670,74 +429,7 @@ get_drives () ++j; } } -#endif - -#ifdef DCPOMATIC_OSX - DASessionRef session = DASessionCreate(kCFAllocatorDefault); - if (!session) { - return drives; - } - - DARegisterDiskAppearedCallback (session, NULL, disk_appeared, &drives); - CFRunLoopRef run_loop = CFRunLoopGetCurrent (); - DASessionScheduleWithRunLoop (session, run_loop, kCFRunLoopDefaultMode); - CFRunLoopStop (run_loop); - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.05, 0); - DAUnregisterCallback(session, (void *) disk_appeared, &drives); - CFRelease(session); -#endif - -#ifdef DCPOMATIC_LINUX - - using namespace boost::filesystem; - list mounted_devices; - std::ifstream f("/proc/mounts"); - string line; - while (f.good()) { - getline(f, line); - vector bits; - boost::algorithm::split (bits, line, boost::is_any_of(" ")); - if (bits.size() > 0 && boost::algorithm::starts_with(bits[0], "/dev/")) { - mounted_devices.push_back(bits[0]); - LOG_DIST("Mounted device %1", bits[0]); - } - } - for (directory_iterator i = directory_iterator("/sys/block"); i != directory_iterator(); ++i) { - string const name = i->path().filename().string(); - path device_type_file("/sys/block/" + name + "/device/type"); - optional device_type; - if (exists(device_type_file)) { - device_type = dcp::file_to_string (device_type_file); - boost::trim(*device_type); - } - /* Device type 5 is "SCSI_TYPE_ROM" in blkdev.h; seems usually to be a CD/DVD drive */ - if (!boost::algorithm::starts_with(name, "loop") && (!device_type || *device_type != "5")) { - uint64_t const size = dcp::raw_convert(dcp::file_to_string(*i / "size")) * 512; - if (size == 0) { - continue; - } - bool mounted = false; - optional vendor; - try { - vendor = dcp::file_to_string("/sys/block/" + name + "/device/vendor"); - boost::trim(*vendor); - } catch (...) {} - optional model; - try { - model = dcp::file_to_string("/sys/block/" + name + "/device/model"); - boost::trim(*model); - } catch (...) {} - BOOST_FOREACH (string j, mounted_devices) { - if (boost::algorithm::starts_with(j, "/dev/" + name)) { - mounted = true; - } - } - drives.push_back(Drive(i->path().filename().string(), size, mounted, vendor, model)); - LOG_DIST("Block device %1 size %2 %3 vendor %4 model %5", name, size, mounted ? "mounted" : "not mounted", vendor.get_value_or("[none]"), model.get_value_or("[none]")); - } - } -#endif return drives; } @@ -763,42 +455,11 @@ Drive::description () const return String::compose("%1 (%2 GB) [%3]", name, gb, _internal_name); } -#ifdef DCPOMATIC_LINUX -void -unprivileged () -{ - uid_t ruid, euid, suid; - if (getresuid(&ruid, &euid, &suid) == -1) { - cerr << "getresuid() failed.\n"; - exit (EXIT_FAILURE); - } - seteuid (ruid); -} - -PrivilegeEscalator::~PrivilegeEscalator () -{ - unprivileged (); -} - -PrivilegeEscalator::PrivilegeEscalator () -{ - seteuid (0); -} -#endif - boost::filesystem::path config_path () { boost::filesystem::path p; -#ifdef DCPOMATIC_OSX - p /= g_get_home_dir (); - p /= "Library"; - p /= "Preferences"; - p /= "com.dcpomatic"; - p /= "2"; -#else - p /= g_get_user_config_dir (); - p /= "dcpomatic2"; -#endif + p /= g_get_user_config_dir (); + p /= "dcpomatic2"; return p; } diff --git a/src/lib/wscript b/src/lib/wscript index 7b5598746..c998b6936 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -53,7 +53,6 @@ sources = """ content.cc content_factory.cc create_cli.cc - cross.cc crypto.cc curl_uploader.cc datasat_ap2x.cc @@ -209,6 +208,11 @@ def build(bld): if bld.env.TARGET_WINDOWS: obj.uselib += ' WINSOCK2 DBGHELP SHLWAPI MSWSOCK BOOST_LOCALE' + obj.source += ' cross_windows.cc' + if bld.env.TARGET_OSX: + obj.source += ' cross_osx.cc' + if bld.env.TARGET_LINUX: + obj.source += ' cross_linux.cc' if bld.env.STATIC_DCPOMATIC: obj.uselib += ' XMLPP' -- 2.30.2