#include #include #include #include #include #include #include extern const char *__progname; static int works(char *term, char *tcap) { pid_t kid; int p[2]; int s; int nr; if (socketpair(AF_LOCAL,SOCK_STREAM,0,&p[0]) < 0) { fprintf(stderr,"%s: AF_LOCAL socketpair: %s\n",__progname,strerror(errno)); exit(1); } kid = fork(); if (kid < 0) { fprintf(stderr,"%s: fork: %s\n",__progname,strerror(errno)); exit(1); } if (kid == 0) { char entbuf[1024]; setenv("TERMCAP",tcap,1); s = tgetent(&entbuf[0],term); write(p[1],&s,sizeof(s)); _exit(0); } close(p[1]); nr = recv(p[0],&s,sizeof(s),MSG_WAITALL); if (nr < 0) { fprintf(stderr,"%s: recv: %s\n",__progname,strerror(errno)); exit(1); } else if (nr != sizeof(s)) { fprintf(stderr,"%s: recv: wanted %d, got %d\n",__progname,(int)sizeof(s),nr); exit(1); } return(s==1); } int main(int, char **); int main(int ac, char **av) { char *term; if (ac != 2) { fprintf(stderr,"Usage: %s proposed-termcap-file\n",__progname); exit(1); } term = getenv("TERM"); if (! term) exit(0); if (works(term,av[1])) exit(0); exit(1); }