+int
+fstat(int fd, struct stat *sb)
+{
+ BY_HANDLE_FILE_INFORMATION info;
+ char tmpbuf[1024];
+
+ if (!GetFileInformationByHandle((HANDLE)fd, &info)) {
+ const char *err = errorString();
+ Dmsg2(99, "GetfileInformationByHandle(%s): %s\n", tmpbuf, err);
+ LocalFree((void *)err);
+ errno = b_errno_win32;
+ return -1;
+ }
+
+ sb->st_dev = info.dwVolumeSerialNumber;
+ sb->st_ino = info.nFileIndexHigh;
+ sb->st_ino <<= 32;
+ sb->st_ino |= info.nFileIndexLow;
+ sb->st_nlink = (short)info.nNumberOfLinks;
+ if (sb->st_nlink > 1) {
+ Dmsg1(99, "st_nlink=%d\n", sb->st_nlink);
+ }
+
+ sb->st_mode = 0777; /* start with everything */
+ if (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+ sb->st_mode &= ~(S_IRUSR|S_IRGRP|S_IROTH);
+ if (info.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
+ sb->st_mode &= ~S_IRWXO; /* remove everything for other */
+ if (info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ sb->st_mode |= S_ISVTX; /* use sticky bit -> hidden */
+ sb->st_mode |= S_IFREG;
+
+ sb->st_size = info.nFileSizeHigh;
+ sb->st_size <<= 32;
+ sb->st_size |= info.nFileSizeLow;
+ sb->st_blksize = 4096;
+ sb->st_blocks = (uint32_t)(sb->st_size + 4095)/4096;
+ sb->st_atime = cvt_ftime_to_utime(info.ftLastAccessTime);
+ sb->st_mtime = cvt_ftime_to_utime(info.ftLastWriteTime);
+ sb->st_ctime = cvt_ftime_to_utime(info.ftCreationTime);
+
+ return 0;
+}
+