%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file dk4dira.h Directory operations with application support. */ #include "dk4dir.h" #include "dk4app.h" #ifdef __cplusplus extern "C" { #endif /** Open directory. @param path Directory path name. @param om Opening mode. @param app Application structure for diagnostics, may be NULL. @return Pointer to new directory structure on success, NULL on error. On success use dk4dir_close() to destroy the directory structure. */ dk4_dir_t * dk4dir_open_app(const dkChar *path, int om, dk4_app_t *app); #ifdef __cplusplus } #endif %% module #include "dk4conf.h" #include "dk4const.h" #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #include "dk4mem.h" #include "dk4dira.h" #include "dk4error.h" #if DK4_ON_WINDOWS #include "dk4maodd.h" #include "dk4maodh.h" #endif $!trace-include dk4_dir_t * dk4dir_open_app(const dkChar *path, int om, dk4_app_t *app) { #if DK4_ON_WINDOWS dkChar eb1[8 * sizeof(dk4_um_t) + 16]; dkChar eb2[8 * sizeof(dk4_um_t) + 16]; #endif dk4_er_t er; dk4_dir_t *back = NULL; #if DK4_ON_WINDOWS DWORD le; int found; int res; #endif if (NULL != path) { dk4error_init(&er); back = dk4dir_open(path, om, &er); if (NULL == back) { switch (er.ec) { case DK4_E_NOT_SUPPORTED : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 145, path); } break; case DK4_E_MEMORY_ALLOCATION_FAILED : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 103, path); } break; case DK4_E_MATH_OVERFLOW : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 146, path); } break; case DK4_E_BUFFER_TOO_SMALL : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 42, path); } break; #if !DK4_ON_WINDOWS case DK4_E_OPENDIR_FAILED : { switch (er.dt.iDetails1) { #ifdef EACCES case EACCES : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 138, path); } break; #endif #ifdef EBADF case EBADF : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 122, path); } break; #endif #ifdef EMFILE case EMFILE : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 114, path); } break; #endif #ifdef ENFILE case ENFILE : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 115, path); } break; #endif #ifdef ENOENT case ENOENT : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 51, path); } break; #endif #ifdef ENOMEM case ENOMEM : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 142, path); } break; #endif #ifdef ENOTDIR case ENOTDIR : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 150, path); } break; #endif #ifdef ELOOP case ELOOP : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 61, path); } break; #endif #ifdef ENAMETOOLONG case ENAMETOOLONG : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 65, path); } break; #endif default : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 10, path); } break; } } break; #endif #if DK4_ON_WINDOWS case DK4_E_FINDFIRSTFILE_FAILED : { le = er.dt.lDetails1; found = 0; if (ERROR_FILE_NOT_FOUND == le) { dk4app_log_base3(app, DK4_LL_ERROR, 144, 147, path); found = 1; } if (ERROR_ACCESS_DENIED == le) { dk4app_log_base3(app, DK4_LL_ERROR, 144, 138, path); found = 1; } if (ERROR_PATH_NOT_FOUND == le) { dk4app_log_base3(app, DK4_LL_ERROR, 144, 51, path); found = 1; } if (ERROR_BAD_NET_NAME == le) { dk4app_log_base3(app, DK4_LL_ERROR, 144, 74, path); found = 1; } if (ERROR_BAD_NETPATH == le) { dk4app_log_base3(app, DK4_LL_ERROR, 144, 75, path); found = 1; } if (0 == found) { res = dk4ma_write_decimal_unsigned( eb1,DK4_SIZEOF(eb1,dkChar),(dk4_um_t)le,0,NULL ); if (0 != res) { res = dk4ma_write_hex_unsigned( eb2, DK4_SIZEOF(eb2,dkChar), (dk4_um_t)le, 0, NULL ); } if (0 != res) { dk4app_log_base7(app,DK4_LL_ERROR,144,69,70,71,path,eb1,eb2); } else { dk4app_log_base3(app, DK4_LL_ERROR, 144, 77, path); } } } break; #endif default : { dk4app_log_base3(app, DK4_LL_ERROR, 144, 10, path); } break; } } } return back; }