1 | Index: zip.c
|
---|
2 | ===================================================================
|
---|
3 | --- zip.c (revision 658)
|
---|
4 | +++ zip.c (working copy)
|
---|
5 | @@ -1968,7 +1968,7 @@
|
---|
6 | {"8", "compress-8", o_NO_VALUE, o_NOT_NEGATABLE, '8', "compress 8"},
|
---|
7 | {"9", "compress-9", o_NO_VALUE, o_NOT_NEGATABLE, '9', "compress 9"},
|
---|
8 | {"A", "adjust-sfx", o_NO_VALUE, o_NOT_NEGATABLE, 'A', "adjust self extractor offsets"},
|
---|
9 | -#if defined(WIN32)
|
---|
10 | +#if defined(WIN32) || defined(OS2)
|
---|
11 | {"AC", "archive-clear", o_NO_VALUE, o_NOT_NEGATABLE, o_AC, "clear DOS archive bit of included files"},
|
---|
12 | {"AS", "archive-set", o_NO_VALUE, o_NOT_NEGATABLE, o_AS, "include only files with archive bit set"},
|
---|
13 | #endif
|
---|
14 | @@ -2339,7 +2339,7 @@
|
---|
15 | hidden_files = 0; /* process hidden and system files */
|
---|
16 | volume_label = 0; /* add volume label */
|
---|
17 | dirnames = 1; /* include directory entries by default */
|
---|
18 | -#if defined(WIN32)
|
---|
19 | +#if defined(WIN32) || defined(OS2)
|
---|
20 | only_archive_set = 0; /* only include if DOS archive bit set */
|
---|
21 | clear_archive_bits = 0; /* clear DOS archive bit of included files */
|
---|
22 | #endif
|
---|
23 | @@ -2667,7 +2667,7 @@
|
---|
24 | level = (int)option - '0'; break;
|
---|
25 | case 'A': /* Adjust unzipsfx'd zipfile: adjust offsets only */
|
---|
26 | adjust = 1; break;
|
---|
27 | -#if defined(WIN32)
|
---|
28 | +#if defined(WIN32) || defined(OS2)
|
---|
29 | case o_AC:
|
---|
30 | clear_archive_bits = 1; break;
|
---|
31 | case o_AS:
|
---|
32 | @@ -5984,6 +5984,19 @@
|
---|
33 | # endif
|
---|
34 | }
|
---|
35 | }
|
---|
36 | +
|
---|
37 | +#elif defined(OS2)
|
---|
38 | + /* All looks good so, if requested, clear the DOS archive bits */
|
---|
39 | + if (clear_archive_bits) {
|
---|
40 | + if (noisy)
|
---|
41 | + zipmessage("Clearing archive bits...", "");
|
---|
42 | + for (z = zfiles; z != NULL; z = z->nxt)
|
---|
43 | + {
|
---|
44 | + if (!ClearArchiveBit(z->name)){
|
---|
45 | + zipwarn("Could not clear archive bit for: ", z->oname);
|
---|
46 | + }
|
---|
47 | + }
|
---|
48 | + }
|
---|
49 | #endif
|
---|
50 |
|
---|
51 | /* finish logfile (it gets closed in freeup() called by finish()) */
|
---|
52 | Index: zip.h
|
---|
53 | ===================================================================
|
---|
54 | --- zip.h (revision 658)
|
---|
55 | +++ zip.h (working copy)
|
---|
56 | @@ -431,7 +431,7 @@
|
---|
57 | extern int dirnames; /* include directory names */
|
---|
58 | extern int filter_match_case; /* 1=match case when filter() */
|
---|
59 | extern int diff_mode; /* 1=require --out and only store changed and add */
|
---|
60 | -#if defined(WIN32)
|
---|
61 | +#if defined(WIN32) || defined(OS2)
|
---|
62 | extern int only_archive_set; /* only include if DOS archive bit set */
|
---|
63 | extern int clear_archive_bits; /* clear DOS archive bit of included files */
|
---|
64 | #endif
|
---|
65 | @@ -863,6 +863,13 @@
|
---|
66 | */
|
---|
67 |
|
---|
68 | /*---------------------------------------------------------------------------
|
---|
69 | + OS2-only functions:
|
---|
70 | + ---------------------------------------------------------------------------*/
|
---|
71 | +#ifdef OS2
|
---|
72 | + int ClearArchiveBit OF((char *)); /* os2zip.c */
|
---|
73 | +#endif
|
---|
74 | +
|
---|
75 | +/*---------------------------------------------------------------------------
|
---|
76 | WIN32-only functions:
|
---|
77 | ---------------------------------------------------------------------------*/
|
---|
78 | #ifdef WIN32
|
---|
79 | Index: os2/os2.c
|
---|
80 | ===================================================================
|
---|
81 | --- os2/os2.c (revision 658)
|
---|
82 | +++ os2/os2.c (working copy)
|
---|
83 | @@ -19,6 +19,17 @@
|
---|
84 | #include <dirent.h>
|
---|
85 | #endif
|
---|
86 |
|
---|
87 | +// ALT
|
---|
88 | +#ifndef FILE_HIDDEN
|
---|
89 | + #define FILE_HIDDEN 0x0002
|
---|
90 | +#endif
|
---|
91 | +#ifndef FILE_SYSTEM
|
---|
92 | + #define FILE_SYSTEM 0x0004
|
---|
93 | +#endif
|
---|
94 | +#ifndef FILE_ARCHIVED
|
---|
95 | + #define FILE_ARCHIVED 0x0020
|
---|
96 | +#endif
|
---|
97 | +
|
---|
98 | /* Extra malloc() space in names for cutpath() */
|
---|
99 | #define PAD 0
|
---|
100 | #define PATH_END '/'
|
---|
101 | @@ -60,7 +71,7 @@
|
---|
102 | int amatch = 0, e = ZE_MISS;
|
---|
103 |
|
---|
104 | if (!isshexp(wildtail)) {
|
---|
105 | -#ifdef LARGE_FILE_SUPPORT
|
---|
106 | +#ifdef LARGE_FILE_SUPPORT
|
---|
107 | z_stat s; /* dummy buffer for stat() */
|
---|
108 | #else
|
---|
109 | struct stat s; /* dummy buffer for stat() */
|
---|
110 | @@ -341,7 +352,7 @@
|
---|
111 | char *e; /* pointer to name from readd() */
|
---|
112 | int m; /* matched flag */
|
---|
113 | char *p; /* path for recursion */
|
---|
114 | -#ifdef LARGE_FILE_SUPPORT
|
---|
115 | +#ifdef LARGE_FILE_SUPPORT
|
---|
116 | z_stat s; /* result of stat() */
|
---|
117 | #else
|
---|
118 | struct stat s; /* result of stat() */
|
---|
119 | @@ -383,9 +394,17 @@
|
---|
120 | *p = '/';
|
---|
121 | if ((s.st_mode & S_IFDIR) == 0)
|
---|
122 | {
|
---|
123 | - /* add or remove name of file */
|
---|
124 | - if ((m = newname(n, 0, caseflag)) != ZE_OK)
|
---|
125 | - return m;
|
---|
126 | + /* add exclusions in directory recurse but ignored for single file */
|
---|
127 | + int dwAttr = GetFileMode(n);
|
---|
128 | +
|
---|
129 | + if ((hidden_files ||
|
---|
130 | + !(dwAttr & FILE_HIDDEN || dwAttr & FILE_SYSTEM)) &&
|
---|
131 | + (!only_archive_set || (dwAttr & FILE_ARCHIVED)))
|
---|
132 | + {
|
---|
133 | + /* add or remove name of file */
|
---|
134 | + if ((m = newname(n, 0, caseflag)) != ZE_OK)
|
---|
135 | + return m;
|
---|
136 | + }
|
---|
137 | } else {
|
---|
138 | /* Add trailing / to the directory name */
|
---|
139 | if ((p = malloc(strlen(n)+2)) == NULL)
|
---|
140 | Index: os2/os2zip.c
|
---|
141 | ===================================================================
|
---|
142 | --- os2/os2zip.c (revision 658)
|
---|
143 | +++ os2/os2zip.c (working copy)
|
---|
144 | @@ -70,7 +70,7 @@
|
---|
145 |
|
---|
146 | #ifndef UTIL
|
---|
147 |
|
---|
148 | -#ifndef __KLIBC__
|
---|
149 | +#ifndef __KLIBC__
|
---|
150 | extern int noisy;
|
---|
151 |
|
---|
152 | #ifndef S_IFMT
|
---|
153 | @@ -1231,4 +1231,28 @@
|
---|
154 |
|
---|
155 | } /* end function version_local() */
|
---|
156 |
|
---|
157 | +int ClearArchiveBit(char *path)
|
---|
158 | +{
|
---|
159 | + FILESTATUS3L fsts3l;
|
---|
160 | + APIRET rc;
|
---|
161 | + ULONG cbBuf = sizeof(FILESTATUS3L);
|
---|
162 | + USHORT nLength;
|
---|
163 | + char name[CCHMAXPATH];
|
---|
164 | +
|
---|
165 | + strcpy(name, path);
|
---|
166 | + nLength = strlen(name);
|
---|
167 | + if (name[nLength - 1] == '/')
|
---|
168 | + name[nLength - 1] = 0;
|
---|
169 | +
|
---|
170 | + rc = DosQueryPathInfo(name, FIL_STANDARDL, &fsts3l, cbBuf);
|
---|
171 | + if (rc != NO_ERROR)
|
---|
172 | + return (0);
|
---|
173 | +
|
---|
174 | + if (!(fsts3l.attrFile & FILE_ARCHIVED))
|
---|
175 | + return (1);
|
---|
176 | + fsts3l.attrFile &= ~FILE_ARCHIVED;
|
---|
177 | + rc = DosSetPathInfo(name, FIL_STANDARDL, &fsts3l, cbBuf, 0);
|
---|
178 | + return ((rc == NO_ERROR)? 1 : 0);
|
---|
179 | +}
|
---|
180 | +
|
---|
181 | #endif /* OS2 */
|
---|
182 | Index: os2/os2zip.h
|
---|
183 | ===================================================================
|
---|
184 | --- os2/os2zip.h (revision 658)
|
---|
185 | +++ os2/os2zip.h (working copy)
|
---|
186 | @@ -78,6 +78,8 @@
|
---|
187 | int IsFileSystemFAT(char *dir);
|
---|
188 | void ChangeNameForFAT(char *name);
|
---|
189 |
|
---|
190 | +int ClearArchiveBit(char *path);
|
---|
191 | +
|
---|
192 | char *GetLongNameEA(const char *name);
|
---|
193 | char *GetLongPathEA(const char *name);
|
---|
194 | void GetEAs(char *name, char **bufptr, size_t *size,
|
---|
195 | Index: globals.c
|
---|
196 | ===================================================================
|
---|
197 | --- globals.c (revision 658)
|
---|
198 | +++ globals.c (working copy)
|
---|
199 | @@ -98,7 +98,7 @@
|
---|
200 | int dirnames = 1; /* include directory entries by default */
|
---|
201 | int filter_match_case = 1; /* 1=match case when filter() */
|
---|
202 | int diff_mode = 0; /* 1=require --out and only store changed and add */
|
---|
203 | -#if defined(WIN32)
|
---|
204 | +#if defined(WIN32) || defined(OS2)
|
---|
205 | int only_archive_set = 0; /* include only files with DOS archive bit set */
|
---|
206 | int clear_archive_bits = 0; /* clear DOS archive bit of included files */
|
---|
207 | #endif
|
---|