Add procPipe for subprocesses
This commit is contained in:
		
							parent
							
								
									8128edc7eb
								
							
						
					
					
						commit
						156282c95d
					
				
							
								
								
									
										30
									
								
								chat.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								chat.c
									
									
									
									
									
								
							@ -45,6 +45,21 @@ size_t idNext = Network + 1;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct Self self = { .color = Default };
 | 
					struct Self self = { .color = Default };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int procPipe[2] = { -1, -1 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void pipeRead(void) {
 | 
				
			||||||
 | 
						char buf[1024];
 | 
				
			||||||
 | 
						ssize_t len = read(procPipe[0], buf, sizeof(buf) - 1);
 | 
				
			||||||
 | 
						if (len < 0) err(EX_IOERR, "read");
 | 
				
			||||||
 | 
						if (!len) return;
 | 
				
			||||||
 | 
						buf[len - 1] = '\0';
 | 
				
			||||||
 | 
						char *ptr = buf;
 | 
				
			||||||
 | 
						while (ptr) {
 | 
				
			||||||
 | 
							char *line = strsep(&ptr, "\n");
 | 
				
			||||||
 | 
							uiFormat(Network, Warm, NULL, "%s", line);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static volatile sig_atomic_t signals[NSIG];
 | 
					static volatile sig_atomic_t signals[NSIG];
 | 
				
			||||||
static void signalHandler(int signal) {
 | 
					static void signalHandler(int signal) {
 | 
				
			||||||
	signals[signal] = 1;
 | 
						signals[signal] = 1;
 | 
				
			||||||
@ -146,15 +161,22 @@ int main(int argc, char *argv[]) {
 | 
				
			|||||||
	signal(SIGCHLD, signalHandler);
 | 
						signal(SIGCHLD, signalHandler);
 | 
				
			||||||
	sig_t cursesWinch = signal(SIGWINCH, signalHandler);
 | 
						sig_t cursesWinch = signal(SIGWINCH, signalHandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct pollfd fds[2] = {
 | 
						int error = pipe(procPipe);
 | 
				
			||||||
 | 
						if (error) err(EX_OSERR, "pipe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct pollfd fds[3] = {
 | 
				
			||||||
		{ .events = POLLIN, .fd = STDIN_FILENO },
 | 
							{ .events = POLLIN, .fd = STDIN_FILENO },
 | 
				
			||||||
		{ .events = POLLIN, .fd = irc },
 | 
							{ .events = POLLIN, .fd = irc },
 | 
				
			||||||
 | 
							{ .events = POLLIN, .fd = procPipe[0] },
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	while (!self.quit) {
 | 
						while (!self.quit) {
 | 
				
			||||||
		int nfds = poll(fds, 2, -1);
 | 
							int nfds = poll(fds, ARRAY_LEN(fds), -1);
 | 
				
			||||||
		if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
 | 
							if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
 | 
				
			||||||
		if (nfds > 0 && fds[0].revents) uiRead();
 | 
							if (nfds > 0) {
 | 
				
			||||||
		if (nfds > 0 && fds[1].revents) ircRecv();
 | 
								if (fds[0].revents) uiRead();
 | 
				
			||||||
 | 
								if (fds[1].revents) ircRecv();
 | 
				
			||||||
 | 
								if (fds[2].revents) pipeRead();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (signals[SIGHUP]) self.quit = "zzz";
 | 
							if (signals[SIGHUP]) self.quit = "zzz";
 | 
				
			||||||
		if (signals[SIGINT] || signals[SIGTERM]) break;
 | 
							if (signals[SIGINT] || signals[SIGTERM]) break;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								chat.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								chat.h
									
									
									
									
									
								
							@ -28,6 +28,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef unsigned char byte;
 | 
					typedef unsigned char byte;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int procPipe[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum Color {
 | 
					enum Color {
 | 
				
			||||||
	White, Black, Blue, Green, Red, Brown, Magenta, Orange,
 | 
						White, Black, Blue, Green, Red, Brown, Magenta, Orange,
 | 
				
			||||||
	Yellow, LightGreen, Cyan, LightCyan, LightBlue, Pink, Gray, LightGray,
 | 
						Yellow, LightGreen, Cyan, LightCyan, LightBlue, Pink, Gray, LightGray,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user