KVC@BUSTER.NRC.COM (Kevin Carosso) (06/22/88)
+-+-+-+ Beginning of part 2 +-+-+-+ X zrab.rab$l_rop= RAB$M_WBH; X} X X X X X X X X X Xget_tt_info() X{ X $DESCRIPTOR(d_tt, "SYS$COMMAND"); X /* Get a channel & mailbox of terminal */ X check(LIB$ASN_WTH_MBX(&d_tt,&mbsiz,&maxsiz,&tt_chn,&tt_mb_chn)); X /* Get the terminal characteristics. */ X check(SYS$QIOW(0,tt_chn,IO$_SENSEMODE,0,0,0,&tt_chr,ttchrlen,0,0,0,0)); X tt_sav_chr= tt_chr; X tt_chr.ttchr|= TT$M_NOECHO; /* term will be Noecho */ X tt_chr.ttchr&= ~TT$M_HOSTSYNC & ~TT$M_TTSYNC; /* it will have ^S */ X tt_chr.xchar|= TT2$M_PASTHRU; /* it will be PASTRHU */ X check(SYS$QIOW(0,tt_chn,IO$_SETMODE,0,0,0,&tt_chr,ttchrlen,0,0,0,0)); X} X X X X X X X Xfix_a_tw() /* Set up a Pseudo term */ X{ X int efn=1, dev_depend, tw_chn; X struct CHARBLK tw_chr; X struct IOSBBLK iosb; X struct DVIBLK dvi_stuff = {4, DVI$_DEVDEPEND, &dev_depend, 0, 0}; X X X $DESCRIPTOR(d_pynam,"PYA0:"); /* Template. */ X $DESCRIPTOR(d_finaltw, &finaltw); X /* Assign a mailbox to PYA */ X check(LIB$ASN_WTH_MBX(&d_pynam,&mbsiz,&maxsiz,&py_chn,&py_mb_chn)); X/* X * Use $GETDVI to get the device dependent characteristics, which X * contains the associated terminal device's unit number. X */ X check(SYS$GETDVI(0,py_chn,0,&dvi_stuff,&iosb,0,0,0)); X check(iosb.stats); X sprintf(&finaltw,"TWA%d:",dev_depend); X tw_chr= tt_sav_chr; X tw_chr.xchar|= TT2$M_HANGUP; X d_finaltw.dsc$w_length= strlen(&finaltw); X check(SYS$ASSIGN(&d_finaltw,&tw_chn,0,0)); /* Get a channel on this TWA */ X /* Make it look like user's real terminal */ X st = SYS$QIOW(0,tw_chn,IO$_SETCHAR,0,0,0,&tw_chr,ttchrlen,0,0,0,0); X if (st == SS$_NOPRIV) V`009printf ("WARNING -- PHY_IO privilege required to propagate terminal charact Xeristics!\n"); X else X`009check(st); X check(SYS$DASSGN(tw_chn)); /* We don't need it. only the mailbox */ X /* in fact keeping it kills us. */ X} X X X X X X X X X Xpost_reads() /* This sets up ASTs */ X{ X /* Read AST on Pseudo-term */ X check(SYS$QIO(0,py_mb_chn,IO$_READVBLK,&miosb,&tw_srv,0, X &py_mb,mbsiz,0,0,0,0)); X /* Read AST on real term */ X check(SYS$QIO(0,tt_mb_chn,IO$_READVBLK,&tiosb,&tt_srv,0, X &tt_mb,mbsiz,0,0,0,0)); X} X X X X X X X X X Xbegin_session() X{ X int j; X X for(;;) { /* Read/write forever loop */ X /* Read the pseudo-term dry */ X check(SYS$QIOW(0,py_chn,IO$_READVBLK,&piosb,0,0, X &twline,linesz,0,0,0,0)); X check(piosb.stats); /* everything fine? */ X j= piosb.tmoff + piosb.tmsiz; /* How much stuff did we read? */ X /* Write the stuff to the terminal */ X check(SYS$QIO(1,tt_chn,IO$_WRITEVBLK,&tiosb,0,0,&twline,j,0,0,0,0)); V check(SYS$WAITFR(1)); /* for some reason QIOW does not work * X/ X if (log) { X log_line(j); /* If we're looging, log it. */ X if ((tim) && (com)) { X sprintf(&time,"%s\r\n",&time); /* Time stamp */ X check(SYS$QIOW(0,tt_chn,IO$_WRITEVBLK,0,0,0, X &time,strlen(&time),0,0,0,0)); X com= 0; X } X } X } X} X X X X X X X X X Xmain(how_many,rscan) X int how_many; X char *rscan[]; X{ X int exit_handler[4]= {0,quit,0,&st}; X char filnam[40]; X X check(SYS$DCLEXH(&exit_handler)); /* Define Exit handler (quit) */ X if (how_many > 1) X strcpy(&filnam,rscan[1]); X else X strcpy(&filnam,"Photo.Log"); /* default log file if none specified */ X get_file(filnam); /* Open the file */ X get_tt_info(); /* Get terminal channel & info */ X fix_a_tw(); /* Set a pseudo terminal by TT info */ X check(SYS$CANCEL(py_chn)); /* Don't need this Half of pseudo-ter */ X check(low_lib_spawn(&finaltw,&pid)); /* Spawn a subprocess. */ X post_reads(); X enable_hangups= 1; X puts ("Begin PHOTO subprocess"); X begin_session(); X} $ GOSUB UNPACK_FILE $ FILE_IS = "PHOTO.CLD" $ CHECKSUM_IS = 1040204513 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY Xdefine verb PHOTO X`009image sys$system:photo X`009parameter p1 value(type=$rest_of_line) X X`009`009 $ GOSUB UNPACK_FILE $ FILE_IS = "PHOTO.HLP" $ CHECKSUM_IS = 85935070 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X1 Photo X X!******************************************************** X X!* * X X!* * X X!* Photo * X X!* * X X!* * X X!******************************************************** X X X XPhoto copies all of the Input/Output (IO) that appears on the X Xterminal to a file. It is useful for turning in homework X Xassignments, which do most of their IO to the terminal. X X X XFormat: X X X X $ PHOTO [FILENAME.EXT] X X X XThis starts recording, and creates a file called FILENAME.EXT in X Xthe user's current directory. If a filename is not specified, X Xthe default filename is PHOTO.LOG, in the user's current X Xdirectory. To end PHOTO, either LOGOUT or POP. X X2 Author X XPhoto was written by Asbed Bedrossian. The program uses the X XPTDRIVER PYDRIVER combination to trap terminal IO on a X Xpseudoterminal. The PT/PY package is the latest update from X XKevin Carosso (@Hughes) on the old PTYDRIVER. X X2 Usage X XPhoto is a predefined command. The character ^\ toggles logging X Xto the photo file. The character ^] toggles Time stamping. X XTime stamping will appear as the date and time in square X Xbrackets after every command the user types on the terminal. X $ GOSUB UNPACK_FILE $ FILE_IS = "PHOTO.README" $ CHECKSUM_IS = 189871340 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X Pertinent files: PHOTO.C PHOTO.CLD PHOTO.HLP X X follow compile & link instructions at the top of the PHOTO.C. Then place the Xthe image in your local SYS$SYSTEM:. Install it with PHY_IO and then set the XCLD verb in your DCLTABLES so users can access it. Put the HLP file through Xthe dcl command LIBRAR/CREATE/HELP PHOTO.HLB PHOTO.HLP. Now insert the XHLB file into your system (or local) help library. Install your drivers Xand there you go. X Let me know if you have problems. X X_________________________________________________________________________ XAsbed Bedrossian, University Computing Services, U of Southern California X ARPA: asbed@oberon.usc.edu BITNET: asbed@uscvaxq X UUCP: {sdcrdcf, cit-vax}!oberon!asbed PHONE: (213) 743-4266 $ GOSUB UNPACK_FILE $ FILE_IS = "PHOTOMSG.MSG" $ CHECKSUM_IS = 1701455525 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X.title error messages for PHOTO X.facility PHOTO,1 /prefix=PHOTO_ X.severity FATAL XINUSE <You are already in a PHOTO session> X.end $ GOSUB UNPACK_FILE $ EXIT -+-+-+-+-+ End of part 2 +-+-+-+-+-