Beispiel #1
0
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
									const char *pathname, FILE *fp)
{
	dl_funcptr p;
	void *handle;
	char funcname[258];
	char pathbuf[260];
	int dlopenflags=0;

	if (pathname && strchr(pathname, '/') == NULL) {
		/* Prefix bare filename with "./" */
		PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
		pathname = pathbuf;
	}

	PyOS_snprintf(funcname, sizeof(funcname),
				  LEAD_UNDERSCORE "init%.200s", shortname);

	if (fp != NULL) {
		int i;
		struct stat statb;
		fstat(fileno(fp), &statb);
		for (i = 0; i < nhandles; i++) {
			if (statb.st_dev == handles[i].dev &&
				statb.st_ino == handles[i].ino) {
				p = (dl_funcptr) dlsym(handles[i].handle,
									   funcname);
				return p;
			}
		}
		if (nhandles < 128) {
			handles[nhandles].dev = statb.st_dev;
#ifdef __VMS
			handles[nhandles].ino[0] = statb.st_ino[0];
			handles[nhandles].ino[1] = statb.st_ino[1];
			handles[nhandles].ino[2] = statb.st_ino[2];
#else
			handles[nhandles].ino = statb.st_ino;
#endif
		}
	}

#if !(defined(PYOS_OS2) && defined(PYCC_GCC))
	dlopenflags = JyNI_GetDLOpenFlags();
#endif

	if (Py_VerboseFlag)
		PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname ? pathname : "NULL",
						  dlopenflags);

#ifdef __VMS
	/* VMS currently don't allow a pathname, use a logical name instead */
	/* Concatenate 'python_module_' and shortname */
	/* so "import vms.bar" will use the logical python_module_bar */
	/* As C module use only one name space this is probably not a */
	/* important limitation */
	PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s",
				  shortname);
	pathname = pathbuf;
#endif

	handle = dlopen(pathname, dlopenflags);

	if (handle == NULL) {
		const char *error = dlerror();
		if (error == NULL)
			error = "unknown dlopen() error";
		PyErr_SetString(PyExc_ImportError, error);
		return NULL;
	}
	if (fp != NULL && nhandles < 128)
		handles[nhandles++].handle = handle;
	p = (dl_funcptr) dlsym(handle, funcname);
	return p;
}
Beispiel #2
0
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
									const char *pathname, FILE *fp)
{
	// puts("_PyImport_GetDynLoadFunc");
	dl_funcptr p;
	void *handle;
	char funcname[258];
	char pathbuf[260];
	int dlopenflags=0;
	if (strchr(pathname, '/') == NULL) {
		/* Prefix bare filename with "./" */
		PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
		pathname = pathbuf;
	}
	PyOS_snprintf(funcname, sizeof(funcname),
				  LEAD_UNDERSCORE "init%.200s", shortname);

	if (fp != NULL) {
		int i;
		struct stat statb;
		int fno = fileno(fp);
		fstat(fno, &statb);
		for (i = 0; i < nhandles; i++) {
			if (statb.st_dev == handles[i].dev &&
				statb.st_ino == handles[i].ino) {
				p = (dl_funcptr) dlsym(handles[i].handle, funcname);
				return p;
			}
		}
		if (nhandles < 128) {
			handles[nhandles].dev = statb.st_dev;
#ifdef __VMS
			handles[nhandles].ino[0] = statb.st_ino[0];
			handles[nhandles].ino[1] = statb.st_ino[1];
			handles[nhandles].ino[2] = statb.st_ino[2];
#else
			handles[nhandles].ino = statb.st_ino;
#endif
		}
	}

#if !(defined(PYOS_OS2) && defined(PYCC_GCC))
	//dlopenflags = PyThreadState_GET()->interp->dlopenflags;
	dlopenflags = JyNI_GetDLOpenFlags();
	//puts("dlopenflags obtained:");
	//printf("%i\n", (int) dlopenflags);
#endif

	//if (Py_VerboseFlag)
//	JNIEnv *env;
//	if ((*java)->GetEnv(java, (void **)&env, JNI_VERSION_1_2)) {
//		return NULL; // JNI version not supported
//	}
	env(NULL);
	//JyNI todo: fix verbose mode; it currently segfaults if active
	//if ((*env)->CallStaticIntMethod(env, JyNIClass, JyNIGetDLVerbose))
//	{
//		PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname, dlopenflags);
//	}
	//printf("dlopen(\"%s\", %x);\n", pathname, dlopenflags);
#ifdef __VMS
	/* VMS currently don't allow a pathname, use a logical name instead */
	/* Concatenate 'python_module_' and shortname */
	/* so "import vms.bar" will use the logical python_module_bar */
	/* As C module use only one name space this is probably not a */
	/* important limitation */
	PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s",
				  shortname);
	pathname = pathbuf;
#endif

	handle = dlopen(pathname, dlopenflags);
	if (handle == NULL) {
		const char *error = dlerror();
		if (error == NULL)
			error = "unknown dlopen() error";

		//todo: Check, why error is not correctly propagated on the designated way.
		//Until that is done, we print it out plainly with puts.
		puts("dlopen-error:");
		puts(error);
		//puts(pathname);

		PyErr_SetString(PyExc_ImportError, error);
		JyNI_JyErr_SetString((*env)->GetStaticObjectField(env, pyPyClass, pyPyImportError), error);
		return NULL;
	}
	if (fp != NULL && nhandles < 128)
		handles[nhandles++].handle = handle;
	p = (dl_funcptr) dlsym(handle, funcname);
	return p;
}