Feature #14177 ยป file_stat_dev.patch
| include/ruby/win32.h (working copy) | ||
|---|---|---|
|
#define CLOCK_REALTIME 0
|
||
|
#define CLOCK_MONOTONIC 1
|
||
|
#undef rb_dev_t
|
||
|
#undef DEVT2NUM
|
||
|
#undef NUM2DEVT
|
||
|
#undef PRI_DEVT_PREFIX
|
||
|
typedef unsigned __int64 rb_dev_t;
|
||
|
#define DEVT2NUM(v) ULL2NUM(v)
|
||
|
#define NUM2DEVT(v) NUM2ULL(v)
|
||
|
#define PRI_DEVT_PREFIX PRI_LL_PREFIX
|
||
|
#undef utime
|
||
|
#undef lseek
|
||
|
#undef stat
|
||
| ... | ... | |
|
#define unlink(p) rb_w32_unlink(p)
|
||
|
#endif /* RUBY_EXPORT */
|
||
|
/* same with stati64 except the size of st_ino and nanosecond timestamps */
|
||
|
/* same with stati64 except the size of st_ino, st_dev, st_rdev and nanosecond timestamps */
|
||
|
struct stati128 {
|
||
|
_dev_t st_dev;
|
||
|
rb_dev_t st_dev;
|
||
|
unsigned __int64 st_ino;
|
||
|
__int64 st_inohigh;
|
||
|
unsigned short st_mode;
|
||
| ... | ... | |
|
short st_nlink;
|
||
|
short st_uid;
|
||
|
short st_gid;
|
||
|
_dev_t st_rdev;
|
||
|
rb_dev_t st_rdev;
|
||
|
__int64 st_size;
|
||
|
__time64_t st_atime;
|
||
|
long st_atimensec;
|
||
| win32/win32.c (working copy) | ||
|---|---|---|
|
st->st_nlink = info.nNumberOfLinks;
|
||
|
attr = info.dwFileAttributes;
|
||
|
if (!get_ino(h, &fii)) {
|
||
|
st->st_dev = st->st_rdev = fii.VolumeSerialNumber;
|
||
|
st->st_ino = *((unsigned __int64 *)&fii.FileId);
|
||
|
st->st_inohigh = *((__int64 *)&fii.FileId + 1);
|
||
|
}
|
||
|
else {
|
||
|
st->st_dev = st->st_rdev = info.dwVolumeSerialNumber;
|
||
|
st->st_ino = ((__int64)info.nFileIndexHigh << 32) | info.nFileIndexLow;
|
||
|
st->st_inohigh = 0;
|
||
|
}
|
||
| ... | ... | |
|
towupper(path[0]) - L'A' : _getdrive() - 1;
|
||
|
}
|
||
|
static const WCHAR namespace_prefix[] = {L'\\', L'\\', L'?', L'\\'};
|
||
|
/* License: Ruby's */
|
||
|
static int
|
||
|
winnt_stat(const WCHAR *path, struct stati128 *st, BOOL lstat)
|
||
| ... | ... | |
|
{
|
||
|
DWORD flags = lstat ? FILE_FLAG_OPEN_REPARSE_POINT : 0;
|
||
|
HANDLE f;
|
||
|
WCHAR finalname[PATH_MAX];
|
||
|
memset(st, 0, sizeof(*st));
|
||
|
f = open_special(path, 0, flags);
|
||
|
if (f != INVALID_HANDLE_VALUE) {
|
||
|
DWORD attr = stati128_handle(f, st);
|
||
|
const DWORD len = get_final_path(f, finalname, numberof(finalname), 0);
|
||
|
CloseHandle(f);
|
||
|
if (attr & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||
|
/* TODO: size in which encoding? */
|
||
| ... | ... | |
|
if (check_valid_dir(path)) return -1;
|
||
|
}
|
||
|
st->st_mode = fileattr_to_unixmode(attr, path);
|
||
|
if (len) {
|
||
|
finalname[min(len, numberof(finalname)-1)] = L'\0';
|
||
|
path = finalname;
|
||
|
if (wcsncmp(path, namespace_prefix, numberof(namespace_prefix)) == 0)
|
||
|
path += numberof(namespace_prefix);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if (stat_by_find(path, st)) return -1;
|
||
|
st->st_dev = st->st_rdev = path_drive(path);
|
||
|
}
|
||
|
st->st_dev = st->st_rdev = path_drive(path);
|
||
|
return 0;
|
||
|
}
|
||