summaryrefslogtreecommitdiffstats
path: root/cygwin_util.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2000-09-16 16:25:12 +1100
committerDamien Miller <djm@mindrot.org>2000-09-16 16:25:12 +1100
commitb70b61f5fecf37d95e031414849745030fa8a420 (patch)
tree33a92aca5fde66bde1c3bb3cdabfc5a4c27e24ab /cygwin_util.c
parent52cbcbf0bb5ee685f77449f68c59926320bfe85f (diff)
- (djm) Update CygWin support from Corinna Vinschen <vinschen@cygnus.com>
Diffstat (limited to 'cygwin_util.c')
-rw-r--r--cygwin_util.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/cygwin_util.c b/cygwin_util.c
index 13bd6634..88748c4f 100644
--- a/cygwin_util.c
+++ b/cygwin_util.c
@@ -18,6 +18,10 @@
#ifdef HAVE_CYGWIN
#include <fcntl.h>
#include <io.h>
+#include <stdlib.h>
+#include <sys/vfs.h>
+#include <windows.h>
+#define is_winnt (GetVersion() < 0x80000000)
int binary_open(const char *filename, int flags, mode_t mode)
{
@@ -31,5 +35,67 @@ int binary_pipe(int fd[2])
setmode (fd[0], O_BINARY);
setmode (fd[1], O_BINARY);
}
+ return ret;
+}
+
+int check_nt_auth (int pwd_authenticated, uid_t uid)
+{
+ /*
+ * The only authentication which is able to change the user
+ * context on NT systems is the password authentication. So
+ * we deny all requsts for changing the user context if another
+ * authentication method is used.
+ * This may change in future when a special openssh
+ * subauthentication package is available.
+ */
+ if (is_winnt && !pwd_authenticated && geteuid() != uid)
+ return 0;
+ return 1;
+}
+
+int check_ntsec (const char *filename)
+{
+ char *cygwin;
+ int allow_ntea = 0;
+ int allow_ntsec = 0;
+ struct statfs fsstat;
+
+ /* Windows 95/98/ME don't support file system security at all. */
+ if (!is_winnt)
+ return 0;
+
+ /* Evaluate current CYGWIN settings. */
+ if ((cygwin = getenv("CYGWIN")) != NULL) {
+ if (strstr(cygwin, "ntea") && !strstr(cygwin, "nontea"))
+ allow_ntea = 1;
+ if (strstr(cygwin, "ntsec") && !strstr(cygwin, "nontsec"))
+ allow_ntsec = 1;
+ }
+
+ /*
+ * `ntea' is an emulation of POSIX attributes. It doesn't support
+ * real file level security as ntsec on NTFS file systems does
+ * but it supports FAT filesystems. `ntea' is minimum requirement
+ * for security checks.
+ */
+ if (allow_ntea)
+ return 1;
+
+ /*
+ * Retrieve file system flags. In Cygwin, file system flags are
+ * copied to f_type which has no meaning in Win32 itself.
+ */
+ if (statfs(filename, &fsstat))
+ return 1;
+
+ /*
+ * Only file systems supporting ACLs are able to set permissions.
+ * `ntsec' is the setting in Cygwin which switches using of NTFS
+ * ACLs to support POSIX permissions on files.
+ */
+ if (fsstat.f_type & FS_PERSISTENT_ACLS)
+ return allow_ntsec;
+
+ return 0;
}
#endif