a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* -*- c-basic-offset: 8 -*-
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdesktop: A Remote Desktop Protocol client.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Disk Redirection
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (C) Jeroen Meijer <jeroen@oldambt7.com> 2003-2008
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright 2003-2011 Peter Astrand <astrand@cendio.se> for Cendio AB
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is free software: you can redistribute it and/or modify
a180a41bba1d50822df23fff0099e90b86638b89vboxsync it under the terms of the GNU General Public License as published by
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the Free Software Foundation, either version 3 of the License, or
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (at your option) any later version.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is distributed in the hope that it will be useful,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
a180a41bba1d50822df23fff0099e90b86638b89vboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync GNU General Public License for more details.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync You should have received a copy of the GNU General Public License
a180a41bba1d50822df23fff0099e90b86638b89vboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * Oracle GPL Disclaimer: For the avoidance of doubt, except that if any license choice
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * the General Public License version 2 (GPLv2) at this time for any software where
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * a choice of GPL license versions is made available with the language indicating
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * that GPLv2 or any later version may be used, or where a choice of which version
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * of the GPL is applied is otherwise unspecified.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <dirent.h> /* opendir, closedir, readdir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* TODO: Fix mntent-handling for solaris
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * #include <sys/mntent.h> */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if (defined(HAVE_MNTENT_H) && defined(HAVE_SETMNTENT))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define STATFS_FN(path, buf) (statfs(path,buf,sizeof(buf)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if (defined(STAT_STATFS2_FS_DATA) || defined(STAT_STATFS2_BSIZE) || defined(STAT_STATFS2_FSIZE))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define STATFS_FN(path, buf) (statfs(path,buf,sizeof(buf),0))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if ((defined(USE_STATFS) && defined(HAVE_STRUCT_STATFS_F_NAMEMAX)) || (defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_NAMEMAX)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if ((defined(USE_STATFS) && defined(HAVE_STRUCT_STATFS_F_NAMELEN)) || (defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_NAMELEN)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Dummy statfs fallback */
a180a41bba1d50822df23fff0099e90b86638b89vboxsynctypedef struct
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic RD_NTSTATUS NotifyInfo(RD_NTHANDLE handle, uint32 info_class, NOTIFY * p);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Convert seconds since 1970 to a filetime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncseconds_since_1970_to_filetime(time_t seconds, uint32 * high, uint32 * low)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Convert seconds since 1970 back to filetime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* A wrapper for ftruncate which supports growing files, even if the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync native ftruncate doesn't. This is needed on Linux FAT filesystems,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for example. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Try the simple method first */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Some kind of error. Perhaps we were trying to grow. Retry
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * in a safe way.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Get current position */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Seek to new size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Write a zero */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Truncate. This shouldn't fail. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Restore position */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Just like open(2), but if a open with O_EXCL fails, retry with
a180a41bba1d50822df23fff0099e90b86638b89vboxsync GUARDED semantics. This might be necessary because some filesystems
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (such as NFS filesystems mounted from a unfsd server) doesn't
a180a41bba1d50822df23fff0099e90b86638b89vboxsync support O_EXCL. GUARDED semantics are subject to race conditions,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but we can live with that.
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncopen_weak_exclusive(const char *pathname, int flags, mode_t mode)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Success, or not using O_EXCL */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* An error occured, and we are using O_EXCL. In case the FS
a180a41bba1d50822df23fff0099e90b86638b89vboxsync doesn't support O_EXCL, some kind of error will be
a180a41bba1d50822df23fff0099e90b86638b89vboxsync returned. Unfortunately, we don't know which one. Linux
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2.6.8 seems to return 524, but I cannot find a documented
a180a41bba1d50822df23fff0099e90b86638b89vboxsync #define for this case. So, we'll return only on errors that
a180a41bba1d50822df23fff0099e90b86638b89vboxsync we know aren't related to O_EXCL. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Retry with GUARDED semantics */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* File exists */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Enumeration of devices from rdesktop.c */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* returns numer of units found and initialized. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* optarg looks like ':h=/mnt/floppy,b=/mnt/usbdevice1' */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* when it arrives to this function. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* skip the first colon */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync strncpy(g_rdpdr_device[*id].name, optarg, sizeof(g_rdpdr_device[*id].name) - 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (strlen(optarg) > (sizeof(g_rdpdr_device[*id].name) - 1))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync fprintf(stderr, "share name %s truncated to %s\n", optarg,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_rdpdr_device[*id].local_path = (char *) xmalloc(strlen(pos2) + 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_rdpdr_device[*id].device_type = DEVICE_TYPE_DISK;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Opens or creates a file or directory */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 flags_and_attributes, char *filename, RD_NTHANDLE * phandle)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (filename && *filename && filename[strlen(filename) - 1] == '/')
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync snprintf(path, sizeof(path), "%s%s", g_rdpdr_device[device_id].local_path, filename);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sprintf(path, "%s%s", g_rdpdr_device[device_id].local_path, filename ? filename : "");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Protect against mailicous servers:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync somelongpath/.. not allowed
a180a41bba1d50822df23fff0099e90b86638b89vboxsync somelongpath/../b not allowed
a180a41bba1d50822df23fff0099e90b86638b89vboxsync somelongpath/..b in principle ok, but currently not allowed
a180a41bba1d50822df23fff0099e90b86638b89vboxsync somelongpath/b.. ok
a180a41bba1d50822df23fff0099e90b86638b89vboxsync somelongpath/b../c ok
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Delete existing file/link. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* If the file already exists, then fail. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Create if not already exists. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Default behaviour */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* If the file does not exist, then fail. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /*printf("Open: \"%s\" flags: %X, accessmask: %X sharemode: %X create disp: %X\n", path, flags_and_attributes, accessmask, sharemode, create_disposition); */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Get information about file and set that flag ourselfs */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((stat(path, &filestat) == 0) && (S_ISDIR(filestat.st_mode)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (flags_and_attributes & FILE_NON_DIRECTORY_FILE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync || (accessmask & GENERIC_READ && accessmask & GENERIC_WRITE))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else if ((accessmask & GENERIC_WRITE) && !(accessmask & GENERIC_READ))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* all read and writes of files should be non blocking */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync error("Maximum number of open files (%s) reached. Increase MAX_OPEN_FILES!\n",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_fileinfo[handle].flags_and_attributes = flags_and_attributes;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync strncpy(g_fileinfo[handle].path, path, PATH_MAX - 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (accessmask & GENERIC_ALL || accessmask & GENERIC_WRITE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (pfinfo->accessmask & GENERIC_ALL || pfinfo->accessmask & GENERIC_WRITE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_read(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* browsing dir ???? */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* each request is 24 bytes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_fileinfo[handle].flags_and_attributes & FILE_DIRECTORY_FILE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Implement 24 Byte directory read ??
a180a41bba1d50822df23fff0099e90b86638b89vboxsync with STATUS_NOT_IMPLEMENTED server doesn't read again */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* return STATUS_FILE_IS_A_DIRECTORY; */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_write(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Get information about file */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Set file attributes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Return requested data */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, ft_low); /* create_access_time */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_mtime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_ctime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* Allocation size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* End of file */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_nlink); /* Number of links */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8(out, S_ISDIR(filestat.st_mode) ? 1 : 0); /* Directory */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, file_attributes); /* File Attributes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("IRP Query (File) Information class: 0x%x\n", info_class);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_set_information(RD_NTHANDLE handle, uint32 info_class, STREAM in, STREAM out)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync time_t write_time, change_time, access_time, mod_time;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* CreationTime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* AccessTime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync access_time = convert_1970_to_filetime(ft_high, ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* WriteTime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync write_time = convert_1970_to_filetime(ft_high, ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* ChangeTime */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync change_time = convert_1970_to_filetime(ft_high, ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync printf("FileBasicInformation modification time %s",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break; /* not valid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync printf("FileBasicInformation set access mode 0%o", mode);
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync snprintf(fullpath, sizeof(fullpath), "%s%s", g_rdpdr_device[pfinfo->device_id].local_path,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sprintf(fullpath, "%s%s", g_rdpdr_device[pfinfo->device_id].local_path,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* As far as I understand it, the correct
a180a41bba1d50822df23fff0099e90b86638b89vboxsync thing to do here is to *schedule* a delete,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync so it will be deleted when the file is
a180a41bba1d50822df23fff0099e90b86638b89vboxsync closed. Subsequent
a180a41bba1d50822df23fff0099e90b86638b89vboxsync FileDispositionInformation requests with
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DeleteFile set to FALSE should unschedule
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the delete. See
a180a41bba1d50822df23fff0099e90b86638b89vboxsync http://www.osronline.com/article.cfm?article=245. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* FileDispositionInformation always sets delete_on_close to true.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync "STREAM in" includes Length(4bytes) , Padding(24bytes) and SetBuffer(zero byte).
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Length is always set to zero.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync [MS-RDPEFS] http://msdn.microsoft.com/en-us/library/cc241305%28PROT.10%29.aspx
a180a41bba1d50822df23fff0099e90b86638b89vboxsync - 2.2.3.3.9 Server Drive Set Information Request
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (FILE_DELETE_ON_CLOSE | FILE_COMPLETE_IF_OPLOCKED)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* if file exists in directory , necessary to return RD_STATUS_DIRECTORY_NOT_EMPTY with win2008
a180a41bba1d50822df23fff0099e90b86638b89vboxsync [MS-RDPEFS] http://msdn.microsoft.com/en-us/library/cc241305%28PROT.10%29.aspx
a180a41bba1d50822df23fff0099e90b86638b89vboxsync - 2.2.3.3.9 Server Drive Set Information Request
a180a41bba1d50822df23fff0099e90b86638b89vboxsync - 2.2.3.4.9 Client Drive Set Information Response
a180a41bba1d50822df23fff0099e90b86638b89vboxsync [MS-FSCC] http://msdn.microsoft.com/en-us/library/cc231987%28PROT.10%29.aspx
a180a41bba1d50822df23fff0099e90b86638b89vboxsync - 2.4.11 FileDispositionInformation
a180a41bba1d50822df23fff0099e90b86638b89vboxsync [FSBO] http://msdn.microsoft.com/en-us/library/cc246487%28PROT.13%29.aspx
a180a41bba1d50822df23fff0099e90b86638b89vboxsync - 4.3.2 Set Delete-on-close using FileDispositionInformation Information Class (IRP_MJ_SET_INFORMATION)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Fall through to FileEndOfFileInformation,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync which uses ftrunc. This is like Samba with
a180a41bba1d50822df23fff0099e90b86638b89vboxsync "strict allocation = false", and means that
a180a41bba1d50822df23fff0099e90b86638b89vboxsync we won't detect out-of-quota errors, for
a180a41bba1d50822df23fff0099e90b86638b89vboxsync example. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* prevents start of writing if not enough space left on device */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("IRP Set File Information class: 0x%x\n", info_class);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync status = NotifyInfo(handle, pfinfo->info_class, ¬ify);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (memcmp(&pfinfo->notify, ¬ify, sizeof(NOTIFY)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /*printf("disk_check_notify found changed event\n"); */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_create_notify(RD_NTHANDLE handle, uint32 info_class)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* printf("start disk_create_notify info_class %X\n", info_class); */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ret = NotifyInfo(handle, info_class, &pfinfo->notify);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync { /* ???? */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* printf("disk_create_notify: num_entries %d\n", pfinfo->notify.num_entries); */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncNotifyInfo(RD_NTHANDLE handle, uint32 info_class, NOTIFY * p)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync fullname = (char *) xmalloc(strlen(pfinfo->path) + strlen(dp->d_name) + 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sprintf(fullname, "%s/%s", pfinfo->path, dp->d_name);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync p->total_time += (filestat.st_mtime + filestat.st_ctime);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* initialize */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (strstr(e->mnt_opts, "vfat") || strstr(e->mnt_opts, "iso9660"))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else if (lseek(fd, 32767, SEEK_SET) >= 0) /* ISO9660 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* info.Serial = (buf[128]<<24)+(buf[127]<<16)+(buf[126]<<8)+buf[125]; */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* initialize */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* volume creation time low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* volume creation time high */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(fsinfo->label)); /* length of string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, fsinfo->label, 2 * strlen(fsinfo->label) - 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* Total allocation high units */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_bfree); /* Available allocation units */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* Available allowcation units */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* Total allocation units high */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_bavail); /* Caller allocation units low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* Caller allocation units high */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_bfree); /* Available allocation units */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 0); /* Available allowcation units */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, stat_fs.f_bsize / 0x200); /* Sectors per allocation unit */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED); /* fs attributes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(fsinfo->type)); /* length of fs_type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, fsinfo->type, 2 * strlen(fsinfo->type) - 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("IRP Query Volume Information class: 0x%x\n", info_class);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREAM out)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* If a search pattern is received, remember this pattern, and restart search */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync strncpy(pfinfo->pattern, 1 + strrchr(pattern, '/'), PATH_MAX - 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* find next dirent matching pattern */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (pdirent && fnmatch(pfinfo->pattern, pdirent->d_name, 0) != 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Get information for directory entry */
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync snprintf(fullpath, sizeof(fullpath), "%s/%s", dirname, pdirent->d_name);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* These are non-fatal errors. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Fatal error. By returning STATUS_NO_SUCH_FILE,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the directory list operation will be aborted */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Return requested information */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("IRP Query Directory sub: 0x%x\n", info_class);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_mtime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_ctime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, ft_low); /* change_write_time */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, file_attributes); /* FileAttributes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(pdirent->d_name) + 2); /* unicode length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* this should be correct according to MS-FSCC specification
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but it only works when commented out... */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(out, 2 * 12); /* ShortName (8.3 name) */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, pdirent->d_name, 2 * strlen(pdirent->d_name));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_mtime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_ctime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, ft_low); /* change_write_time */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(pdirent->d_name) + 2); /* unicode length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, pdirent->d_name, 2 * strlen(pdirent->d_name));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_atime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_mtime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync seconds_since_1970_to_filetime(filestat.st_ctime, &ft_high, &ft_low);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, ft_low); /* change_write_time */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, filestat.st_size); /* filesize low */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(pdirent->d_name) + 2); /* unicode length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, pdirent->d_name, 2 * strlen(pdirent->d_name));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(out, 2 * strlen(pdirent->d_name) + 2); /* unicode length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(out, pdirent->d_name, 2 * strlen(pdirent->d_name));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("IRP Query Directory sub: 0x%x\n", info_class);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncdisk_device_control(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out)
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync if (((request >> 16) != 20) && ((request >> 16) != 9))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (((request >> 16) != 20) || ((request >> 16) != 9))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* extract operation */