From 0425aadc78680e53000fd0108b540d6eca048516 Mon Sep 17 00:00:00 2001 From: gmcdonald Date: Sat, 13 Feb 2010 01:32:03 +0000 Subject: Moving axis svn, part of TLP move INFRA-2441 git-svn-id: http://svn.apache.org/repos/asf/axis/axis2/c/core/trunk@909681 13f79535-47bb-0310-9956-ffa450edef68 --- util/src/dir_handler.c | 371 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 util/src/dir_handler.c (limited to 'util/src/dir_handler.c') diff --git a/util/src/dir_handler.c b/util/src/dir_handler.c new file mode 100644 index 0000000..4a5e51e --- /dev/null +++ b/util/src/dir_handler.c @@ -0,0 +1,371 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#ifndef S_ISDIR +# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) +#endif + +#ifdef AXIS2_ARCHIVE_ENABLED +#include +#endif + + +extern int AXIS2_ALPHASORT( + ); +#ifdef IS_MACOSX +int dir_select( + struct dirent *entry); +int file_select( + struct dirent *entry); +#else +int dir_select( + const struct dirent *entry); +int file_select( + const struct dirent *entry); +#endif + +/** + * List the dll files in the given service or module folder path + * @param pathname path to your service or module directory + * @return array list of dll file names + */ +AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL +axutil_dir_handler_list_services_or_modules_in_dir( + const axutil_env_t *env, + const axis2_char_t *pathname) +{ + axutil_array_list_t *file_list = NULL; + struct stat *buf = NULL; + int count = 1; + int i = 0; + struct dirent **files = NULL; + /*int file_select( + );*/ + /* Removed un-wanted redefinition leading to warnings on + * Windows. If this is the desired behaviour, please look + * into the file_select function definition below and comment + * out the code if neccessary. + */ + axis2_status_t status = AXIS2_FAILURE; + + AXIS2_ENV_CHECK(env, NULL); + file_list = axutil_array_list_create(env, 100); + count = AXIS2_SCANDIR(pathname, &files, file_select, AXIS2_ALPHASORT); + /* If no files found, make a non-selectable menu item */ + if(count <= 0) + { + axutil_array_list_free(file_list, env); + AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "No files in the path %s.", pathname); + return NULL; + } + + for(i = 1; i < (count + 1); ++i) + { + axis2_char_t *fname = NULL; + axutil_file_t *arch_file = NULL; + axis2_char_t *path = NULL; + axis2_char_t *temp_path = NULL; + + fname = files[i - 1]->d_name; + arch_file = (axutil_file_t *)axutil_file_create(env); + if(!arch_file) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + axutil_file_set_name(arch_file, env, fname); + temp_path = axutil_stracat(env, pathname, AXIS2_PATH_SEP_STR); + path = axutil_stracat(env, temp_path, fname); + AXIS2_FREE(env->allocator, temp_path); + if(!path) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + axutil_file_free(arch_file, env); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + axutil_file_set_path(arch_file, env, path); + buf = AXIS2_MALLOC(env->allocator, sizeof(struct stat)); + if(!buf) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + AXIS2_FREE(env->allocator, path); + axutil_file_free(arch_file, env); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + stat(path, buf); + axutil_file_set_timestamp(arch_file, env, (time_t)buf->st_ctime); + status = axutil_array_list_add(file_list, env, arch_file); + if(AXIS2_SUCCESS != status) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + axutil_file_free(arch_file, env); + AXIS2_FREE(env->allocator, path); + AXIS2_FREE(env->allocator, buf); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + return NULL; + } + AXIS2_FREE(env->allocator, path); + AXIS2_FREE(env->allocator, buf); + + } + return file_list; +} + +/** + * List services or modules directories in the services or modules folder + * respectively + * @param pathname path your modules or services folder + * @return array list of contents of services or modules folder + */ +AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL +axutil_dir_handler_list_service_or_module_dirs( + const axutil_env_t *env, + const axis2_char_t *pathname) +{ + axutil_array_list_t *file_list = NULL; + struct stat *buf = NULL; + int count = 1; + int i = 0; + struct dirent **files = NULL; + char cwd[500]; + int chdir_result = 0; + + /**FIXME: + * This magic number 500 was selected as a temporary solution. It has to be + * replaced with dynamic memory allocation. This will be done once the use of + * errno after getwcd() on Windows is figured out. + */ + + axis2_status_t status = AXIS2_FAILURE; + AXIS2_ENV_CHECK(env, NULL); + file_list = axutil_array_list_create(env, 0); + if(!AXIS2_GETCWD(cwd, 500)) + exit(1); + + /* pathname is path of services directory or modules directory. */ + chdir_result = AXIS2_CHDIR(pathname); +#ifdef AXIS2_ARCHIVE_ENABLED + axis2_archive_extract(); +#endif + + count = AXIS2_SCANDIR(pathname, &files, dir_select, AXIS2_ALPHASORT); + chdir_result = AXIS2_CHDIR(cwd); + + /* If no files found, make a non-selectable menu item */ + if(count <= 0) + { + axutil_array_list_free(file_list, env); + AXIS2_LOG_INFO(env->log, "No files in the path %s.", pathname); + return NULL; + } + + for(i = 1; i < (count + 1); ++i) + { + axis2_char_t *fname = NULL; + axutil_file_t *arch_file = NULL; + axis2_char_t *path = NULL; + axis2_char_t *temp_path = NULL; + + fname = files[i - 1]->d_name; + arch_file = (axutil_file_t *)axutil_file_create(env); + if(!arch_file) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + axutil_file_set_name(arch_file, env, fname); + temp_path = axutil_stracat(env, pathname, AXIS2_PATH_SEP_STR); + path = axutil_stracat(env, temp_path, fname); + if(!path) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + axutil_file_free(arch_file, env); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + axutil_file_set_path(arch_file, env, path); + AXIS2_FREE(env->allocator, temp_path); + buf = AXIS2_MALLOC(env->allocator, sizeof(struct stat)); + if(!buf) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + axutil_file_free(arch_file, env); + AXIS2_FREE(env->allocator, path); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + stat(path, buf); + axutil_file_set_timestamp(arch_file, env, (time_t)buf->st_ctime); + status = axutil_array_list_add(file_list, env, arch_file); + if(AXIS2_SUCCESS != status) + { + int size = 0; + int j = 0; + axutil_file_t *del_file = NULL; + + axutil_file_free(arch_file, env); + AXIS2_FREE(env->allocator, path); + AXIS2_FREE(env->allocator, buf); + size = axutil_array_list_size(file_list, env); + for(j = 0; j < size; j++) + { + del_file = axutil_array_list_get(file_list, env, j); + axutil_file_free(del_file, env); + } + axutil_array_list_free(file_list, env); + return NULL; + } + AXIS2_FREE(env->allocator, path); + AXIS2_FREE(env->allocator, buf); + } + + for(i = 0; i < count; i++) + { + free(files[i]); + } + free(files); + return file_list; +} + +#ifdef IS_MACOSX + int file_select(struct dirent *entry) +{ +#else + int file_select(const struct dirent *entry) +{ +#endif + /** FIXME: + * This block of code has been sitting here doing nothing. + * I have made the existing logic use this code portion. + * Have no idea about the side-effects of this modification. + * If this code block is not required, we might as well remove + * it. + */ + axis2_char_t *ptr; + + if((strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0)) + return (AXIS2_FALSE); + + /* Check for filename extensions */ + ptr = axutil_rindex(entry->d_name, '.'); + if((ptr) && ((strcmp(ptr, AXIS2_LIB_SUFFIX) == 0))) + { + return (AXIS2_TRUE); + } + else + return (AXIS2_FALSE); +} + +#ifdef IS_MACOSX +int +dir_select( + struct dirent *entry) +#else +int +dir_select( + const struct dirent *entry) +#endif +{ + struct stat stat_p; + + if(-1 == stat(entry->d_name, &stat_p)) + return (AXIS2_FALSE); + + if((entry->d_name[0] == '.') || (!S_ISDIR(stat_p.st_mode))) + { + return (AXIS2_FALSE); + } + + return AXIS2_TRUE; +} -- cgit v1.1-32-gdbae