CAMLprim value unix_stat_64(value path) { int ret; struct _stati64 buf; ret = _stati64(String_val(path), &buf); if (ret == -1) uerror("stat", path); return stat_aux(1, &buf); }
CAMLprim value unix_fstat_64(value fd) { int ret; struct stat buf; ret = fstat(Int_val(fd), &buf); if (ret == -1) uerror("fstat", Nothing); return stat_aux(1, &buf); }
CAMLprim value unix_fstat_64(value handle) { int ret; struct _stati64 buf; ret = _fstati64(win_CRT_fd_of_filedescr(handle), &buf); if (ret == -1) uerror("fstat", Nothing); return stat_aux(1, &buf); }
CAMLprim value unix_lstat_64(value path) { struct _stat64 buf; __int64 st_ino; if (!do_stat(1, 1, String_val(path), caml_string_length(path), NULL, &st_ino, &buf)) { uerror("lstat", path); } return stat_aux(1, st_ino, &buf); }
CAMLprim value unix_fstat_64(value handle) { int ret; struct _stat64 buf; __int64 st_ino; if (!do_stat(0, 1, NULL, 0, Handle_val(handle), &st_ino, &buf)) { uerror("fstat", Nothing); } return stat_aux(1, st_ino, &buf); }
CAMLprim value unix_fstat_64(value fd) { int ret; struct stat buf; caml_enter_blocking_section(); ret = fstat(Int_val(fd), &buf); caml_leave_blocking_section(); if (ret == -1) uerror("fstat", Nothing); return stat_aux(1, &buf); }
CAMLprim value unix_fstat(value fd) { int ret; struct stat buf; ret = fstat(Int_val(fd), &buf); if (ret == -1) uerror("fstat", Nothing); if (buf.st_size > Max_long && (buf.st_mode & S_IFMT) == S_IFREG) unix_error(EOVERFLOW, "fstat", Nothing); return stat_aux(0, &buf); }
CAMLprim value unix_stat(value path) { int ret; struct stat buf; ret = stat(String_val(path), &buf); if (ret == -1) uerror("stat", path); if (buf.st_size > Max_long && (buf.st_mode & S_IFMT) == S_IFREG) unix_error(EOVERFLOW, "stat", path); return stat_aux(0, &buf); }
CAMLprim value unix_lstat(value path) { struct _stat64 buf; __int64 st_ino; caml_unix_check_path(path, "lstat"); if (!do_stat(1, 0, String_val(path), NULL, &st_ino, &buf)) { uerror("lstat", path); } return stat_aux(0, st_ino, &buf); }
CAMLprim value unix_lstat_64(value path) { int ret; struct stat buf; #ifdef HAS_SYMLINK ret = lstat(String_val(path), &buf); #else ret = stat(String_val(path), &buf); #endif if (ret == -1) uerror("lstat", path); return stat_aux(1, &buf); }
CAMLprim value unix_stat(value path) { int ret; struct _stati64 buf; ret = _stati64(String_val(path), &buf); if (ret == -1) uerror("stat", path); if (buf.st_size > Max_long) { win32_maperr(ERROR_ARITHMETIC_OVERFLOW); uerror("stat", path); } return stat_aux(0, &buf); }
CAMLprim value unix_fstat(value handle) { int ret; struct _stati64 buf; ret = _fstati64(win_CRT_fd_of_filedescr(handle), &buf); if (ret == -1) uerror("fstat", Nothing); if (buf.st_size > Max_long) { win32_maperr(ERROR_ARITHMETIC_OVERFLOW); uerror("fstat", Nothing); } return stat_aux(0, &buf); }
CAMLprim value unix_stat_64(value path) { CAMLparam1(path); int ret; struct stat buf; char * p; p = caml_strdup(String_val(path)); caml_enter_blocking_section(); ret = stat(p, &buf); caml_leave_blocking_section(); caml_stat_free(p); if (ret == -1) uerror("stat", path); CAMLreturn(stat_aux(1, &buf)); }
CAMLprim value unix_lstat(value path) { int ret; struct stat buf; #ifdef HAS_SYMLINK ret = lstat(String_val(path), &buf); #else ret = stat(String_val(path), &buf); #endif if (ret == -1) uerror("lstat", path); if (buf.st_size > Max_long && (buf.st_mode & S_IFMT) == S_IFREG) unix_error(EOVERFLOW, "lstat", path); return stat_aux(0, &buf); }
CAMLprim value unix_stat(value path) { CAMLparam1(path); int ret; struct stat buf; char * p; p = caml_strdup(String_val(path)); caml_enter_blocking_section(); ret = stat(p, &buf); caml_leave_blocking_section(); caml_stat_free(p); if (ret == -1) uerror("stat", path); if (buf.st_size > Max_long && (buf.st_mode & S_IFMT) == S_IFREG) unix_error(EOVERFLOW, "stat", path); CAMLreturn(stat_aux(0, &buf)); }
static value do_fstat(value handle, int use_64) { int ret; struct _stat64 buf; __int64 st_ino; HANDLE h; DWORD ft; st_ino = 0; memset(&buf, 0, sizeof buf); buf.st_nlink = 1; h = Handle_val(handle); ft = GetFileType(h) & ~FILE_TYPE_REMOTE; switch(ft) { case FILE_TYPE_DISK: if (!safe_do_stat(0, use_64, NULL, Handle_val(handle), &st_ino, &buf)) { uerror("fstat", Nothing); } break; case FILE_TYPE_CHAR: buf.st_mode = S_IFCHR; break; case FILE_TYPE_PIPE: { DWORD n_avail; if (Descr_kind_val(handle) == KIND_SOCKET) { buf.st_mode = S_IFSOCK; } else { buf.st_mode = S_IFIFO; } if (PeekNamedPipe(h, NULL, 0, NULL, &n_avail, NULL)) { buf.st_size = n_avail; } } break; case FILE_TYPE_UNKNOWN: unix_error(EBADF, "fstat", Nothing); default: win32_maperr(GetLastError()); uerror("fstat", Nothing); } return stat_aux(use_64, st_ino, &buf); }
CAMLprim value caml_extunix_fstatat(value v_dirfd, value v_name, value v_flags) { CAMLparam3(v_dirfd, v_name, v_flags); int ret; struct stat buf; char* p = caml_stat_alloc(caml_string_length(v_name) + 1); int flags = caml_convert_flag_list(v_flags, at_flags_table); flags &= (AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT); /* only allowed flags here */ strcpy(p, String_val(v_name)); caml_enter_blocking_section(); ret = fstatat(Int_val(v_dirfd), p, &buf, flags); caml_leave_blocking_section(); caml_stat_free(p); if (ret != 0) uerror("fstatat", v_name); if (buf.st_size > Max_long && (buf.st_mode & S_IFMT) == S_IFREG) unix_error(EOVERFLOW, "fstatat", v_name); CAMLreturn(stat_aux(/*0,*/ &buf)); }