1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5/*=====================================================================
6**
7** Source: test4.c
8**
9** Purpose: Tests the PAL implementation of the CopyFileA function
10** to see if a file can through different users belonging to
11** different groups.
12**
13
14=====================================================================*/
15
16/* USECASE
17 Copy a file from a different user, belonging to a different group to
18 the the current user, who is a member of the current group. Then check
19 to see that the current user has the basic access rights to the copied
20 file.
21
22 Thie original file used is the passwd file in the etc directory of a
23 BSD machine. This file should exist on all machines.
24*/
25
26#include <palsuite.h>
27
28int __cdecl main(int argc, char *argv[])
29{
30
31#if WIN32
32 return PASS;
33
34#else
35
36 BOOL bRc = TRUE;
37 char* szSrcExisting = "/etc/passwd";
38 char* szDest = "temp.tmp";
39 char* szStringTest = "Marry had a little lamb";
40 char szStringRead[30]; /* large enough for string szStringTest */
41
42 HANDLE hFile = NULL;
43 DWORD dwBytesWritten=0;
44 DWORD dwBytesRead=0;
45
46 if (0 != PAL_Initialize(argc,argv))
47 {
48 return FAIL;
49 }
50
51 /* copy the file */
52 bRc = CopyFileA(szSrcExisting,szDest,TRUE);
53 if(!bRc)
54 {
55 Fail("CopyFileA: Cannot copy a file with error, %u",GetLastError());
56 }
57
58 /* try to get file attributes of destination file */
59 if (GetFileAttributesA(szDest) == -1)
60 {
61 Fail("CopyFileA: GetFileAttributes of destination file "
62 "failed with error code %u. \n",
63 GetLastError());
64 }
65
66 /* set the attributes of the destination file to normal again */
67 bRc = SetFileAttributes(szDest, FILE_ATTRIBUTE_NORMAL);
68 if(!bRc)
69 {
70 Fail("CopyFileA: ERROR-> Couldn't set file attributes for "
71 "file %s with error %u\n", szDest, GetLastError());
72 }
73
74 /* open the file for write purposes */
75 hFile = CreateFile(szDest,
76 GENERIC_WRITE,
77 0,
78 NULL,
79 OPEN_EXISTING,
80 FILE_ATTRIBUTE_NORMAL,
81 NULL);
82
83 if(hFile == INVALID_HANDLE_VALUE)
84 {
85 Fail("CopyFileA: ERROR -> Unable to create file \"%s\".\n",
86 szDest);
87 }
88
89 /* Attempt to write to the file */
90 bRc = WriteFile(hFile, szStringTest, strlen(szStringTest), &dwBytesWritten, NULL);
91 if (!bRc)
92 {
93 Trace("CopyFileA: ERROR -> Unable to write to copied file with error "
94 "%u.\n", GetLastError());
95 bRc = CloseHandle(hFile);
96 if (!bRc)
97 {
98 Fail("CopyFileA: ERROR -> Unable to close file \"%s\" with "
99 "error %u.\n",szDest, GetLastError());
100 }
101 Fail("");
102
103 }
104
105 /* Close the file handle */
106 bRc = CloseHandle(hFile);
107 if (!bRc)
108 {
109 Fail("CopyFileA: ERROR -> Unable to close file \"%s\" with error %u "
110 ".\n",szDest,GetLastError());
111 }
112
113
114 /* open the file for read purposes */
115 hFile = CreateFile(szDest,
116 GENERIC_READ,
117 0,
118 NULL,
119 OPEN_EXISTING,
120 FILE_ATTRIBUTE_NORMAL,
121 NULL);
122
123 if(hFile == INVALID_HANDLE_VALUE)
124 {
125 Fail("CopyFileA: ERROR -> Unable to create file \"%s\".\n",
126 szDest);
127 }
128
129 /* Attempt to read from the file */
130 bRc = ReadFile(hFile, szStringRead, strlen(szStringTest), &dwBytesRead, NULL);
131 if (!bRc)
132 {
133 Trace("CopyFileA: ERROR -> Unable to read from copied file with "
134 "error %u.\n",GetLastError());
135 bRc = CloseHandle(hFile);
136 if (!bRc)
137 {
138 Fail("CopyFileA: ERROR -> Unable to close file \"%s\" with "
139 "error %u.\n",szDest, GetLastError());
140 }
141 Fail("");
142
143 }
144
145 if(strncmp(szStringTest,szStringRead, strlen(szStringTest)) != 0)
146 {
147 Trace("CopyFileA: ERROR -> The string which was written '%s' does not "
148 "match the string '%s' which was read from the copied file.\n",
149 szStringTest,szStringRead);
150 bRc = CloseHandle(hFile);
151 if (!bRc)
152 {
153 Fail("CopyFileA: ERROR -> Unable to close file \"%s\" with "
154 "error %u.\n",szDest, GetLastError());
155 }
156 Fail("");
157 }
158
159 /* Close the file handle */
160 bRc = CloseHandle(hFile);
161 if (!bRc)
162 {
163 Fail("CopyFileA: ERROR -> Unable to close file \"%s\" with error %u "
164 ".\n",szDest,GetLastError());
165 }
166
167 /* Remove the temporary file */
168 bRc = DeleteFile(szDest);
169 if(!bRc)
170 {
171 Fail("CopyFileA: Could not remove copied file with error %u\n",
172 GetLastError());
173 }
174
175 PAL_Terminate();
176 return PASS;
177
178#endif
179
180}
181