From 5f08cec3402ed247423b596eb3c622e1845707c2 Mon Sep 17 00:00:00 2001
From: cellframe <roman.khlopkov@demlabs.net>
Date: Wed, 23 Nov 2022 21:19:17 +0300
Subject: [PATCH] [*] Crossplatform things

---
 dap-sdk                           |   2 +-
 modules/wallet/dap_chain_wallet.c | 199 ++++++++++--------------------
 2 files changed, 68 insertions(+), 133 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index 2e12edb4ff..3cbf44c9fc 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 2e12edb4fff37fcadadd6414643e9fbeb3e8a574
+Subproject commit 3cbf44c9fc8f362e1fe5bc3b772e291c7ad1af98
diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c
index adff4b947e..fc90865135 100644
--- a/modules/wallet/dap_chain_wallet.c
+++ b/modules/wallet/dap_chain_wallet.c
@@ -567,17 +567,13 @@ dap_enc_key_t* dap_chain_wallet_get_key( dap_chain_wallet_t * a_wallet,uint32_t
 int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet, const char *a_pass)
 {
 DAP_CHAIN_WALLET_INTERNAL_LOCAL (a_wallet);                                 /* Declare l_wallet_internal */
-#ifdef DAP_OS_WINDOWS
-HANDLE l_fh = INVALID_HANDLE_VALUE;
-#else
-int l_fd = -1;
-typedef struct iovec iovec_t;
-#endif
+dap_file_handle_t l_fh = INVALID_HANDLE_VALUE;
 size_t l_rc = 0;
 uint32_t l_len = 0;
 char *l_cp, *l_cert_raw, l_buf[32*1024];
 dap_enc_key_t *l_enc_key = NULL;
 uint32_t l_csum = CRC32C_INIT;
+dap_errnum_t l_err = 0;
 
 enum {
     WALLET$K_IOV_HEADER = 0,
@@ -593,17 +589,16 @@ enum {
             return  log_it(L_ERROR, "Error create key context"), -EINVAL;
 
 #ifdef DAP_OS_WINDOWS
-    DWORD l_err = 0;
     if ((l_fh = CreateFile(l_wallet_internal->file_name, GENERIC_WRITE, /*FILE_SHARE_READ | FILE_SHARE_WRITE */ 0, NULL, CREATE_NEW,
                           /*FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING*/ 0, NULL)) == INVALID_HANDLE_VALUE) {
         l_err = GetLastError();
-        log_it(L_ERROR, "Cant open file %s for writing, err %lu", l_wallet_internal->file_name, l_err);
-        return -l_err;
-    }
 #else
-    if ( 0 > (l_fd = open(l_wallet_internal->file_name , O_CREAT | O_WRONLY, s_fileprot)) )
-        return log_it(L_ERROR, "Cant open file %s for writing, errno=%d", l_wallet_internal->file_name, errno), -errno;
+    if ( 0 > (l_fh = open(l_wallet_internal->file_name , O_CREAT | O_WRONLY, s_fileprot)) ) {
+        l_err = errno;
 #endif
+        return log_it(L_ERROR, "Cant open file %s for writing, errno=%"DAP_FORMAT_ERRNUM,
+                      l_wallet_internal->file_name, l_err), -l_err;
+    }
 
     l_cp = a_wallet->name[0] ? a_wallet->name : "DefaultWalletName";
 
@@ -619,22 +614,12 @@ enum {
         { .iov_base = l_cp,         .iov_len = l_file_hdr.wallet_len }  /* WALLET$K_IOV_BODY */
     };
 
-#ifdef DAP_OS_WINDOWS
-    l_rc = dap_writev(l_fh, l_cp, l_iov, WALLET$SZ_IOV_NR, &l_err);
-    if (l_err) {
-        log_it(L_ERROR, "Error write Wallet header to file '%s', err %lu", l_wallet_internal->file_name, l_err);
-        CloseHandle(l_fh);
+    l_rc = dap_writev(l_fh, l_cp, l_iov, WALLET$SZ_IOV_NR, &l_err);     /* Performs writting vectorized buffer */
+    if (l_err || (l_len = sizeof(l_file_hdr) + l_file_hdr.wallet_len) != l_rc) {
+        log_it(L_ERROR, "Error write Wallet header to file '%s', err %"DAP_FORMAT_ERRNUM, l_wallet_internal->file_name, l_err);
+        dap_fileclose(l_fh);
         return -l_err;
     }
-#else
-    l_rc = writev (l_fd, l_iov, WALLET$SZ_IOV_NR );                         /* Performs writting vectorized buffer */
-    if ((l_len = sizeof(l_file_hdr) + l_file_hdr.wallet_len) != l_rc)
-    {
-        close(l_fd);
-        return  log_it(L_ERROR, "Error write Wallet header to file '%s', errno=%d", l_wallet_internal->file_name, errno), -EIO;
-    }
-#endif
-
                                                                             /* CRC for file header part */
     l_csum = crc32c(l_csum, l_iov[WALLET$K_IOV_HEADER].iov_base, l_iov[WALLET$K_IOV_HEADER].iov_len);
                                                                             /* CRC for file body part */
@@ -674,24 +659,14 @@ enum {
         l_iov[WALLET$K_IOV_BODY].iov_base  = l_enc_key ? l_buf : l_cert_raw;/* Cert itself or buffer with has been encrypted cert */
         l_len += l_iov[WALLET$K_IOV_BODY].iov_len  = l_wallet_cert_hdr.cert_raw_size;
 
-#ifdef DAP_OS_WINDOWS
-        l_err = 0;
         l_rc = dap_writev(l_fh, l_cp, l_iov, WALLET$SZ_IOV_NR, &l_err);
         DAP_DEL_Z (l_cert_raw);
-        if (l_err) {
-            log_it(L_ERROR, "Error writing %d octets of cert to file '%s', err %lu", l_len, l_wallet_internal->file_name, l_err);
-            CloseHandle(l_fh);
+        if (l_err || l_rc != l_len) {
+            log_it(L_ERROR, "Error writing %d octets of cert to file '%s', err %"DAP_FORMAT_ERRNUM,
+                   l_len, l_wallet_internal->file_name, l_err);
+            dap_fileclose(l_fh);
             return -l_err;
         }
-#else
-        l_rc = writev (l_fd, l_iov, WALLET$SZ_IOV_NR );                      /* Perform writting vectorized buffer */
-        DAP_DEL_Z (l_cert_raw);                                             /* Free cert's memory */
-        if ( l_rc != l_len )                                                /* Check a result of the I/O operation */
-        {
-            close (l_fd);
-            return  log_it(L_ERROR, "Error write %d octets of cert to file '%s', errno=%d", l_len, l_wallet_internal->file_name, errno), errno;
-        }
-#endif
     }
 
     if ( l_file_hdr.version == DAP_WALLET$K_VER_2 )
@@ -704,25 +679,15 @@ enum {
         l_iov[WALLET$K_IOV_BODY].iov_base  = &l_csum;
         l_len += l_iov[WALLET$K_IOV_BODY].iov_len  = sizeof(l_csum);
 
-#ifdef DAP_OS_WINDOWS
-        l_err = 0;
-        l_rc = dap_writev(l_fh, l_cp, l_iov, WALLET$SZ_IOV_NR, &l_err);
-        if (l_err) {
-            log_it(L_ERROR, "Error writing %d octets of cert to file '%s', err %lu", l_len, l_wallet_internal->file_name, l_err);
+        l_rc = dap_writev(l_fh, l_cp, l_iov, WALLET$SZ_IOV_NR, &l_err);     /* Perform writting vectorized buffer */
+        if (l_err || l_rc != l_len) {                                       /* Check a result of the I/O operation */
+            log_it(L_ERROR, "Error writing %d octets of cert to file '%s', err %"DAP_FORMAT_ERRNUM,
+                   l_len, l_wallet_internal->file_name, l_err);
         }
     }
-    CloseHandle(l_fh);
-
-#else
-        l_rc = writev (l_fd, l_iov, WALLET$SZ_IOV_NR );                     /* Perform writting vectorized buffer */
-        if ( l_rc != l_len )                                                /* Check a result of the I/O operation */
-            log_it(L_ERROR, "Error write %d octets of cert to  file '%s', errno=%d", l_len, l_wallet_internal->file_name, errno);
-
-    }
-
     /* Cleanup and exit ... */
-    close (l_fd);
-#endif
+    dap_fileclose(l_fh);
+
     if ( l_enc_key )
         dap_enc_key_delete(l_enc_key);
 
@@ -736,11 +701,7 @@ enum {
     }
 #endif      /* DAP_SYS_DEBUG */
 
-#ifdef DAP_OS_WINDOWS
-    return  log_it(L_NOTICE, "Wallet '%s' has been saved into the '%s'", a_wallet->name, l_wallet_internal->file_name), l_err;
-#else
-    return  log_it(L_NOTICE, "Wallet '%s' has been saved into the '%s'", a_wallet->name, l_wallet_internal->file_name), 0;
-#endif
+    return log_it(L_NOTICE, "Wallet '%s' has been saved into the '%s'", a_wallet->name, l_wallet_internal->file_name), l_err;
 }
 
 
@@ -756,12 +717,8 @@ dap_chain_wallet_t *dap_chain_wallet_open_file (
                     )
 {
 dap_chain_wallet_t *l_wallet;
-#ifdef DAP_OS_WINDOWS
-HANDLE l_fh = INVALID_HANDLE_VALUE;
-DWORD l_rc = 0;
-#else
-int l_fd = -1, l_rc;
-#endif
+dap_file_handle_t l_fh = INVALID_HANDLE_VALUE;
+dap_errnum_t l_err = 0;
 int l_certs_count, l_len;
 dap_chain_wallet_file_hdr_t l_file_hdr = {0};
 dap_chain_wallet_cert_hdr_t l_cert_hdr = {0};
@@ -770,66 +727,57 @@ dap_enc_key_t *l_enc_key = NULL;
 uint32_t    l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT;
 
 #ifdef DAP_OS_WINDOWS
+    DWORD l_rc = 0;
     if ((l_fh = CreateFile(a_file_name, GENERIC_READ, 0, 0,
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, 0)) == INVALID_HANDLE_VALUE) {
-        return  log_it(L_ERROR,"Cant open file %s for read, err %lu", a_file_name, GetLastError()), NULL;
-    }
-
+        l_err = GetLastError();
 #else
-    if ( 0 > (l_fd = open(a_file_name , O_RDONLY)) )                        /* Open file for ReadOnly !!! */
-        return  log_it(L_ERROR,"Cant open file %s for read, errno=%d", a_file_name, errno), NULL;
+    ssize_t l_rc = 0;
+    if ( 0 > (l_fh = open(a_file_name , O_RDONLY)) ) {                      /* Open file for ReadOnly !!! */
+        l_err = errno;
 #endif
-
+        return  log_it(L_ERROR,"Cant open file %s for read, error %"DAP_FORMAT_ERRNUM, a_file_name, l_err), NULL;
+    }
 #ifdef DAP_OS_WINDOWS
     if (ReadFile(l_fh, &l_file_hdr, sizeof(l_file_hdr), &l_rc, 0) == FALSE || l_rc != sizeof(l_file_hdr)) {
-        return  log_it(L_ERROR, "Error reading Wallet file (%s) header, err %lu", a_file_name, GetLastError()),
-                CloseHandle(l_fh), NULL;
-    }
+        l_err = GetLastError();
 #else
-    if ( sizeof(l_file_hdr) != read(l_fd, &l_file_hdr, sizeof(l_file_hdr)) )/* Get the file header record */
-        return  log_it(L_ERROR, "Error read Wallet file (%s) header, errno=%d", a_file_name, errno), close(l_fd), NULL;
+    if (sizeof(l_file_hdr) != read(l_fh, &l_file_hdr, sizeof(l_file_hdr))) {/* Get the file header record */
+        l_err = errno;
 #endif
-
+        return  log_it(L_ERROR, "Error reading Wallet file (%s) header, err %"DAP_FORMAT_ERRNUM, a_file_name, l_err),
+                dap_fileclose(l_fh), NULL;
+    }
     if ( l_file_hdr.signature != DAP_CHAIN_WALLETS_FILE_SIGNATURE )  {       /* Check signature of the file */
-        log_it(L_ERROR, "Wallet (%s) signature mismatch (%llux != %ldx)", a_file_name, l_file_hdr.signature, DAP_CHAIN_WALLETS_FILE_SIGNATURE);
-#ifdef DAP_OS_WINDOWS
-        CloseHandle(l_fh);
-#else
-        close(l_fd);
-#endif
+        log_it(L_ERROR, "Wallet (%s) signature mismatch (%"DAP_UINT64_FORMAT_X" != %"DAP_UINT64_FORMAT_X")",
+               a_file_name, l_file_hdr.signature, DAP_CHAIN_WALLETS_FILE_SIGNATURE);
+        dap_fileclose(l_fh);
         return NULL;
     }
 
     if ( (l_file_hdr.version == DAP_WALLET$K_VER_2) && (!l_pass) ) {
         log_it(L_DEBUG, "Wallet (%s) version 2 cannot be processed w/o password", a_file_name);
-#ifdef DAP_OS_WINDOWS
-        CloseHandle(l_fh);
-#else
-        close(l_fd);
-#endif
+        dap_fileclose(l_fh);
         return NULL;
     }
 
     if ( l_file_hdr.wallet_len > DAP_WALLET$SZ_NAME ) {
         log_it(L_ERROR, "Invalid Wallet name (%s) length ( >%d)", a_file_name, DAP_WALLET$SZ_NAME);
-#ifdef DAP_OS_WINDOWS
-        CloseHandle(l_fh);
-#else
-        close(l_fd);
-#endif
+        dap_fileclose(l_fh);
         return NULL;
     }
 
 #ifdef DAP_OS_WINDOWS
     if (!ReadFile(l_fh, l_wallet_name, l_file_hdr.wallet_len, &l_rc, 0) || l_rc != l_file_hdr.wallet_len) {
-        return  log_it(L_ERROR, "Error reading Wallet name, err %lu", GetLastError()),
-                CloseHandle(l_fh), NULL;
-    }
+        l_err = GetLastError();
 #else
-    if ( l_file_hdr.wallet_len != read(l_fd, l_wallet_name, l_file_hdr.wallet_len) ) /* Read wallet's name */
-        return  log_it(L_ERROR, "Error Wallet's name (%s), errno=%d", a_file_name, errno), close(l_fd), NULL;
+    if (l_file_hdr.wallet_len != read(l_fh, l_wallet_name, l_file_hdr.wallet_len)) { /* Read wallet's name */
+        l_err = errno;
 #endif
+        return log_it(L_ERROR, "Error reading Wallet name, err %"DAP_FORMAT_ERRNUM, l_err),
+               dap_fileclose(l_fh), NULL;
+    }
 
     l_csum = crc32c(l_csum, &l_file_hdr, sizeof(l_file_hdr) );           /* Compute check sum of the Wallet file header */
     l_csum = crc32c(l_csum, l_wallet_name,  l_file_hdr.wallet_len);
@@ -843,35 +791,28 @@ uint32_t    l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT;
     for ( l_certs_count = 0; ReadFile(l_fh, &l_cert_hdr, sizeof(l_cert_hdr), &l_rc, NULL) && l_rc; ++l_certs_count) {
         if ( (l_file_hdr.version == DAP_WALLET$K_VER_2) && (l_cert_hdr.type == DAP_WALLET$K_MAGIC) )
             break;
-        if (!ReadFile(l_fh, l_buf, l_cert_hdr.cert_raw_size, &l_rc, NULL) || l_rc != l_cert_hdr.cert_raw_size){
-            log_it(L_ERROR, "Error reading certificate body (%d != %lu), err %lu", l_cert_hdr.cert_raw_size, l_rc, GetLastError());
+        if (!ReadFile(l_fh, l_buf, l_cert_hdr.cert_raw_size, &l_rc, NULL) || l_rc != l_cert_hdr.cert_raw_size) {
+            l_err = GetLastError();
             break;
         }
     }
 #else
-    for ( l_certs_count = 0; sizeof(l_cert_hdr) == (l_rc = read (l_fd, &l_cert_hdr, sizeof(l_cert_hdr))); l_certs_count++ ) {
+    for ( l_certs_count = 0; sizeof(l_cert_hdr) == (l_rc = read (l_fh, &l_cert_hdr, sizeof(l_cert_hdr))); l_certs_count++ ) {
         if ( (l_file_hdr.version == DAP_WALLET$K_VER_2) && (l_cert_hdr.type == DAP_WALLET$K_MAGIC) )
             break;
-
-        if ( (int)l_cert_hdr.cert_raw_size != (l_rc = read(l_fd, l_buf, l_cert_hdr.cert_raw_size)) ) {
-            log_it(L_ERROR, "Error read certificate's body (%d != %d), errno=%d", l_cert_hdr.cert_raw_size, l_rc, errno);
+        if ( (int)l_cert_hdr.cert_raw_size != (l_rc = read(l_fh, l_buf, l_cert_hdr.cert_raw_size)) ) {
+            l_err = errno;
             break;
         }
     }
 #endif
-
-#ifndef DAP_OS_WINDOWS
-    if ( l_rc < 0 )
-        return log_it(L_ERROR, "Wallet file (%s) I/O error, errno=%d", a_file_name, errno), close(l_fd), NULL;
-#endif
+    if (l_err)
+        return log_it(L_ERROR, "Wallet file (%s) I/O error reading certificate body (%d != %zd), error %"DAP_FORMAT_ERRNUM,
+                      a_file_name, l_cert_hdr.cert_raw_size, (ssize_t)l_rc, l_err), dap_fileclose(l_fh), NULL;
 
     if ( !l_certs_count ) {
         log_it(L_ERROR, "No certificate (-s) in the wallet file (%s)", a_file_name);
-#ifdef DAP_OS_WINDOWS
-        CloseHandle(l_fh);
-#else
-        close(l_fd);
-#endif
+        dap_fileclose(l_fh);
         return NULL;
     }
 
@@ -879,13 +820,9 @@ uint32_t    l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT;
     if ( (l_file_hdr.version == DAP_WALLET$K_VER_2) && l_pass )             /* Generate encryptor context  */
         if ( !(l_enc_key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_GOST_OFB, NULL, 0, l_pass, strlen(l_pass), 0)) ) {
             log_it(L_ERROR, "Error create key context");
-#ifdef DAP_OS_WINDOWS
-            CloseHandle(l_fh);
-#else
-            close(l_fd);
-#endif
+            dap_fileclose(l_fh);
             return NULL;
-    }
+        }
 
 
     /* Create local instance of wallet,
@@ -909,22 +846,24 @@ uint32_t    l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT;
     l_offset.QuadPart = sizeof(l_file_hdr) + l_file_hdr.wallet_len;
     if (SetFilePointerEx(l_fh, l_offset, &l_offset, FILE_BEGIN))
 #else
-    lseek(l_fd,  sizeof(l_file_hdr) + l_file_hdr.wallet_len, SEEK_SET);     /* Set file pointer to first record after cert file header */
+    lseek(l_fh,  sizeof(l_file_hdr) + l_file_hdr.wallet_len, SEEK_SET);     /* Set file pointer to first record after cert file header */
 #endif
 
 #ifdef DAP_OS_WINDOWS
     for (size_t i = 0; (ReadFile(l_fh, &l_cert_hdr, sizeof(l_cert_hdr), &l_rc, NULL) == TRUE) && l_rc; ++i)
 #else
-    for ( size_t i = 0; sizeof(l_cert_hdr) == (l_rc = read (l_fd, &l_cert_hdr, sizeof(l_cert_hdr))); i++ )           /* Read Cert/Record header */
+    for ( size_t i = 0; sizeof(l_cert_hdr) == (l_rc = read (l_fh, &l_cert_hdr, sizeof(l_cert_hdr))); i++ )           /* Read Cert/Record header */
 #endif
     {
 #ifdef DAP_OS_WINDOWS
         if (!ReadFile(l_fh, l_buf, l_cert_hdr.cert_raw_size, &l_rc, NULL) || l_rc != l_cert_hdr.cert_raw_size) {
-            log_it(L_ERROR, "Error reading certificate body (%lu != %lu), err %lu", l_cert_hdr.cert_raw_size, l_rc, GetLastError());
+            l_err = GetLastError();
 #else
-        if ( (int)l_cert_hdr.cert_raw_size != (l_rc = read(l_fd, l_buf, l_cert_hdr.cert_raw_size)) ) {
-            log_it(L_ERROR, "Error read certificate's body (%d != %d), errno=%d", l_cert_hdr.cert_raw_size, l_rc, errno);
+        if ( (int)l_cert_hdr.cert_raw_size != (l_rc = read(l_fh, l_buf, l_cert_hdr.cert_raw_size)) ) {
+            l_err = errno;
 #endif
+            log_it(L_ERROR, "Error read certificate's body (%d != %zd), error %"DAP_FORMAT_ERRNUM,
+                   l_cert_hdr.cert_raw_size, (ssize_t)l_rc, l_err);
             break;
         }
 
@@ -949,11 +888,7 @@ uint32_t    l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT;
 
 
     /* Cleanup and exit ... */
-#ifdef DAP_OS_WINDOWS
-    CloseHandle(l_fh);
-#else
-    close (l_fd);
-#endif
+    dap_fileclose(l_fh);
 
     if ( l_enc_key )
     {
-- 
GitLab