some small fixes, starting _web_hostname integration

This commit is contained in:
David Rose 2009-10-26 20:19:19 +00:00
parent 32c5b3b66d
commit ab3e13403f
6 changed files with 112 additions and 6 deletions

View File

@ -502,6 +502,7 @@ get_panda_script_object() const {
////////////////////////////////////////////////////////////////////
void P3DInstance::
set_browser_script_object(P3D_object *browser_script_object) {
nout << "set_browser_script_object\n";
if (browser_script_object != _browser_script_object) {
P3D_OBJECT_XDECREF(_browser_script_object);
_browser_script_object = browser_script_object;
@ -513,6 +514,41 @@ set_browser_script_object(P3D_object *browser_script_object) {
send_browser_script_object();
}
}
// Query the location hostname. We'll use this to limit access to
// the scripting interfaces for a particular p3d file.
_web_hostname = "";
if (_browser_script_object != NULL) {
P3D_object *location = P3D_OBJECT_GET_PROPERTY(_browser_script_object, "location");
if (location != NULL) {
P3D_object *hostname = P3D_OBJECT_GET_PROPERTY(location, "hostname");
if (hostname != NULL) {
int size = P3D_OBJECT_GET_STRING(hostname, NULL, 0);
char *buffer = new char[size];
P3D_OBJECT_GET_STRING(hostname, buffer, size);
_web_hostname = string(buffer, size);
delete [] buffer;
P3D_OBJECT_DECREF(hostname);
}
P3D_object *protocol = P3D_OBJECT_GET_PROPERTY(location, "protocol");
if (protocol != NULL) {
int size = P3D_OBJECT_GET_STRING(protocol, NULL, 0);
char *buffer = new char[size];
P3D_OBJECT_GET_STRING(protocol, buffer, size);
if (string(buffer, size) == "file:") {
_web_hostname = "local";
}
delete [] buffer;
P3D_OBJECT_DECREF(protocol);
}
P3D_OBJECT_DECREF(location);
}
}
nout << "_web_hostname is " << _web_hostname << "\n";
}

View File

@ -193,6 +193,7 @@ private:
P3D_request_ready_func *_func;
P3D_object *_browser_script_object;
P3DMainObject *_panda_script_object;
string _web_hostname;
P3DTemporaryFile *_temp_p3d_filename;

View File

@ -236,7 +236,8 @@ initialize(const string &contents_filename, const string &host_url,
_log_pathname = _log_directory;
_log_pathname += _log_basename;
_log_pathname += ".log";
logfile.close();
logfile.clear();
logfile.open(_log_pathname.c_str(), ios::out | ios::trunc);
if (logfile) {

View File

@ -787,8 +787,11 @@ start_p3dpython(P3DInstance *inst) {
if (_p3dpython_exe.empty()) {
_p3dpython_exe = _python_root_dir + "/p3dpython";
#ifdef __APPLE__
// On OSX, run from the packaged bundle.
_p3dpython_exe = _python_root_dir + "/P3DPython.app/Contents/MacOS/p3dpython";
// On OSX, run from the packaged bundle, if it exists.
string bundle_exe = _python_root_dir + "/P3DPython.app/Contents/MacOS/p3dpython";
if (access(bundle_exe.c_str(), X_OK) == 0) {
_p3dpython_exe = bundle_exe;
}
#endif
}
#ifdef _WIN32
@ -1065,6 +1068,13 @@ start_p3dpython(P3DInstance *inst) {
// Fall back to running it in a sub-thread within the same
// process. This isn't nearly as good, but I guess it's better
// than nothing.
#ifndef _WIN32
// Let's only do this sub-thread fallback on Windows. On Mac and
// Linux, just fail.
set_failed();
return;
#endif // _WIN32
INIT_THREAD(_p3dpython_thread);
SPAWN_THREAD(_p3dpython_thread, p3dpython_thread_run, this);
_p3dpython_one_process = true;
@ -1377,6 +1387,12 @@ win_create_process() {
////////////////////////////////////////////////////////////////////
int P3DSession::
posix_create_process() {
// If the program file doesn't exist or isn't executable, don't even
// bother to try.
if (access(_p3dpython_exe.c_str(), X_OK) != 0) {
return -1;
}
// Fork and exec.
pid_t child = fork();
if (child < 0) {
@ -1444,7 +1460,57 @@ posix_create_process() {
close(_input_handle);
close(_output_handle);
return child;
// Let's wait a few milliseconds and see if the child is going to
// immediately exit with a failure status. This isn't 100%
// reliable, but it's a lot easier than sending back a "yes I
// successfully started the program" message. Maybe I'll put in the
// more reliable test later.
struct timeval start;
gettimeofday(&start, NULL);
int start_ms = start.tv_sec * 1000 + start.tv_usec / 1000;
int status;
pid_t result = waitpid(child, &status, WNOHANG);
while (result != child) {
if (result == -1) {
perror("waitpid");
break;
}
struct timeval now;
gettimeofday(&now, NULL);
int now_ms = now.tv_sec * 1000 + now.tv_usec / 1000;
int elapsed = now_ms - start_ms;
if (elapsed > 100) {
// OK, we've waited, and the child process is still alive.
// Assume it will stay that way.
nout << "child still alive after " << elapsed << " ms\n";
return child;
}
// Yield the timeslice and wait some more.
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1;
select(0, NULL, NULL, NULL, &tv);
result = waitpid(child, &status, WNOHANG);
}
// The child process died for some reason; maybe it couldn't exec()
// its process. Report an error condition.
nout << "Python process stopped immediately.\n";
if (WIFEXITED(status)) {
nout << " exited normally, status = "
<< WEXITSTATUS(status) << "\n";
} else if (WIFSIGNALED(status)) {
nout << " signalled by " << WTERMSIG(status) << ", core = "
<< WCOREDUMP(status) << "\n";
} else if (WIFSTOPPED(status)) {
nout << " stopped by " << WSTOPSIG(status) << "\n";
}
return -1;
}
#endif // _WIN32

View File

@ -131,7 +131,8 @@ void PPLogger::Open( const std::string &rootDir )
std::string log_pathname = log_directory;
log_pathname += log_basename;
log_pathname += ".log";
m_logfile.close();
m_logfile.clear();
m_logfile.open(log_pathname.c_str(), std::ios::out | std::ios::trunc);
m_logfile.setf(std::ios::unitbuf);

View File

@ -74,7 +74,8 @@ open_logfile() {
string log_pathname = log_directory;
log_pathname += log_basename;
log_pathname += ".log";
logfile.close();
logfile.clear();
logfile.open(log_pathname.c_str(), ios::out | ios::trunc);
logfile.setf(ios::unitbuf);