diff --git a/src/ui-socket.c b/src/ui-socket.c
index e703106..3f1c6dc 100644
--- a/src/ui-socket.c
+++ b/src/ui-socket.c
@@ -28,12 +28,12 @@ int init_ui_socket(const char *filename) {
}
}
-/*
- * This function is called from the FUSE operations functions. Those are called
- * from separate threads. Therefore, there can be multiple threads that try to
- * ask for access at the same time, but we have to
+/**
+ * @param filename: The file that the process is trying to access
+ * @pram pi: The process information
+ * @return: 0 if access is denied, 1 if access is allowed, 2 if access is allwed
+ * for the runtime of the process
*/
-
int ask_access(const char *filename, struct process_info pi) {
FILE *fp;
@@ -41,16 +41,31 @@ int ask_access(const char *filename, struct process_info pi) {
139 + sizeof(pid_t) * 8 + strlen(pi.name) + strlen(filename);
char *command = (char *)malloc(command_len);
snprintf(command, command_len,
- "zenity --question --title \"Allow Access?\" --text \"Allow process "
+ "zenity --question --extra-button \"Allow this time\" --title "
+ "\"Allow Access?\" --text \"Allow process "
"%s with PID %d to access %s\"",
pi.name, pi.PID, filename);
+
// Zenity Question Message Popup
fp = popen(command, "r");
free(command);
+
if (fp == NULL) {
perror("Pipe returned a error");
return -1;
- } else {
- return WEXITSTATUS(pclose(fp));
}
+
+ // if the user clicks the "Allow this time" button, `zenity` will only
+ // write it to `stdout`, but the exit code will still be `1`. So, we need
+ // to manually check the output.
+ char buffer[1024];
+ while (fgets(buffer, sizeof(buffer), fp)) {
+ if (strcmp(buffer, "Allow this time.\n") == 0) {
+ pclose(fp);
+ return 2;
+ }
+ }
+
+ int zenity_exit_code = WEXITSTATUS(pclose(fp));
+ return zenity_exit_code;
}