diff options
| author | Karsten Blees <karsten.blees@gmail.com> | 2026-01-09 20:05:11 +0000 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-01-09 18:32:55 -0800 |
| commit | 593008b95dfd4898f182d664d6b162c7590b4028 (patch) | |
| tree | 5eadcec85b07e3b7711de7d218bc8418d9924e47 /compat/mingw.c | |
| parent | 980852dbff657a14eecc4a8a72a2874dad2bad71 (diff) | |
| download | git-593008b95dfd4898f182d664d6b162c7590b4028.tar.xz | |
mingw: implement basic `symlink()` functionality (file symlinks only)
Implement `symlink()`. This implementation always creates _file_
symlinks (remember: Windows discerns between symlinks pointing to
directories and those pointing to files). Support for directory symlinks
will be added in a subseqeuent commit.
This implementation fails with `ENOSYS` if symlinks are disabled or
unsupported.
Signed-off-by: Karsten Blees <karsten.blees@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat/mingw.c')
| -rw-r--r-- | compat/mingw.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index b407a2ac07..8d366794c4 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -2698,6 +2698,34 @@ int link(const char *oldpath, const char *newpath) return 0; } +int symlink(const char *target, const char *link) +{ + wchar_t wtarget[MAX_PATH], wlink[MAX_PATH]; + int len; + + /* fail if symlinks are disabled or API is not supported (WinXP) */ + if (!has_symlinks) { + errno = ENOSYS; + return -1; + } + + if ((len = xutftowcs_path(wtarget, target)) < 0 + || xutftowcs_path(wlink, link) < 0) + return -1; + + /* convert target dir separators to backslashes */ + while (len--) + if (wtarget[len] == '/') + wtarget[len] = '\\'; + + /* create file symlink */ + if (!CreateSymbolicLinkW(wlink, wtarget, 0)) { + errno = err_win_to_posix(GetLastError()); + return -1; + } + return 0; +} + int readlink(const char *path, char *buf, size_t bufsiz) { WCHAR wpath[MAX_PATH]; |
