%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% module #include "dk4conf.h" #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #include "dk4const.h" #include "dk4app.h" #include "dk-ls.h" #include "dk4strd.h" #include "dk4filei.h" #include "dk4md.h" #include "dk4binenc.h" #include "dk4fopda.h" #include "dk4fput.h" $!trace-include void dk_ls_set_md( int *mdtype, int *mdenc, dkChar *buffer, dk4_app_t *app, const dkChar * const *msg, size_t szmsg ) { dkChar *mdptr; /* Start of text in buffer */ dkChar *encptr; /* Encoding within the buffer */ int mdt; /* Message digest type */ int mde; /* Message digest encoding */ mdptr = dk4str_start(buffer, NULL); if (NULL != mdptr) { encptr = dk4str_chr(mdptr, dkT('.')); if (NULL == encptr) { encptr = dk4str_chr(mdptr, dkT(',')); } if (NULL != encptr) { *(encptr++) = dkT('\0'); encptr = dk4str_start(encptr, NULL); } mdt = dk4md_choose_type(mdptr, NULL); if (NULL != encptr) { mde = dk4binenc_choose_encoding(encptr, NULL); } else { mde = DK4_BINARY_TO_TEXT_ENCODING_HEX; } if ((0 <= mdt) && (0 < mde)) { if (0 != dk4md_check_type(mdt)) { *mdtype = mdt; *mdenc = mde; } else { /* ERROR: No support for digest type */ dk4app_log_3(app, msg, szmsg, DK4_LL_ERROR, 20, 21, mdptr); } } else { if (0 > mdt) { /* ERROR: No such message digest type */ dk4app_log_3(app, msg, szmsg, DK4_LL_ERROR, 22, 23, mdptr); } else { *mdtype = mdt; } if (1 > mde) { /* ERROR: Illegal encoding */ dk4app_log_3(app, msg, szmsg, DK4_LL_ERROR, 24,25, encptr); } } } else { /* ERROR: No contents in buffer, should not happen */ } } #if 0 /* Now in dk4symlink.c as dk4symlink_target() function. */ int dk_ls_readlink(dkChar *bptr, size_t szb, const dkChar *fn) { #if DK4_ON_WINDOWS HANDLE fh; DWORD dwres; #else ssize_t res; #endif int back = 0; $? "+ dk_ls_readlink \"%!ds\"", TR_STR(fn) #if DK4_ON_WINDOWS #if DK4_CHAR_SIZE > 1 fh = CreateFileW( fn, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if (INVALID_HANDLE_VALUE != fh) { dwres = GetFinalPathNameByHandleW(fh, bptr, (DWORD)szb, 0); if (0 < dwres) { if (dwres < (DWORD)szb) { back = 1; } } CloseHandle(fh); } #else fh = CreateFileA( fn, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if (INVALID_HANDLE_VALUE != fh) { dwres = GetFinalPathNameByHandleA(fh, bptr, (DWORD)szb, 0); if (0 < dwres) { if (dwres < (DWORD)szb) { back = 1; } } CloseHandle(fh); } #endif if (0 < back) { if (dkT('\\') == bptr[0]) { if (dkT('\\') == bptr[1]) { if (dkT('?') == bptr[2]) { if (dkT('\\') == bptr[3]) { if (260 > dk4str_len(&(bptr[4]))) { dk4str_cpy_to_left(bptr, &(bptr[4])); } } } } } } #else #if DK4_CHAR_SIZE > 1 #else res = readlink(fn, bptr, szb); if (0 < res) { if (res < szb) { bptr[res] = dkT('\0'); back = 1; } else { $? "! readlink requires larger buffer" bptr[0] = dkT('\0'); } } else { $? "! readlink <= 0" bptr[0] = dkT('\0'); } #endif #endif if (0 == back) { bptr[0] = dkT('\0'); } $? "- dk_ls_readlink %d", back return back; } #endif void dk_ls_report_fileinfo_size_error( dk4_app_t *app, const dkChar *fn, int ch, const dkChar * const *msg, size_t szmsg ) { dk4app_log_3( app, msg, szmsg, DK4_LL_ERROR, ((DK4_FILE_INFO_CONTENTS_DATA_TARGET == ch) ? 4 : 3), 5, fn ); } void dk_ls_report_fileinfo_timestamp_error( dk4_app_t *app, const dkChar *fn, int ch, const dkChar * const *msg, size_t szmsg ) { dk4app_log_3( app, msg, szmsg, DK4_LL_ERROR, ((DK4_FILE_INFO_CONTENTS_DATA_TARGET == ch) ? 8 : 7), 9, fn ); }