< prev index next >
src/jdk.jpackage/unix/native/libapplauncher/PosixPlatform.cpp
Print this page
*** 23,34 ****
* questions.
*/
#include "PosixPlatform.h"
- #ifdef POSIX
-
#include "PlatformString.h"
#include "FilePath.h"
#include "Helpers.h"
#include <assert.h>
--- 23,32 ----
*** 36,56 ****
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <sys/file.h>
#include <sys/stat.h>
- #ifdef LINUX
#include <sys/wait.h>
- #endif
#include <errno.h>
#include <limits.h>
#include <pwd.h>
#include <iostream>
#include <algorithm>
#include <dlfcn.h>
#include <signal.h>
PosixPlatform::PosixPlatform(void) {
}
PosixPlatform::~PosixPlatform(void) {
--- 34,53 ----
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <errno.h>
#include <limits.h>
#include <pwd.h>
#include <iostream>
#include <algorithm>
#include <dlfcn.h>
#include <signal.h>
+ using namespace std;
PosixPlatform::PosixPlatform(void) {
}
PosixPlatform::~PosixPlatform(void) {
*** 112,135 ****
Procedure PosixPlatform::GetProcAddress(Module AModule,
std::string MethodName) {
return dlsym(AModule, PlatformString(MethodName));
}
! std::vector<std::string> PosixPlatform::GetLibraryImports(
! const TString FileName) {
! std::vector<TString> result;
return result;
}
! std::vector<TString> PosixPlatform::FilterOutRuntimeDependenciesForPlatform(
! std::vector<TString> Imports) {
! std::vector<TString> result;
return result;
}
! Process* PosixPlatform::CreateProcess() {
! return new PosixProcess();
}
PosixProcess::PosixProcess() : Process() {
FChildPID = 0;
FRunning = false;
--- 109,188 ----
Procedure PosixPlatform::GetProcAddress(Module AModule,
std::string MethodName) {
return dlsym(AModule, PlatformString(MethodName));
}
! Process* PosixPlatform::CreateProcess() {
! return new PosixProcess();
! }
!
! void PosixPlatform::addPlatformDependencies(JavaLibrary *pJavaLibrary) {
! }
!
! void Platform::CopyString(char *Destination,
! size_t NumberOfElements, const char *Source) {
! strncpy(Destination, Source, NumberOfElements);
!
! if (NumberOfElements > 0) {
! Destination[NumberOfElements - 1] = '\0';
! }
! }
!
! void Platform::CopyString(wchar_t *Destination,
! size_t NumberOfElements, const wchar_t *Source) {
! wcsncpy(Destination, Source, NumberOfElements);
!
! if (NumberOfElements > 0) {
! Destination[NumberOfElements - 1] = '\0';
! }
! }
!
! // Owner must free the return value.
!
! MultibyteString Platform::WideStringToMultibyteString(
! const wchar_t* value) {
! MultibyteString result;
! size_t count = 0;
!
! if (value == NULL) {
! return result;
! }
!
! count = wcstombs(NULL, value, 0);
! if (count > 0) {
! result.data = new char[count + 1];
! result.data[count] = '\0';
! result.length = count;
! wcstombs(result.data, value, count);
! }
!
return result;
}
! // Owner must free the return value.
!
! WideString Platform::MultibyteStringToWideString(const char* value) {
! WideString result;
! size_t count = 0;
!
! if (value == NULL) {
! return result;
! }
!
! count = mbstowcs(NULL, value, 0);
! if (count > 0) {
! result.data = new wchar_t[count + 1];
! result.data[count] = '\0';
! result.length = count;
! mbstowcs(result.data, value, count);
! }
!
return result;
}
! void PosixPlatform::InitStreamLocale(wios *stream) {
! // Nothing to do for POSIX platforms.
}
PosixProcess::PosixProcess() : Process() {
FChildPID = 0;
FRunning = false;
*** 139,173 ****
PosixProcess::~PosixProcess() {
Terminate();
}
- void PosixProcess::Cleanup() {
- if (FOutputHandle != 0) {
- close(FOutputHandle);
- FOutputHandle = 0;
- }
-
- if (FInputHandle != 0) {
- close(FInputHandle);
- FInputHandle = 0;
- }
-
- #ifdef MAC
- sigaction(SIGINT, &savintr, (struct sigaction *)0);
- sigaction(SIGQUIT, &savequit, (struct sigaction *)0);
- sigprocmask(SIG_SETMASK, &saveblock, (sigset_t *)0);
- #endif //MAC
- }
-
bool PosixProcess::ReadOutput() {
bool result = false;
if (FOutputHandle != 0 && IsRunning() == true) {
char buffer[4096] = {0};
! ssize_t count = read(FOutputHandle, buffer, sizeof(buffer));
if (count == -1) {
if (errno == EINTR) {
// continue;
} else {
--- 192,208 ----
PosixProcess::~PosixProcess() {
Terminate();
}
bool PosixProcess::ReadOutput() {
bool result = false;
if (FOutputHandle != 0 && IsRunning() == true) {
char buffer[4096] = {0};
! ssize_t count = read(FOutputHandle, buffer, sizeof (buffer));
if (count == -1) {
if (errno == EINTR) {
// continue;
} else {
*** 231,336 ****
}
return result;
}
- #define PIPE_READ 0
- #define PIPE_WRITE 1
-
- bool PosixProcess::Execute(const TString Application,
- const std::vector<TString> Arguments, bool AWait) {
- bool result = false;
-
- if (FRunning == false) {
- FRunning = true;
-
- int handles[2];
-
- if (pipe(handles) == -1) {
- return false;
- }
-
- struct sigaction sa;
- sa.sa_handler = SIG_IGN;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
- #ifdef MAC
- sigemptyset(&savintr.sa_mask);
- sigemptyset(&savequit.sa_mask);
- sigaction(SIGINT, &sa, &savintr);
- sigaction(SIGQUIT, &sa, &savequit);
- sigaddset(&sa.sa_mask, SIGCHLD);
- sigprocmask(SIG_BLOCK, &sa.sa_mask, &saveblock);
- #endif // MAC
- FChildPID = fork();
-
- // PID returned by vfork is 0 for the child process and the
- // PID of the child process for the parent.
- if (FChildPID == -1) {
- // Error
- TString message = PlatformString::Format(
- _T("Error: Unable to create process %s"),
- Application.data());
- throw Exception(message);
- }
- else if (FChildPID == 0) {
- Cleanup();
- TString command = Application;
-
- for (std::vector<TString>::const_iterator iterator =
- Arguments.begin(); iterator != Arguments.end();
- iterator++) {
- command += TString(_T(" ")) + *iterator;
- }
- #ifdef DEBUG
- printf("%s\n", command.data());
- #endif // DEBUG
-
- dup2(handles[PIPE_READ], STDIN_FILENO);
- dup2(handles[PIPE_WRITE], STDOUT_FILENO);
-
- close(handles[PIPE_READ]);
- close(handles[PIPE_WRITE]);
-
- execl("/bin/sh", "sh", "-c", command.data(), (char *)0);
-
- _exit(127);
- } else {
- FOutputHandle = handles[PIPE_READ];
- FInputHandle = handles[PIPE_WRITE];
-
- if (AWait == true) {
- ReadOutput();
- Wait();
- Cleanup();
- FRunning = false;
- result = true;
- }
- else {
- result = true;
- }
- }
- }
-
- return result;
- }
-
bool PosixProcess::Wait() {
bool result = false;
int status = 0;
pid_t wpid = 0;
- #ifdef LINUX
- wpid = wait(&status);
- #endif
- #ifdef MAC
wpid = wait(&status);
- #endif
-
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
! if (errno != EINTR){
status = -1;
}
}
#ifdef DEBUG
--- 266,284 ----
}
return result;
}
bool PosixProcess::Wait() {
bool result = false;
int status = 0;
pid_t wpid = 0;
wpid = wait(&status);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
! if (errno != EINTR) {
status = -1;
}
}
#ifdef DEBUG
*** 368,374 ****
std::list<TString> PosixProcess::GetOutput() {
ReadOutput();
return Process::GetOutput();
}
-
- #endif // POSIX
--- 316,320 ----
< prev index next >