This source file includes following definitions.
- zip_source_win32a
- zip_source_win32a_create
- _win32_strdup_a
- _win32_open_a
- _win32_create_temp_a
- _win32_rename_temp_a
- _win32_remove_a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include <stdio.h>
36
37 #include "zipint.h"
38 #include "zipwin32.h"
39
40 static void * _win32_strdup_a(const void *str);
41 static HANDLE _win32_open_a(_zip_source_win32_read_file_t *ctx);
42 static HANDLE _win32_create_temp_a(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa);
43 static int _win32_rename_temp_a(_zip_source_win32_read_file_t *ctx);
44 static int _win32_remove_a(const void *fname);
45
46 static _zip_source_win32_file_ops_t win32_ops_a = {
47 _win32_strdup_a,
48 _win32_open_a,
49 _win32_create_temp_a,
50 _win32_rename_temp_a,
51 _win32_remove_a
52 };
53
54 ZIP_EXTERN zip_source_t *
55 zip_source_win32a(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t len)
56 {
57 if (za == NULL)
58 return NULL;
59
60 return zip_source_win32a_create(fname, start, len, &za->error);
61 }
62
63
64 ZIP_EXTERN zip_source_t *
65 zip_source_win32a_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
66 {
67 if (fname == NULL || length < -1) {
68 zip_error_set(error, ZIP_ER_INVAL, 0);
69 return NULL;
70 }
71
72 return _zip_source_win32_handle_or_name(fname, INVALID_HANDLE_VALUE, start, length, 1, NULL, &win32_ops_a, error);
73 }
74
75
76 static void *
77 _win32_strdup_a(const void *str)
78 {
79 return strdup((const char *)str);
80 }
81
82
83 static HANDLE
84 _win32_open_a(_zip_source_win32_read_file_t *ctx)
85 {
86 return CreateFileA(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
87 }
88
89
90 static HANDLE
91 _win32_create_temp_a(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa)
92 {
93 int len;
94
95 len = strlen((const char *)ctx->fname) + 10;
96 if (*temp == NULL) {
97 if ((*temp = malloc(sizeof(char) * len)) == NULL) {
98 zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
99 return INVALID_HANDLE_VALUE;
100 }
101 }
102 if (sprintf((char *)*temp, "%s.%08x", (const char *)ctx->fname, value) != len - 1) {
103 return INVALID_HANDLE_VALUE;
104 }
105
106 return CreateFileA((const char *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY, NULL);
107 }
108
109
110 static int
111 _win32_rename_temp_a(_zip_source_win32_read_file_t *ctx)
112 {
113 if (!MoveFileExA(ctx->tmpname, ctx->fname, MOVEFILE_REPLACE_EXISTING))
114 return -1;
115 return 0;
116 }
117
118
119 static int
120 _win32_remove_a(const void *fname)
121 {
122 DeleteFileA((const char *)fname);
123 return 0;
124 }