I want to write a simple, dumb, X terminal emulator in C on a Linux system.
At first, I just thought I would have to popen a shell and display its output. I checked xterm and rxvt code, and it looks a bit more complicated.
First, I have to open a pseudo-terminal with openpty. So I look at the man page and see that openpty fills 2 file descriptors, the master and the slave. Both xterm and rxvt code are messy because of the system-dependent-ness of those specials files.
I understand the termios stuff : it’s just a bunch of information about the escape code of the terminal. What I really don’t get is : what am I suppose to do with the master/slave file descriptor ?
An example program which open a terminal, logs in, executes a ‘ls’ on the shell would be awesome.
(English is not my native language, excuse my eventual mistake)
Edit: Here’s the sample code I came up with :
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <pty.h> #include <utmp.h> #include <ctype.h> void safe_print (char* s) { while(*s) { if(*s == '\n') putchar('\n'); else if(iscntrl(*s)) printf('\\e(%d)', *s); else putchar(*s); s++; } } int main (int argc, char** argv) { char buf[BUFSIZ] = {0}; int master; int ret = forkpty(&master, NULL, NULL, NULL); if(ret == -1) puts('no fork'), exit(0); if(!ret) { execl('/bin/sh', 'sh', NULL); exit(0); } sleep(1); /* let the shell run */ if(argc >= 2) { write(master, argv[1], strlen(argv[1])); write(master, '\n', 1); } else { write(master, 'date\n', sizeof 'date\n'); } while(1) { switch(ret = read(master, buf, BUFSIZ)) { case -1: puts('error!'); exit(1); break; case 0: puts('nothing..'), sleep(1); break; default: buf[ret] = '\0'; safe_print(buf); } } close(master); return 0; }
With respect to the master/slave part of your question, from the pty(4) man page (which is referenced from the openpty(3) man page on my system):
Man pages are your friends.