1 /* fhandler.cc. See console.cc for fhandler_console functions.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
6 This file is part of Cygwin.
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
18 #include "perprocess.h"
20 #include "cygwin/version.h"
31 #include <asm/socket.h>
33 #define MAX_OVERLAPPED_WRITE_LEN (64 * 1024 * 1024)
34 #define MIN_OVERLAPPED_WRITE_LEN (1 * 1024 * 1024)
36 static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */
38 struct __cygwin_perfile *perfile_table;
41 fhandler_base::reset (const fhandler_base *from)
52 fhandler_base::puts_readahead (const char *s, size_t len)
55 while ((len == (size_t) -1 ? *s : len--)
56 && (success = put_readahead (*s++) > 0))
62 fhandler_base::put_readahead (char value)
65 if (raixput < rabuflen)
67 else if ((newrabuf = (char *) realloc (rabuf, rabuflen += 32)))
72 rabuf[raixput++] = value;
78 fhandler_base::get_readahead ()
82 chret = ((unsigned char) rabuf[raixget++]) & 0xff;
83 /* FIXME - not thread safe */
85 raixget = raixput = ralen = 0;
90 fhandler_base::peek_readahead (int queryput)
93 if (!queryput && raixget < ralen)
94 chret = ((unsigned char) rabuf[raixget]) & 0xff;
95 else if (queryput && raixput > 0)
96 chret = ((unsigned char) rabuf[raixput - 1]) & 0xff;
101 fhandler_base::set_readahead_valid (int val, int ch)
104 ralen = raixget = raixput = 0;
110 fhandler_base::eat_readahead (int n)
117 if ((int) (ralen -= n) < 0)
120 if (raixget >= ralen)
121 raixget = raixput = ralen = 0;
122 else if (raixput > ralen)
130 fhandler_base::get_readahead_into_buffer (char *buf, size_t buflen)
133 int copied_chars = 0;
136 if ((ch = get_readahead ()) < 0)
140 buf[copied_chars++] = (unsigned char)(ch & 0xff);
147 /* Record the file name. and name hash */
149 fhandler_base::set_name (path_conv &in_pc)
154 char *fhandler_base::get_proc_fd_name (char *buf)
157 return strcpy (buf, get_name ());
159 return strcpy (buf, dev ().name);
160 return strcpy (buf, "");
163 /* Detect if we are sitting at EOF for conditions where Windows
164 returns an error but UNIX doesn't. */
169 FILE_POSITION_INFORMATION fpi;
170 FILE_STANDARD_INFORMATION fsi;
172 if (NT_SUCCESS (NtQueryInformationFile (h, &io, &fsi, sizeof fsi,
173 FileStandardInformation))
174 && NT_SUCCESS (NtQueryInformationFile (h, &io, &fpi, sizeof fpi,
175 FilePositionInformation))
176 && fsi.EndOfFile.QuadPart == fpi.CurrentByteOffset.QuadPart)
182 fhandler_base::set_flags (int flags, int supplied_bin)
186 debug_printf ("flags %p, supplied_bin %p", flags, supplied_bin);
187 if ((bin = flags & (O_BINARY | O_TEXT)))
188 debug_printf ("O_TEXT/O_BINARY set in flags %p", bin);
189 else if (rbinset () && wbinset ())
190 bin = rbinary () ? O_BINARY : O_TEXT; // FIXME: Not quite right
191 else if ((fmode = get_default_fmode (flags)) & O_BINARY)
193 else if (fmode & O_TEXT)
195 else if (supplied_bin)
198 bin = wbinary () || rbinary () ? O_BINARY : O_TEXT;
200 openflags = flags | bin;
203 rbinary (bin ? true : false);
204 wbinary (bin ? true : false);
205 syscall_printf ("filemode set to %s", bin ? "binary" : "text");
208 /* Normal file i/o handlers. */
210 /* Cover function to ReadFile to achieve (as much as possible) Posix style
211 semantics and use of errno. */
213 fhandler_base::raw_read (void *ptr, size_t& ulen)
215 #define bytes_read ulen
217 int try_noreserve = 1;
222 BOOL res = ReadFile (get_handle (), ptr, len, (DWORD *) &ulen, NULL);
225 /* Some errors are not really errors. Detect such cases here. */
227 DWORD errcode = GetLastError ();
230 case ERROR_BROKEN_PIPE:
231 /* This is really EOF. */
234 case ERROR_MORE_DATA:
235 /* `bytes_read' is supposedly valid. */
238 if (is_at_eof (get_handle ()))
246 switch (mmap_is_attached_or_noreserve (ptr, len))
248 case MMAP_NORESERVE_COMMITED:
250 case MMAP_RAISE_SIGBUS:
257 case ERROR_INVALID_FUNCTION:
258 case ERROR_INVALID_PARAMETER:
259 case ERROR_INVALID_HANDLE:
263 bytes_read = (size_t) -1;
267 syscall_printf ("ReadFile %s(%p) failed, %E", get_name (), get_handle ());
268 __seterrno_from_win_error (errcode);
269 bytes_read = (size_t) -1;
276 /* Cover function to WriteFile to provide Posix interface and semantics
277 (as much as possible). */
279 fhandler_base::raw_write (const void *ptr, size_t len)
283 static _RDATA LARGE_INTEGER off_current =
284 { QuadPart:FILE_USE_FILE_POINTER_POSITION };
285 static _RDATA LARGE_INTEGER off_append =
286 { QuadPart:FILE_WRITE_TO_END_OF_FILE };
288 status = NtWriteFile (get_output_handle (), NULL, NULL, NULL, &io,
290 (get_flags () & O_APPEND) ? &off_append : &off_current,
292 if (!NT_SUCCESS (status))
294 __seterrno_from_nt_status (status);
295 if (get_errno () == EPIPE)
299 return io.Information;
303 fhandler_base::get_default_fmode (int flags)
308 size_t nlen = strlen (get_name ());
309 unsigned accflags = (flags & O_ACCMODE);
310 for (__cygwin_perfile *pf = perfile_table; pf->name; pf++)
311 if (!*pf->name && (pf->flags & O_ACCMODE) == accflags)
313 fmode = pf->flags & ~O_ACCMODE;
318 size_t pflen = strlen (pf->name);
319 const char *stem = get_name () + nlen - pflen;
320 if (pflen > nlen || (stem != get_name () && !isdirsep (stem[-1])))
322 else if ((pf->flags & O_ACCMODE) == accflags
323 && pathmatch (stem, pf->name, !!pc.objcaseinsensitive ()))
325 fmode = pf->flags & ~O_ACCMODE;
334 fhandler_base::device_access_denied (int flags)
340 if (flags & (O_WRONLY | O_APPEND))
345 return fhaccess (mode, true);
349 fhandler_base::fhaccess (int flags, bool effective)
354 set_errno (error ());
364 if (!(flags & (R_OK | W_OK | X_OK)))
367 if (is_fs_special ())
369 else if (has_attribute (FILE_ATTRIBUTE_READONLY) && (flags & W_OK)
372 else if (has_acls ())
374 res = check_file_access (pc, flags, effective);
377 else if (get_device () == FH_REGISTRY && open (O_RDONLY, 0) && get_handle ())
379 res = check_registry_access (get_handle (), flags, effective);
390 if (st.st_uid == (effective ? myself->uid : cygheap->user.real_uid))
392 if (!(st.st_mode & S_IRUSR))
395 else if (st.st_gid == (effective ? myself->gid : cygheap->user.real_gid))
397 if (!(st.st_mode & S_IRGRP))
400 else if (!(st.st_mode & S_IROTH))
406 if (st.st_uid == (effective ? myself->uid : cygheap->user.real_uid))
408 if (!(st.st_mode & S_IWUSR))
411 else if (st.st_gid == (effective ? myself->gid : cygheap->user.real_gid))
413 if (!(st.st_mode & S_IWGRP))
416 else if (!(st.st_mode & S_IWOTH))
422 if (st.st_uid == (effective ? myself->uid : cygheap->user.real_uid))
424 if (!(st.st_mode & S_IXUSR))
427 else if (st.st_gid == (effective ? myself->gid : cygheap->user.real_gid))
429 if (!(st.st_mode & S_IXGRP))
432 else if (!(st.st_mode & S_IXOTH))
442 if (!res && (flags & W_OK) && get_device () == FH_FS
443 && (pc.fs_flags () & FILE_READ_ONLY_VOLUME))
448 debug_printf ("returning %d", res);
453 fhandler_base::open_with_arch (int flags, mode_t mode)
456 if (!(res = (archetype && archetype->io_handle)
457 || open (flags, (mode & 07777) & ~cygheap->umask)))
464 if (!archetype->get_io_handle ())
467 archetype_usecount (1);
468 archetype->archetype = NULL;
474 /* Preserve any name (like /dev/tty) derived from build_fh_pc. */
479 name = (char *) alloca (strlen (get_name ()) + 1);
480 strcpy (name, get_name ());
482 fhandler_base *arch = archetype;
483 archetype->copyto (this);
487 archetype_usecount (1);
493 close_on_exec (flags & O_CLOEXEC);
497 /* Open system call handler function. */
499 fhandler_base::open (int flags, mode_t mode)
503 ULONG file_attributes = 0;
504 ULONG shared = (get_major () == DEV_TAPE_MAJOR ? 0 : FILE_SHARE_VALID_FLAGS);
505 ULONG create_disposition;
506 OBJECT_ATTRIBUTES attr;
509 PFILE_FULL_EA_INFORMATION p = NULL;
512 syscall_printf ("(%S, %p)", pc.get_nt_native_path (), flags);
514 pc.get_object_attr (attr, *sec_none_cloexec (flags));
516 options = FILE_OPEN_FOR_BACKUP_INTENT;
517 switch (query_open ())
519 case query_read_control:
520 access = READ_CONTROL;
522 case query_read_attributes:
523 access = READ_CONTROL | FILE_READ_ATTRIBUTES;
525 case query_write_control:
526 access = READ_CONTROL | WRITE_OWNER | WRITE_DAC | FILE_WRITE_ATTRIBUTES;
528 case query_write_dac:
529 access = READ_CONTROL | WRITE_DAC | FILE_WRITE_ATTRIBUTES;
531 case query_write_attributes:
532 access = READ_CONTROL | FILE_WRITE_ATTRIBUTES;
535 if ((flags & O_ACCMODE) == O_RDONLY)
536 access = GENERIC_READ;
537 else if ((flags & O_ACCMODE) == O_WRONLY)
538 access = GENERIC_WRITE | READ_CONTROL | FILE_READ_ATTRIBUTES;
540 access = GENERIC_READ | GENERIC_WRITE;
542 options |= FILE_WRITE_THROUGH;
543 if (flags & O_DIRECT)
544 options |= FILE_NO_INTERMEDIATE_BUFFERING;
545 if (get_major () != DEV_SERIAL_MAJOR && get_major () != DEV_TAPE_MAJOR)
547 options |= FILE_SYNCHRONOUS_IO_NONALERT;
548 access |= SYNCHRONIZE;
553 /* Don't use the FILE_OVERWRITE{_IF} flags here. See below for an
554 explanation, why that's not such a good idea. */
555 if ((flags & O_EXCL) && (flags & O_CREAT))
556 create_disposition = FILE_CREATE;
558 create_disposition = (flags & O_CREAT) ? FILE_OPEN_IF : FILE_OPEN;
560 if (get_device () == FH_FS)
562 /* Add the reparse point flag to native symlinks, otherwise we open the
563 target, not the symlink. This would break lstat. */
564 if (pc.is_rep_symlink ())
565 options |= FILE_OPEN_REPARSE_POINT;
569 /* Make sure we can read EAs of files on an NFS share. Also make
570 sure that we're going to act on the file itself, even if it's a
572 access |= FILE_READ_EA;
575 if (query_open () >= query_write_control)
576 access |= FILE_WRITE_EA;
577 plen = sizeof nfs_aol_ffei;
578 p = (PFILE_FULL_EA_INFORMATION) &nfs_aol_ffei;
582 /* Starting with Windows 2000, when trying to overwrite an already
583 existing file with FILE_ATTRIBUTE_HIDDEN and/or FILE_ATTRIBUTE_SYSTEM
584 attribute set, CreateFile fails with ERROR_ACCESS_DENIED.
585 Per MSDN you have to create the file with the same attributes as
586 already specified for the file. */
587 if (((flags & O_CREAT) || create_disposition == FILE_OVERWRITE)
588 && has_attribute (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM))
589 file_attributes |= pc.file_attributes ();
593 file_attributes |= FILE_ATTRIBUTE_NORMAL;
597 /* When creating a file on an NFS share, we have to set the
598 file mode by writing a NFS fattr3 structure with the
599 correct mode bits set. */
600 access |= FILE_WRITE_EA;
601 plen = sizeof (FILE_FULL_EA_INFORMATION) + sizeof (NFS_V3_ATTR)
603 p = (PFILE_FULL_EA_INFORMATION) alloca (plen);
604 p->NextEntryOffset = 0;
606 p->EaNameLength = sizeof (NFS_V3_ATTR) - 1;
607 p->EaValueLength = sizeof (fattr3);
608 strcpy (p->EaName, NFS_V3_ATTR);
609 fattr3 *nfs_attr = (fattr3 *) (p->EaName
610 + p->EaNameLength + 1);
611 memset (nfs_attr, 0, sizeof (fattr3));
612 nfs_attr->type = NF3REG;
613 nfs_attr->mode = mode;
615 else if (!has_acls () && !(mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
616 /* If mode has no write bits set, and ACLs are not used, we set
617 the DOS R/O attribute. */
618 file_attributes |= FILE_ATTRIBUTE_READONLY;
619 /* The file attributes are needed for later use in, e.g. fchmod. */
620 pc.file_attributes (file_attributes);
621 /* Never set the WRITE_DAC flag here. Calls to fstat may return
622 wrong st_ctime information after calls to fchmod, fchown, etc
623 because Windows only gurantees to update the metadata when
624 the handle is closed or flushed. However, flushing the file
625 on every fstat to enforce POSIXy stat behaviour is exceessivly
626 slow, compared to open/close the file when changing the file's
627 security descriptor. */
631 status = NtCreateFile (&fh, access, &attr, &io, NULL, file_attributes, shared,
632 create_disposition, options, p, plen);
633 if (!NT_SUCCESS (status))
635 /* Trying to create a directory should return EISDIR, not ENOENT. */
636 PUNICODE_STRING upath = pc.get_nt_native_path ();
637 if (status == STATUS_OBJECT_NAME_INVALID && (flags & O_CREAT)
638 && upath->Buffer[upath->Length / sizeof (WCHAR) - 1] == '\\')
641 __seterrno_from_nt_status (status);
646 /* Always create files using a NULL SD. Create correct permission bits
647 afterwards, maintaining the owner and group information just like chmod.
649 This is done for two reasons.
651 On Windows filesystems we need to create the file with default
652 permissions to allow inheriting ACEs. When providing an explicit DACL
653 in calls to [Nt]CreateFile, the created file will not inherit default
654 permissions from the parent object. This breaks not only Windows
655 inheritance, but also POSIX ACL inheritance.
657 Another reason to do this are remote shares. Files on a remote share
658 are created as the user used for authentication. In a domain that's
659 usually the user you're logged in as. Outside of a domain you're
660 authenticating using a local user account on the sharing machine.
661 If the SIDs of the client machine are used, that's entirely
662 unexpected behaviour. Doing it like we do here creates the expected SD
663 in a domain as well as on standalone servers.
664 This is the result of a discussion on the samba-technical list, starting at
665 http://lists.samba.org/archive/samba-technical/2008-July/060247.html */
666 if (io.Information == FILE_CREATED && has_acls ())
667 set_file_attribute (fh, pc, ILLEGAL_UID, ILLEGAL_GID, S_JUSTCREATED | mode);
669 /* If you O_TRUNC a file on Linux, the data is truncated, but the EAs are
670 preserved. If you open a file on Windows with FILE_OVERWRITE{_IF} or
671 FILE_SUPERSEDE, all streams are truncated, including the EAs. So we don't
672 use the FILE_OVERWRITE{_IF} flags, but instead just open the file and set
673 the size of the data stream explicitely to 0. Apart from being more Linux
674 compatible, this implementation has the pleasant side-effect to be more
675 than 5% faster than using FILE_OVERWRITE{_IF} (tested on W7 32 bit). */
676 if ((flags & O_TRUNC)
677 && (flags & O_ACCMODE) != O_RDONLY
678 && io.Information != FILE_CREATED
679 && get_device () == FH_FS)
681 FILE_END_OF_FILE_INFORMATION feofi = { EndOfFile:{ QuadPart:0 } };
682 status = NtSetInformationFile (fh, &io, &feofi, sizeof feofi,
683 FileEndOfFileInformation);
684 /* In theory, truncating the file should never fail, since the opened
685 handle has FILE_WRITE_DATA permissions, which is all you need to
686 be allowed to truncate a file. Better safe than sorry. */
687 if (!NT_SUCCESS (status))
689 __seterrno_from_nt_status (status);
696 set_flags (flags, pc.binmode ());
701 debug_printf ("%x = NtCreateFile "
702 "(%p, %x, %S, io, NULL, %x, %x, %x, %x, NULL, 0)",
703 status, fh, access, pc.get_nt_native_path (), file_attributes,
704 shared, create_disposition, options);
706 syscall_printf ("%d = fhandler_base::open (%S, %p)",
707 res, pc.get_nt_native_path (), flags);
712 open buffer in binary mode? Just do the read.
714 open buffer in text mode? Scan buffer for control zs and handle
715 the first one found. Then scan buffer, converting every \r\n into
716 an \n. If last char is an \r, look ahead one more char, if \n then
717 modify \r, if not, remember char.
720 fhandler_base::read (void *in_ptr, size_t& len)
722 char *ptr = (char *) in_ptr;
723 ssize_t copied_chars = get_readahead_into_buffer (ptr, len);
727 len = (size_t) copied_chars;
734 len = (size_t) copied_chars;
738 raw_read (ptr + copied_chars, len);
741 else if ((ssize_t) len > 0)
746 if (rbinary () || (ssize_t) len <= 0)
749 /* Scan buffer and turn \r\n into \n */
750 char *src, *dst, *end;
755 /* Read up to the last but one char - the last char needs special handling */
758 if (*src == '\r' && src[1] == '\n')
763 /* If not beyond end and last char is a '\r' then read one more
764 to see if we should translate this one too */
767 else if (*src != '\r')
773 raw_read (&c1, c1len);
780 set_readahead_valid (1, c1);
785 len = dst - (char *) ptr;
788 if (strace.active ())
790 char buf[16 * 6 + 1];
793 for (int i = 0; i < copied_chars && i < 16; ++i)
795 unsigned char c = ((unsigned char *) ptr)[i];
796 __small_sprintf (p, " %c", c);
800 debug_printf ("read %d bytes (%s%s)", copied_chars, buf,
801 copied_chars > 16 ? " ..." : "");
806 debug_printf ("returning %d, %s mode", len, rbinary () ? "binary" : "text");
810 fhandler_base::write (const void *ptr, size_t len)
814 FILE_POSITION_INFORMATION fpi;
815 FILE_STANDARD_INFORMATION fsi;
819 did_lseek (false); /* don't do it again */
821 if (!(get_flags () & O_APPEND)
822 && NT_SUCCESS (NtQueryInformationFile (get_output_handle (),
823 &io, &fsi, sizeof fsi,
824 FileStandardInformation))
825 && NT_SUCCESS (NtQueryInformationFile (get_output_handle (),
826 &io, &fpi, sizeof fpi,
827 FilePositionInformation))
828 && fpi.CurrentByteOffset.QuadPart
829 >= fsi.EndOfFile.QuadPart + (128 * 1024)
830 && (pc.fs_flags () & FILE_SUPPORTS_SPARSE_FILES))
832 /* If the file system supports sparse files and the application
833 is writing after a long seek beyond EOF, convert the file to
836 status = NtFsControlFile (get_output_handle (), NULL, NULL, NULL,
837 &io, FSCTL_SET_SPARSE, NULL, 0, NULL, 0);
838 syscall_printf ("%p = NtFsControlFile(%S, FSCTL_SET_SPARSE)",
839 status, pc.get_nt_native_path ());
845 debug_printf ("binary write");
846 res = raw_write (ptr, len);
850 debug_printf ("text write");
851 /* This is the Microsoft/DJGPP way. Still not ideal, but it's
853 Modified slightly by CGF 2000-10-07 */
855 int left_in_data = len;
856 char *data = (char *)ptr;
859 while (left_in_data > 0)
861 char buf[CHUNK_SIZE + 1], *buf_ptr = buf;
862 int left_in_buf = CHUNK_SIZE;
864 while (left_in_buf > 0 && left_in_data > 0)
875 if (left_in_data > 0 && ch == '\r' && *data == '\n')
877 *buf_ptr++ = *data++;
883 /* We've got a buffer-full, or we're out of data. Write it out */
885 int want = buf_ptr - buf;
886 if ((nbytes = raw_write (buf, want)) == want)
888 /* Keep track of how much written not counting additional \r's */
889 res = data - (char *)ptr;
894 res = -1; /* Error */
896 res += nbytes; /* Partial write. Return total bytes written. */
897 break; /* All done */
905 fhandler_base::readv (const struct iovec *const iov, const int iovcnt,
909 assert (iovcnt >= 1);
915 read (iov->iov_base, len);
919 if (tot == -1) // i.e. if not pre-calculated by the caller.
922 const struct iovec *iovptr = iov + iovcnt;
926 len += iovptr->iov_len;
928 while (iovptr != iov);
934 char *buf = (char *) malloc (len);
943 ssize_t nbytes = (ssize_t) len;
945 const struct iovec *iovptr = iov;
950 const int frag = min (nbytes, (ssize_t) iovptr->iov_len);
951 memcpy (iovptr->iov_base, p, frag);
962 fhandler_base::writev (const struct iovec *const iov, const int iovcnt,
966 assert (iovcnt >= 1);
969 return write (iov->iov_base, iov->iov_len);
971 if (tot == -1) // i.e. if not pre-calculated by the caller.
974 const struct iovec *iovptr = iov + iovcnt;
978 tot += iovptr->iov_len;
980 while (iovptr != iov);
988 char *const buf = (char *) malloc (tot);
997 const struct iovec *iovptr = iov;
1002 const int frag = min (nbytes, (ssize_t) iovptr->iov_len);
1003 memcpy (bufptr, iovptr->iov_base, frag);
1008 ssize_t ret = write (buf, tot);
1014 fhandler_base::lseek (_off64_t offset, int whence)
1018 FILE_POSITION_INFORMATION fpi;
1019 FILE_STANDARD_INFORMATION fsi;
1021 /* Seeks on text files is tough, we rewind and read till we get to the
1024 if (whence != SEEK_CUR || offset != 0)
1026 if (whence == SEEK_CUR)
1027 offset -= ralen - raixget;
1028 set_readahead_valid (0);
1034 fpi.CurrentByteOffset.QuadPart = offset;
1037 status = NtQueryInformationFile (get_handle (), &io, &fpi, sizeof fpi,
1038 FilePositionInformation);
1039 if (!NT_SUCCESS (status))
1041 __seterrno_from_nt_status (status);
1044 fpi.CurrentByteOffset.QuadPart += offset;
1046 default: /* SEEK_END */
1047 status = NtQueryInformationFile (get_handle (), &io, &fsi, sizeof fsi,
1048 FileStandardInformation);
1049 if (!NT_SUCCESS (status))
1051 __seterrno_from_nt_status (status);
1054 fpi.CurrentByteOffset.QuadPart = fsi.EndOfFile.QuadPart + offset;
1058 debug_printf ("setting file pointer to %U", fpi.CurrentByteOffset.QuadPart);
1059 status = NtSetInformationFile (get_handle (), &io, &fpi, sizeof fpi,
1060 FilePositionInformation);
1061 if (!NT_SUCCESS (status))
1063 __seterrno_from_nt_status (status);
1066 _off64_t res = fpi.CurrentByteOffset.QuadPart;
1068 /* When next we write(), we will check to see if *this* seek went beyond
1069 the end of the file and if so, potentially sparsify the file. */
1072 /* If this was a SEEK_CUR with offset 0, we still might have
1073 readahead that we have to take into account when calculating
1074 the actual position for the application. */
1075 if (whence == SEEK_CUR)
1076 res -= ralen - raixget;
1082 fhandler_base::pread (void *, size_t, _off64_t)
1089 fhandler_base::pwrite (void *, size_t, _off64_t)
1096 fhandler_base::close_with_arch ()
1103 debug_printf ("closing passed in archetype, usecount %d", usecount);
1106 debug_printf ("not closing passed in archetype, usecount %d", usecount);
1111 else if (!archetype)
1116 if (archetype_usecount (-1) == 0)
1118 debug_printf ("closing archetype");
1123 debug_printf ("not closing archetype");
1131 cygheap->fdtab.delete_archetype (archetype);
1138 fhandler_base::close ()
1142 syscall_printf ("closing '%s' handle %p", get_name (), get_handle ());
1143 if (nohandle () || CloseHandle (get_handle ()))
1147 paranoid_printf ("CloseHandle (%d <%s>) failed", get_handle (),
1157 fhandler_base_overlapped::close ()
1159 if (is_nonblocking () && io_pending)
1162 wait_overlapped (1, !!(get_access () & GENERIC_WRITE), &bytes, false);
1164 destroy_overlapped ();
1165 return fhandler_base::close ();
1169 fhandler_base::ioctl (unsigned int cmd, void *buf)
1176 set_nonblocking (*(int *) buf);
1190 syscall_printf ("%d = ioctl (%x, %p)", res, cmd, buf);
1195 fhandler_base::lock (int, struct __flock64 *)
1202 fhandler_base::fstat (struct __stat64 *buf)
1204 if (is_fs_special ())
1205 return fstat_fs (buf);
1207 switch (get_device ())
1210 buf->st_mode = S_IFIFO | S_IRUSR | S_IWUSR;
1213 buf->st_mode = S_IFIFO | S_IWUSR;
1216 buf->st_mode = S_IFIFO | S_IRUSR;
1219 buf->st_mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IWGRP | S_IWOTH;
1222 buf->st_mode = S_IFCHR | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH;
1226 buf->st_uid = geteuid32 ();
1227 buf->st_gid = getegid32 ();
1229 buf->st_blksize = PREFERRED_IO_BLKSIZE;
1231 buf->st_ctim.tv_sec = 1164931200L; /* Arbitrary value: 2006-12-01 */
1232 buf->st_ctim.tv_nsec = 0L;
1233 buf->st_birthtim = buf->st_ctim;
1234 buf->st_mtim.tv_sec = time (NULL); /* Arbitrary value: current time,
1236 buf->st_mtim.tv_nsec = 0L;
1237 buf->st_atim = buf->st_mtim;
1243 fhandler_base::fstatvfs (struct statvfs *sfs)
1245 /* If we hit this base implementation, it's some device in /dev.
1246 Just call statvfs on /dev for simplicity. */
1247 path_conv pc ("/dev", PC_KEEP_HANDLE);
1248 fhandler_disk_file fh (pc);
1249 return fh.fstatvfs (sfs);
1253 fhandler_base::init (HANDLE f, DWORD a, mode_t bin)
1257 a &= GENERIC_READ | GENERIC_WRITE;
1259 if (a == GENERIC_READ)
1261 else if (a == GENERIC_WRITE)
1263 else if (a == (GENERIC_READ | GENERIC_WRITE))
1265 set_flags (flags | bin);
1267 debug_printf ("created new fhandler_base for handle %p, bin %d", f, rbinary ());
1272 fhandler_base::dup (fhandler_base *child, int)
1274 debug_printf ("in fhandler_base dup");
1277 if (!nohandle () && !archetype)
1279 if (!DuplicateHandle (GetCurrentProcess (), get_handle (),
1280 GetCurrentProcess (), &nh,
1281 0, TRUE, DUPLICATE_SAME_ACCESS))
1283 debug_printf ("dup(%s) failed, handle %x, %E",
1284 get_name (), get_handle ());
1290 child->set_io_handle (nh);
1296 fhandler_base_overlapped::dup (fhandler_base *child, int flags)
1298 int res = fhandler_base::dup (child, flags) ||
1299 ((fhandler_base_overlapped *) child)->setup_overlapped ();
1303 int fhandler_base::fcntl (int cmd, void *arg)
1310 res = close_on_exec () ? FD_CLOEXEC : 0;
1313 set_close_on_exec (((int) arg & FD_CLOEXEC) ? 1 : 0);
1318 debug_printf ("GETFL: %p", res);
1322 /* Only O_APPEND, O_ASYNC and O_NONBLOCK/O_NDELAY are allowed.
1323 Each other flag will be ignored.
1324 Since O_ASYNC isn't defined in fcntl.h it's currently
1326 const int allowed_flags = O_APPEND | O_NONBLOCK_MASK;
1327 int new_flags = (int) arg & allowed_flags;
1328 /* Carefully test for the O_NONBLOCK or deprecated OLD_O_NDELAY flag.
1329 Set only the flag that has been passed in. If both are set, just
1330 record O_NONBLOCK. */
1331 if ((new_flags & OLD_O_NDELAY) && (new_flags & O_NONBLOCK))
1332 new_flags &= ~OLD_O_NDELAY;
1333 set_flags ((get_flags () & ~allowed_flags) | new_flags);
1345 /* Base terminal handlers. These just return errors. */
1348 fhandler_base::tcflush (int)
1355 fhandler_base::tcsendbreak (int)
1362 fhandler_base::tcdrain ()
1369 fhandler_base::tcflow (int)
1376 fhandler_base::tcsetattr (int, const struct termios *)
1383 fhandler_base::tcgetattr (struct termios *)
1390 fhandler_base::tcsetpgrp (const pid_t)
1397 fhandler_base::tcgetpgrp ()
1404 fhandler_base::tcgetsid ()
1411 fhandler_base::operator delete (void *p)
1416 /* Normal I/O constructor */
1417 fhandler_base::fhandler_base () :
1435 /* Normal I/O destructor */
1436 fhandler_base::~fhandler_base ()
1442 /**********************************************************************/
1445 fhandler_dev_null::fhandler_dev_null () :
1451 fhandler_base::set_no_inheritance (HANDLE &h, bool not_inheriting)
1453 if (!SetHandleInformation (h, HANDLE_FLAG_INHERIT,
1454 not_inheriting ? 0 : HANDLE_FLAG_INHERIT))
1455 debug_printf ("SetHandleInformation failed, %E");
1456 #ifdef DEBUGGING_AND_FDS_PROTECTED
1458 setclexec (oh, h, not_inheriting);
1463 fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name)
1467 if (/* !is_socket () && */ !close_on_exec ())
1468 debug_printf ("handle %p already opened", h);
1469 else if (!DuplicateHandle (parent, h, GetCurrentProcess (), &h,
1470 0, !close_on_exec (), DUPLICATE_SAME_ACCESS))
1471 system_printf ("%s - %E, handle %s<%p>", get_name (), name, h);
1482 fhandler_base::set_close_on_exec (bool val)
1485 set_no_inheritance (io_handle, val);
1486 close_on_exec (val);
1487 debug_printf ("set close_on_exec for %s to %d", get_name (), val);
1491 fhandler_base::fixup_after_fork (HANDLE parent)
1493 debug_printf ("inheriting '%s' from parent", get_name ());
1495 fork_fixup (parent, io_handle, "io_handle");
1496 /* POSIX locks are not inherited across fork. */
1498 del_my_locks (after_fork);
1502 fhandler_base_overlapped::fixup_after_fork (HANDLE parent)
1504 setup_overlapped ();
1505 fhandler_base::fixup_after_fork (parent);
1509 fhandler_base::fixup_after_exec ()
1511 debug_printf ("here for '%s'", get_name ());
1512 if (unique_id && close_on_exec ())
1513 del_my_locks (after_exec);
1516 fhandler_base_overlapped::fixup_after_exec ()
1518 setup_overlapped ();
1519 fhandler_base::fixup_after_exec ();
1523 fhandler_base::is_nonblocking ()
1525 return (openflags & O_NONBLOCK_MASK) != 0;
1529 fhandler_base::set_nonblocking (int yes)
1531 int current = openflags & O_NONBLOCK_MASK;
1532 int new_flags = yes ? (!current ? O_NONBLOCK : current) : 0;
1533 openflags = (openflags & ~O_NONBLOCK_MASK) | new_flags;
1537 fhandler_base::mkdir (mode_t)
1547 fhandler_base::rmdir ()
1551 else if (!pc.isdir ())
1552 set_errno (ENOTDIR);
1559 fhandler_base::opendir (int fd)
1561 set_errno (ENOTDIR);
1566 fhandler_base::readdir (DIR *, dirent *)
1572 fhandler_base::telldir (DIR *)
1574 set_errno (ENOTDIR);
1579 fhandler_base::seekdir (DIR *, long)
1581 set_errno (ENOTDIR);
1585 fhandler_base::rewinddir (DIR *)
1587 set_errno (ENOTDIR);
1591 fhandler_base::closedir (DIR *)
1593 set_errno (ENOTDIR);
1598 fhandler_base::fchmod (mode_t mode)
1600 extern int chmod_device (path_conv& pc, mode_t mode);
1601 if (pc.is_fs_special ())
1602 return chmod_device (pc, mode);
1603 /* By default, just succeeds. */
1608 fhandler_base::fchown (__uid32_t uid, __gid32_t gid)
1610 if (pc.is_fs_special ())
1611 return ((fhandler_disk_file *) this)->fhandler_disk_file::fchown (uid, gid);
1612 /* By default, just succeeds. */
1617 fhandler_base::facl (int cmd, int nentries, __aclent32_t *aclbufp)
1623 /* By default, just succeeds. */
1629 else if (nentries < MIN_ACL_ENTRIES)
1633 aclbufp[0].a_type = USER_OBJ;
1634 aclbufp[0].a_id = myself->uid;
1635 aclbufp[0].a_perm = (S_IRUSR | S_IWUSR) >> 6;
1636 aclbufp[1].a_type = GROUP_OBJ;
1637 aclbufp[1].a_id = myself->gid;
1638 aclbufp[1].a_perm = (S_IRGRP | S_IWGRP) >> 3;
1639 aclbufp[2].a_type = OTHER_OBJ;
1640 aclbufp[2].a_id = ILLEGAL_GID;
1641 aclbufp[2].a_perm = S_IROTH | S_IWOTH;
1642 aclbufp[3].a_type = CLASS_OBJ;
1643 aclbufp[3].a_id = ILLEGAL_GID;
1644 aclbufp[3].a_perm = S_IRWXU | S_IRWXG | S_IRWXO;
1645 res = MIN_ACL_ENTRIES;
1649 res = MIN_ACL_ENTRIES;
1659 fhandler_base::fgetxattr (const char *name, void *value, size_t size)
1661 set_errno (ENOTSUP);
1666 fhandler_base::fsetxattr (const char *name, const void *value, size_t size,
1669 set_errno (ENOTSUP);
1674 fhandler_base::fadvise (_off64_t offset, _off64_t length, int advice)
1681 fhandler_base::ftruncate (_off64_t length, bool allow_truncate)
1688 fhandler_base::link (const char *newpath)
1695 fhandler_base::utimens (const struct timespec *tvp)
1697 if (is_fs_special ())
1698 return utimens_fs (tvp);
1705 fhandler_base::fsync ()
1707 if (!get_handle () || nohandle ())
1712 if (pc.isdir ()) /* Just succeed. */
1714 if (FlushFileBuffers (get_handle ()))
1717 /* Ignore ERROR_INVALID_FUNCTION because FlushFileBuffers() always fails
1718 with this code on raw devices which are unbuffered by default. */
1719 DWORD errcode = GetLastError();
1720 if (errcode == ERROR_INVALID_FUNCTION)
1723 __seterrno_from_win_error (errcode);
1728 fhandler_base::fpathconf (int v)
1735 return pc.fs_is_ntfs () || pc.fs_is_samba () || pc.fs_is_nfs ()
1748 /* NAME_MAX is without trailing \0 */
1751 ret = NT_MAX_PATH - strlen (get_name ()) - 2;
1752 return ret < 0 ? 0 : ret > NAME_MAX ? NAME_MAX : ret;
1754 /* PATH_MAX is with trailing \0 */
1757 ret = NT_MAX_PATH - strlen (get_name ()) - 1;
1758 return ret < 0 ? 0 : ret > PATH_MAX ? PATH_MAX : ret;
1761 || get_device () == FH_FIFO || get_device () == FH_PIPE
1762 || get_device () == FH_PIPER || get_device () == FH_PIPEW)
1766 case _PC_CHOWN_RESTRICTED:
1772 return _POSIX_VDISABLE;
1780 case _PC_FILESIZEBITS:
1781 return FILESIZEBITS;
1782 case _PC_2_SYMLINKS:
1784 case _PC_SYMLINK_MAX:
1786 case _PC_POSIX_PERMISSIONS:
1787 case _PC_POSIX_SECURITY:
1788 if (get_device () == FH_FS)
1789 return pc.has_acls () || pc.fs_is_nfs ();
1799 /* Overlapped I/O */
1801 int __stdcall __attribute__ ((regparm (1)))
1802 fhandler_base_overlapped::setup_overlapped ()
1804 OVERLAPPED *ov = get_overlapped_buffer ();
1805 memset (ov, 0, sizeof (*ov));
1806 set_overlapped (ov);
1807 ov->hEvent = CreateEvent (&sec_none_nih, true, true, NULL);
1809 return ov->hEvent ? 0 : -1;
1812 void __stdcall __attribute__ ((regparm (1)))
1813 fhandler_base_overlapped::destroy_overlapped ()
1815 OVERLAPPED *ov = get_overlapped ();
1816 if (ov && ov->hEvent)
1818 CloseHandle (ov->hEvent);
1822 get_overlapped () = NULL;
1825 bool __stdcall __attribute__ ((regparm (1)))
1826 fhandler_base_overlapped::has_ongoing_io ()
1831 if (!IsEventSignalled (get_overlapped ()->hEvent))
1838 GetOverlappedResult (get_output_handle (), get_overlapped (), &nbytes, 0);
1842 fhandler_base_overlapped::wait_return __stdcall __attribute__ ((regparm (3)))
1843 fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *bytes, bool nonblocking, DWORD len)
1845 if (!get_overlapped ())
1846 return inres ? overlapped_success : overlapped_error;
1848 wait_return res = overlapped_unknown;
1852 else if ((err = GetLastError ()) != ERROR_IO_PENDING)
1853 res = overlapped_error;
1854 else if (!nonblocking)
1857 SetEvent (get_overlapped ()->hEvent); /* Force immediate WFMO return */
1860 *bytes = len; /* Assume that this worked */
1861 io_pending = true; /* but don't allow subsequent */
1862 res = overlapped_success; /* writes until completed */
1864 if (res == overlapped_unknown)
1866 HANDLE w4[3] = { get_overlapped ()->hEvent, signal_arrived,
1867 pthread::get_cancel_event () };
1868 DWORD n = w4[2] ? 3 : 2;
1869 HANDLE h = writing ? get_output_handle () : get_handle ();
1870 DWORD wfres = WaitForMultipleObjects (n, w4, false, INFINITE);
1871 /* Cancelling here to prevent races. It's possible that the I/O has
1872 completed already, in which case this is a no-op. Otherwise,
1873 WFMO returned because 1) This is a non-blocking call, 2) a signal
1874 arrived, or 3) the operation was cancelled. These cases may be
1875 overridden by the return of GetOverlappedResult which could detect
1876 that I/O completion occurred. */
1878 BOOL wores = GetOverlappedResult (h, get_overlapped (), bytes, false);
1879 err = GetLastError ();
1880 ResetEvent (get_overlapped ()->hEvent); /* Probably not needed but CYA */
1881 debug_printf ("wfres %d, wores %d, bytes %u", wfres, wores, *bytes);
1883 res = overlapped_success; /* operation succeeded */
1884 else if (wfres == WAIT_OBJECT_0 + 1)
1886 if (_my_tls.call_signal_handler ())
1887 res = overlapped_signal;
1890 err = ERROR_INVALID_AT_INTERRUPT_TIME; /* forces an EINTR below */
1891 debug_printf ("unhandled signal");
1892 res = overlapped_error;
1895 else if (nonblocking)
1896 res = overlapped_nonblocking_no_data; /* more handling below */
1897 else if (wfres == WAIT_OBJECT_0 + 2)
1898 pthread::static_cancel_self (); /* never returns */
1901 debug_printf ("GetOverLappedResult failed, h %p, bytes %u, w4: %p, %p, %p %E", h, *bytes, w4[0], w4[1], w4[2]);
1902 res = overlapped_error;
1906 if (res == overlapped_success)
1907 debug_printf ("normal %s, %u bytes", writing ? "write" : "read", *bytes);
1908 else if (res == overlapped_signal)
1909 debug_printf ("handled signal");
1910 else if (res == overlapped_nonblocking_no_data)
1912 *bytes = (DWORD) -1;
1914 debug_printf ("no data to read for nonblocking I/O");
1916 else if (err == ERROR_HANDLE_EOF || err == ERROR_BROKEN_PIPE)
1918 debug_printf ("EOF, %E");
1920 res = overlapped_success;
1921 if (writing && err == ERROR_BROKEN_PIPE)
1926 debug_printf ("res %u, err %u", (unsigned) res, err);
1927 *bytes = (DWORD) -1;
1928 __seterrno_from_win_error (err);
1929 if (writing && err == ERROR_NO_DATA)
1936 void __stdcall __attribute__ ((regparm (3)))
1937 fhandler_base_overlapped::raw_read (void *ptr, size_t& len)
1943 bool res = ReadFile (get_handle (), ptr, len, &nbytes,
1945 switch (wait_overlapped (res, false, &nbytes, is_nonblocking ()))
1947 case overlapped_signal:
1948 keep_looping = true;
1950 default: /* Added to quiet gcc */
1951 case overlapped_success:
1952 case overlapped_error:
1953 keep_looping = false;
1957 while (keep_looping);
1958 len = (size_t) nbytes;
1961 ssize_t __stdcall __attribute__ ((regparm (3)))
1962 fhandler_base_overlapped::raw_write (const void *ptr, size_t len)
1965 if (has_ongoing_io ())
1966 nbytes = (DWORD) -1;
1970 if (!max_atomic_write || len < max_atomic_write)
1972 else if (is_nonblocking ())
1973 chunk = len = max_atomic_write;
1975 chunk = max_atomic_write;
1978 DWORD nbytes_now = 0;
1979 /* Write to fd in smaller chunks, accumlating a total.
1980 If there's an error, just return the accumulated total
1981 unless the first write fails, in which case return value
1982 from wait_overlapped(). */
1983 while (nbytes < len)
1985 size_t left = len - nbytes;
1991 bool res = WriteFile (get_output_handle (), ptr, len1, &nbytes_now,
1993 switch (wait_overlapped (res, true, &nbytes_now,
1994 is_nonblocking (), len1))
1996 case overlapped_success:
1997 ptr = ((char *) ptr) + chunk;
1998 nbytes += nbytes_now;
1999 /* fall through intentionally */
2000 case overlapped_signal:
2001 break; /* keep looping */
2002 case overlapped_error:
2003 len = 0; /* terminate loop */
2004 case overlapped_unknown:
2005 case overlapped_nonblocking_no_data:
2010 nbytes = nbytes_now;