Implemented all system cli handling functions.
							parent
							
								
									585978982e
								
							
						
					
					
						commit
						a737a5409a
					
				|  | @ -206,9 +206,11 @@ struct Mac_Vars { | ||||||
|      |      | ||||||
|     mach_timebase_info_data_t timebase_info; |     mach_timebase_info_data_t timebase_info; | ||||||
|     b32 first; |     b32 first; | ||||||
|     b32 step_requested; |  | ||||||
|     void *base_ptr; |     void *base_ptr; | ||||||
|  |      | ||||||
|     u64 timer_start; |     u64 timer_start; | ||||||
|  |     b32 step_requested; | ||||||
|  |     i32 running_cli; | ||||||
|      |      | ||||||
|     Node free_mac_objects; |     Node free_mac_objects; | ||||||
|     Node timer_objects; |     Node timer_objects; | ||||||
|  | @ -795,8 +797,8 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         // NOTE(yuval): Schedule another step if needed |         // NOTE(yuval): Schedule another step if needed | ||||||
|         MacProfileScope("Schedule Animations"){ |         MacProfileScope("Schedule Step"){ | ||||||
|             if (result.animating){ |             if (result.animating || (mac_vars.running_cli > 0)){ | ||||||
|                 system_signal_step(0); |                 system_signal_step(0); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -1335,6 +1337,7 @@ main(int arg_count, char **args){ | ||||||
|          |          | ||||||
|         mac_vars.first = true; |         mac_vars.first = true; | ||||||
|         mac_vars.step_requested = false; |         mac_vars.step_requested = false; | ||||||
|  |         mac_vars.running_cli = 0; | ||||||
|          |          | ||||||
|         if (plat_settings.fullscreen_window){ |         if (plat_settings.fullscreen_window){ | ||||||
|             mac_toggle_fullscreen(); |             mac_toggle_fullscreen(); | ||||||
|  |  | ||||||
|  | @ -454,32 +454,108 @@ function | ||||||
| system_cli_call_sig(){ | system_cli_call_sig(){ | ||||||
|     b32 result = false; |     b32 result = false; | ||||||
|      |      | ||||||
|     NotImplemented; |     int pipe_fds[2]; | ||||||
|  |     if (pipe(pipe_fds) == -1){ | ||||||
|  |         perror("system_cli_call: pipe"); | ||||||
|  |         return(false); | ||||||
|  |     } | ||||||
|      |      | ||||||
|     return(result); |     pid_t child_pid = fork(); | ||||||
|  |     if (child_pid == -1){ | ||||||
|  |         perror("system_cli_call: fork"); | ||||||
|  |         return(false); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     enum { PIPE_FD_READ, PIPE_FD_WRITE }; | ||||||
|  |      | ||||||
|  |     if (child_pid == 0){ | ||||||
|  |         // NOTE(yuval): Child Process | ||||||
|  |         close(pipe_fds[PIPE_FD_READ]); | ||||||
|  |         dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); | ||||||
|  |         dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); | ||||||
|  |          | ||||||
|  |         if (chdir(path) == -1){ | ||||||
|  |             perror("system_cli_call: chdir"); | ||||||
|  |             exit(1); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         char* argv[] = {"sh", "-c", script, 0}; | ||||||
|  |          | ||||||
|  |         if (execv("/bin/sh", argv) == -1){ | ||||||
|  |             perror("system_cli_call: execv"); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         exit(1); | ||||||
|  |     } else{ | ||||||
|  |         // NOTE(yuval): Parent Process | ||||||
|  |         close(pipe_fds[PIPE_FD_WRITE]); | ||||||
|  |          | ||||||
|  |         *(pid_t*)&cli_out->proc = child_pid; | ||||||
|  |         *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; | ||||||
|  |         *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; | ||||||
|  |          | ||||||
|  |         mac_vars.running_cli += 1; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return(true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function | function | ||||||
| system_cli_begin_update_sig(){ | system_cli_begin_update_sig(){ | ||||||
|     NotImplemented; |     // NOTE(yuval): Nothing to do here. | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function | function | ||||||
| system_cli_update_step_sig(){ | system_cli_update_step_sig(){ | ||||||
|     b32 result = false; |     int pipe_read_fd = *(int*)&cli->out_read; | ||||||
|      |      | ||||||
|     NotImplemented; |     fd_set fds; | ||||||
|  |     FD_ZERO(&fds); | ||||||
|  |     FD_SET(pipe_read_fd, &fds); | ||||||
|      |      | ||||||
|  |     struct timeval tv = {}; | ||||||
|  |      | ||||||
|  |     size_t space_left = max; | ||||||
|  |     char* ptr = dest; | ||||||
|  |      | ||||||
|  |     while (space_left > 0 && (select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1)){ | ||||||
|  |         ssize_t num = read(pipe_read_fd, ptr, space_left); | ||||||
|  |         if (num == -1){ | ||||||
|  |             perror("system_cli_update_step: read"); | ||||||
|  |         } else if (num == 0){ | ||||||
|  |             // NOTE(inso): EOF | ||||||
|  |             break; | ||||||
|  |         } else{ | ||||||
|  |             ptr += num; | ||||||
|  |             space_left -= num; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     *amount = (ptr - dest); | ||||||
|  |      | ||||||
|  |     b32 result = ((ptr - dest) > 0); | ||||||
|     return(result); |     return(result); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function | function | ||||||
| system_cli_end_update_sig(){ | system_cli_end_update_sig(){ | ||||||
|     b32 result = false; |     b32 close_me = false; | ||||||
|      |      | ||||||
|     NotImplemented; |     pid_t pid = *(pid_t*)&cli->proc; | ||||||
|      |      | ||||||
|     return(result); |     int status; | ||||||
|  |     if (pid && (waitpid(pid, &status, WNOHANG) > 0)){ | ||||||
|  |         cli->exit = WEXITSTATUS(status); | ||||||
|  |          | ||||||
|  |         close(*(int*)&cli->out_read); | ||||||
|  |         close(*(int*)&cli->out_write); | ||||||
|  |          | ||||||
|  |         mac_vars.running_cli -= 1; | ||||||
|  |          | ||||||
|  |         close_me = true; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return(close_me); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //////////////////////////////// | //////////////////////////////// | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Yuval Dolev
						Yuval Dolev