summaryrefslogtreecommitdiff
path: root/support/dktools/dk4fileig8.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4fileig8.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk4fileig8.ctr')
-rw-r--r--support/dktools/dk4fileig8.ctr495
1 files changed, 495 insertions, 0 deletions
diff --git a/support/dktools/dk4fileig8.ctr b/support/dktools/dk4fileig8.ctr
new file mode 100644
index 0000000000..cf4d9ae3fd
--- /dev/null
+++ b/support/dktools/dk4fileig8.ctr
@@ -0,0 +1,495 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2015-xxxx
+license = bsd
+
+
+
+%% module
+
+#include "dk4filei.h"
+
+#ifndef DK4TIME_H_INCLUDED
+#include "dk4time.h"
+#endif
+
+#ifndef DK4MEM_H_INCLUDED
+#include "dk4mem.h"
+#endif
+
+#ifndef DK4TIME08_H_INCLUDED
+#include "dk4time08.h"
+#endif
+
+#if DK4_TIME_WITH_SYS_TIME
+#ifndef SYS_TIME_H_INCLUDED
+#include <sys/time.h>
+#define SYS_TIME_H_INCLUDED 1
+#endif
+#ifndef TIME_H_INCLUDED
+#include <time.h>
+#define TIME_H_INCLUDED 1
+#endif
+#else
+#if DK4_HAVE_TIME_H
+#ifndef TIME_H_INCLUDED
+#include <time.h>
+#define TIME_H_INCLUDED 1
+#endif
+#else
+#if DK4_HAVE_SYS_TIME_H
+#ifndef SYS_TIME_H_INCLUDED
+#include <sys/time.h>
+#define SYS_TIME_H_INCLUDED 1
+#endif
+#endif
+#endif
+#endif
+
+
+
+$!trace-include
+
+
+
+#if DK4_ON_WINDOWS
+/* +++++ Windows +++++ */
+
+static
+int
+dk4fileinfo_c8_filetime_timestamp(
+ char *dptr,
+ size_t szdptr,
+ const FILETIME *timer,
+ dk4_er_t *erp
+)
+{
+ SYSTEMTIME st;
+ SYSTEMTIME lt;
+ int back = 0;
+ if (FileTimeToSystemTime(timer, &st)) {
+ if (SystemTimeToTzSpecificLocalTime(NULL, &st, &lt)) {
+ back = dk4time_to_text_c8(
+ dptr, szdptr, DK4_TIMEFORMAT_DATE_TIME,
+ lt.wYear, lt.wMonth, lt.wDay,
+ lt.wHour, lt.wMinute, lt.wSecond,
+ erp
+ );
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_BUG);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_BUG);
+ }
+ return back;
+}
+
+static
+int
+dk4fileinfo_c8_win_timestamp(
+ char *dptr,
+ size_t szdptr,
+ const BY_HANDLE_FILE_INFORMATION *pbhfi,
+ int chtime,
+ dk4_er_t *erp
+)
+{
+ int back = 0;
+ switch (chtime) {
+ case DK4_FILE_INFO_TIME_ACCESS: {
+ back = dk4fileinfo_c8_filetime_timestamp(
+ dptr, szdptr, &(pbhfi->ftLastAccessTime), erp
+ );
+ } break;
+ case DK4_FILE_INFO_TIME_CREATE: {
+ back = dk4fileinfo_c8_filetime_timestamp(
+ dptr, szdptr, &(pbhfi->ftCreationTime), erp
+ );
+ } break;
+ default: {
+ back = dk4fileinfo_c8_filetime_timestamp(
+ dptr, szdptr, &(pbhfi->ftLastWriteTime), erp
+ );
+ } break;
+ }
+ return back;
+}
+
+/* ----- Windows ----- */
+#else
+/* +++++ non-Windows +++++ */
+
+
+static
+int
+dk4fileinfo_c8_stat_time_timestamp(
+ char *dptr,
+ size_t szdptr,
+ const time_t *timer,
+ dk4_er_t *erp
+)
+{
+#if DK4_HAVE_LOCALTIME_R
+ struct tm lct;
+ int back = 0;
+ if (NULL != localtime_r(timer, &lct)) {
+ back = dk4time_convert_to_text_c8(dptr, szdptr, &lct, erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_BUG);
+ }
+ return back;
+#else
+ dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED);
+ return 0;
+#endif
+}
+
+static
+int
+dk4fileinfo_c8_nonwin_timestamp(
+ char *dptr,
+ size_t szdptr,
+ const dk4_stat_t *stb,
+ int chtime,
+ dk4_er_t *erp
+)
+{
+ int back = 0;
+ switch (chtime) {
+ case DK4_FILE_INFO_TIME_ACCESS: {
+ back = dk4fileinfo_c8_stat_time_timestamp(
+ dptr, szdptr, &(stb->st_atime), erp
+ );
+ } break;
+ case DK4_FILE_INFO_TIME_CREATE: {
+ back = dk4fileinfo_c8_stat_time_timestamp(
+ dptr, szdptr, &(stb->st_ctime), erp
+ );
+ } break;
+ default: {
+ back = dk4fileinfo_c8_stat_time_timestamp(
+ dptr, szdptr, &(stb->st_mtime), erp
+ );
+ } break;
+ }
+ return back;
+}
+
+/* ----- non-Windows ----- */
+#endif
+
+
+
+int
+dk4fileinfo_timestamp_c8(
+ char *dptr,
+ size_t szdptr,
+ const dk4_file_info_t *fi,
+ int chfile,
+ int chtime,
+ dk4_er_t *erp
+)
+{
+ int back = 0;
+ if ((NULL != dptr) && (NULL != fi) && (0 < szdptr)) {
+ switch (chfile) {
+ case DK4_FILE_INFO_CONTENTS_DATA_LINK: {
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (fi->contents))) {
+#if DK4_ON_WINDOWS
+ back = dk4fileinfo_c8_win_timestamp(
+ dptr, szdptr, &(fi->linfo), chtime, erp
+ );
+#else
+ back = dk4fileinfo_c8_nonwin_timestamp(
+ dptr, szdptr, &(fi->lstb), chtime, erp
+ );
+#endif
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND);
+ }
+ } break;
+ default: {
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (fi->contents))) {
+#if DK4_ON_WINDOWS
+ back = dk4fileinfo_c8_win_timestamp(
+ dptr, szdptr, &(fi->tinfo), chtime, erp
+ );
+#else
+ back = dk4fileinfo_c8_nonwin_timestamp(
+ dptr, szdptr, &(fi->tstb), chtime, erp
+ );
+#endif
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND);
+ }
+ } break;
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ return back;
+}
+
+
+
+int
+dk4fileinfo_type_attributes_c8(
+ char *dptr,
+ size_t szdptr,
+ dk4_file_info_t *fi,
+ dk4_er_t *erp
+)
+{
+ size_t i;
+ int back = 0;
+ if ((NULL != dptr) && (NULL != fi) && (0 < szdptr)) {
+ DK4_MEMRES(dptr, szdptr);
+#if DK4_ON_WINDOWS
+ if (14 < szdptr) {
+ back = 1;
+ for (i = 0; i < 12; i++) { dptr[i] = '-'; }
+ /* 0 reparse point or symlink */
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (fi->contents))) {
+ if (0 != (FILE_ATTRIBUTE_REPARSE_POINT & (fi->fattr))) {
+ dptr[0] = 'r';
+ if (IO_REPARSE_TAG_MOUNT_POINT == fi->rppnt) {
+ dptr[0] = 'm';
+ } else {
+ if (IO_REPARSE_TAG_SYMLINK == fi->rppnt) {
+ dptr[0] = 'l';
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (fi->contents))) {
+ if (
+ (fi->linfo).dwVolumeSerialNumber
+ != (fi->tinfo).dwVolumeSerialNumber
+ ) {
+ dptr[0] = 'L';
+ }
+ } else {
+ dptr[0] = '!';
+ }
+ } else {
+ if (IO_REPARSE_TAG_WIM == fi->rppnt) {
+ dptr[0] = 'w';
+ } else {
+ if (IO_REPARSE_TAG_SIS == fi->rppnt) {
+ dptr[0] = 's';
+ } else {
+#ifdef IO_REPARSE_TAG_NFS
+ /* Not available in VS2008+PSDK7
+ */
+ if (IO_REPARSE_TAG_NFS == fi->rppnt) {
+ dptr[0] = 'n';
+ } else {
+#endif
+ if (IO_REPARSE_TAG_CSV == fi->rppnt) {
+ dptr[0] = 'c';
+ } else {
+ if (IO_REPARSE_TAG_DFS == fi->rppnt) {
+ dptr[0] = 'd';
+ } else {
+ if (IO_REPARSE_TAG_DFSR == fi->rppnt) {
+ dptr[0] = 'f';
+ } else {
+#ifdef IO_REPARSE_TAG_DEDUP
+ /* Not available in VS2008+PSDK7
+ */
+ if (IO_REPARSE_TAG_DEDUP == fi->rppnt) {
+ dptr[0] = 'u';
+ } else {
+#endif
+ if (IO_REPARSE_TAG_HSM == fi->rppnt) {
+ dptr[0] = 'h';
+ } else {
+ if (IO_REPARSE_TAG_HSM2 == fi->rppnt) {
+ dptr[0] = '2';
+ }
+ }
+#ifdef IO_REPARSE_TAG_DEDUP
+ }
+#endif
+ }
+ }
+ }
+#ifdef IO_REPARSE_TAG_NFS
+ }
+#endif
+ }
+ }
+ }
+ }
+ }
+ }
+ /* 1 file type */
+ if (0 != (FILE_ATTRIBUTE_DIRECTORY & fi->fattr)) {
+ dptr[1] = 'd';
+ } else {
+ if (0 != (FILE_ATTRIBUTE_DEVICE & fi->fattr)) {
+ dptr[1] = 'b';
+ }
+ }
+ /* 2 read-only */
+ if (0 != (FILE_ATTRIBUTE_READONLY & fi->fattr)) {
+ dptr[2] = 'R';
+ }
+ /* 3 system file */
+ if (0 != (FILE_ATTRIBUTE_SYSTEM & fi->fattr)) {
+ dptr[3] = 'S';
+ }
+ /* 4 hidden */
+ if (0 != (FILE_ATTRIBUTE_HIDDEN & fi->fattr)) {
+ dptr[4] = 'H';
+ }
+ /* 5 not indexed */
+ if (0 != (FILE_ATTRIBUTE_NOT_CONTENT_INDEXED & fi->fattr)) {
+ dptr[5] = 'I';
+ }
+ /* 6 compressed */
+ if (0 != (FILE_ATTRIBUTE_COMPRESSED & fi->fattr)) {
+ dptr[6] = 'C';
+ }
+ /* 7 encrypted */
+ if (0 != (FILE_ATTRIBUTE_ENCRYPTED & fi->fattr)) {
+ dptr[7] = 'E';
+ }
+ /* 8 offline */
+ if (0 != (FILE_ATTRIBUTE_OFFLINE & fi->fattr)) {
+ dptr[8] = 'O';
+ }
+ /* 9 sparse file */
+ if (0 != (FILE_ATTRIBUTE_SPARSE_FILE & fi->fattr)) {
+ dptr[9] = 'P';
+ }
+ /* 10 temporary file */
+ if (0 != (FILE_ATTRIBUTE_TEMPORARY & fi->fattr)) {
+ dptr[10] = 'T';
+ }
+ /* 11 virtual file */
+ if (0 != (FILE_ATTRIBUTE_VIRTUAL & fi->fattr)) {
+ dptr[11] = 'V';
+ }
+ } else { $? "! buffer too small"
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+#else
+ if (12 < szdptr) {
+ back = 1;
+ for (i = 0; i < 11; i++) { dptr[i] = '-'; }
+ /* 0 symlink */
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_LINK & (fi->contents))) {
+#if defined(S_IFMT) && defined(S_IFLNK)
+ if (S_IFLNK == (S_IFMT & ((fi->lstb).st_mode))) {
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (fi->contents))) {
+ if ((fi->tstb).st_dev == (fi->lstb).st_dev) {
+ dptr[0] = 'l';
+ } else {
+ dptr[0] = 'L';
+ }
+ } else {
+ dptr[0] = '!';
+ }
+ }
+#endif
+ }
+ /* 1 file type */
+ dptr[1] = '?';
+ if (0 != (DK4_FILE_INFO_CONTENTS_DATA_TARGET & (fi->contents))) {
+ switch (S_IFMT & ((fi->tstb).st_mode)) {
+ case S_IFIFO: { dptr[1] = 'p'; } break;
+ case S_IFCHR: { dptr[1] = 'c'; } break;
+ case S_IFDIR: { dptr[1] = 'd'; } break;
+ case S_IFBLK: { dptr[1] = 'b'; } break;
+ case S_IFREG: { dptr[1] = '-'; } break;
+ case S_IFSOCK: { dptr[1] = 's'; } break;
+#ifdef S_IFMPC
+ case S_IFMPC: { dptr[1] = 'C'; } break;
+#endif
+#ifdef S_IFNAM
+ case S_IFNAM: { dptr[1] = 'O'; } break;
+#endif
+#ifdef S_INSEM
+ case S_INSEM: { dptr[1] = 'N'; } break;
+#endif
+#ifdef S_INSHD
+ case S_INSHD: { dptr[1] = 'M'; } break;
+#endif
+#ifdef S_IFMPB
+ case S_IFMPB: { dptr[1] = 'B'; } break;
+#endif
+#ifdef S_IFCMP
+ case S_IFCMP: { dptr[1] = 'v'; } break;
+#endif
+#ifdef S_IFNWK
+ case S_IFNWK: { dptr[1] = 'n'; } break;
+#endif
+#ifdef S_IFSHAD
+ case S_IFSHAD: { dptr[1] = 'a'; } break;
+#endif
+#ifdef S_IFDOOR
+ case S_IFDOOR: { dptr[1] = 'D'; } break;
+#endif
+#ifdef S_IFWHT
+ case S_IFWHT: { dptr[1] = 'w'; } break;
+#endif
+ }
+ /* 2 user read */
+ if (0 != (S_IRUSR & ((fi->tstb).st_mode))) {
+ dptr[2] = 'r';
+ }
+ /* 3 user write */
+ if (0 != (S_IWUSR & ((fi->tstb).st_mode))) {
+ dptr[3] = 'w';
+ }
+ /* 4 user execute */
+ if (0 != (S_IXUSR & ((fi->tstb).st_mode))) {
+ dptr[4] = 'x';
+ }
+ /* 4 user sticky */
+ if (0 != (S_ISUID & ((fi->tstb).st_mode))) {
+ dptr[4] = (('x' == dptr[4]) ? ('s') : ('S'));
+ }
+ /* 5 group read */
+ if (0 != (S_IRGRP & ((fi->tstb).st_mode))) {
+ dptr[5] = 'r';
+ }
+ /* 6 group write */
+ if (0 != (S_IWGRP & ((fi->tstb).st_mode))) {
+ dptr[6] = 'w';
+ }
+ /* 7 group execute */
+ if (0 != (S_IXGRP & ((fi->tstb).st_mode))) {
+ dptr[7] = 'x';
+ }
+ /* 7 group sticky */
+ if (0 != (S_ISGID & ((fi->tstb).st_mode))) {
+ dptr[7] = (('x' == dptr[7]) ? ('s') : ('S'));
+ }
+ /* 8 other read */
+ if (0 != (S_IROTH & ((fi->tstb).st_mode))) {
+ dptr[8] = 'r';
+ }
+ /* 9 other write */
+ if (0 != (S_IWOTH & ((fi->tstb).st_mode))) {
+ dptr[9] = 'w';
+ }
+ /* 10 other execute */
+ if (0 != (S_IXOTH & ((fi->tstb).st_mode))) {
+ dptr[10] = 'x';
+ }
+ /* 10 dir sticky */
+ if (0 != (S_ISVTX & ((fi->tstb).st_mode))) {
+ dptr[10] = (('x' == dptr[10]) ? ('t') : ('T'));
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+#endif
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ return back;
+}
+