2010-10-27 13:13:11 +01:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2003-03-23 11:12:59 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* OpenOffice.org 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 Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
2008-04-11 09:33:45 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2003-03-23 11:12:59 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
2008-12-11 13:10:39 +00:00
|
|
|
|
2012-02-16 18:15:04 +01:00
|
|
|
/* make Python.h go first as a hack to work around _POSIX_C_SOURCE redefinition
|
|
|
|
warnings: */
|
|
|
|
#include "Python.h"
|
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
#include "sal/config.h"
|
2008-12-11 13:10:39 +00:00
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
#if defined LINUX && !defined __USE_GNU
|
|
|
|
#define __USE_GNU
|
2008-12-11 13:10:39 +00:00
|
|
|
#endif
|
2003-03-23 11:12:59 +00:00
|
|
|
#include <dlfcn.h>
|
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
#include "rtl/string.h"
|
2008-12-11 13:10:39 +00:00
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
/* A wrapper around libpyuno.so, making sure the latter is loaded RTLD_GLOBAL
|
|
|
|
so that C++ exception handling works with old GCC versions (that determine
|
|
|
|
RTTI identity by comparing string addresses rather than string content).
|
|
|
|
*/
|
2008-12-11 13:10:39 +00:00
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
static void * load(void * address, char const * symbol) {
|
|
|
|
Dl_info dl_info;
|
|
|
|
char * slash;
|
|
|
|
size_t len;
|
|
|
|
char * libname;
|
|
|
|
void * h;
|
|
|
|
void * func;
|
|
|
|
if (dladdr(address, &dl_info) == 0) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
slash = strrchr(dl_info.dli_fname, '/');
|
|
|
|
if (slash == NULL) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
len = slash - dl_info.dli_fname + 1;
|
|
|
|
libname = malloc(
|
|
|
|
len + RTL_CONSTASCII_LENGTH(SAL_DLLPREFIX "pyuno" SAL_DLLEXTENSION)
|
|
|
|
+ 1);
|
|
|
|
if (libname == 0) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
strncpy(libname, dl_info.dli_fname, len);
|
|
|
|
strcpy(libname + len, SAL_DLLPREFIX "pyuno" SAL_DLLEXTENSION);
|
|
|
|
h = dlopen(libname, RTLD_NOW | RTLD_GLOBAL);
|
2008-12-11 13:10:39 +00:00
|
|
|
free(libname);
|
2012-02-16 16:30:25 +01:00
|
|
|
if (h == NULL) {
|
|
|
|
abort();
|
2003-03-23 11:12:59 +00:00
|
|
|
}
|
2012-02-16 16:30:25 +01:00
|
|
|
func = dlsym(h, symbol);
|
|
|
|
if (func == NULL) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
return func;
|
2003-03-23 11:12:59 +00:00
|
|
|
}
|
2010-10-27 13:13:11 +01:00
|
|
|
|
2012-02-16 16:30:25 +01:00
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
|
|
|
|
|
|
PyObject * PyInit_pyuno(void) {
|
2012-02-16 17:06:41 +01:00
|
|
|
return
|
|
|
|
((PyObject * (*)(void)) load((void *) &PyInit_pyuno, "PyInit_pyuno"))();
|
2012-02-16 16:30:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
void initpyuno(void) {
|
|
|
|
((void (*)(void)) load((void *) &initpyuno, "initpyuno"))();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2010-10-27 13:13:11 +01:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|