/[rdesktop]/sourceforge.net/trunk/rdesktop/disk.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/disk.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 574 by stargo, Wed Jan 21 23:53:55 2004 UTC revision 616 by n-ki, Tue Feb 24 15:24:38 2004 UTC
# Line 24  Line 24 
24  #define FILE_ATTRIBUTE_DIRECTORY                0x00000010  #define FILE_ATTRIBUTE_DIRECTORY                0x00000010
25  #define FILE_ATTRIBUTE_ARCHIVE                  0x00000020  #define FILE_ATTRIBUTE_ARCHIVE                  0x00000020
26  #define FILE_ATTRIBUTE_DEVICE                   0x00000040  #define FILE_ATTRIBUTE_DEVICE                   0x00000040
27    #define FILE_ATTRIBUTE_UNKNOWNXXX0              0x00000060      /* ??? ACTION i.e. 0x860 == compress this file ? */
28  #define FILE_ATTRIBUTE_NORMAL                   0x00000080  #define FILE_ATTRIBUTE_NORMAL                   0x00000080
29  #define FILE_ATTRIBUTE_TEMPORARY                0x00000100  #define FILE_ATTRIBUTE_TEMPORARY                0x00000100
30  #define FILE_ATTRIBUTE_SPARSE_FILE              0x00000200  #define FILE_ATTRIBUTE_SPARSE_FILE              0x00000200
# Line 33  Line 34 
34  #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED      0x00002000  #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED      0x00002000
35  #define FILE_ATTRIBUTE_ENCRYPTED                0x00004000  #define FILE_ATTRIBUTE_ENCRYPTED                0x00004000
36    
37    #define FILE_FLAG_OPEN_NO_RECALL                0x00100000
38    #define FILE_FLAG_OPEN_REPARSE_POINT            0x00200000
39    #define FILE_FLAG_POSIX_SEMANTICS               0x01000000
40    #define FILE_FLAG_BACKUP_SEMANTICS              0x02000000      /* sometimes used to create a directory */
41    #define FILE_FLAG_DELETE_ON_CLOSE               0x04000000
42    #define FILE_FLAG_SEQUENTIAL_SCAN               0x08000000
43    #define FILE_FLAG_RANDOM_ACCESS                 0x10000000
44    #define FILE_FLAG_NO_BUFFERING                  0x20000000
45    #define FILE_FLAG_OVERLAPPED                    0x40000000
46    #define FILE_FLAG_WRITE_THROUGH                 0x80000000
47    
48    #define FILE_SHARE_READ                         0x01
49    #define FILE_SHARE_WRITE                        0x02
50    #define FILE_SHARE_DELETE                       0x04
51    
52  #define FILE_BASIC_INFORMATION                  0x04  #define FILE_BASIC_INFORMATION                  0x04
53  #define FILE_STANDARD_INFORMATION               0x05  #define FILE_STANDARD_INFORMATION               0x05
54    
# Line 68  Line 84 
84  #define SOLARIS  #define SOLARIS
85  #endif  #endif
86    
87  #ifdef SOLARIS  #if (defined(SOLARIS) || defined(__hpux))
88  #define DIRFD(a) ((a)->dd_fd)  #define DIRFD(a) ((a)->dd_fd)
89  #else  #else
90  #define DIRFD(a) (dirfd(a))  #define DIRFD(a) (dirfd(a))
# Line 82  Line 98 
98  #include <fnmatch.h>  #include <fnmatch.h>
99  #include <errno.h>              /* errno */  #include <errno.h>              /* errno */
100    
101  #if defined(SOLARIS)  #include <utime.h>
102    #include <time.h>               /* ctime */
103    
104    
105    #if (defined(SOLARIS) || defined (__hpux) || defined(__BEOS__))
106  #include <sys/statvfs.h>        /* solaris statvfs */  #include <sys/statvfs.h>        /* solaris statvfs */
107    #include <sys/mntent.h>
108    #define HAVE_MNTENT_H
109    #define MNTENT_PATH "/etc/mnttab"
110  #define STATFS_FN(path, buf) (statvfs(path,buf))  #define STATFS_FN(path, buf) (statvfs(path,buf))
111  #define STATFS_T statvfs  #define STATFS_T statvfs
112  #define F_NAMELEN(buf) ((buf).f_namemax)  #define F_NAMELEN(buf) ((buf).f_namemax)
113    
114  #elif defined(__OpenBSD__)  #elif (defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__))
115  #include <sys/param.h>  #include <sys/param.h>
116  #include <sys/mount.h>  #include <sys/mount.h>
117  #define STATFS_FN(path, buf) (statfs(path,buf))  #define STATFS_FN(path, buf) (statfs(path,buf))
# Line 97  Line 120 
120    
121  #else  #else
122  #include <sys/vfs.h>            /* linux statfs */  #include <sys/vfs.h>            /* linux statfs */
123    #include <mntent.h>
124    #define HAVE_MNTENT_H
125    #define MNTENT_PATH "/etc/mtab"
126  #define STATFS_FN(path, buf) (statfs(path,buf))  #define STATFS_FN(path, buf) (statfs(path,buf))
127  #define STATFS_T statfs  #define STATFS_T statfs
128  #define F_NAMELEN(buf) ((buf).f_namelen)  #define F_NAMELEN(buf) ((buf).f_namelen)
# Line 117  struct fileinfo Line 143  struct fileinfo
143  }  }
144  g_fileinfo[MAX_OPEN_FILES];  g_fileinfo[MAX_OPEN_FILES];
145    
146    typedef struct
147    {
148            char name[256];
149            char label[256];
150            unsigned long serial;
151            char type[256];
152    } FsInfoType;
153    
154    
155    time_t
156    get_create_time(struct stat *st)
157    {
158            time_t ret, ret1;
159    
160            ret = MIN(st->st_ctime, st->st_mtime);
161            ret1 = MIN(ret, st->st_atime);
162    
163            if (ret1 != (time_t) 0)
164                    return ret1;
165    
166            return ret;
167    }
168    
169  /* Convert seconds since 1970 to a filetime */  /* Convert seconds since 1970 to a filetime */
170  void  void
171  seconds_since_1970_to_filetime(time_t seconds, uint32 * high, uint32 * low)  seconds_since_1970_to_filetime(time_t seconds, uint32 * high, uint32 * low)
# Line 128  seconds_since_1970_to_filetime(time_t se Line 177  seconds_since_1970_to_filetime(time_t se
177          *high = (uint32) (ticks >> 32);          *high = (uint32) (ticks >> 32);
178  }  }
179    
180    /* Convert seconds since 1970 back to filetime */
181    time_t
182    convert_1970_to_filetime(uint32 high, uint32 low)
183    {
184            unsigned long long ticks;
185            time_t val;
186    
187            ticks = low + (((unsigned long long) high) << 32);
188            ticks /= 10000000;
189            ticks -= 11644473600LL;
190    
191            val = (time_t) ticks;
192            return (val);
193    
194    }
195    
196    
197  /* Enumeration of devices from rdesktop.c        */  /* Enumeration of devices from rdesktop.c        */
198  /* returns numer of units found and initialized. */  /* returns numer of units found and initialized. */
199  /* optarg looks like ':h:=/mnt/floppy,b:=/mnt/usbdevice1' */  /* optarg looks like ':h=/mnt/floppy,b=/mnt/usbdevice1' */
200  /* when it arrives to this function.             */  /* when it arrives to this function.             */
201  int  int
202  disk_enum_devices(int *id, char *optarg)  disk_enum_devices(uint32 * id, char *optarg)
203  {  {
204          char *pos = optarg;          char *pos = optarg;
205          char *pos2;          char *pos2;
# Line 163  disk_enum_devices(int *id, char *optarg) Line 229  disk_enum_devices(int *id, char *optarg)
229          return count;          return count;
230  }  }
231    
232  /* Opens of creates a file or directory */  /* Opens or creates a file or directory */
233  NTSTATUS  NTSTATUS
234  disk_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,  disk_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,
235              uint32 flags_and_attributes, char *filename, HANDLE * phandle)              uint32 flags_and_attributes, char *filename, HANDLE * phandle)
# Line 172  disk_create(uint32 device_id, uint32 acc Line 238  disk_create(uint32 device_id, uint32 acc
238          DIR *dirp;          DIR *dirp;
239          int flags, mode;          int flags, mode;
240          char path[256];          char path[256];
241            struct stat filestat;
242    
243          handle = 0;          handle = 0;
244          dirp = NULL;          dirp = NULL;
245          flags = 0;          flags = 0;
246          mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;          mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
247    
248    
249          if (filename[strlen(filename) - 1] == '/')          if (filename[strlen(filename) - 1] == '/')
250                  filename[strlen(filename) - 1] = 0;                  filename[strlen(filename) - 1] = 0;
251          sprintf(path, "%s%s", g_rdpdr_device[device_id].local_path, filename);          sprintf(path, "%s%s", g_rdpdr_device[device_id].local_path, filename);
         //printf("Open: %s\n", path);  
252    
253          switch (create_disposition)          switch (create_disposition)
254          {          {
# Line 216  disk_create(uint32 device_id, uint32 acc Line 283  disk_create(uint32 device_id, uint32 acc
283                          break;                          break;
284          }          }
285    
286            //printf("Open: \"%s\"  flags: %u, accessmask: %u sharemode: %u create disp: %u\n", path, flags_and_attributes, accessmask, sharemode, create_disposition);
287    
288            // Get information about file and set that flag ourselfs
289            if ((stat(path, &filestat) == 0) && (S_ISDIR(filestat.st_mode)))
290            {
291                    if (flags_and_attributes & FILE_NON_DIRECTORY_FILE)
292                            return STATUS_FILE_IS_A_DIRECTORY;
293                    else
294                            flags_and_attributes |= FILE_DIRECTORY_FILE;
295            }
296    
297          if (flags_and_attributes & FILE_DIRECTORY_FILE)          if (flags_and_attributes & FILE_DIRECTORY_FILE)
298          {          {
299                  if (flags & O_CREAT)                  if (flags & O_CREAT)
# Line 246  disk_create(uint32 device_id, uint32 acc Line 324  disk_create(uint32 device_id, uint32 acc
324          }          }
325          else          else
326          {          {
327    
328                  if (accessmask & GENERIC_ALL                  if (accessmask & GENERIC_ALL
329                      || (accessmask & GENERIC_READ && accessmask & GENERIC_WRITE))                      || (accessmask & GENERIC_READ && accessmask & GENERIC_WRITE))
330                  {                  {
# Line 265  disk_create(uint32 device_id, uint32 acc Line 344  disk_create(uint32 device_id, uint32 acc
344                  {                  {
345                          switch (errno)                          switch (errno)
346                          {                          {
347                                    case EISDIR:
348    
349                                            return STATUS_FILE_IS_A_DIRECTORY;
350    
351                                  case EACCES:                                  case EACCES:
352    
353                                          return STATUS_ACCESS_DENIED;                                          return STATUS_ACCESS_DENIED;
# Line 272  disk_create(uint32 device_id, uint32 acc Line 355  disk_create(uint32 device_id, uint32 acc
355                                  case ENOENT:                                  case ENOENT:
356    
357                                          return STATUS_NO_SUCH_FILE;                                          return STATUS_NO_SUCH_FILE;
358                                    case EEXIST:
359    
360                                            return STATUS_OBJECT_NAME_COLLISION;
361                                  default:                                  default:
362    
363                                          perror("open");                                          perror("open");
364                                          return STATUS_NO_SUCH_FILE;                                          return STATUS_NO_SUCH_FILE;
365                          }                          }
366                  }                  }
367    
368                    /* all read and writes of files should be non blocking */
369                    if (fcntl(handle, F_SETFL, O_NONBLOCK) == -1)
370                            perror("fcntl");
371          }          }
372    
373          if (handle >= MAX_OPEN_FILES)          if (handle >= MAX_OPEN_FILES)
# Line 323  disk_read(HANDLE handle, uint8 * data, u Line 412  disk_read(HANDLE handle, uint8 * data, u
412  {  {
413          int n;          int n;
414    
415          if (offset)  #if 0
416                  lseek(handle, offset, SEEK_SET);          /* browsing dir ????        */
417            /* each request is 24 bytes */
418            if (g_fileinfo[handle].flags_and_attributes & FILE_DIRECTORY_FILE)
419            {
420                    *result = 0;
421                    return STATUS_SUCCESS;
422            }
423    #endif
424    
425            lseek(handle, offset, SEEK_SET);
426    
427          n = read(handle, data, length);          n = read(handle, data, length);
428    
429          if (n < 0)          if (n < 0)
430          {          {
                 perror("read");  
431                  *result = 0;                  *result = 0;
432                  return STATUS_INVALID_PARAMETER;                  switch (errno)
433                    {
434                            case EISDIR:
435                                    return STATUS_FILE_IS_A_DIRECTORY;
436                            default:
437                                    perror("read");
438                                    return STATUS_INVALID_PARAMETER;
439                    }
440          }          }
441    
442          *result = n;          *result = n;
# Line 344  disk_write(HANDLE handle, uint8 * data, Line 449  disk_write(HANDLE handle, uint8 * data,
449  {  {
450          int n;          int n;
451    
452          if (offset)          lseek(handle, offset, SEEK_SET);
                 lseek(handle, offset, SEEK_SET);  
453    
454          n = write(handle, data, length);          n = write(handle, data, length);
455    
# Line 353  disk_write(HANDLE handle, uint8 * data, Line 457  disk_write(HANDLE handle, uint8 * data,
457          {          {
458                  perror("write");                  perror("write");
459                  *result = 0;                  *result = 0;
460                  return STATUS_ACCESS_DENIED;                  switch (errno)
461                    {
462                            case ENOSPC:
463                                    return STATUS_DISK_FULL;
464                            default:
465                                    return STATUS_ACCESS_DENIED;
466                    }
467          }          }
468    
469          *result = n;          *result = n;
# Line 381  disk_query_information(HANDLE handle, ui Line 491  disk_query_information(HANDLE handle, ui
491          // Set file attributes          // Set file attributes
492          file_attributes = 0;          file_attributes = 0;
493          if (S_ISDIR(filestat.st_mode))          if (S_ISDIR(filestat.st_mode))
         {  
494                  file_attributes |= FILE_ATTRIBUTE_DIRECTORY;                  file_attributes |= FILE_ATTRIBUTE_DIRECTORY;
495          }  
496          filename = 1 + strrchr(path, '/');          filename = 1 + strrchr(path, '/');
497          if (filename && filename[0] == '.')          if (filename && filename[0] == '.')
         {  
498                  file_attributes |= FILE_ATTRIBUTE_HIDDEN;                  file_attributes |= FILE_ATTRIBUTE_HIDDEN;
499          }  
500            if (!file_attributes)
501                    file_attributes |= FILE_ATTRIBUTE_NORMAL;
502    
503            if (!(filestat.st_mode & S_IWUSR))
504                    file_attributes |= FILE_ATTRIBUTE_READONLY;
505    
506          // Return requested data          // Return requested data
507          switch (info_class)          switch (info_class)
508          {          {
509                  case 4: /* FileBasicInformation */                  case 4: /* FileBasicInformation */
510                            seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high,
511                          out_uint8s(out, 8);     //create_time not available;                                                         &ft_low);
512                            out_uint32_le(out, ft_low);     //create_access_time
513                            out_uint32_le(out, ft_high);
514    
515                          seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);                          seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);
516                          out_uint32_le(out, ft_low);     //last_access_time                          out_uint32_le(out, ft_low);     //last_access_time
# Line 405  disk_query_information(HANDLE handle, ui Line 520  disk_query_information(HANDLE handle, ui
520                          out_uint32_le(out, ft_low);     //last_write_time                          out_uint32_le(out, ft_low);     //last_write_time
521                          out_uint32_le(out, ft_high);                          out_uint32_le(out, ft_high);
522    
523                          out_uint8s(out, 8);     //unknown zero                          seconds_since_1970_to_filetime(filestat.st_ctime, &ft_high, &ft_low);
524                            out_uint32_le(out, ft_low);     //last_change_time
525                            out_uint32_le(out, ft_high);
526    
527                          out_uint32_le(out, file_attributes);                          out_uint32_le(out, file_attributes);
528                          break;                          break;
529    
# Line 441  disk_set_information(HANDLE handle, uint Line 559  disk_set_information(HANDLE handle, uint
559          char newname[256], fullpath[256];          char newname[256], fullpath[256];
560          struct fileinfo *pfinfo;          struct fileinfo *pfinfo;
561    
562            int mode;
563            struct stat filestat;
564            time_t write_time, change_time, access_time, mod_time;
565            struct utimbuf tvs;
566            struct STATFS_T stat_fs;
567    
568          pfinfo = &(g_fileinfo[handle]);          pfinfo = &(g_fileinfo[handle]);
569    
570          switch (info_class)          switch (info_class)
571          {          {
572                  case 4: /* FileBasicInformation */                  case 4: /* FileBasicInformation */
573                            write_time = change_time = access_time = 0;
574    
575                            in_uint8s(in, 4);       /* Handle of root dir? */
576                            in_uint8s(in, 24);      /* unknown */
577    
578                            // CreationTime
579                            in_uint32_le(in, ft_low);
580                            in_uint32_le(in, ft_high);
581    
582                            // AccessTime
583                            in_uint32_le(in, ft_low);
584                            in_uint32_le(in, ft_high);
585                            if (ft_low || ft_high)
586                                    access_time = convert_1970_to_filetime(ft_high, ft_low);
587    
588                            // WriteTime
589                            in_uint32_le(in, ft_low);
590                            in_uint32_le(in, ft_high);
591                            if (ft_low || ft_high)
592                                    write_time = convert_1970_to_filetime(ft_high, ft_low);
593    
594                            // ChangeTime
595                            in_uint32_le(in, ft_low);
596                            in_uint32_le(in, ft_high);
597                            if (ft_low || ft_high)
598                                    change_time = convert_1970_to_filetime(ft_high, ft_low);
599    
600                            in_uint32_le(in, file_attributes);
601    
602                            if (fstat(handle, &filestat))
603                                    return STATUS_ACCESS_DENIED;
604    
605                            tvs.modtime = filestat.st_mtime;
606                            tvs.actime = filestat.st_atime;
607                            if (access_time)
608                                    tvs.actime = access_time;
609    
610    
611                            if (write_time || change_time)
612                                    mod_time = MIN(write_time, change_time);
613                            else
614                                    mod_time = write_time ? write_time : change_time;
615    
616                            if (mod_time)
617                                    tvs.modtime = mod_time;
618    
619    
620                            if (access_time || write_time || change_time)
621                            {
622    #if WITH_DEBUG_RDP5
623                                    printf("FileBasicInformation access       time %s",
624                                           ctime(&tvs.actime));
625                                    printf("FileBasicInformation modification time %s",
626                                           ctime(&tvs.modtime));
627    #endif
628                                    if (utime(pfinfo->path, &tvs))
629                                            return STATUS_ACCESS_DENIED;
630                            }
631    
632                            if (!file_attributes)
633                                    break;  // not valid
634    
635                            mode = filestat.st_mode;
636    
637                            if (file_attributes & FILE_ATTRIBUTE_READONLY)
638                                    mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
639                            else
640                                    mode |= S_IWUSR;
641    
642                            mode &= 0777;
643    #if WITH_DEBUG_RDP5
644                            printf("FileBasicInformation set access mode 0%o", mode);
645    #endif
646    
647                            if (fchmod(handle, mode))
648                                    return STATUS_ACCESS_DENIED;
649    
                         // Probably safe to ignore  
650                          break;                          break;
651    
652                  case 10:        /* FileRenameInformation */                  case 10:        /* FileRenameInformation */
# Line 479  disk_set_information(HANDLE handle, uint Line 678  disk_set_information(HANDLE handle, uint
678                  case 13:        /* FileDispositionInformation */                  case 13:        /* FileDispositionInformation */
679    
680                          //unimpl("IRP Set File Information class: FileDispositionInformation\n");                          //unimpl("IRP Set File Information class: FileDispositionInformation\n");
681                          // in_uint32_le(in, delete_on_close);  
682                            //in_uint32_le(in, delete_on_close);
683                          // disk_close(handle);                          // disk_close(handle);
684                          unlink(pfinfo->path);                          if ((pfinfo->flags_and_attributes & FILE_DIRECTORY_FILE))       // remove a directory
685                            {
686                                    if (rmdir(pfinfo->path) < 0)
687                                            return STATUS_ACCESS_DENIED;
688                            }
689                            else if (unlink(pfinfo->path) < 0)      // unlink a file
690                                    return STATUS_ACCESS_DENIED;
691    
692                          break;                          break;
693    
694                  case 19:        /* FileAllocationInformation */                  case 19:        /* FileAllocationInformation */
# Line 490  disk_set_information(HANDLE handle, uint Line 697  disk_set_information(HANDLE handle, uint
697                          break;                          break;
698    
699                  case 20:        /* FileEndOfFileInformation */                  case 20:        /* FileEndOfFileInformation */
700                            in_uint8s(in, 28);      /* unknown */
701                            in_uint32_le(in, length);       /* file size */
702    
703                          unimpl("IRP Set File Information class: FileEndOfFileInformation\n");                          /* prevents start of writing if not enough space left on device */
704                            if (STATFS_FN(g_rdpdr_device[pfinfo->device_id].local_path, &stat_fs) == 0)
705                                    if (stat_fs.f_bsize * stat_fs.f_bfree < length)
706                                            return STATUS_DISK_FULL;
707    
708                            //printf("FileEndOfFileInformation length = %d\n", length);
709                            // ????????????
710                            //unimpl("IRP Set File Information class: FileEndOfFileInformation\n");
711                          break;                          break;
   
712                  default:                  default:
713    
714                          unimpl("IRP Set File Information class: 0x%x\n", info_class);                          unimpl("IRP Set File Information class: 0x%x\n", info_class);
# Line 502  disk_set_information(HANDLE handle, uint Line 717  disk_set_information(HANDLE handle, uint
717          return STATUS_SUCCESS;          return STATUS_SUCCESS;
718  }  }
719    
720    FsInfoType *
721    FsVolumeInfo(char *fpath)
722    {
723    
724    #ifdef HAVE_MNTENT_H
725            FILE *fdfs;
726            struct mntent *e;
727            static FsInfoType info;
728    
729            /* initialize */
730            memset(&info, 0, sizeof(info));
731            strcpy(info.label, "RDESKTOP");
732            strcpy(info.type, "RDPFS");
733    
734            fdfs = setmntent(MNTENT_PATH, "r");
735            if (!fdfs)
736                    return &info;
737    
738            while ((e = getmntent(fdfs)))
739            {
740                    if (strncmp(fpath, e->mnt_dir, strlen(fpath)) == 0)
741                    {
742                            strcpy(info.type, e->mnt_type);
743                            strcpy(info.name, e->mnt_fsname);
744                            if (strstr(e->mnt_opts, "vfat") || strstr(e->mnt_opts, "iso9660"))
745                            {
746                                    int fd = open(e->mnt_fsname, O_RDONLY);
747                                    if (fd >= 0)
748                                    {
749                                            unsigned char buf[512];
750                                            memset(buf, 0, sizeof(buf));
751                                            if (strstr(e->mnt_opts, "vfat"))
752                                                     /*FAT*/
753                                            {
754                                                    strcpy(info.type, "vfat");
755                                                    read(fd, buf, sizeof(buf));
756                                                    info.serial =
757                                                            (buf[42] << 24) + (buf[41] << 16) +
758                                                            (buf[40] << 8) + buf[39];
759                                                    strncpy(info.label, buf + 43, 10);
760                                                    info.label[10] = '\0';
761                                            }
762                                            else if (lseek(fd, 32767, SEEK_SET) >= 0)       /* ISO9660 */
763                                            {
764                                                    read(fd, buf, sizeof(buf));
765                                                    strncpy(info.label, buf + 41, 32);
766                                                    info.label[32] = '\0';
767                                                    //info.Serial = (buf[128]<<24)+(buf[127]<<16)+(buf[126]<<8)+buf[125];
768                                            }
769                                            close(fd);
770                                    }
771                            }
772                    }
773            }
774            endmntent(fdfs);
775    #else
776            static FsInfoType info;
777    
778            /* initialize */
779            memset(&info, 0, sizeof(info));
780            strcpy(info.label, "RDESKTOP");
781            strcpy(info.type, "RDPFS");
782    
783    #endif
784            return &info;
785    }
786    
787    
788  NTSTATUS  NTSTATUS
789  disk_query_volume_information(HANDLE handle, uint32 info_class, STREAM out)  disk_query_volume_information(HANDLE handle, uint32 info_class, STREAM out)
790  {  {
         char *volume, *fs_type;  
791          struct STATFS_T stat_fs;          struct STATFS_T stat_fs;
792          struct fileinfo *pfinfo;          struct fileinfo *pfinfo;
793            FsInfoType *fsinfo;
794    
795          pfinfo = &(g_fileinfo[handle]);          pfinfo = &(g_fileinfo[handle]);
         volume = "RDESKTOP";  
         fs_type = "RDPFS";  
796    
797          if (STATFS_FN(pfinfo->path, &stat_fs) != 0)     /* FIXME: statfs is not portable */          if (STATFS_FN(pfinfo->path, &stat_fs) != 0)
798          {          {
799                  perror("statfs");                  perror("statfs");
800                  return STATUS_ACCESS_DENIED;                  return STATUS_ACCESS_DENIED;
801          }          }
802    
803            fsinfo = FsVolumeInfo(pfinfo->path);
804    
805          switch (info_class)          switch (info_class)
806          {          {
807                  case 1: /* FileFsVolumeInformation */                  case 1: /* FileFsVolumeInformation */
808    
809                          out_uint32_le(out, 0);  /* volume creation time low */                          out_uint32_le(out, 0);  /* volume creation time low */
810                          out_uint32_le(out, 0);  /* volume creation time high */                          out_uint32_le(out, 0);  /* volume creation time high */
811                          out_uint32_le(out, 0);  /* serial */                          out_uint32_le(out, fsinfo->serial);     /* serial */
812                          out_uint32_le(out, 2 * strlen(volume)); /* length of string */  
813                            out_uint32_le(out, 2 * strlen(fsinfo->label));  /* length of string */
814    
815                          out_uint8(out, 0);      /* support objects? */                          out_uint8(out, 0);      /* support objects? */
816                          rdp_out_unistr(out, volume, 2 * strlen(volume) - 2);                          rdp_out_unistr(out, fsinfo->label, 2 * strlen(fsinfo->label) - 2);
817                          break;                          break;
818    
819                  case 3: /* FileFsSizeInformation */                  case 3: /* FileFsSizeInformation */
# Line 545  disk_query_volume_information(HANDLE han Line 830  disk_query_volume_information(HANDLE han
830    
831                          out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED);   /* fs attributes */                          out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED);   /* fs attributes */
832                          out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */                          out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */
833                          out_uint32_le(out, 2 * strlen(fs_type));        /* length of fs_type */  
834                          rdp_out_unistr(out, fs_type, 2 * strlen(fs_type) - 2);                          out_uint32_le(out, 2 * strlen(fsinfo->type));   /* length of fs_type */
835                            rdp_out_unistr(out, fsinfo->type, 2 * strlen(fsinfo->type) - 2);
836                          break;                          break;
837    
838                  case 2: /* FileFsLabelInformation */                  case 2: /* FileFsLabelInformation */
# Line 592  disk_query_directory(HANDLE handle, uint Line 878  disk_query_directory(HANDLE handle, uint
878                          // find next dirent matching pattern                          // find next dirent matching pattern
879                          pdirent = readdir(pdir);                          pdirent = readdir(pdir);
880                          while (pdirent && fnmatch(pfinfo->pattern, pdirent->d_name, 0) != 0)                          while (pdirent && fnmatch(pfinfo->pattern, pdirent->d_name, 0) != 0)
                         {  
881                                  pdirent = readdir(pdir);                                  pdirent = readdir(pdir);
                         }  
882    
883                          if (pdirent == NULL)                          if (pdirent == NULL)
                         {  
884                                  return STATUS_NO_MORE_FILES;                                  return STATUS_NO_MORE_FILES;
                         }  
885    
886                          // Get information for directory entry                          // Get information for directory entry
887                          sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);                          sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
888                          /* JIF  
889                            /* JIF
890                             printf("Stat: %s\n", fullpath); */                             printf("Stat: %s\n", fullpath); */
891                          if (stat(fullpath, &fstat))                          if (stat(fullpath, &fstat))
892                          {                          {
# Line 616  disk_query_directory(HANDLE handle, uint Line 899  disk_query_directory(HANDLE handle, uint
899                                  file_attributes |= FILE_ATTRIBUTE_DIRECTORY;                                  file_attributes |= FILE_ATTRIBUTE_DIRECTORY;
900                          if (pdirent->d_name[0] == '.')                          if (pdirent->d_name[0] == '.')
901                                  file_attributes |= FILE_ATTRIBUTE_HIDDEN;                                  file_attributes |= FILE_ATTRIBUTE_HIDDEN;
902                            if (!file_attributes)
903                                    file_attributes |= FILE_ATTRIBUTE_NORMAL;
904                            if (!(fstat.st_mode & S_IWUSR))
905                                    file_attributes |= FILE_ATTRIBUTE_READONLY;
906    
907                          // Return requested information                          // Return requested information
908                          out_uint8s(out, 8);     //unknown zero                          out_uint8s(out, 8);     //unknown zero
909                          out_uint8s(out, 8);     //create_time not available in posix;  
910                            seconds_since_1970_to_filetime(get_create_time(&fstat), &ft_high, &ft_low);
911                            out_uint32_le(out, ft_low);     // create time
912                            out_uint32_le(out, ft_high);
913    
914                          seconds_since_1970_to_filetime(fstat.st_atime, &ft_high, &ft_low);                          seconds_since_1970_to_filetime(fstat.st_atime, &ft_high, &ft_low);
915                          out_uint32_le(out, ft_low);     //last_access_time                          out_uint32_le(out, ft_low);     //last_access_time
# Line 629  disk_query_directory(HANDLE handle, uint Line 919  disk_query_directory(HANDLE handle, uint
919                          out_uint32_le(out, ft_low);     //last_write_time                          out_uint32_le(out, ft_low);     //last_write_time
920                          out_uint32_le(out, ft_high);                          out_uint32_le(out, ft_high);
921    
922                          out_uint8s(out, 8);     //unknown zero                          seconds_since_1970_to_filetime(fstat.st_ctime, &ft_high, &ft_low);
923                            out_uint32_le(out, ft_low);     //change_write_time
924                            out_uint32_le(out, ft_high);
925    
926                          out_uint32_le(out, fstat.st_size);      //filesize low                          out_uint32_le(out, fstat.st_size);      //filesize low
927                          out_uint32_le(out, 0);  //filesize high                          out_uint32_le(out, 0);  //filesize high
928                          out_uint32_le(out, fstat.st_size);      //filesize low                          out_uint32_le(out, fstat.st_size);      //filesize low
# Line 651  disk_query_directory(HANDLE handle, uint Line 944  disk_query_directory(HANDLE handle, uint
944          return STATUS_SUCCESS;          return STATUS_SUCCESS;
945  }  }
946    
947    
948    
949    static NTSTATUS
950    disk_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)
951    {
952            uint32 result;
953    
954            if (((request >> 16) != 20) || ((request >> 16) != 9))
955                    return STATUS_INVALID_PARAMETER;
956    
957            /* extract operation */
958            request >>= 2;
959            request &= 0xfff;
960    
961            printf("DISK IOCTL %d\n", request);
962    
963            switch (request)
964            {
965                    case 25:        // ?
966                    case 42:        // ?
967                    default:
968                            unimpl("DISK IOCTL %d\n", request);
969                            return STATUS_INVALID_PARAMETER;
970            }
971    
972            return STATUS_SUCCESS;
973    }
974    
975  DEVICE_FNS disk_fns = {  DEVICE_FNS disk_fns = {
976          disk_create,          disk_create,
977          disk_close,          disk_close,
978          disk_read,          disk_read,
979          disk_write,          disk_write,
980          NULL                    /* device_control */          disk_device_control     /* device_control */
981  };  };

Legend:
Removed from v.574  
changed lines
  Added in v.616

  ViewVC Help
Powered by ViewVC 1.1.26