mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
missing file
This commit is contained in:
parent
4388b853e5
commit
aca9915060
135
direct/src/plugin/p3dPythonMain.cxx
Normal file
135
direct/src/plugin/p3dPythonMain.cxx
Normal file
@ -0,0 +1,135 @@
|
||||
// Filename: p3dPythonMain.cxx
|
||||
// Created by: drose (29Aug09)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "run_p3dpython.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
static const string dll_ext = ".dll";
|
||||
#elif defined(__APPLE__)
|
||||
static const string dll_ext = ".dylib";
|
||||
#else
|
||||
static const string dll_ext = ".so";
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: main
|
||||
// Description: This is a trivial main() function that loads and runs
|
||||
// libp3dpython.dll. It's used to build p3dpython.exe,
|
||||
// which is the preferred way to run Python in a child
|
||||
// process, as a separate executable.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
const char *program_name = argv[0];
|
||||
const char *dll_file = NULL;
|
||||
const char *archive_file = NULL;
|
||||
if (argc > 1) {
|
||||
dll_file = argv[1];
|
||||
}
|
||||
if (argc > 2) {
|
||||
archive_file = argv[2];
|
||||
}
|
||||
|
||||
if (dll_file == NULL || *dll_file == '\0') {
|
||||
cerr << "No libp3dpython filename specified on command line.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (archive_file == NULL || *archive_file == '\0') {
|
||||
cerr << "No archive filename specified on command line.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// For some vague idea of security, we insist that this program can
|
||||
// only run libp3dpython.dll: you can't use it to load just any
|
||||
// arbitrary DLL on the system. Of course, if you're successfully
|
||||
// running this program in the first place, you probably don't need
|
||||
// any help to load an arbitrary DLL, but whatever.
|
||||
|
||||
// Find the basename of the dll_file.
|
||||
const char *slash = strrchr(dll_file, '/');
|
||||
#ifdef _WIN32
|
||||
const char *backslash = strrchr(dll_file, '\\');
|
||||
if (backslash != NULL && (slash == NULL || backslash > slash)) {
|
||||
slash = backslash;
|
||||
}
|
||||
#endif
|
||||
if (slash == NULL) {
|
||||
slash = dll_file;
|
||||
} else {
|
||||
++slash;
|
||||
}
|
||||
|
||||
string expected_basename = "libp3dpython" + dll_ext;
|
||||
|
||||
if (memcmp(slash, expected_basename.data(), expected_basename.size()) != 0) {
|
||||
cerr << dll_file << " does not name " << expected_basename << "\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Everything checks out. Load and run the library.
|
||||
|
||||
#ifdef _WIN32
|
||||
SetErrorMode(0);
|
||||
HMODULE module = LoadLibrary(dll_file);
|
||||
if (module == NULL) {
|
||||
// Couldn't load the DLL.
|
||||
cerr << "Couldn't load " << dll_file << "\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define get_func GetProcAddress
|
||||
FHandle input = GetStdHandle(STD_INPUT_HANDLE);
|
||||
FHandle output = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (!SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE)) {
|
||||
cerr << "unable to reset input handle\n";
|
||||
}
|
||||
if (!SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE)) {
|
||||
cerr << "unable to reset input handle\n";
|
||||
}
|
||||
|
||||
#else // _WIN32
|
||||
// Posix case.
|
||||
void *module = dlopen(dll_file, RTLD_GLOBAL);
|
||||
if (module == NULL) {
|
||||
// Couldn't load the .so.
|
||||
cerr << "Couldn't load " << dll_file << "\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define get_func dlsym
|
||||
FHandle input = STDIN_FILENO;
|
||||
FHandle output = STDOUT_FILENO;
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
run_p3dpython_func *run_p3dpython = (run_p3dpython_func *)get_func(module, "run_p3dpython");
|
||||
if (run_p3dpython == NULL) {
|
||||
cerr << "Couldn't find run_p3dpython\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!run_p3dpython(program_name, archive_file, input, output)) {
|
||||
cerr << "Failure on startup.\n";
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user