You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Add FileAccess::set_unix_permissions for Unix platforms
This commit is contained in:
@@ -293,8 +293,25 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) {
|
||||
};
|
||||
}
|
||||
|
||||
Error FileAccessUnix::_chmod(const String &p_path, int p_mod) {
|
||||
int err = chmod(p_path.utf8().get_data(), p_mod);
|
||||
uint32_t FileAccessUnix::_get_unix_permissions(const String &p_file) {
|
||||
|
||||
String file = fix_path(p_file);
|
||||
struct stat flags;
|
||||
int err = stat(file.utf8().get_data(), &flags);
|
||||
|
||||
if (!err) {
|
||||
return flags.st_mode & 0x7FF; //only permissions
|
||||
} else {
|
||||
ERR_EXPLAIN("Failed to get unix permissions for: " + p_file);
|
||||
ERR_FAIL_V(0);
|
||||
};
|
||||
}
|
||||
|
||||
Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_permissions) {
|
||||
|
||||
String file = fix_path(p_file);
|
||||
|
||||
int err = chmod(file.utf8().get_data(), p_permissions);
|
||||
if (!err) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -85,8 +85,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 Error _chmod(const String &p_path, int p_mod);
|
||||
virtual uint32_t _get_unix_permissions(const String &p_file);
|
||||
virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions);
|
||||
|
||||
FileAccessUnix();
|
||||
virtual ~FileAccessUnix();
|
||||
|
||||
@@ -276,7 +276,7 @@ uint64_t OS_Unix::get_ticks_usec() const {
|
||||
return longtime;
|
||||
}
|
||||
|
||||
Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr) {
|
||||
Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr, Mutex *p_pipe_mutex) {
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
// Don't compile this code at all to avoid undefined references.
|
||||
@@ -303,11 +303,17 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo
|
||||
ERR_FAIL_COND_V(!f, ERR_CANT_OPEN);
|
||||
|
||||
char buf[65535];
|
||||
|
||||
while (fgets(buf, 65535, f)) {
|
||||
|
||||
if (p_pipe_mutex) {
|
||||
p_pipe_mutex->lock();
|
||||
}
|
||||
(*r_pipe) += buf;
|
||||
if (p_pipe_mutex) {
|
||||
p_pipe_mutex->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
int rv = pclose(f);
|
||||
if (r_exitcode)
|
||||
*r_exitcode = rv;
|
||||
@@ -320,6 +326,13 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo
|
||||
|
||||
if (pid == 0) {
|
||||
// is child
|
||||
|
||||
if (!p_blocking) {
|
||||
// For non blocking calls, create a new session-ID so parent won't wait for it.
|
||||
// This ensures the process won't go zombie at end.
|
||||
setsid();
|
||||
}
|
||||
|
||||
Vector<CharString> cs;
|
||||
cs.push_back(p_path.utf8());
|
||||
for (int i = 0; i < p_arguments.size(); i++)
|
||||
@@ -342,6 +355,7 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo
|
||||
waitpid(pid, &status, 0);
|
||||
if (r_exitcode)
|
||||
*r_exitcode = WEXITSTATUS(status);
|
||||
|
||||
} else {
|
||||
|
||||
if (r_child_id)
|
||||
|
||||
@@ -89,7 +89,7 @@ public:
|
||||
virtual void delay_usec(uint32_t p_usec) const;
|
||||
virtual uint64_t get_ticks_usec() 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);
|
||||
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);
|
||||
virtual Error kill(const ProcessID &p_pid);
|
||||
virtual int get_process_id() const;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user