2013-12-29 04:53:12 +00:00
|
|
|
/*
|
2016-03-25 19:59:40 +00:00
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
|
|
* or more contributor license agreements. See the NOTICE file
|
|
|
|
* distributed with this work for additional information
|
|
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
|
|
* to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance
|
|
|
|
* with the License. You may obtain a copy of the License at
|
2013-07-25 16:48:48 +00:00
|
|
|
*
|
2016-03-25 19:59:40 +00:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2013-07-25 16:48:48 +00:00
|
|
|
*
|
2016-03-25 19:59:40 +00:00
|
|
|
* Unless required by applicable law or agreed to in writing,
|
|
|
|
* software distributed under the License is distributed on an
|
|
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
* KIND, either express or implied. See the License for the
|
|
|
|
* specific language governing permissions and limitations
|
|
|
|
* under the License.
|
2013-12-29 04:53:12 +00:00
|
|
|
*/
|
|
|
|
|
2019-12-23 21:29:13 +00:00
|
|
|
#ifndef GUAC_RDP_FS_H
|
|
|
|
#define GUAC_RDP_FS_H
|
2013-07-25 16:48:48 +00:00
|
|
|
|
2013-07-31 23:55:13 +00:00
|
|
|
/**
|
|
|
|
* Functions and macros specific to filesystem handling and initialization
|
2013-11-04 08:50:10 +00:00
|
|
|
* independent of RDP. The functions here may deal with the filesystem device
|
2013-07-31 23:55:13 +00:00
|
|
|
* directly, but their semantics must not deal with RDP protocol messaging.
|
|
|
|
* Functions here represent a virtual Windows-style filesystem on top of UNIX
|
2013-11-04 08:50:10 +00:00
|
|
|
* system calls and structures, using the guac_rdp_fs structure as a home
|
2013-07-31 23:55:13 +00:00
|
|
|
* for common data.
|
|
|
|
*
|
2013-11-04 08:50:10 +00:00
|
|
|
* @file rdp_fs.h
|
2013-07-31 23:55:13 +00:00
|
|
|
*/
|
|
|
|
|
2014-01-01 22:44:28 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
2014-11-12 21:35:25 +00:00
|
|
|
#include <guacamole/client.h>
|
2014-06-11 01:45:14 +00:00
|
|
|
#include <guacamole/pool.h>
|
|
|
|
|
2013-08-01 20:36:39 +00:00
|
|
|
#include <dirent.h>
|
2014-01-01 22:44:28 +00:00
|
|
|
#include <stdint.h>
|
2013-07-26 17:45:40 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The maximum number of file IDs to provide.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_MAX_FILES 128
|
2013-07-26 17:45:40 +00:00
|
|
|
|
2013-07-30 00:57:24 +00:00
|
|
|
/**
|
|
|
|
* The maximum number of bytes in a path string.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_MAX_PATH 4096
|
2013-07-30 00:57:24 +00:00
|
|
|
|
2018-11-13 00:10:24 +00:00
|
|
|
/**
|
|
|
|
* The maximum number of directories a path may contain.
|
|
|
|
*/
|
|
|
|
#define GUAC_RDP_MAX_PATH_DEPTH 64
|
|
|
|
|
2013-07-29 19:52:04 +00:00
|
|
|
/**
|
|
|
|
* Error code returned when no more file IDs can be allocated.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENFILE -1
|
2013-07-29 19:52:04 +00:00
|
|
|
|
|
|
|
/**
|
2013-10-24 22:11:28 +00:00
|
|
|
* Error code returned when no such file exists.
|
2013-07-29 19:52:04 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENOENT -2
|
2013-07-29 19:52:04 +00:00
|
|
|
|
2013-10-24 22:11:28 +00:00
|
|
|
/**
|
|
|
|
* Error code returned when the operation required a directory
|
|
|
|
* but the file was not a directory.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENOTDIR -3
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when insufficient space exists to complete
|
|
|
|
* the operation.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENOSPC -4
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when the operation requires a normal file but
|
|
|
|
* a directory was given.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_EISDIR -5
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when permission is denied.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_EACCES -6
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when the operation cannot be completed because the
|
|
|
|
* file already exists.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_EEXIST -7
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when invalid parameters were given.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_EINVAL -8
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when the operation is not implemented.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENOSYS -9
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Error code returned when the operation is not supported.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
#define GUAC_RDP_FS_ENOTSUP -10
|
2013-10-24 22:11:28 +00:00
|
|
|
|
2013-07-30 00:57:24 +00:00
|
|
|
/*
|
|
|
|
* Access constants.
|
|
|
|
*/
|
2013-09-11 15:52:36 +00:00
|
|
|
#define ACCESS_GENERIC_READ 0x80000000
|
|
|
|
#define ACCESS_GENERIC_WRITE 0x40000000
|
|
|
|
#define ACCESS_GENERIC_ALL 0x10000000
|
|
|
|
#define ACCESS_FILE_READ_DATA 0x00000001
|
|
|
|
#define ACCESS_FILE_WRITE_DATA 0x00000002
|
|
|
|
#define ACCESS_FILE_APPEND_DATA 0x00000004
|
|
|
|
#define ACCESS_DELETE 0x00010000
|
2013-07-30 00:57:24 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Create disposition constants.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define DISP_FILE_SUPERSEDE 0x00000000
|
|
|
|
#define DISP_FILE_OPEN 0x00000001
|
|
|
|
#define DISP_FILE_CREATE 0x00000002
|
|
|
|
#define DISP_FILE_OPEN_IF 0x00000003
|
|
|
|
#define DISP_FILE_OVERWRITE 0x00000004
|
|
|
|
#define DISP_FILE_OVERWRITE_IF 0x00000005
|
|
|
|
|
2013-07-26 23:21:01 +00:00
|
|
|
/*
|
|
|
|
* File attributes.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define FILE_ATTRIBUTE_READONLY 0x00000001
|
2013-12-11 21:49:02 +00:00
|
|
|
#define FILE_ATTRIBUTE_HIDDEN 0x00000002
|
2013-07-26 23:21:01 +00:00
|
|
|
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
|
2013-12-11 21:49:02 +00:00
|
|
|
#define FILE_ATTRIBUTE_ARCHIVE 0x00000020
|
2013-07-26 23:21:01 +00:00
|
|
|
#define FILE_ATTRIBUTE_NORMAL 0x00000080
|
|
|
|
|
2013-10-23 01:19:30 +00:00
|
|
|
/*
|
|
|
|
* Filesystem attributes.
|
|
|
|
*/
|
|
|
|
|
2013-11-05 00:12:40 +00:00
|
|
|
#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
|
|
|
|
#define FILE_CASE_PRESERVED_NAMES 0x00000002
|
|
|
|
#define FILE_UNICODE_ON_DISK 0x00000004
|
2013-10-23 01:19:30 +00:00
|
|
|
|
2013-10-25 19:43:57 +00:00
|
|
|
/*
|
|
|
|
* File create options.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define FILE_DIRECTORY_FILE 0x00000001
|
|
|
|
#define FILE_NON_DIRECTORY_FILE 0x00000040
|
|
|
|
|
2013-12-11 22:21:59 +00:00
|
|
|
/*
|
|
|
|
* File device types.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define FILE_DEVICE_DISK 0x00000007
|
|
|
|
|
2013-07-26 23:21:01 +00:00
|
|
|
#define SEC_TO_UNIX_EPOCH 11644473600
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts a Windows timestamp (100 nanosecond intervals since Jan 1, 1601
|
|
|
|
* UTC) to UNIX timestamp (seconds since Jan 1, 1970 UTC).
|
|
|
|
*
|
|
|
|
* This conversion is lossy.
|
|
|
|
*/
|
|
|
|
#define UNIX_TIME(t) ((time_t) ((t / 10000000 + ((uint64_t) 11644473600))))
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts a UNIX timestamp (seconds since Jan 1, 1970 UTC) to Windows
|
|
|
|
* timestamp (100 nanosecond intervals since Jan 1, 1601 UTC).
|
|
|
|
*/
|
|
|
|
#define WINDOWS_TIME(t) ((t - ((uint64_t) 11644473600)) * 10000000)
|
2013-07-26 17:45:40 +00:00
|
|
|
|
2013-07-26 21:11:44 +00:00
|
|
|
/**
|
|
|
|
* An arbitrary file on the virtual filesystem of the Guacamole drive.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
typedef struct guac_rdp_fs_file {
|
2013-07-26 21:11:44 +00:00
|
|
|
|
2013-11-04 09:28:27 +00:00
|
|
|
/**
|
|
|
|
* The ID of this file.
|
|
|
|
*/
|
|
|
|
int id;
|
|
|
|
|
2013-08-01 20:44:30 +00:00
|
|
|
/**
|
2013-08-03 00:23:09 +00:00
|
|
|
* The absolute path, including filename, of this file.
|
2013-08-01 20:44:30 +00:00
|
|
|
*/
|
2013-08-03 00:23:09 +00:00
|
|
|
char* absolute_path;
|
2013-08-01 20:44:30 +00:00
|
|
|
|
2013-10-25 23:28:09 +00:00
|
|
|
/**
|
|
|
|
* The real path of this file on the local filesystem.
|
|
|
|
*/
|
|
|
|
char* real_path;
|
|
|
|
|
2013-07-26 21:11:44 +00:00
|
|
|
/**
|
|
|
|
* Associated local file descriptor.
|
|
|
|
*/
|
|
|
|
int fd;
|
|
|
|
|
2013-08-01 20:36:39 +00:00
|
|
|
/**
|
|
|
|
* Associated directory stream, if any. This field only applies
|
|
|
|
* if the file is being used as a directory.
|
|
|
|
*/
|
|
|
|
DIR* dir;
|
|
|
|
|
2013-09-17 21:26:05 +00:00
|
|
|
/**
|
|
|
|
* The pattern the check directory contents against, if any.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
char dir_pattern[GUAC_RDP_FS_MAX_PATH];
|
2013-09-17 21:26:05 +00:00
|
|
|
|
2013-08-03 00:23:09 +00:00
|
|
|
/**
|
|
|
|
* Bitwise OR of all associated Windows file attributes.
|
|
|
|
*/
|
|
|
|
int attributes;
|
|
|
|
|
2013-08-01 20:36:39 +00:00
|
|
|
/**
|
|
|
|
* The size of this file, in bytes.
|
|
|
|
*/
|
2017-04-17 18:52:07 +00:00
|
|
|
uint64_t size;
|
2013-08-01 20:36:39 +00:00
|
|
|
|
|
|
|
/**
|
2013-08-03 00:23:09 +00:00
|
|
|
* The time this file was created, as a Windows timestamp.
|
2013-08-01 20:36:39 +00:00
|
|
|
*/
|
2013-08-03 00:23:09 +00:00
|
|
|
uint64_t ctime;
|
2013-08-01 20:36:39 +00:00
|
|
|
|
|
|
|
/**
|
2013-08-03 00:23:09 +00:00
|
|
|
* The time this file was last modified, as a Windows timestamp.
|
2013-08-01 20:36:39 +00:00
|
|
|
*/
|
2013-08-03 00:23:09 +00:00
|
|
|
uint64_t mtime;
|
2013-08-01 20:36:39 +00:00
|
|
|
|
|
|
|
/**
|
2013-08-03 00:23:09 +00:00
|
|
|
* The time this file was last accessed, as a Windows timestamp.
|
2013-08-01 20:36:39 +00:00
|
|
|
*/
|
2013-08-03 00:23:09 +00:00
|
|
|
uint64_t atime;
|
2013-08-01 20:36:39 +00:00
|
|
|
|
2013-11-12 18:16:04 +00:00
|
|
|
/**
|
|
|
|
* The number of bytes written to the file.
|
|
|
|
*/
|
|
|
|
uint64_t bytes_written;
|
|
|
|
|
2013-11-04 08:50:10 +00:00
|
|
|
} guac_rdp_fs_file;
|
2013-07-26 21:11:44 +00:00
|
|
|
|
2013-07-25 16:48:48 +00:00
|
|
|
/**
|
2013-11-04 08:50:10 +00:00
|
|
|
* A virtual filesystem implementing RDP-style operations.
|
2013-07-25 16:48:48 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
typedef struct guac_rdp_fs {
|
|
|
|
|
2014-11-12 21:35:25 +00:00
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* The Guacamole client associated with the RDP session.
|
2014-11-12 21:35:25 +00:00
|
|
|
*/
|
|
|
|
guac_client* client;
|
|
|
|
|
2013-11-04 08:50:10 +00:00
|
|
|
/**
|
|
|
|
* The root of the filesystem.
|
|
|
|
*/
|
|
|
|
char* drive_path;
|
2013-07-25 16:48:48 +00:00
|
|
|
|
2013-07-26 17:45:40 +00:00
|
|
|
/**
|
|
|
|
* The number of currently open files.
|
|
|
|
*/
|
|
|
|
int open_files;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pool of file IDs.
|
|
|
|
*/
|
|
|
|
guac_pool* file_id_pool;
|
2013-07-25 16:48:48 +00:00
|
|
|
|
2013-07-26 21:11:44 +00:00
|
|
|
/**
|
|
|
|
* All available file structures.
|
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
guac_rdp_fs_file files[GUAC_RDP_FS_MAX_FILES];
|
2013-07-26 21:11:44 +00:00
|
|
|
|
2013-11-04 08:50:10 +00:00
|
|
|
} guac_rdp_fs;
|
|
|
|
|
2013-11-15 21:44:57 +00:00
|
|
|
/**
|
|
|
|
* Filesystem information structure.
|
|
|
|
*/
|
|
|
|
typedef struct guac_rdp_fs_info {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The number of free blocks available.
|
|
|
|
*/
|
|
|
|
int blocks_available;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The number of blocks in the filesystem.
|
|
|
|
*/
|
|
|
|
int blocks_total;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The number of bytes per block.
|
|
|
|
*/
|
|
|
|
int block_size;
|
|
|
|
|
|
|
|
} guac_rdp_fs_info;
|
|
|
|
|
2013-11-04 08:50:10 +00:00
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* Allocates a new filesystem given a root path. This filesystem will behave
|
|
|
|
* as if it were a network drive.
|
|
|
|
*
|
|
|
|
* @param client
|
|
|
|
* The guac_client associated with the current RDP session.
|
|
|
|
*
|
|
|
|
* @param drive_path
|
|
|
|
* The local directory to use as the root directory of the emulated
|
|
|
|
* network drive.
|
|
|
|
*
|
|
|
|
* @param create_drive_path
|
|
|
|
* Non-zero if the drive path specified should be automatically created if
|
|
|
|
* it does not yet exist, zero otherwise.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The newly-allocated filesystem.
|
2013-11-04 08:50:10 +00:00
|
|
|
*/
|
2016-03-01 05:50:00 +00:00
|
|
|
guac_rdp_fs* guac_rdp_fs_alloc(guac_client* client, const char* drive_path,
|
|
|
|
int create_drive_path);
|
2013-07-25 16:48:48 +00:00
|
|
|
|
|
|
|
/**
|
2013-11-04 08:50:10 +00:00
|
|
|
* Frees the given filesystem.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem to free.
|
2013-07-25 16:48:48 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
void guac_rdp_fs_free(guac_rdp_fs* fs);
|
2013-07-25 16:48:48 +00:00
|
|
|
|
2016-03-01 05:50:00 +00:00
|
|
|
/**
|
|
|
|
* Creates and exposes a new filesystem guac_object to the given user,
|
|
|
|
* providing access to the files within the given RDP filesystem. The
|
|
|
|
* allocated guac_object must eventually be freed via guac_user_free_object().
|
|
|
|
*
|
|
|
|
* @param fs
|
|
|
|
* The RDP filesystem object to expose.
|
|
|
|
*
|
|
|
|
* @param user
|
|
|
|
* The user that the RDP filesystem should be exposed to.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* A new Guacamole filesystem object, configured to use RDP for uploading
|
|
|
|
* and downloading files.
|
|
|
|
*/
|
|
|
|
guac_object* guac_rdp_fs_alloc_object(guac_rdp_fs* fs, guac_user* user);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allocates a new filesystem guac_object for the given user, returning the
|
|
|
|
* resulting guac_object. This function is provided for convenience, as it is
|
|
|
|
* can be used as the callback for guac_client_foreach_user() or
|
|
|
|
* guac_client_for_owner(). Note that this guac_object will be tracked
|
|
|
|
* internally by libguac, will be provided to us in the parameters of handlers
|
|
|
|
* related to that guac_object, and will automatically be freed when the
|
|
|
|
* associated guac_user is freed, so the return value of this function can
|
|
|
|
* safely be ignored.
|
|
|
|
*
|
|
|
|
* If either the given user or the given filesystem are NULL, then this
|
|
|
|
* function has no effect.
|
|
|
|
*
|
|
|
|
* @param user
|
|
|
|
* The use to expose the filesystem to, or NULL if nothing should be
|
|
|
|
* exposed.
|
|
|
|
*
|
|
|
|
* @param data
|
|
|
|
* A pointer to the guac_rdp_fs instance to expose to the given user, or
|
|
|
|
* NULL if nothing should be exposed.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The guac_object allocated for the newly-exposed filesystem, or NULL if
|
|
|
|
* no filesystem object could be allocated.
|
|
|
|
*/
|
|
|
|
void* guac_rdp_fs_expose(guac_user* user, void* data);
|
|
|
|
|
2013-08-02 20:35:52 +00:00
|
|
|
/**
|
|
|
|
* Converts the given relative path to an absolute path based on the given
|
|
|
|
* parent path. If the path cannot be converted, non-zero is returned.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param parent
|
|
|
|
* The parent directory of the relative path.
|
|
|
|
*
|
|
|
|
* @param rel_path
|
|
|
|
* The relative path to convert.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Zero if the path was converted successfully, non-zero otherwise.
|
2013-08-02 20:35:52 +00:00
|
|
|
*/
|
2016-03-01 05:50:00 +00:00
|
|
|
int guac_rdp_fs_convert_path(const char* parent, const char* rel_path,
|
|
|
|
char* abs_path);
|
2013-08-02 20:35:52 +00:00
|
|
|
|
2013-10-24 22:11:28 +00:00
|
|
|
/**
|
2013-11-04 08:50:10 +00:00
|
|
|
* Translates the given errno error code to a GUAC_RDP_FS error code.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param err
|
|
|
|
* The error code, as returned within errno by a system call.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* A GUAC_RDP_FS error code, such as GUAC_RDP_FS_ENFILE,
|
|
|
|
* GUAC_RDP_FS_ENOENT, etc.
|
2013-10-24 22:11:28 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_get_errorcode(int err);
|
2013-10-24 22:11:28 +00:00
|
|
|
|
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* Translates the given GUAC_RDP_FS error code to an RDPDR status code.
|
|
|
|
*
|
|
|
|
* @param err
|
|
|
|
* A GUAC_RDP_FS error code, such as GUAC_RDP_FS_ENFILE,
|
|
|
|
* GUAC_RDP_FS_ENOENT, etc.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* A status code corresponding to the given error code that an
|
|
|
|
* implementation of the RDPDR channel can understand.
|
2013-10-24 22:11:28 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_get_status(int err);
|
2013-10-24 22:11:28 +00:00
|
|
|
|
2013-07-26 17:45:40 +00:00
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* Opens the given file, returning the a new file ID, or an error code less
|
|
|
|
* than zero if an error occurs. The given path MUST be absolute, and will be
|
|
|
|
* translated to be relative to the drive path of the simulated filesystem.
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem to use when opening the file.
|
|
|
|
*
|
|
|
|
* @param path
|
|
|
|
* The absolute path to the file within the simulated filesystem.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param access
|
|
|
|
* A bitwise-OR of various RDPDR access flags, such as ACCESS_GENERIC_ALL
|
|
|
|
* or ACCESS_GENERIC_WRITE. This value will ultimately be translated to a
|
|
|
|
* standard O_RDWR, O_WRONLY, etc. value when opening the real file on the
|
|
|
|
* local filesystem.
|
|
|
|
*
|
|
|
|
* @param file_attributes
|
|
|
|
* The attributes to apply to the file, if created. This parameter is
|
|
|
|
* currently ignored, and has no effect.
|
|
|
|
*
|
|
|
|
* @param create_disposition
|
|
|
|
* Any one of several RDPDR file creation dispositions, such as
|
|
|
|
* DISP_FILE_CREATE, DISP_FILE_OPEN_IF, etc. The creation disposition
|
|
|
|
* dictates whether a new file should be created, whether the file can
|
|
|
|
* already exist, whether existing contents should be truncated, etc.
|
|
|
|
*
|
|
|
|
* @param create_options
|
|
|
|
* A bitwise-OR of various RDPDR options dictating how a file is to be
|
|
|
|
* created. Currently only one option is implemented, FILE_DIRECTORY_FILE,
|
|
|
|
* which specifies that the new file must be a directory.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* A new file ID, which will always be a positive value, or an error code
|
|
|
|
* if an error occurs. All error codes are negative values and correspond
|
|
|
|
* to GUAC_RDP_FS constants, such as GUAC_RDP_FS_ENOENT.
|
2013-07-26 17:45:40 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_open(guac_rdp_fs* fs, const char* path,
|
2013-10-22 17:56:47 +00:00
|
|
|
int access, int file_attributes, int create_disposition,
|
|
|
|
int create_options);
|
2013-07-26 17:45:40 +00:00
|
|
|
|
2013-10-25 23:53:11 +00:00
|
|
|
/**
|
|
|
|
* Reads up to the given length of bytes from the given offset within the
|
|
|
|
* file having the given ID. Returns the number of bytes read, zero on EOF,
|
|
|
|
* and an error code if an error occurs.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file from which data is to be read.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to read data from, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param offset
|
|
|
|
* The byte offset within the file to start reading from.
|
|
|
|
*
|
|
|
|
* @param buffer
|
|
|
|
* The buffer to fill with data from the file.
|
|
|
|
*
|
|
|
|
* @param length
|
|
|
|
* The maximum number of bytes to read from the file.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The number of bytes actually read, zero on EOF, or an error code if an
|
|
|
|
* error occurs. All error codes are negative values and correspond to
|
|
|
|
* GUAC_RDP_FS constants, such as GUAC_RDP_FS_ENOENT.
|
2013-10-25 23:53:11 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_read(guac_rdp_fs* fs, int file_id, int offset,
|
2013-10-25 23:53:11 +00:00
|
|
|
void* buffer, int length);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writes up to the given length of bytes from the given offset within the
|
|
|
|
* file having the given ID. Returns the number of bytes written, and an
|
|
|
|
* error code if an error occurs.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to which data is to be written.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to write data to, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param offset
|
|
|
|
* The byte offset within the file to start writinging at.
|
|
|
|
*
|
|
|
|
* @param buffer
|
|
|
|
* The buffer containing the data to write.
|
|
|
|
*
|
|
|
|
* @param length
|
|
|
|
* The maximum number of bytes to write to the file.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The number of bytes actually written, or an error code if an error
|
|
|
|
* occurs. All error codes are negative values and correspond to
|
|
|
|
* GUAC_RDP_FS constants, such as GUAC_RDP_FS_ENOENT.
|
2013-10-25 23:53:11 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_write(guac_rdp_fs* fs, int file_id, int offset,
|
2013-10-25 23:53:11 +00:00
|
|
|
void* buffer, int length);
|
|
|
|
|
2013-10-25 23:28:09 +00:00
|
|
|
/**
|
|
|
|
* Renames (moves) the file with the given ID to the new path specified.
|
|
|
|
* Returns zero on success, or an error code if an error occurs.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to rename.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to rename, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param new_path
|
|
|
|
* The absolute path to move the file to.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Zero if the rename succeeded, or an error code if an error occurs. All
|
|
|
|
* error codes are negative values and correspond to GUAC_RDP_FS constants,
|
|
|
|
* such as GUAC_RDP_FS_ENOENT.
|
2013-10-25 23:28:09 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_rename(guac_rdp_fs* fs, int file_id,
|
2013-10-25 23:28:09 +00:00
|
|
|
const char* new_path);
|
|
|
|
|
2013-11-05 00:37:29 +00:00
|
|
|
/**
|
2013-11-05 08:48:55 +00:00
|
|
|
* Deletes the file with the given ID.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to delete.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to delete, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Zero if deletion succeeded, or an error code if an error occurs. All
|
|
|
|
* error codes are negative values and correspond to GUAC_RDP_FS constants,
|
|
|
|
* such as GUAC_RDP_FS_ENOENT.
|
2013-11-05 00:37:29 +00:00
|
|
|
*/
|
|
|
|
int guac_rdp_fs_delete(guac_rdp_fs* fs, int file_id);
|
|
|
|
|
2013-11-05 08:48:55 +00:00
|
|
|
/**
|
|
|
|
* Truncates the file with the given ID to the given length (in bytes), which
|
|
|
|
* may be larger.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to truncate.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to truncate, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
|
|
|
* @param length
|
|
|
|
* The new length of the file, in bytes. Despite being named "truncate",
|
|
|
|
* this new length may be larger.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Zero if truncation succeeded, or an error code if an error occurs. All
|
|
|
|
* error codes are negative values and correspond to GUAC_RDP_FS constants,
|
|
|
|
* such as GUAC_RDP_FS_ENOENT.
|
2013-11-05 08:48:55 +00:00
|
|
|
*/
|
|
|
|
int guac_rdp_fs_truncate(guac_rdp_fs* fs, int file_id, int length);
|
|
|
|
|
2013-07-26 17:45:40 +00:00
|
|
|
/**
|
|
|
|
* Frees the given file ID, allowing future open operations to reuse it.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to close.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to close, as returned by guac_rdp_fs_open().
|
2013-07-26 17:45:40 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
void guac_rdp_fs_close(guac_rdp_fs* fs, int file_id);
|
2013-07-26 17:45:40 +00:00
|
|
|
|
2013-08-02 20:35:52 +00:00
|
|
|
/**
|
|
|
|
* Given an arbitrary path, which may contain ".." and ".", creates an
|
2016-03-01 05:50:00 +00:00
|
|
|
* absolute path which does NOT contain ".." or ".". The given path MUST
|
|
|
|
* be absolute.
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param path
|
|
|
|
* The absolute path to normalize.
|
|
|
|
*
|
2016-03-01 05:50:00 +00:00
|
|
|
* @param abs_path
|
|
|
|
* The buffer to populate with the normalized path. The normalized path
|
|
|
|
* will not contain relative path components like ".." or ".".
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @return
|
|
|
|
* Zero if normalization succeeded, non-zero otherwise.
|
2013-08-02 20:35:52 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_normalize_path(const char* path, char* abs_path);
|
2013-08-02 20:35:52 +00:00
|
|
|
|
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* Given a parent path and a relative path, produces a normalized absolute
|
|
|
|
* path.
|
|
|
|
*
|
|
|
|
* @param parent
|
|
|
|
* The absolute path of the parent directory of the relative path.
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param rel_path
|
|
|
|
* The relative path to convert.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param abs_path
|
|
|
|
* The buffer to populate with the absolute, normalized path. The
|
|
|
|
* normalized path will not contain relative path components like ".." or
|
|
|
|
* ".".
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @return
|
|
|
|
* Zero if conversion succeeded, non-zero otherwise.
|
2013-08-02 20:35:52 +00:00
|
|
|
*/
|
2016-03-01 05:50:00 +00:00
|
|
|
int guac_rdp_fs_convert_path(const char* parent, const char* rel_path,
|
|
|
|
char* abs_path);
|
2013-08-02 20:35:52 +00:00
|
|
|
|
2013-08-02 00:44:39 +00:00
|
|
|
/**
|
|
|
|
* Returns the next filename within the directory having the given file ID,
|
|
|
|
* or NULL if no more files.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the file to read directory entries from.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the file to read directory entries from, as returned by
|
|
|
|
* guac_rdp_fs_open().
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The name of the next filename within the directory, or NULL if the last
|
|
|
|
* file in the directory has already been returned by a previous call.
|
2013-08-02 00:44:39 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
const char* guac_rdp_fs_read_dir(guac_rdp_fs* fs, int file_id);
|
2013-08-02 00:44:39 +00:00
|
|
|
|
2013-09-16 21:01:08 +00:00
|
|
|
/**
|
|
|
|
* Returns the file having the given ID, or NULL if no such file exists.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem containing the desired file.
|
|
|
|
*
|
|
|
|
* @param file_id
|
|
|
|
* The ID of the desired, as returned by guac_rdp_fs_open().
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The file having the given ID, or NULL is no such file exists.
|
2013-09-16 21:01:08 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
guac_rdp_fs_file* guac_rdp_fs_get_file(guac_rdp_fs* fs, int file_id);
|
2013-09-16 21:01:08 +00:00
|
|
|
|
2013-09-17 21:26:05 +00:00
|
|
|
/**
|
2016-03-01 05:50:00 +00:00
|
|
|
* Returns whether the given filename matches the given pattern. The pattern
|
|
|
|
* given is a shell wildcard pattern as accepted by the POSIX fnmatch()
|
|
|
|
* function. Backslashes will be interpreted as literal backslashes, not
|
|
|
|
* escape characters.
|
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param filename
|
|
|
|
* The filename to check
|
|
|
|
*
|
|
|
|
* @param pattern
|
|
|
|
* The pattern to check the filename against.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Non-zero if the pattern matches, zero otherwise.
|
2013-09-17 21:26:05 +00:00
|
|
|
*/
|
2013-11-04 08:50:10 +00:00
|
|
|
int guac_rdp_fs_matches(const char* filename, const char* pattern);
|
2013-09-17 21:26:05 +00:00
|
|
|
|
2013-11-15 21:44:57 +00:00
|
|
|
/**
|
|
|
|
* Populates the given structure with information about the filesystem,
|
|
|
|
* particularly the amount of space available.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
2016-03-07 23:05:31 +00:00
|
|
|
* @param fs
|
|
|
|
* The filesystem to obtain information from.
|
|
|
|
*
|
|
|
|
* @param info
|
|
|
|
* The guac_rdp_fs_info structure to populate.
|
2016-03-01 05:50:00 +00:00
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Zero if information retrieval succeeded, or an error code if an error
|
|
|
|
* occurs. All error codes are negative values and correspond to
|
|
|
|
* GUAC_RDP_FS constants, such as GUAC_RDP_FS_ENOENT.
|
2013-11-15 21:44:57 +00:00
|
|
|
*/
|
|
|
|
int guac_rdp_fs_get_info(guac_rdp_fs* fs, guac_rdp_fs_info* info);
|
|
|
|
|
2015-07-06 06:14:18 +00:00
|
|
|
/**
|
|
|
|
* Concatenates the given filename with the given path, separating the two
|
|
|
|
* with a single forward slash. The full result must be no more than
|
|
|
|
* GUAC_RDP_FS_MAX_PATH bytes long, counting null terminator.
|
|
|
|
*
|
|
|
|
* @param fullpath
|
|
|
|
* The buffer to store the result within. This buffer must be at least
|
|
|
|
* GUAC_RDP_FS_MAX_PATH bytes long.
|
|
|
|
*
|
|
|
|
* @param path
|
|
|
|
* The path to append the filename to.
|
|
|
|
*
|
|
|
|
* @param filename
|
|
|
|
* The filename to append to the path.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* Non-zero if the filename is valid and was successfully appended to the
|
|
|
|
* path, zero otherwise.
|
|
|
|
*/
|
|
|
|
int guac_rdp_fs_append_filename(char* fullpath, const char* path,
|
|
|
|
const char* filename);
|
|
|
|
|
2013-07-25 16:48:48 +00:00
|
|
|
#endif
|
|
|
|
|