Files
sdk/runtime/bin/platform_linux.cc
T
ager@google.com 28b43144e5 Update dart:io to convert strings between UTF8 and current code page
when interacting with the system.

What we get from and need to hand to the VM is utf8. What we
get from and need to hand to the system is in the current
code page.

R=sgjesse@google.com
BUG=

Review URL: https://codereview.chromium.org//11275281

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@14851 260f80e4-7a28-3924-810f-c04153c831b5
2012-11-13 15:03:23 +00:00

81 lines
2.1 KiB
C++

// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "bin/platform.h"
#include <signal.h>
#include <string.h>
#include <unistd.h>
bool Platform::Initialize() {
// Turn off the signal handler for SIGPIPE as it causes the process
// to terminate on writing to a closed pipe. Without the signal
// handler error EPIPE is set instead.
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = SIG_IGN;
if (sigaction(SIGPIPE, &act, 0) != 0) {
perror("Setting signal handler failed");
return false;
}
// Unblock SIGCHLD as waiting on spawned child process depends
// on successful interception of this signal.
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, SIGCHLD);
if (sigprocmask(SIG_UNBLOCK, &newset, NULL) != 0) {
perror("Unblocking SIGCHLD signal failed");
}
return true;
}
int Platform::NumberOfProcessors() {
return sysconf(_SC_NPROCESSORS_ONLN);
}
const char* Platform::OperatingSystem() {
return "linux";
}
bool Platform::LocalHostname(char *buffer, intptr_t buffer_length) {
return gethostname(buffer, buffer_length) == 0;
}
char** Platform::Environment(intptr_t* count) {
// Using environ directly is only safe as long as we do not
// provide access to modifying environment variables.
intptr_t i = 0;
char** tmp = environ;
while (*(tmp++) != NULL) i++;
*count = i;
char** result = new char*[i];
for (intptr_t current = 0; current < i; current++) {
result[current] = environ[current];
}
return result;
}
void Platform::FreeEnvironment(char** env, intptr_t count) {
delete[] env;
}
char* Platform::StrError(int error_code) {
static const int kBufferSize = 1024;
char* error = static_cast<char*>(malloc(kBufferSize));
error[0] = '\0';
char* error_str = strerror_r(error_code, error, kBufferSize);
if (error_str != error) {
size_t written = snprintf(error, kBufferSize, "%s", error_str);
ASSERT(written == strlen(error_str));
}
return error;
}