stat.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #define _POSIX_C_SOURCE 200112L
  2. #include <sys/stat.h> /* *stat, S_IS* */
  3. #include <sys/types.h> /* mode_t */
  4. static inline mode_t mode_native_to_git(mode_t native_mode)
  5. {
  6. mode_t perm_bits = native_mode & 07777;
  7. if (S_ISREG(native_mode))
  8. return 0100000 | perm_bits;
  9. if (S_ISDIR(native_mode))
  10. return 0040000 | perm_bits;
  11. if (S_ISLNK(native_mode))
  12. return 0120000 | perm_bits;
  13. if (S_ISBLK(native_mode))
  14. return 0060000 | perm_bits;
  15. if (S_ISCHR(native_mode))
  16. return 0020000 | perm_bits;
  17. if (S_ISFIFO(native_mode))
  18. return 0010000 | perm_bits;
  19. if (S_ISSOCK(native_mode))
  20. return 0140000 | perm_bits;
  21. /* Non-standard type bits were given. */
  22. return perm_bits;
  23. }
  24. int git_stat(const char *path, struct stat *buf)
  25. {
  26. int rc = stat(path, buf);
  27. if (rc == 0)
  28. buf->st_mode = mode_native_to_git(buf->st_mode);
  29. return rc;
  30. }
  31. int git_fstat(int fd, struct stat *buf)
  32. {
  33. int rc = fstat(fd, buf);
  34. if (rc == 0)
  35. buf->st_mode = mode_native_to_git(buf->st_mode);
  36. return rc;
  37. }
  38. int git_lstat(const char *path, struct stat *buf)
  39. {
  40. int rc = lstat(path, buf);
  41. if (rc == 0)
  42. buf->st_mode = mode_native_to_git(buf->st_mode);
  43. return rc;
  44. }