diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/io/file_access_buffered_fa.h | 8 | ||||
| -rw-r--r-- | core/io/file_access_compressed.cpp | 13 | ||||
| -rw-r--r-- | core/io/file_access_compressed.h | 2 | ||||
| -rw-r--r-- | core/io/file_access_encrypted.cpp | 10 | ||||
| -rw-r--r-- | core/io/file_access_encrypted.h | 2 | ||||
| -rw-r--r-- | core/io/file_access_memory.h | 2 | ||||
| -rw-r--r-- | core/io/file_access_network.cpp | 10 | ||||
| -rw-r--r-- | core/io/file_access_network.h | 2 | ||||
| -rw-r--r-- | core/io/file_access_pack.h | 2 | ||||
| -rw-r--r-- | core/io/file_access_zip.h | 2 | ||||
| -rw-r--r-- | core/os/dir_access.cpp | 2 | ||||
| -rw-r--r-- | core/os/file_access.cpp | 23 | ||||
| -rw-r--r-- | core/os/file_access.h | 7 | ||||
| -rw-r--r-- | core/os/os.h | 4 | 
14 files changed, 85 insertions, 4 deletions
| diff --git a/core/io/file_access_buffered_fa.h b/core/io/file_access_buffered_fa.h index be960fbc25..24b40cbce8 100644 --- a/core/io/file_access_buffered_fa.h +++ b/core/io/file_access_buffered_fa.h @@ -143,6 +143,14 @@ public:  		return f._get_modified_time(p_file);  	} +	virtual uint32_t _get_unix_permissions(const String &p_file) { +		return f._get_unix_permissions(p_file); +	} + +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { +		return f._set_unix_permissions(p_file, p_permissions); +	} +  	FileAccessBufferedFA(){  	}; diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index b268d5c710..6c4310a572 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -373,6 +373,19 @@ uint64_t FileAccessCompressed::_get_modified_time(const String &p_file) {  		return 0;  } +uint32_t FileAccessCompressed::_get_unix_permissions(const String &p_file) { +	if (f) +		return f->_get_unix_permissions(p_file); +	return 0; +} + +Error FileAccessCompressed::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { +	if (f) { +		return f->_set_unix_permissions(p_file, p_permissions); +	} +	return FAILED; +} +  FileAccessCompressed::FileAccessCompressed() :  		cmode(Compression::MODE_ZSTD),  		writing(false), diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index f408b1bc29..773fed6a3a 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -91,6 +91,8 @@ public:  	virtual bool file_exists(const String &p_name); ///< return true if a file exists  	virtual uint64_t _get_modified_time(const String &p_file); +	virtual uint32_t _get_unix_permissions(const String &p_file); +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions);  	FileAccessCompressed();  	virtual ~FileAccessCompressed(); diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index 6ad68dd74d..3cf6908961 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -301,6 +301,16 @@ uint64_t FileAccessEncrypted::_get_modified_time(const String &p_file) {  	return 0;  } +uint32_t FileAccessEncrypted::_get_unix_permissions(const String &p_file) { + +	return 0; +} + +Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + +	return FAILED; +} +  FileAccessEncrypted::FileAccessEncrypted() {  	file = NULL; diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index e77d62a9f4..d779a150ac 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -79,6 +79,8 @@ public:  	virtual bool file_exists(const String &p_name); ///< return true if a file exists  	virtual uint64_t _get_modified_time(const String &p_file); +	virtual uint32_t _get_unix_permissions(const String &p_file); +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions);  	FileAccessEncrypted();  	~FileAccessEncrypted(); diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index 73952133c1..4db7811aaa 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -70,6 +70,8 @@ public:  	virtual bool file_exists(const String &p_name); ///< return true if a file exists  	virtual uint64_t _get_modified_time(const String &p_file) { return 0; } +	virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; }  	FileAccessMemory();  }; diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp index 501a21a50d..722e62c54e 100644 --- a/core/io/file_access_network.cpp +++ b/core/io/file_access_network.cpp @@ -497,6 +497,16 @@ uint64_t FileAccessNetwork::_get_modified_time(const String &p_file) {  	return exists_modtime;  } +uint32_t FileAccessNetwork::_get_unix_permissions(const String &p_file) { +	//could be implemented, not sure if worth it +	return 0; +} + +Error FileAccessNetwork::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + +	return FAILED; +} +  void FileAccessNetwork::configure() {  	GLOBAL_DEF("network/remote_fs/page_size", 65536); diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h index 5bbf7588c7..073b75a37b 100644 --- a/core/io/file_access_network.h +++ b/core/io/file_access_network.h @@ -159,6 +159,8 @@ public:  	virtual bool file_exists(const String &p_path); ///< return true if a file exists  	virtual uint64_t _get_modified_time(const String &p_file); +	virtual uint32_t _get_unix_permissions(const String &p_file); +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions);  	static void configure(); diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index a90672ce26..a21dd7d22d 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -142,6 +142,8 @@ class FileAccessPack : public FileAccess {  	FileAccess *f;  	virtual Error _open(const String &p_path, int p_mode_flags);  	virtual uint64_t _get_modified_time(const String &p_file) { return 0; } +	virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; }  public:  	virtual void close(); diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index fc8f85c07b..217176c0af 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -112,6 +112,8 @@ public:  	virtual bool file_exists(const String &p_name); ///< return true if a file exists  	virtual uint64_t _get_modified_time(const String &p_file) { return 0; } // todo +	virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; }  	FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file);  	~FileAccessZip(); diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index 2c1c655175..d81c30f33a 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -330,7 +330,7 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {  	if (err == OK && p_chmod_flags != -1) {  		fdst->close(); -		err = fdst->_chmod(p_to, p_chmod_flags); +		err = FileAccess::set_unix_permissions(p_to, p_chmod_flags);  		// If running on a platform with no chmod support (i.e., Windows), don't fail  		if (err == ERR_UNAVAILABLE)  			err = OK; diff --git a/core/os/file_access.cpp b/core/os/file_access.cpp index 4be1364278..079f51bada 100644 --- a/core/os/file_access.cpp +++ b/core/os/file_access.cpp @@ -507,6 +507,29 @@ uint64_t FileAccess::get_modified_time(const String &p_file) {  	return mt;  } +uint32_t FileAccess::get_unix_permissions(const String &p_file) { + +	if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file)) +		return 0; + +	FileAccess *fa = create_for_path(p_file); +	ERR_FAIL_COND_V(!fa, 0); + +	uint32_t mt = fa->_get_unix_permissions(p_file); +	memdelete(fa); +	return mt; +} + +Error FileAccess::set_unix_permissions(const String &p_file, uint32_t p_permissions) { + +	FileAccess *fa = create_for_path(p_file); +	ERR_FAIL_COND_V(!fa, ERR_CANT_CREATE); + +	Error err = fa->_set_unix_permissions(p_file, p_permissions); +	memdelete(fa); +	return err; +} +  void FileAccess::store_string(const String &p_string) {  	if (p_string.length() == 0) diff --git a/core/os/file_access.h b/core/os/file_access.h index 9df2a5cade..4930eae35a 100644 --- a/core/os/file_access.h +++ b/core/os/file_access.h @@ -56,6 +56,9 @@ public:  	bool endian_swap;  	bool real_is_double; +	virtual uint32_t _get_unix_permissions(const String &p_file) = 0; +	virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) = 0; +  protected:  	String fix_path(const String &p_path) const;  	virtual Error _open(const String &p_path, int p_mode_flags) = 0; ///< open a file @@ -148,14 +151,14 @@ public:  	virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType -	virtual Error _chmod(const String &p_path, int p_mod) { return ERR_UNAVAILABLE; } -  	static FileAccess *create(AccessType p_access); /// Create a file access (for the current platform) this is the only portable way of accessing files.  	static FileAccess *create_for_path(const String &p_path);  	static FileAccess *open(const String &p_path, int p_mode_flags, Error *r_error = NULL); /// Create a file access (for the current platform) this is the only portable way of accessing files.  	static CreateFunc get_create_func(AccessType p_access);  	static bool exists(const String &p_name); ///< return true if a file exists  	static uint64_t get_modified_time(const String &p_file); +	static uint32_t get_unix_permissions(const String &p_file); +	static Error set_unix_permissions(const String &p_file, uint32_t p_permissions);  	static void set_backup_save(bool p_enable) { backup_save = p_enable; };  	static bool is_backup_save_enabled() { return backup_save; }; diff --git a/core/os/os.h b/core/os/os.h index 12012fba80..4ae8a354e5 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -45,6 +45,8 @@  	@author Juan Linietsky <reduzio@gmail.com>  */ +class Mutex; +  class OS {  	static OS *singleton; @@ -260,7 +262,7 @@ public:  	virtual int get_low_processor_usage_mode_sleep_usec() const;  	virtual String get_executable_path() const; -	virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false) = 0; +	virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false, Mutex *p_pipe_mutex = NULL) = 0;  	virtual Error kill(const ProcessID &p_pid) = 0;  	virtual int get_process_id() const; |