20 |
|
|
21 |
#include "disk.h" |
#include "disk.h" |
22 |
|
|
|
#if (defined(sun) && (defined(__svr4__) || defined(__SVR4))) |
|
|
#define SOLARIS |
|
|
#endif |
|
|
|
|
|
#if (defined(SOLARIS) || defined(__hpux)) |
|
|
#define DIRFD(a) ((a)->dd_fd) |
|
|
#else |
|
|
#define DIRFD(a) (dirfd(a)) |
|
|
#endif |
|
|
|
|
23 |
#include <sys/types.h> |
#include <sys/types.h> |
24 |
#include <sys/stat.h> |
#include <sys/stat.h> |
25 |
#include <unistd.h> |
#include <unistd.h> |
31 |
#include <utime.h> |
#include <utime.h> |
32 |
#include <time.h> /* ctime */ |
#include <time.h> /* ctime */ |
33 |
|
|
34 |
|
#if defined(HAVE_DIRFD) |
35 |
|
#define DIRFD(a) (dirfd(a)) |
36 |
|
#else |
37 |
|
#define DIRFD(a) ((a)->DIR_FD_MEMBER_NAME) |
38 |
|
#endif |
39 |
|
|
40 |
|
/* TODO: let autoconf figure out everything below... */ |
41 |
|
#if (defined(sun) && (defined(__svr4__) || defined(__SVR4))) |
42 |
|
#define SOLARIS |
43 |
|
#endif |
44 |
|
|
45 |
#if (defined(SOLARIS) || defined (__hpux) || defined(__BEOS__)) |
#if (defined(SOLARIS) || defined (__hpux) || defined(__BEOS__)) |
46 |
#include <sys/statvfs.h> /* solaris statvfs */ |
#include <sys/statvfs.h> /* solaris statvfs */ |
820 |
|
|
821 |
switch (info_class) |
switch (info_class) |
822 |
{ |
{ |
823 |
case 3: //FIXME: Why 3? |
case FileBothDirectoryInformation: |
824 |
|
|
825 |
// If a search pattern is received, remember this pattern, and restart search |
// If a search pattern is received, remember this pattern, and restart search |
826 |
if (pattern[0] != 0) |
if (pattern[0] != 0) |
840 |
// Get information for directory entry |
// Get information for directory entry |
841 |
sprintf(fullpath, "%s/%s", dirname, pdirent->d_name); |
sprintf(fullpath, "%s/%s", dirname, pdirent->d_name); |
842 |
|
|
|
/* JIF |
|
|
printf("Stat: %s\n", fullpath); */ |
|
843 |
if (stat(fullpath, &fstat)) |
if (stat(fullpath, &fstat)) |
844 |
{ |
{ |
845 |
perror("stat"); |
switch (errno) |
846 |
out_uint8(out, 0); |
{ |
847 |
return STATUS_ACCESS_DENIED; |
case ENOENT: |
848 |
|
case ELOOP: |
849 |
|
case EACCES: |
850 |
|
/* These are non-fatal errors. */ |
851 |
|
memset(&fstat, 0, sizeof(fstat)); |
852 |
|
break; |
853 |
|
default: |
854 |
|
/* Fatal error. By returning STATUS_NO_SUCH_FILE, |
855 |
|
the directory list operation will be aborted */ |
856 |
|
perror(fullpath); |
857 |
|
out_uint8(out, 0); |
858 |
|
return STATUS_NO_SUCH_FILE; |
859 |
|
} |
860 |
} |
} |
861 |
|
|
862 |
if (S_ISDIR(fstat.st_mode)) |
if (S_ISDIR(fstat.st_mode)) |
900 |
break; |
break; |
901 |
|
|
902 |
default: |
default: |
903 |
|
/* FIXME: Support FileDirectoryInformation, |
904 |
|
FileFullDirectoryInformation, and |
905 |
|
FileNamesInformation */ |
906 |
|
|
907 |
unimpl("IRP Query Directory sub: 0x%x\n", info_class); |
unimpl("IRP Query Directory sub: 0x%x\n", info_class); |
908 |
return STATUS_INVALID_PARAMETER; |
return STATUS_INVALID_PARAMETER; |