Skip to content

Commit af6199c

Browse files
committed
Merge branch 'ps/reftable-sans-compat-util' into jch
Make the code in reftable library less reliant on the service routines it used to borrow from Git proper, to make it easier to use by external users of the library. * ps/reftable-sans-compat-util: Makefile: skip reftable library for Coccinelle reftable: decouple from Git codebase by pulling in "compat/posix.h" git-compat-util.h: split out POSIX-emulating bits compat/mingw: split out POSIX-related bits reftable/basics: stop using `UNUSED` annotation reftable/basics: stop using `SWAP()` macro reftable/stack: stop using `sleep_millisec()` reftable/system: introduce `reftable_rand()` reftable/reader: stop using `ARRAY_SIZE()` macro reftable/basics: provide wrappers for big endian conversion reftable/basics: stop using `st_mult()` in array allocators reftable: stop using `BUG()` in trivial cases reftable/record: don't `BUG()` in `reftable_record_cmp()` reftable/record: stop using `BUG()` in `reftable_record_init()` reftable/record: stop using `COPY_ARRAY()` reftable/blocksource: stop using `xmmap()` reftable/stack: stop using `write_in_full()` reftable/stack: stop using `read_in_full()`
2 parents c9e5cf4 + b6ccb37 commit af6199c

31 files changed

+1242
-949
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,7 @@ FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))
955955
FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
956956
FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
957957

958-
COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES),$(FOUND_C_SOURCES))
958+
COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES) reftable/%,$(FOUND_C_SOURCES))
959959

960960
LIB_H = $(FOUND_H_SOURCES)
961961

compat/mingw.c renamed to compat/mingw/compat-util.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
#define USE_THE_REPOSITORY_VARIABLE
22
#define DISABLE_SIGN_COMPARE_WARNINGS
33

4-
#include "../git-compat-util.h"
5-
#include "win32.h"
4+
#include "../../git-compat-util.h"
5+
#include "../win32.h"
66
#include <aclapi.h>
77
#include <sddl.h>
88
#include <conio.h>
99
#include <wchar.h>
10-
#include "../strbuf.h"
11-
#include "../run-command.h"
12-
#include "../abspath.h"
13-
#include "../alloc.h"
14-
#include "win32/lazyload.h"
15-
#include "../config.h"
16-
#include "../environment.h"
17-
#include "../trace2.h"
18-
#include "../symlinks.h"
19-
#include "../wrapper.h"
20-
#include "dir.h"
21-
#include "gettext.h"
10+
#include "../../strbuf.h"
11+
#include "../../run-command.h"
12+
#include "../../abspath.h"
13+
#include "../../alloc.h"
14+
#include "../win32/lazyload.h"
15+
#include "../../config.h"
16+
#include "../../environment.h"
17+
#include "../../trace2.h"
18+
#include "../../symlinks.h"
19+
#include "../../wrapper.h"
20+
#include "../../dir.h"
21+
#include "../../gettext.h"
2222
#define SECURITY_WIN32
2323
#include <sspi.h>
2424

compat/mingw/compat-util.h

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
#ifndef COMPAT_MINGW_COMPAT_UTIL_H
2+
#define COMPAT_MINGW_COMPAT_UTIL_H
3+
4+
#include "posix.h"
5+
6+
struct config_context;
7+
int mingw_core_config(const char *var, const char *value,
8+
const struct config_context *ctx, void *cb);
9+
#define platform_core_config mingw_core_config
10+
11+
#ifndef NO_OPENSSL
12+
#include <openssl/ssl.h>
13+
static inline int mingw_SSL_set_fd(SSL *ssl, int fd)
14+
{
15+
return SSL_set_fd(ssl, _get_osfhandle(fd));
16+
}
17+
#define SSL_set_fd mingw_SSL_set_fd
18+
19+
static inline int mingw_SSL_set_rfd(SSL *ssl, int fd)
20+
{
21+
return SSL_set_rfd(ssl, _get_osfhandle(fd));
22+
}
23+
#define SSL_set_rfd mingw_SSL_set_rfd
24+
25+
static inline int mingw_SSL_set_wfd(SSL *ssl, int fd)
26+
{
27+
return SSL_set_wfd(ssl, _get_osfhandle(fd));
28+
}
29+
#define SSL_set_wfd mingw_SSL_set_wfd
30+
#endif
31+
32+
/*
33+
* git specific compatibility
34+
*/
35+
36+
static inline void convert_slashes(char *path)
37+
{
38+
for (; *path; path++)
39+
if (*path == '\\')
40+
*path = '/';
41+
}
42+
#define PATH_SEP ';'
43+
char *mingw_query_user_email(void);
44+
#define query_user_email mingw_query_user_email
45+
46+
/**
47+
* Verifies that the specified path is owned by the user running the
48+
* current process.
49+
*/
50+
int is_path_owned_by_current_sid(const char *path, struct strbuf *report);
51+
#define is_path_owned_by_current_user is_path_owned_by_current_sid
52+
53+
/**
54+
* Verifies that the given path is a valid one on Windows.
55+
*
56+
* In particular, path segments are disallowed which
57+
*
58+
* - end in a period or a space (except the special directories `.` and `..`).
59+
*
60+
* - contain any of the reserved characters, e.g. `:`, `;`, `*`, etc
61+
*
62+
* - correspond to reserved names (such as `AUX`, `PRN`, etc)
63+
*
64+
* The `allow_literal_nul` parameter controls whether the path `NUL` should
65+
* be considered valid (this makes sense e.g. before opening files, as it is
66+
* perfectly legitimate to open `NUL` on Windows, just as it is to open
67+
* `/dev/null` on Unix/Linux).
68+
*
69+
* Returns 1 upon success, otherwise 0.
70+
*/
71+
int is_valid_win32_path(const char *path, int allow_literal_nul);
72+
#define is_valid_path(path) is_valid_win32_path(path, 0)
73+
74+
/**
75+
* Converts UTF-8 encoded string to UTF-16LE.
76+
*
77+
* To support repositories with legacy-encoded file names, invalid UTF-8 bytes
78+
* 0xa0 - 0xff are converted to corresponding printable Unicode chars \u00a0 -
79+
* \u00ff, and invalid UTF-8 bytes 0x80 - 0x9f (which would make non-printable
80+
* Unicode) are converted to hex-code.
81+
*
82+
* Lead-bytes not followed by an appropriate number of trail-bytes, over-long
83+
* encodings and 4-byte encodings > \u10ffff are detected as invalid UTF-8.
84+
*
85+
* Maximum space requirement for the target buffer is two wide chars per UTF-8
86+
* char (((strlen(utf) * 2) + 1) [* sizeof(wchar_t)]).
87+
*
88+
* The maximum space is needed only if the entire input string consists of
89+
* invalid UTF-8 bytes in range 0x80-0x9f, as per the following table:
90+
*
91+
* | | UTF-8 | UTF-16 |
92+
* Code point | UTF-8 sequence | bytes | words | ratio
93+
* --------------+-------------------+-------+--------+-------
94+
* 000000-00007f | 0-7f | 1 | 1 | 1
95+
* 000080-0007ff | c2-df + 80-bf | 2 | 1 | 0.5
96+
* 000800-00ffff | e0-ef + 2 * 80-bf | 3 | 1 | 0.33
97+
* 010000-10ffff | f0-f4 + 3 * 80-bf | 4 | 2 (a) | 0.5
98+
* invalid | 80-9f | 1 | 2 (b) | 2
99+
* invalid | a0-ff | 1 | 1 | 1
100+
*
101+
* (a) encoded as UTF-16 surrogate pair
102+
* (b) encoded as two hex digits
103+
*
104+
* Note that, while the UTF-8 encoding scheme can be extended to 5-byte, 6-byte
105+
* or even indefinite-byte sequences, the largest valid code point \u10ffff
106+
* encodes as only 4 UTF-8 bytes.
107+
*
108+
* Parameters:
109+
* wcs: wide char target buffer
110+
* utf: string to convert
111+
* wcslen: size of target buffer (in wchar_t's)
112+
* utflen: size of string to convert, or -1 if 0-terminated
113+
*
114+
* Returns:
115+
* length of converted string (_wcslen(wcs)), or -1 on failure
116+
*
117+
* Errors:
118+
* EINVAL: one of the input parameters is invalid (e.g. NULL)
119+
* ERANGE: the output buffer is too small
120+
*/
121+
int xutftowcsn(wchar_t *wcs, const char *utf, size_t wcslen, int utflen);
122+
123+
/**
124+
* Simplified variant of xutftowcsn, assumes input string is \0-terminated.
125+
*/
126+
static inline int xutftowcs(wchar_t *wcs, const char *utf, size_t wcslen)
127+
{
128+
return xutftowcsn(wcs, utf, wcslen, -1);
129+
}
130+
131+
/**
132+
* Simplified file system specific variant of xutftowcsn, assumes output
133+
* buffer size is MAX_PATH wide chars and input string is \0-terminated,
134+
* fails with ENAMETOOLONG if input string is too long.
135+
*/
136+
static inline int xutftowcs_path(wchar_t *wcs, const char *utf)
137+
{
138+
int result = xutftowcsn(wcs, utf, MAX_PATH, -1);
139+
if (result < 0 && errno == ERANGE)
140+
errno = ENAMETOOLONG;
141+
return result;
142+
}
143+
144+
/**
145+
* Converts UTF-16LE encoded string to UTF-8.
146+
*
147+
* Maximum space requirement for the target buffer is three UTF-8 chars per
148+
* wide char ((_wcslen(wcs) * 3) + 1).
149+
*
150+
* The maximum space is needed only if the entire input string consists of
151+
* UTF-16 words in range 0x0800-0xd7ff or 0xe000-0xffff (i.e. \u0800-\uffff
152+
* modulo surrogate pairs), as per the following table:
153+
*
154+
* | | UTF-16 | UTF-8 |
155+
* Code point | UTF-16 sequence | words | bytes | ratio
156+
* --------------+-----------------------+--------+-------+-------
157+
* 000000-00007f | 0000-007f | 1 | 1 | 1
158+
* 000080-0007ff | 0080-07ff | 1 | 2 | 2
159+
* 000800-00ffff | 0800-d7ff / e000-ffff | 1 | 3 | 3
160+
* 010000-10ffff | d800-dbff + dc00-dfff | 2 | 4 | 2
161+
*
162+
* Note that invalid code points > 10ffff cannot be represented in UTF-16.
163+
*
164+
* Parameters:
165+
* utf: target buffer
166+
* wcs: wide string to convert
167+
* utflen: size of target buffer
168+
*
169+
* Returns:
170+
* length of converted string, or -1 on failure
171+
*
172+
* Errors:
173+
* EINVAL: one of the input parameters is invalid (e.g. NULL)
174+
* ERANGE: the output buffer is too small
175+
*/
176+
int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen);
177+
178+
/*
179+
* A critical section used in the implementation of the spawn
180+
* functions (mingw_spawnv[p]e()) and waitpid(). Initialised in
181+
* the replacement main() macro below.
182+
*/
183+
extern CRITICAL_SECTION pinfo_cs;
184+
185+
/*
186+
* Git, like most portable C applications, implements a main() function. On
187+
* Windows, this main() function would receive parameters encoded in the
188+
* current locale, but Git for Windows would prefer UTF-8 encoded parameters.
189+
*
190+
* To make that happen, we still declare main() here, and then declare and
191+
* implement wmain() (which is the Unicode variant of main()) and compile with
192+
* -municode. This wmain() function reencodes the parameters from UTF-16 to
193+
* UTF-8 format, sets up a couple of other things as required on Windows, and
194+
* then hands off to the main() function.
195+
*/
196+
int wmain(int argc, const wchar_t **w_argv);
197+
int main(int argc, const char **argv);
198+
199+
/*
200+
* For debugging: if a problem occurs, say, in a Git process that is spawned
201+
* from another Git process which in turn is spawned from yet another Git
202+
* process, it can be quite daunting to figure out what is going on.
203+
*
204+
* Call this function to open a new MinTTY (this assumes you are in Git for
205+
* Windows' SDK) with a GDB that attaches to the current process right away.
206+
*/
207+
void open_in_gdb(void);
208+
209+
/*
210+
* Used by Pthread API implementation for Windows
211+
*/
212+
int err_win_to_posix(DWORD winerr);
213+
214+
#ifndef NO_UNIX_SOCKETS
215+
int mingw_have_unix_sockets(void);
216+
#undef have_unix_sockets
217+
#define have_unix_sockets mingw_have_unix_sockets
218+
#endif
219+
220+
#endif /* COMPAT_MINGW_COMPAT_UTIL_H */

0 commit comments

Comments
 (0)