blob: 92832823bd4297e3cadd628e8b1baad222db4cd8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexey V. Varlamov
*/
#include "port_malloc.h"
#include "port_sysinfo.h"
#include "port_dso.h"
#include <windows.h>
#include <string.h>
#include <apr_dso.h>
#include <apr_strings.h>
#include <apr_env.h>
struct apr_dso_handle_t {
apr_pool_t *pool;
HINSTANCE handle;
apr_status_t error;
};
APR_DECLARE(apr_status_t) port_dso_load_ex(apr_dso_handle_t** handle,
const char* path,
U_32 mode,
apr_pool_t* pool){
/*
* FIXME Windows does not support lazy dll resolution a la Linux's RTLD_LAZY.
* Proper support for it requires hacking of APR DSO functions.
* Just ignore the <code>mode<code> param for now.
*/
/*if (mode == PORT_DSO_DEFAULT || !path) {*/
char *self_path;
apr_status_t res;
if (!path) {
port_executable_name(&self_path);
res = apr_dso_load(handle, (const char*)self_path, pool);
STD_FREE(self_path);
return res;
}
return apr_dso_load(handle, path, pool);
/*} else {
HINSTANCE native_handle = NULL;
DWORD flag = (mode & PORT_DSO_BIND_DEFER) ?
(DONT_RESOLVE_DLL_REFERENCES) : (0);
char *cp = apr_pstrdup(pool, path);
char *p = cp;
while ((p = strchr(p, '/')) != NULL) {
*p = '\\';
}
native_handle = LoadLibraryEx(cp, NULL, flag);
*handle = apr_palloc(pool, sizeof(apr_dso_handle_t));
if (native_handle == 0) {
native_handle = LoadLibraryEx(cp, NULL, flag | LOAD_WITH_ALTERED_SEARCH_PATH);
if (native_handle == 0) {
DWORD sys_err = apr_get_os_error();
(*handle)->error = sys_err;
return sys_err;
}
}
(*handle)->handle = native_handle;
(*handle)->pool = pool;
(*handle)->error = APR_SUCCESS;
return APR_SUCCESS;
}*/
}
APR_DECLARE(apr_status_t) port_dso_search_path(char** path,
apr_pool_t* pool) {
return apr_env_get(path, "PATH", pool);
}
APR_DECLARE(char *) port_dso_name_decorate(const char* dl_name,
apr_pool_t* pool) {
if (!dl_name) {
return 0;
}
return apr_pstrcat(pool, dl_name, ".dll", NULL);
}