FreeRDP
Loading...
Searching...
No Matches
TestFileWriteFile.c
1
2#include <stdio.h>
3#include <winpr/crt.h>
4#include <winpr/file.h>
5#include <winpr/windows.h>
6
7static const char* get_dir(char* filename, size_t len)
8{
9#if defined(WIN32)
10 if ((len == 0) || (strnlen_s(filename, len) == len))
11 return NULL;
12 char* ptr = strrchr(filename, '\\');
13#else
14 if ((len == 0) || (strnlen(filename, len) == len))
15 return NULL;
16 char* ptr = strrchr(filename, '/');
17#endif
18 if (!ptr)
19 return NULL;
20 *ptr = '\0';
21 return filename;
22}
23
24static BOOL get_tmp(char* path, size_t len)
25{
26#if defined(WIN32)
27 const char template[] = "tmpdir.XXXXXX";
28 strncmp(path, template, strnlen_s(template, len) + 1);
29 if (!mktemp_s(path))
30 return FALSE;
31 return winpr_str_append("testfile", path, len, "\\");
32#else
33 const char template[] = "/tmp/tmpdir.XXXXXX";
34 if (!strncpy(path, template, strnlen(template, len) + 1))
35 return FALSE;
36 if (!mkdtemp(path))
37 return FALSE;
38 return winpr_str_append("testfile", path, len, "/");
39#endif
40}
41
42static BOOL test_write(const char* filename, const char* data, size_t datalen)
43{
44 BOOL rc = FALSE;
45
46 WINPR_ASSERT(filename);
47 WINPR_ASSERT(data);
48 WINPR_ASSERT(datalen > 0);
49
50 HANDLE hdl =
51 CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
52 if (!hdl || (hdl == INVALID_HANDLE_VALUE))
53 goto fail;
54
55 DWORD written = 0;
56 if (!WriteFile(hdl, data, datalen, &written, NULL))
57 goto fail;
58 if (written != datalen)
59 goto fail;
60
61 if (!FlushFileBuffers(hdl))
62 goto fail;
63
64 rc = TRUE;
65fail:
66 CloseHandle(hdl);
67 return rc;
68}
69
70static BOOL test_read(const char* filename, const char* data, size_t datalen)
71{
72 BOOL rc = FALSE;
73
74 WINPR_ASSERT(filename);
75 WINPR_ASSERT(data);
76 WINPR_ASSERT(datalen > 0);
77
78 char* cmp = calloc(datalen + 1, sizeof(char));
79 HANDLE hdl =
80 CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
81 if (!hdl || (hdl == INVALID_HANDLE_VALUE) || !cmp)
82 goto fail;
83
84 DWORD read = 0;
85 if (!ReadFile(hdl, cmp, datalen, &read, NULL))
86 goto fail;
87 if (read != datalen)
88 goto fail;
89 if (memcmp(data, cmp, datalen) != 0)
90 goto fail;
91 if (FlushFileBuffers(hdl))
92 goto fail;
93
94 rc = TRUE;
95fail:
96 free(cmp);
97 CloseHandle(hdl);
98 return rc;
99}
100
101int TestFileWriteFile(int argc, char* argv[])
102{
103 const char data[] = "sometesttext\nanother line\r\ngogogo\r\tfoo\t\r\n\r";
104 char filename[MAX_PATH] = { 0 };
105
106 int rc = -1;
107 if (!get_tmp(filename, sizeof(filename)))
108 goto fail;
109
110 if (!test_write(filename, data, sizeof(data)))
111 goto fail;
112
113 if (!test_read(filename, data, sizeof(data)))
114 goto fail;
115
116 rc = 0;
117fail:
118 if (!DeleteFile(filename))
119 rc = -2;
120
121 const char* d = get_dir(filename, sizeof(filename));
122 if (d)
123 {
124 if (!RemoveDirectory(d))
125 rc = -3;
126 }
127 return rc;
128}