diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 0cd6e49b0..5e0ba2f75 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,20 @@ +2003-05-10 Christopher Faylor + + * dir.cc (readdir): Fill out new old_d_ino field. + * fhandler.h (fhandler_base::namehash): Define as ino_t. + (fhandler_base::get_namehash): Ditto. + * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Accommodate + new 64 bit st_ino. + * fhandler_socket.cc (fhandler_socket::fstat): Ditto. + * path.cc (hash_path_name): Return ino_t. + * syscalls.cc (stat64_to_stat32): Convert 64 bit inode to 32 bit. + * winsup.h (hash_path_name): Declare as returning ino_t. + * include/cygwin/stat.h (__stat32): Use 32 bit st_ino. + (__stat64): Use 64 bit st_ino. + * include/cygwin/types.h (__ino64_t): Define. + (__ino32_t): Ditto. + (ino_t): Define appropriately. + 2003-05-10 Corinna Vinschen * Makefile.in (NEW_FUNCTIONS): All 32/64 from 0.79 API get diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index bd0fc624e..9bd18c17e 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -146,6 +146,7 @@ readdir (DIR *dir) dir->__d_dirent->d_ino = hash_path_name (dino, res->d_name); } } + dir->__d_dirent->old_d_ino = dir->__d_dirent->d_ino; // just truncate return res; } diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc index 4e0e653f2..53aae6d4b 100644 --- a/winsup/cygwin/errno.cc +++ b/winsup/cygwin/errno.cc @@ -10,6 +10,7 @@ details. */ #define _sys_nerr FOO_sys_nerr #define sys_nerr FOOsys_nerr +#define _sys_errlist FOO_sys_errlist #include "winsup.h" #define _REENT_ONLY #include @@ -18,6 +19,7 @@ details. */ #include "thread.h" #undef _sys_nerr #undef sys_nerr +#undef _sys_errlist /* Table to map Windows error codes to Errno values. */ /* FIXME: Doing things this way is a little slow. It's trivial to change @@ -25,13 +27,12 @@ details. */ #define X(w, e) {ERROR_##w, #w, e} -static const NO_COPY struct - { - DWORD w; /* windows version of error */ - const char *s; /* text of windows version */ - int e; /* errno version of error */ - } -errmap[] = +static NO_COPY struct +{ + DWORD w; /* windows version of error */ + const char *s; /* text of windows version */ + int e; /* errno version of error */ +} errmap[] = { /* FIXME: Some of these choices are arbitrary! */ X (INVALID_FUNCTION, EBADRQC), @@ -116,42 +117,8 @@ errmap[] = { 0, NULL, 0} }; -int __stdcall -geterrno_from_win_error (DWORD code, int deferrno) -{ - for (int i = 0; errmap[i].w != 0; ++i) - if (code == errmap[i].w) - { - syscall_printf ("windows error %u == errno %d", code, errmap[i].e); - return errmap[i].e; - } - - syscall_printf ("unknown windows error %u, setting errno to %d", code, - deferrno); - return deferrno; /* FIXME: what's so special about EACCESS? */ -} - -/* seterrno_from_win_error: Given a Windows error code, set errno - as appropriate. */ -void __stdcall -seterrno_from_win_error (const char *file, int line, DWORD code) -{ - syscall_printf ("%s:%d windows error %d", file, line, code); - set_errno (geterrno_from_win_error (code, EACCES)); - return; -} - -/* seterrno: Set `errno' based on GetLastError (). */ -void __stdcall -seterrno (const char *file, int line) -{ - seterrno_from_win_error (file, line, GetLastError ()); -} - -extern char *_user_strerror _PARAMS ((int)); - extern "C" { -const NO_COPY char __declspec(dllexport) * const _sys_errlist[]= +const char __declspec(dllexport) * _sys_errlist[] NO_COPY_INIT = { /* NOERROR 0 */ "No error", /* EPERM 1 */ "Operation not permitted", @@ -295,9 +262,43 @@ const NO_COPY char __declspec(dllexport) * const _sys_errlist[]= /* EOVERFLOW 139 */ "Value too large for defined data type" }; -extern const int NO_COPY __declspec(dllexport) _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]); +int NO_COPY_INIT _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]); }; +int __stdcall +geterrno_from_win_error (DWORD code, int deferrno) +{ + for (int i = 0; errmap[i].w != 0; ++i) + if (code == errmap[i].w) + { + syscall_printf ("windows error %u == errno %d", code, errmap[i].e); + return errmap[i].e; + } + + syscall_printf ("unknown windows error %u, setting errno to %d", code, + deferrno); + return deferrno; /* FIXME: what's so special about EACCESS? */ +} + +/* seterrno_from_win_error: Given a Windows error code, set errno + as appropriate. */ +void __stdcall +seterrno_from_win_error (const char *file, int line, DWORD code) +{ + syscall_printf ("%s:%d windows error %d", file, line, code); + set_errno (geterrno_from_win_error (code, EACCES)); + return; +} + +/* seterrno: Set `errno' based on GetLastError (). */ +void __stdcall +seterrno (const char *file, int line) +{ + seterrno_from_win_error (file, line, GetLastError ()); +} + +extern char *_user_strerror _PARAMS ((int)); + /* FIXME: Why is strerror() a long switch and not just: return sys_errlist[errnum]; (or moral equivalent). diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 3c4947dae..23e597cd8 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -151,7 +151,7 @@ class fhandler_base int access; HANDLE io_handle; - unsigned long namehash; /* hashed filename, used as inode num */ + ino_t namehash; /* hashed filename, used as inode num */ protected: /* Full unix path name of this file */ @@ -292,7 +292,7 @@ class fhandler_base const char *get_name () { return unix_path_name; } const char *get_win32_name () { return win32_path_name; } - unsigned long get_namehash () { return namehash; } + ino_t get_namehash () { return namehash; } virtual void hclose (HANDLE h) {CloseHandle (h);} virtual void set_inheritance (HANDLE &h, int not_inheriting); diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 9e4de957f..3a944200b 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -250,7 +250,7 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc, case DRIVE_RAMDISK: /* Although the documentation indicates otherwise, it seems like "inodes" on these devices are persistent, at least across reboots. */ - buf->st_ino = nFileIndexHigh | nFileIndexLow; + buf->st_ino = (((ino_t) nFileIndexHigh) << 32) | (ino_t) nFileIndexLow; break; default: /* Either the nFileIndex* fields are unreliable or unavailable. Use the diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 127463757..05bbcda3c 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -442,14 +442,14 @@ fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc) if (get_socket_type ()) /* fstat */ { buf->st_dev = 0; - buf->st_ino = (ino_t) get_handle (); + buf->st_ino = (ino_t) ((DWORD) get_handle ()); buf->st_mode = S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO; } else { path_conv spc ("/dev", PC_SYM_NOFOLLOW | PC_NULLEMPTY, NULL); buf->st_dev = spc.volser (); - buf->st_ino = (ino_t) get_namehash (); + buf->st_ino = get_namehash (); buf->st_mode &= ~S_IRWXO; buf->st_rdev = (get_device () << 16) | get_unit (); } diff --git a/winsup/cygwin/include/cygwin/stat.h b/winsup/cygwin/include/cygwin/stat.h index a21e731b8..d35e1ed74 100644 --- a/winsup/cygwin/include/cygwin/stat.h +++ b/winsup/cygwin/include/cygwin/stat.h @@ -19,9 +19,9 @@ extern "C" { #ifdef __INSIDE_CYGWIN__ struct __stat32 { - __dev16_t st_dev; - ino_t st_ino; - mode_t st_mode; + __dev16_t st_dev; + __ino32_t st_ino; + mode_t st_mode; nlink_t st_nlink; __uid16_t st_uid; __gid16_t st_gid; @@ -38,7 +38,7 @@ struct __stat32 struct __stat64 { __dev32_t st_dev; - ino_t st_ino; + __ino64_t st_ino; mode_t st_mode; nlink_t st_nlink; __uid32_t st_uid; diff --git a/winsup/cygwin/include/cygwin/types.h b/winsup/cygwin/include/cygwin/types.h index 8a26ef0a4..da2fc44e2 100644 --- a/winsup/cygwin/include/cygwin/types.h +++ b/winsup/cygwin/include/cygwin/types.h @@ -90,7 +90,13 @@ typedef __gid16_t gid_t; #ifndef __ino_t_defined #define __ino_t_defined -typedef unsigned long ino_t; +typedef unsigned long __ino32_t; +typedef unsigned long long __ino64_t; +#ifdef __CYGWIN_USE_BIG_TYPES__ +typedef __ino64_t ino_t; +#else +typedef __ino32_t ino_t; +#endif #endif /*__ino_t_defined*/ #ifndef __BIT_TYPES_DEFINED diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index a8ec7ab84..5d1cdcb7d 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -3185,7 +3185,7 @@ readlink (const char *path, char *buf, int buflen) the directory. FIXME: Not bullet-proof. */ /* Cygwin internal */ -unsigned long __stdcall +ino_t __stdcall hash_path_name (ino_t hash, const char *name) { if (!*name) diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index de967938c..961bc3f12 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -990,7 +990,7 @@ static void stat64_to_stat32 (struct __stat64 *src, struct __stat32 *dst) { dst->st_dev = ((src->st_dev >> 8) & 0xff00) | (src->st_dev & 0xff); - dst->st_ino = src->st_ino; + dst->st_ino = ((unsigned) (src->st_ino >> 32)) | (unsigned) src->st_ino; dst->st_mode = src->st_mode; dst->st_nlink = src->st_nlink; dst->st_uid = src->st_uid; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 8060ffa17..70a9c1225 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -24,6 +24,7 @@ details. */ #endif #define NO_COPY __attribute__((nocommon)) __attribute__((section(".data_cygwin_nocopy"))) +#define NO_COPY_INIT __attribute__((section(".data_cygwin_nocopy"))) #if !defined(__STDC_VERSION__) || __STDC_VERSION__ >= 199900L #define NEW_MACRO_VARARGS @@ -198,7 +199,7 @@ int __stdcall writable_directory (const char *file); int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *); extern BOOL allow_ntsec; -unsigned long __stdcall hash_path_name (ino_t hash, const char *name) __attribute__ ((regparm(2))); +ino_t __stdcall hash_path_name (ino_t hash, const char *name) __attribute__ ((regparm(2))); void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2))); extern "C" char *__stdcall rootdir (char *full_path) __attribute__ ((regparm(1)));