* fhandler_disk_file.cc (path_conv::ndisk_links): Rename from num_entries.
Accept an argument and calculate any extra links needed based on missing . and .. entries. (fhandler_disk_file::fstat_helper): Always call pc->ndisks_links() to calculate the number of links. * path.h (path_conv::ndisk_links): Declare.
This commit is contained in:
parent
ce044d8fe0
commit
9e24b8ace9
@ -1,3 +1,12 @@
|
||||
2003-09-11 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* fhandler_disk_file.cc (path_conv::ndisk_links): Rename from
|
||||
num_entries. Accept an argument and calculate any extra links needed
|
||||
based on missing . and .. entries.
|
||||
(fhandler_disk_file::fstat_helper): Always call pc->ndisks_links() to
|
||||
calculate the number of links.
|
||||
* path.h (path_conv::ndisk_links): Declare.
|
||||
|
||||
2003-09-11 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* path.cc (normalize_posix_path): Put check for '//' prefix back to
|
||||
|
@ -29,36 +29,64 @@ details. */
|
||||
#define _COMPILING_NEWLIB
|
||||
#include <dirent.h>
|
||||
|
||||
static int __stdcall
|
||||
num_entries (const char *win32_name)
|
||||
unsigned __stdcall
|
||||
path_conv::ndisk_links (DWORD nNumberOfLinks)
|
||||
{
|
||||
WIN32_FIND_DATA buf;
|
||||
HANDLE handle;
|
||||
char buf1[MAX_PATH];
|
||||
int count = 0;
|
||||
if (!isdir () || isremote ())
|
||||
return nNumberOfLinks;
|
||||
|
||||
strcpy (buf1, win32_name);
|
||||
int len = strlen (buf1);
|
||||
if (len == 0 || isdirsep (buf1[len - 1]))
|
||||
strcat (buf1, "*");
|
||||
else
|
||||
strcat (buf1, "/*"); /* */
|
||||
int len = strlen (*this);
|
||||
char fn[len + 3];
|
||||
strcpy (fn, *this);
|
||||
|
||||
handle = FindFirstFileA (buf1, &buf);
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 2; /* 2 is the minimum number of links to a dir, so... */
|
||||
int saw_dot = 2;
|
||||
while (FindNextFileA (handle, &buf))
|
||||
const char *s;
|
||||
unsigned count;
|
||||
if (nNumberOfLinks <= 1)
|
||||
{
|
||||
if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
count++;
|
||||
if (buf.cFileName[0] == '.'
|
||||
&& (buf.cFileName[1] == '\0'
|
||||
|| (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0')))
|
||||
saw_dot--;
|
||||
s = "/*";
|
||||
count = 0;
|
||||
}
|
||||
FindClose (handle);
|
||||
else
|
||||
{
|
||||
s = "/..";
|
||||
count = nNumberOfLinks;
|
||||
}
|
||||
|
||||
if (len == 0 || isdirsep (fn[len - 1]))
|
||||
strcpy (fn, s + 1);
|
||||
else
|
||||
strcat (fn, s);
|
||||
|
||||
WIN32_FIND_DATA buf;
|
||||
HANDLE h = FindFirstFile (fn, &buf);
|
||||
|
||||
int saw_dot = 2;
|
||||
if (h != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (nNumberOfLinks > 1)
|
||||
saw_dot--;
|
||||
else
|
||||
while (FindNextFileA (h, &buf))
|
||||
{
|
||||
if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
count++;
|
||||
if (buf.cFileName[0] == '.'
|
||||
&& (buf.cFileName[1] == '\0'
|
||||
|| (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0')))
|
||||
saw_dot--;
|
||||
}
|
||||
FindClose (h);
|
||||
}
|
||||
|
||||
if (nNumberOfLinks > 1)
|
||||
{
|
||||
fn[len + 2] = '\0';
|
||||
h = FindFirstFile (fn, &buf);
|
||||
if (h)
|
||||
saw_dot--;
|
||||
FindClose (h);
|
||||
}
|
||||
|
||||
return count + saw_dot;
|
||||
}
|
||||
|
||||
@ -212,10 +240,7 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc,
|
||||
This is too slow on remote drives, so we do without it.
|
||||
Setting the count to 2 confuses `find (1)' command. So
|
||||
let's try it with `1' as link count. */
|
||||
if (pc->isdir () && !pc->isremote () && nNumberOfLinks == 1)
|
||||
buf->st_nlink = num_entries (pc->get_win32 ());
|
||||
else
|
||||
buf->st_nlink = nNumberOfLinks;
|
||||
buf->st_nlink = pc->ndisk_links (nNumberOfLinks);
|
||||
|
||||
/* Assume that if a drive has ACL support it MAY have valid "inodes".
|
||||
It definitely does not have valid inodes if it does not have ACL
|
||||
|
@ -164,6 +164,7 @@ class path_conv
|
||||
DWORD volser () { return fs.serial; }
|
||||
const char *volname () {return fs.name; }
|
||||
void fillin (HANDLE h);
|
||||
unsigned __stdcall ndisk_links (DWORD);
|
||||
char *normalized_path;
|
||||
private:
|
||||
char path[MAX_PATH];
|
||||
|
Loading…
x
Reference in New Issue
Block a user