mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![David Michael](/assets/img/avatar_default.png)
This adds simple wrapper functions around calls to stat(), fstat(), and lstat() that translate the operating system's native file type bits to those used by most operating systems. It also rewrites the S_IF* macros to the common values, so all file type processing is performed using the translated modes. This makes projects portable across operating systems that use different file type definitions. Only the file type bits may be affected by these compatibility functions; the file permission bits are assumed to be 07777 and are passed through unchanged. Signed-off-by: David Michael <fedora.dm0@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
49 lines
1.1 KiB
C
49 lines
1.1 KiB
C
#define _POSIX_C_SOURCE 200112L
|
|
#include <sys/stat.h> /* *stat, S_IS* */
|
|
#include <sys/types.h> /* mode_t */
|
|
|
|
static inline mode_t mode_native_to_git(mode_t native_mode)
|
|
{
|
|
mode_t perm_bits = native_mode & 07777;
|
|
if (S_ISREG(native_mode))
|
|
return 0100000 | perm_bits;
|
|
if (S_ISDIR(native_mode))
|
|
return 0040000 | perm_bits;
|
|
if (S_ISLNK(native_mode))
|
|
return 0120000 | perm_bits;
|
|
if (S_ISBLK(native_mode))
|
|
return 0060000 | perm_bits;
|
|
if (S_ISCHR(native_mode))
|
|
return 0020000 | perm_bits;
|
|
if (S_ISFIFO(native_mode))
|
|
return 0010000 | perm_bits;
|
|
if (S_ISSOCK(native_mode))
|
|
return 0140000 | perm_bits;
|
|
/* Non-standard type bits were given. */
|
|
return perm_bits;
|
|
}
|
|
|
|
int git_stat(const char *path, struct stat *buf)
|
|
{
|
|
int rc = stat(path, buf);
|
|
if (rc == 0)
|
|
buf->st_mode = mode_native_to_git(buf->st_mode);
|
|
return rc;
|
|
}
|
|
|
|
int git_fstat(int fd, struct stat *buf)
|
|
{
|
|
int rc = fstat(fd, buf);
|
|
if (rc == 0)
|
|
buf->st_mode = mode_native_to_git(buf->st_mode);
|
|
return rc;
|
|
}
|
|
|
|
int git_lstat(const char *path, struct stat *buf)
|
|
{
|
|
int rc = lstat(path, buf);
|
|
if (rc == 0)
|
|
buf->st_mode = mode_native_to_git(buf->st_mode);
|
|
return rc;
|
|
}
|