Introduce file_descriptors struct
This commit is contained in:
		
							parent
							
								
									58d77943f6
								
							
						
					
					
						commit
						2eeac80444
					
				
							
								
								
									
										48
									
								
								bt.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								bt.c
									
									
									
									
									
								
							| @ -18,29 +18,30 @@ typedef struct scrollback { | ||||
|     char *buf; | ||||
| } scrollback; | ||||
| 
 | ||||
| // PTY
 | ||||
| int master; | ||||
| int slave; | ||||
| typedef struct file_descriptors { | ||||
|     int master; | ||||
|     int child; | ||||
| } file_descriptors; | ||||
| 
 | ||||
| void spawn(void) { | ||||
|     openpty(&master, &slave, NULL, NULL, NULL); | ||||
| void spawn(file_descriptors *fds) { | ||||
|     openpty(&fds->master, &fds->child, NULL, NULL, NULL); | ||||
|     pid_t p = fork(); | ||||
|     if (p == 0) { | ||||
|         close(master); | ||||
|         close(fds->master); | ||||
| 
 | ||||
|         setsid(); | ||||
|         ioctl(slave, TIOCSCTTY, NULL); | ||||
|         dup2(slave, 0); | ||||
|         dup2(slave, 1); | ||||
|         dup2(slave, 2); | ||||
|         ioctl(fds->child, TIOCSCTTY, NULL); | ||||
|         dup2(fds->child, 0); | ||||
|         dup2(fds->child, 1); | ||||
|         dup2(fds->child, 2); | ||||
| 
 | ||||
|         execle("/bin/dash", "-/bin/dash", (char *)NULL, (char *[]){ "TERM=dumb", NULL }); | ||||
|     } else { | ||||
|         close(slave); | ||||
|         close(fds->child); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| float fontsize = 12; | ||||
| static float fontsize = 12; | ||||
| 
 | ||||
| Font *load_font() { | ||||
|     unsigned int file_size = 0; | ||||
| @ -57,10 +58,10 @@ Font *load_font() { | ||||
|     return fontDefault; | ||||
| } | ||||
| 
 | ||||
| int read_pty(scrollback *sb) { | ||||
| int read_pty(file_descriptors *fds, scrollback *sb) { | ||||
|     ssize_t nread; | ||||
|     char readbuf[256]; | ||||
|     switch (nread = read(master, readbuf, sizeof(readbuf))) { | ||||
|     switch (nread = read(fds->master, readbuf, sizeof(readbuf))) { | ||||
|     case -1: | ||||
|         if (errno == EAGAIN) { | ||||
|             return 0; | ||||
| @ -85,9 +86,10 @@ int read_pty(scrollback *sb) { | ||||
| } | ||||
| 
 | ||||
| int main(void) { | ||||
|     spawn(); | ||||
| 
 | ||||
|     scrollback sb = { 0 }; | ||||
|     file_descriptors fds = { 0 }; | ||||
| 
 | ||||
|     spawn(&fds); | ||||
| 
 | ||||
|     const int screenWidth = 800; | ||||
|     const int screenHeight = 550; | ||||
| @ -105,12 +107,12 @@ int main(void) { | ||||
|     char buf[128]; | ||||
|     int buf_len = 0; | ||||
| 
 | ||||
|     int flags = fcntl(master, F_GETFL); | ||||
|     int flags = fcntl(fds.master, F_GETFL); | ||||
|     flags |= O_NONBLOCK; | ||||
|     fcntl(master, F_SETFL, flags); | ||||
|     fcntl(fds.master, F_SETFL, flags); | ||||
|     fd_set rset; | ||||
|     FD_ZERO(&rset); | ||||
|     FD_SET(master, &rset); | ||||
|     FD_SET(fds.master, &rset); | ||||
| 
 | ||||
|     sb.ypos = 0; | ||||
| 
 | ||||
| @ -152,8 +154,8 @@ int main(void) { | ||||
|         if (IsKeyPressed(KEY_ENTER)) { | ||||
|             sb.length -= buf_len; | ||||
|             sb.buf[sb.length] = '\0'; | ||||
|             write(master, buf, buf_len); | ||||
|             write(master, "\r", 1); | ||||
|             write(fds.master, buf, buf_len); | ||||
|             write(fds.master, "\r", 1); | ||||
|             buf[0] = '\0'; | ||||
|             buf_len = 0; | ||||
|             new_char = true; | ||||
| @ -171,7 +173,7 @@ int main(void) { | ||||
|         // Drawing
 | ||||
|         BeginDrawing(); | ||||
|         { | ||||
|             int nread = read_pty(&sb); | ||||
|             int nread = read_pty(&fds, &sb); | ||||
|             if (nread > 0) { | ||||
|                 sb.length += nread; | ||||
|                 new_read = true; | ||||
| @ -201,6 +203,6 @@ int main(void) { | ||||
|     } | ||||
| 
 | ||||
|     free(sb.buf); | ||||
|     close(master); | ||||
|     close(fds.master); | ||||
|     CloseWindow(); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user