summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/miscfuncs.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-02-08 20:57:27 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-02-08 20:57:27 +0000
commit234074f6834dfd090bc6780ffe667b11d3b7c101 (patch)
tree62756a2be569fa69668a74d42d8094ec0cdeb2ec /winsup/cygwin/miscfuncs.cc
parentabbe1f5320881ec7da114a4e0b6d17045d6b5500 (diff)
downloadcygnal-234074f6834dfd090bc6780ffe667b11d3b7c101.tar.gz
cygnal-234074f6834dfd090bc6780ffe667b11d3b7c101.tar.bz2
cygnal-234074f6834dfd090bc6780ffe667b11d3b7c101.zip
* miscfuncs.h (class NT_readline): New class to implement line-wise
reading from file using native NT functions. * miscfuncs.cc (NT_readline::init): New method. * mount.cc (mount_info::from_fstab): Utilize NT_readline to read fstab files.
Diffstat (limited to 'winsup/cygwin/miscfuncs.cc')
-rw-r--r--winsup/cygwin/miscfuncs.cc78
1 files changed, 77 insertions, 1 deletions
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index b2da91846..241819460 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -1,7 +1,7 @@
/* miscfuncs.cc: misc funcs that don't belong anywhere else
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
This file is part of Cygwin.
@@ -384,6 +384,82 @@ WritePipeOverlapped (HANDLE h, LPCVOID buf, DWORD len, LPDWORD ret_len,
return ret;
}
+bool
+NT_readline::init (POBJECT_ATTRIBUTES attr, PCHAR in_buf, ULONG in_buflen)
+{
+ NTSTATUS status;
+ IO_STATUS_BLOCK io;
+
+ status = NtOpenFile (&fh, SYNCHRONIZE | FILE_READ_DATA, attr, &io,
+ FILE_SHARE_VALID_FLAGS,
+ FILE_SYNCHRONOUS_IO_NONALERT
+ | FILE_OPEN_FOR_BACKUP_INTENT);
+ if (!NT_SUCCESS (status))
+ {
+ paranoid_printf ("NtOpenFile(%S) failed, status %y",
+ &attr->ObjectName, status);
+ return false;
+ }
+ buf = in_buf;
+ buflen = in_buflen;
+ got = end = buf;
+ len = 0;
+ line = 1;
+ return true;
+}
+
+PCHAR
+NT_readline::gets ()
+{
+ IO_STATUS_BLOCK io;
+
+ while (true)
+ {
+ /* len == 0 indicates we have to read from the file. */
+ if (!len)
+ {
+ if (!NT_SUCCESS (NtReadFile (fh, NULL, NULL, NULL, &io, got,
+ (buflen - 2) - (got - buf), NULL, NULL)))
+ return NULL;
+ len = io.Information;
+ /* Set end marker. */
+ got[len] = got[len + 1] = '\0';
+ /* Set len to the absolute len of bytes in buf. */
+ len += got - buf;
+ /* Reset got to start reading at the start of the buffer again. */
+ got = end = buf;
+ }
+ else
+ {
+ got = end + 1;
+ ++line;
+ }
+ /* Still some valid full line? */
+ if (got < buf + len)
+ {
+ if ((end = strchr (got, '\n')))
+ {
+ end[end[-1] == '\r' ? -1 : 0] = '\0';
+ return got;
+ }
+ /* Last line missing a \n at EOF? */
+ if (len < buflen - 2)
+ {
+ len = 0;
+ return got;
+ }
+ }
+ /* We have to read once more. Move remaining bytes to the start of
+ the buffer and reposition got so that it points to the end of
+ the remaining bytes. */
+ len = buf + len - got;
+ memmove (buf, got, len);
+ got = buf + len;
+ buf[len] = buf[len + 1] = '\0';
+ len = 0;
+ }
+}
+
/* backslashify: Convert all forward slashes in src path to back slashes
in dst path. Add a trailing slash to dst when trailing_slash_p arg
is set to 1. */