%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file dk4fileia.h File information with application support. */ #include "dk4fileit.h" #include "dk4app.h" #ifdef __cplusplus extern "C" { #endif /** Retrieve full information for a path name. For symbolic links attempt to retrieve information both about the link and about the link target. @param dptr Pointer to result structure. @param fn File path name. @param app Application structure for diagnostics, may be NULL. @return 1 if information is found, 0 otherwise. If information about the link is found and no information about the target, the function returns 1 as we can recognize the directory item as a dangling link (link with non-existing target). */ int dk4fileinfo_app(dk4_file_info_t *dptr, const dkChar *fn, dk4_app_t *app); /** Report errors from the stat() function. @param app Application structure. @param path Path name for which stat failed. @param errc Error code from errno variable. */ void dk4fileinfo_report_stat_failed(dk4_app_t *app, const dkChar *path, int errc); #if DK4_ON_WINDOWS /** Report errors from Windows functions. @param app Application structure. @param path Path name for which the functions failed. @param errc Error code from GetLastError(). */ void dk4fileinfo_report_win_failed(dk4_app_t *app, const dkChar *path, long errc); #endif #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 "dk4filei.h" #include "dk4fileia.h" #include "dk4error.h" #include "dk4mem.h" #if DK4_ON_WINDOWS #include "dk4maodd.h" #include "dk4maodh.h" #endif $!trace-include #if DK4_ON_WINDOWS void dk4fileinfo_report_win_failed(dk4_app_t *app, const dkChar *path, long errc) { dkChar eb1[8 * sizeof(DWORD) + 16]; dkChar eb2[8 * sizeof(DWORD) + 16]; int res = 0; int found = 0; if (ERROR_FILE_NOT_FOUND == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 51, path); found = 1; goto finished; } if (ERROR_PATH_NOT_FOUND == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 51, path); found = 1; goto finished; } if (ERROR_ACCESS_DENIED == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 55, path); found = 1; goto finished; } if (ERROR_BAD_NET_NAME == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 74, path); found = 1; goto finished; } if (ERROR_BAD_NETPATH == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 75, path); found = 1; goto finished; } if (ERROR_SHARING_VIOLATION == errc) { dk4app_log_base3(app, DK4_LL_ERROR, 149, 151, path); found = 1; goto finished; } if (0 == found) { res = dk4ma_write_decimal_unsigned( eb1, DK4_SIZEOF(eb1,dkChar), (dk4_um_t)(errc), 0, NULL ); if (0 != res) { res = dk4ma_write_hex_unsigned( eb2, DK4_SIZEOF(eb2,dkChar), (dk4_um_t)(errc), 0, NULL ); } if (0 != res) { dk4app_log_base7(app,DK4_LL_ERROR,149,69,70,71,path,eb1,eb2); } else { dk4app_log_base3(app, DK4_LL_ERROR, 149, 40, path); } } finished: ; } #endif void dk4fileinfo_report_stat_failed(dk4_app_t *app, const dkChar *path, int errc) { $? "+ dk4fileinfo_report_stat_failed \"%!ds\"", path switch (errc) { #ifdef EACCES case EACCES : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 138, path); } break; #endif #ifdef EFAULT case EFAULT : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 123, path); } break; #endif #ifdef ELOOP case ELOOP : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 61, path); } break; #endif #ifdef ENAMETOOLONG case ENAMETOOLONG : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 42, path); } break; #endif #ifdef ENOENT case ENOENT : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 51, path); } break; #endif #ifdef ENOMEM case ENOMEM : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 142, path); } break; #endif #ifdef ENOTDIR case ENOTDIR : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 150, path); } break; #endif #ifdef EOVERFLOW case EOVERFLOW : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 117, path); } break; #endif #ifdef EIO case EIO : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 126, path); } break; #endif default : { dk4app_log_base3(app, DK4_LL_ERROR, 149, 101, path); } break; } $? "- dk4fileinfo_report_stat_failed" } int dk4fileinfo_app(dk4_file_info_t *dptr, const dkChar *fn, dk4_app_t *app) { dk4_er_t er; int back = 0; if ((NULL != dptr) && (NULL != fn)) { dk4error_init(&er); back = dk4fileinfo(dptr, fn, &er); if (0 == back) { switch (er.ec) { #if DK4_ON_WINDOWS case DK4_E_CREATE_FILE_FAILED : case DK4_E_FILE_INFORMATION_FAILED : case DK4_E_FINDFIRSTFILE_FAILED : case DK4_E_SYSTEM : { dk4fileinfo_report_win_failed(app, fn, er.dt.lDetails1); } break; #else case DK4_E_SYSTEM : { dk4fileinfo_report_stat_failed(app, fn, er.dt.iDetails1); } break; #endif } } } return back; }