|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 4895 (0x131f) Types: TextFile Names: »tk3270.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦639290824⟧ »EurOpenD3/misc/tn3270.4.1.1.tar.Z« └─⟦cd3e6b3a4⟧ └─⟦this⟧ »disttn3270/transcom/tk3270.c«
/******************************************************************/ /* */ /* Transparent mode command for Suntools tektronix support for */ /* tn3270. Not to be directly called from shell. Specify */ /* 'tk3270' as tn3270 '-t' option or using 'transcom' command */ /* stdin and stdout are ends of pipes from tn3270 */ /* */ /* Steve Jacobson U.C. Berkeley 6/86 */ /******************************************************************/ #ifndef lint static char sccsid[] = "@(#)tk3270.c 1.1 (Berkeley) 6/30/86"; #endif not lint #include <stdio.h> #include <signal.h> #include <strings.h> #include <sys/time.h> #include <setjmp.h> char fnamei[] = "/tmp/tkiXXXXXX"; char fnameo[] = "/tmp/tkoXXXXXX"; int ioflag = 0; jmp_buf env; main(argc, argv) int argc; char *argv[]; { char command[300], inbuf[BUFSIZ]; int chldpid = -1, c, abortit(), sigin(); FILE *fopen(), *fpi, *fpo, *tout; /* tk3270 calls itself in a child process; tektool makes this necessary */ if (argc == 3 && *argv[1] == '/' && *argv[2] == '/') { exit(secondpass(argc, argv)); } (void) mktemp(fnamei); (void) mktemp(fnameo); /* communicating to program running in tektool via files is necessary */ /* because tektool won't leave fds alone */ if ((fpo = fopen(fnameo, "w")) == NULL) { exit(1); } if ((tout = fopen("/dev/tty", "w")) == NULL) { exit(1); } /* second pass needs to know this process id */ fprintf(fpo, "%d\n", getpid()); (void) fflush(fpo); (void) signal(SIGCHLD, abortit); (void) signal(SIGIO, sigin); (void) strcpy(command, "/usr/bin/tektool "); for (c = 1; c < argc; ++c) { /* copy suntool options to command line */ (void) strcat(command, argv[c]); (void) strcat(command, " "); } (void) strcat(command, "-r "); (void) strcat(command, argv[0]); (void) strcat(command, " "); (void) strcat(command, fnameo); (void) strcat(command, " "); (void) strcat(command, fnamei); /* invoke tektool and call tk3270 again */ if ((c = fork()) == 0) { if (execl("/bin/csh", "csh", "-c", command, (char *) 0) < 0) { (void) fflush(fpo); (void) fclose(fpo); (void) unlink(fnameo); exit(1); } } if (c < 0) { (void) fflush(fpo); (void) fclose(fpo); (void) unlink(fnameo); exit(1); } fprintf(tout,"%c[10;10Hstarting tektool...please wait", '\033'); (void) fflush(tout); /* remember that sun longjmp always returns 1 */ /* will longjmp if child dies or second pass (child) sends SIGIO */ if (setjmp(env) && ioflag == 0) { /* child died */ (void) fclose(fpo); (void) unlink(fnameo); (void) unlink(fnamei); if (chldpid > 0) { kill(chldpid, SIGKILL); } exit(0); } if (ioflag) { /* there is io waiting from child tek screen */ ioflag = 0; if (chldpid < 0) { /* read child pid so can kill when stdio closes */ if ((fpi = fopen(fnamei, "r")) == NULL) { (void) fflush(fpo); (void) fclose(fpo); (void) unlink(fnameo); exit(1); } fscanf(fpi,"%d\n", &chldpid); } while ((c = getc(fpi)) != EOF) { /* remember that tn3270 is in cbreak mode */ if (c == '\n') { c = '\r'; } putc(c, stdout); } (void) fflush(stdout); (void) clearerr(fpi); } /* endless read loop until tn3270 closes pipe, child unexpectly dies, or */ /* child signals that io from tek screen is waiting to go to tn3270 */ while ((c = read(fileno(stdin), inbuf, sizeof(inbuf))) != 0) { if (c > 0) { write(fileno(fpo), inbuf, c); } } (void) fclose(fpo); (void) unlink(fnameo); (void) unlink(fnamei); if (chldpid > 0) { kill(chldpid, SIGKILL); } exit(0); } abortit() { longjmp(env, 1); } sigin() { ioflag++; longjmp(env, 1); } /* secondpass is run by tektool, so output graphics commands result */ /* in moves, draws, etc. */ secondpass(argc, argv) int argc; char *argv[]; { FILE *fopen(), *fpi, *fpo, *tin, *tout; int c, parpid, readfds; struct timeval time; time.tv_sec = 0; time.tv_usec = 500; if ((fpi = fopen(argv[1], "r")) == NULL) { return(1); } /* read first pass process id from file for sigio */ fscanf(fpi, "%d\n", &parpid); if ((fpo = fopen(argv[2], "w")) == NULL) { return(1); } /* tell first pass this process id for kill */ fprintf(fpo, "%d\n", getpid()); if ((tin = fopen("/dev/tty", "r")) == NULL) { return(1); } if ((tout = fopen("/dev/tty", "w")) == NULL) { return(1); } while (1) { /* loop forever (1st pass will kill) */ while ((c = getc(fpi)) != EOF) { putc(c, tout); } (void) fflush(tout); (void) clearerr(fpi); readfds = 1 << fileno(tin); if (select(32, &readfds, 0, 0, &time) == 1) { while ((c = getc(tin)) != '\n') { putc(c, fpo); } putc('\r', fpo); (void) fflush(fpo); (void) kill(parpid, SIGIO); } } }