mellin@lan.informatik.tu-muenchen.dbp.de (Reiner Mellin) (09/04/89)
Here are now the Sources of my PTY-filemanager written mainly in C.
For educational purposes mainly ....
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 1 (of 2)."
# Contents: COPYRIGHT MANIFEST.SRC cpty.a makefile misc.h miscasm.a
# pty.a ptydev.a ptydrv.a ptyman.doc ptyman.h ptystat.a tty.a
# Wrapped by ram@ramsys on Mon Sep 4 13:16:56 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'COPYRIGHT' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'COPYRIGHT'\"
else
echo shar: Extracting \"'COPYRIGHT'\" \(1562 characters\)
sed "s/^X//" >'COPYRIGHT' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
END_OF_FILE
if test 1562 -ne `wc -c <'COPYRIGHT'`; then
echo shar: \"'COPYRIGHT'\" unpacked with wrong size!
fi
# end of 'COPYRIGHT'
fi
if test -f 'MANIFEST.SRC' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'MANIFEST.SRC'\"
else
echo shar: Extracting \"'MANIFEST.SRC'\" \(579 characters\)
sed "s/^X//" >'MANIFEST.SRC' <<'END_OF_FILE'
X File Name Archive # Description
X-----------------------------------------------------------
X COPYRIGHT 1
X MANIFEST.SRC 1 This shipping list
X cpty.a 1
X funcs.c 2
X makefile 1
X misc.h 1
X miscasm.a 1
X pty.a 1
X ptydev.a 1
X ptydrv.a 1
X ptyman.c 2
X ptyman.doc 1
X ptyman.h 1
X ptystat.a 1
X tty.a 1
END_OF_FILE
if test 579 -ne `wc -c <'MANIFEST.SRC'`; then
echo shar: \"'MANIFEST.SRC'\" unpacked with wrong size!
fi
# end of 'MANIFEST.SRC'
fi
if test -f 'cpty.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'cpty.a'\"
else
echo shar: Extracting \"'cpty.a'\" \(3373 characters\)
sed "s/^X//" >'cpty.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X*
X* $Id: cpty.a_v 1.2.1.1 89/09/04 13:12:14 ram Exp $
X*
X* $Log: cpty.a_v $
X* Revision 1.2.1.1 89/09/04 13:12:14 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:27:06 ram
X* Copyright-message added
X*
X*
X
X nam PtyMan
X ttl PtyMan - Pty File Manager
X
X use defsfile
X
XEdition set 2
X
XTyp_Lang set (FlMgr<<8)+Objct
XAttr_Rev set (ReEnt+SupStat)<<8+0
X
X psect PtyMan,Typ_Lang,Attr_Rev,Edition,0,Entry
X
Xerrno: equ $1e ; !!! PD_Errno in /DEFS/sysio.a !!!
X* dadurch koennen C-Routinen die errno setzen, ganz normal genutzt
X* werden !!
X
X page
XEntry:
X dc.w _Create-Entry
X dc.w _Open-Entry
X dc.w _MakDir-Entry
X dc.w _ChdDir-Entry
X dc.w _Delete-Entry
X dc.w _Seek-Entry
X dc.w _Read-Entry
X dc.w _Write-Entry
X dc.w _ReadLn-Entry
X dc.w _WriteLn-Entry
X dc.w _GetStat-Entry
X dc.w _SetStat-Entry
X dc.w _Close-Entry
X
X_MakDir:
X_ChdDir:
X_Delete:
X move.w #E$BMode,d1
X ori.w #Carry,ccr
X rts
X
X_Seek:
X andi.w #NoCarry,ccr
X rts
X
X_Read:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra Read
X
X_ReadLn:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra ReadLn
X
X_Write:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra Write
X
X_WriteLn:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra WriteLn
X
X_Create:
X_Open:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra Open
X
X_GetStat:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra GetStat
X
X_SetStat:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra SetStat
X
X_Close:
X movem.l d0-d7/a0-a6,-(sp)
X bsr.s _setup
X bra Close
X
X_setup
X move.l a6,PD_Sysglob(a1) ; System Globals
X move.l a1,a6 ; Globals fuer C
X move.l (sp)+,a0 ; Return-Adresse
X move.l a4,d0 ; Process-Desciptor
X move.l a5,d1 ; User Stack Frame
X jsr (a0) ; Ruecksprung
X
X tst.l d0
X beq.s _setup90 ; kein Fehler!
X
X movem.l (sp)+,d0-d7/a0-a6
X move.l PD_Errno(a1),d1
X ori.w #Carry,ccr
X rts
X
X_setup90
X movem.l (sp)+,d0-d7/a0-a6
X andi.w #NoCarry,ccr
X rts
X
X ends
END_OF_FILE
if test 3373 -ne `wc -c <'cpty.a'`; then
echo shar: \"'cpty.a'\" unpacked with wrong size!
fi
# end of 'cpty.a'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(1480 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X# Options:
X# ST The Cumana Implementation of OSK supports a BlkWr-like
X# SetStat-Call, implement this
X#
XOPTIONS = -DST
X#
X#
XRDIR = RELS
XCFLAGS = -t=/dd -S $(OPTIONS)
XLFLAGS = -g
X
XSYSLIB = -l=/h0/LIB/sys.l
XCLIB = -l=/h0/LIB/clib.l
X
XOBJS = cpty.r ptyman.r funcs.r miscasm.r
XLIBOBJS =
X
XPtyMan: $(OBJS) ptyman.h
X chd $(RDIR); l68 -O=../$@ $(OBJS) $(CLIB) $(SYSLIB) $(LFLAGS) -s >-../$@.map
X
XPtyDrv: ptydrv.r ptystat.r
X chd $(RDIR); l68 -O=../$@ $(SYSLIB) ptystat.r \
X $@.r $(LFLAGS)
X
Xpty: pty.r
X chd $(RDIR); l68 -n=$@ -O=../$@ $(SYSLIB) $@.r
X
Xtty: tty.r
X chd $(RDIR); l68 -n=$@ -O=../$@ $(SYSLIB) $@.r
X
Xbindist.shar: ptyman pty tty ptydrv
X uuencode ptyman >-ptyman.uu
X uuencode pty >-pty.uu
X uuencode tty >-tty.uu
X uuencode ptydrv >-ptydrv.uu
X shar MANIFEST.BIN COPYRIGHT ptyman.doc *.uu >-bindist.shar
X del *.uu
X
Xsrcdist: cpty.a ptyman.c funcs.c miscasm.a pty.a tty.a ptydrv.a ptystat.a ptyman.h misc.h makefile ptydev.a
X makekit -i MANIFEST.SRC -o MANIFEST.SRC COPYRIGHT ptyman.doc cpty.a ptyman.c funcs.c miscasm.a pty.a tty.a \
X ptydrv.a ptystat.a ptyman.h misc.h makefile ptydev.a
X del MANIFEST.SRC
X
Xclean: makefile
X del rels/*
X del ptyman tty pty ptydrv *.stb *.map
X touch makefile
X
Xco:
X co cpty.a ptyman.c funcs.c miscasm.a pty.a tty.a ptydrv.a \
X ptystat.a ptyman.h misc.h makefile ptydev.a
X
Xci:
X ci -u cpty.a ptyman.c funcs.c miscasm.a pty.a tty.a ptydrv.a \
X ptystat.a ptyman.h misc.h makefile ptydev.a
END_OF_FILE
if test 1480 -ne `wc -c <'makefile'`; then
echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'misc.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'misc.h'\"
else
echo shar: Extracting \"'misc.h'\" \(2579 characters\)
sed "s/^X//" >'misc.h' <<'END_OF_FILE'
X/* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* */
X
X/*
X * $Id: misc.h_v 1.2.1.1 89/09/04 13:13:15 ram Exp $
X *
X * $Log: misc.h_v $
X * Revision 1.2.1.1 89/09/04 13:13:15 ram
X * added some comments
X *
X * Revision 1.2 89/08/31 12:31:38 ram
X * Copyright message added
X *
X *
X */
X
X#define NULL 0
X
X#define TRUE 1
X#define FALSE 0
X
X#define MIN(a,b) ((a)<(b)?(a):(b))
X#define MAX(a,b) ((a)>(b)?(a):(b))
X#define upchar(ch) ( ( ch >= 'a' && ch <= 'z' ) ? ( ch - ' ') : ch)
X
X#define DEFBUFSIZE 0x200 /* size of Databuffers */
X#define LINEBUFSIZ 0x100 /* size of line-editing-buffer */
X
X#define PTY (0)
X#define TTY (1)
X
X#define P_CONDEMNED (0x200)
X
X#define WAKE(pid,sig) ( pid != 0 ? (kill(pid,sig),pid = 0) : 0)
X
X/* user-changeable options -- see SS_Opt */
X#define OPTMAX (&((struct pty_opt *) 0)->pd_tbl)
X
X#ifndef __GNUC__
X#define inline
X#endif
X
X/* returned by getctrlchar() */
X#define BSP 1
X#define DEL 2
X#define EOR 3
X#define EOF 4
X#define RPR 5
X#define DUP 6
X#define PSC 7
X#define INT 8
X#define QUT 9
X
END_OF_FILE
if test 2579 -ne `wc -c <'misc.h'`; then
echo shar: \"'misc.h'\" unpacked with wrong size!
fi
# end of 'misc.h'
fi
if test -f 'miscasm.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'miscasm.a'\"
else
echo shar: Extracting \"'miscasm.a'\" \(3687 characters\)
sed "s/^X//" >'miscasm.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X*
X* $Id: miscasm.a_v 1.2.1.1 89/09/04 13:13:33 ram Exp $
X*
X* $Log: miscasm.a_v $
X* Revision 1.2.1.1 89/09/04 13:13:33 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:32:39 ram
X* copyright message added
X*
X*
X
X use <iodev.a>
X use ptydev.a
X use defsfile
X
X psect miscasm,0,0,0,0,0
X
X* Hilfs-Funktionen fuer Ptyman, da malloc() nicht verwendet werden kann
X*
X* _srqmem( size )
X
X_srqmem:
X move.l a2,-(sp)
X
X OS9 F$SRqMem
X bcc.s _srqmem90
X
X move.l d1,errno(a6)
X move.l (sp)+,a2
X moveq.l #0,d0
X rts
X
X_srqmem90
X move.l a2,d0
X move.l (sp)+,a2
X rts
X
X* _srtmem(addr, size)
X_srtmem:
X move.l a2,-(sp)
X
X move.l d0,a2
X move.l d1,d0
X OS9 F$SRtMem
X bcc.s _srtmem90
X
X move.l d1,errno(a6)
X
X move.l (sp)+,a2
X moveq.l #-1,d0
X rts
X
X_srtmem90
X move.l (sp)+,a2
X moveq.l #0,d0
X rts
X
X* wait for pid to finish I/O ( 0 --> free )
Xiowait:
X tst.w d0
X beq.s io1
X clr.l d1
X os9 F$IOQu
X move.l d1,d0
Xio1
X rts
X
X* getctrlchar(ch) -- return control-char-index in d0
Xgetctrlchar:
X tst.b d0
X beq.s g1
X cmp.b #32,d0
X bge.s g1
X lea PD_BSP(a6),a0 * start of ctl-char array
X moveq.l #8,d1 * length
Xg2
X cmp.b (a0)+,d0
X beq.s g3
X
X dbra d1,g2
Xg1
X clr.l d0
X rts
Xg3
X neg d1 * compute index
X add.w #9,d1
X move.w d1,d0
X rts
X
Xstrcmp:
X movea.l d0,a1 * simple strcmp
X movea.l d1,a0
X moveq.l #0,d0 :2
X move.l d0,d1
X bra.s _6
X_4 tst.b (a1) :2
X beq.s _3
X_9
X_7
X_6 cmpm.b (a0)+,(a1)+ :2
X beq.s _4
X_5
X subq.l #1,a0
X subq.l #1,a1
X move.b (a0),d0 :2
X move.b (a1),d1 :2
X sub.l d0,d1 :2
X move.l d1,d0 :2
X_3 rts :2
X
Xmemcpy:
X move.l d0,a1 * simple memcpy
X move.l d1,a0
X move.l 4(a7),d0
Xm1
X move.b (a0)+,(a1)+
X dbra d0,m1
X rts
X
X* initbuf
Xinitbuf:
X move.l d0,a0 * dont change this Function !!!!!
X lea in2(pc),a1
Xin1
X move.b (a1)+,d0
X not.b d0
X cmpi.b #$d,d0
X beq.s in3
X move.b d0,(a0)+
X dbra d1,in1
Xin3
X move.b d0,(a0)+
X dbra d1,in3
X rts
Xin2
X dc.b ^' ',^'b',^'y',^' ',^'R',^'e',^'i',^'m' * dont change !!
X dc.b ^'e',^'r',^' ',^'A',^'.',^' ',^'M',^'e'
X dc.b ^'l',^'l',^'i',^'n',^$d
X align
X
Xkill:
X tst.w d0
X beq.s k1
X os9 F$Send
Xk1
X rts
X
X ends
END_OF_FILE
if test 3687 -ne `wc -c <'miscasm.a'`; then
echo shar: \"'miscasm.a'\" unpacked with wrong size!
fi
# end of 'miscasm.a'
fi
if test -f 'pty.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'pty.a'\"
else
echo shar: Extracting \"'pty.a'\" \(2847 characters\)
sed "s/^X//" >'pty.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X*
X* $Id: pty.a_v 1.2.1.1 89/09/04 13:13:46 ram Exp $
X*
X* $Log: pty.a_v $
X* Revision 1.2.1.1 89/09/04 13:13:46 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:34:02 ram
X* *** empty log message ***
X*
X*
X
X nam PtyMan device descriptor module
X
XEdition equ 0 current edition
X
X use defsfile
X
XTypeLang set (Devic<<8)+0
XAtt_Revs set (ReEnt)<<8)+0
X psect pty,TypeLang,Att_Revs,Edition,0,0
X
X dc.l 0 no port address
X dc.b 0 no trap assignment
X dc.b 0 no IRQ hardware interrupt level
X dc.b 0 0 no polling priority
X dc.b PUpdat_+Updat_ device mode capabilities
X dc.w PtyMgr file manager name offset
X dc.w PtyDrv device driver name offset
X dc.w 0 DevCon
X dc.w 0,0,0,0 reserved
X dc.w OptLen option byte count
X
XOptTbl
X dc.b 0 its a SCF-like device
X dc.b 0 PD_UPC
X dc.b 0 PD_BSO
X dc.b 0 PD_DLO
X dc.b 0 PD_EKO
X dc.b 0 PD_ALF
X dc.b 0 PD_NUL
X dc.b 0 PD_PAU
X dc.b 0 PD_PAG
X dc.b 0 PD_BSP
X dc.b 0 PD_DEL
X dc.b 0 PD_EOR
X dc.b 0 PD_EOF
X dc.b 0 PD_RPR
X dc.b 0 PD_DUP
X dc.b 0 PD_PSC
X dc.b 0 PD_INT
X dc.b 0 PD_QUT
X dc.b 0 PD_BSE
X dc.b 0 PD_OVF
X dc.b 0 PD_PAR
X dc.b 0 PD_BAU
X dc.w echodev
X dc.b 0 PD_XON
X dc.b 0 PD_XOFF
X dc.b 0 PD_TAB
X dc.b 0 PD_TABS
XOptLen equ *-OptTbl
X
XPtyMgr dc.b "PtyMan",0 file manager
XPtyDrv dc.b "PtyDrv",0 device driver
Xechodev dc.b "pty",0 correspondent device
X ends
END_OF_FILE
if test 2847 -ne `wc -c <'pty.a'`; then
echo shar: \"'pty.a'\" unpacked with wrong size!
fi
# end of 'pty.a'
fi
if test -f 'ptydev.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ptydev.a'\"
else
echo shar: Extracting \"'ptydev.a'\" \(1692 characters\)
sed "s/^X//" >'ptydev.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X********************************
X* Pty Static storage requirements
X
X org V_USER
XV_PTY: equ . total PtyManager static overhead
X
END_OF_FILE
if test 1692 -ne `wc -c <'ptydev.a'`; then
echo shar: \"'ptydev.a'\" unpacked with wrong size!
fi
# end of 'ptydev.a'
fi
if test -f 'ptydrv.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ptydrv.a'\"
else
echo shar: Extracting \"'ptydrv.a'\" \(2210 characters\)
sed "s/^X//" >'ptydrv.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X* $Id: ptydrv.a_v 1.2.1.1 89/09/04 13:14:11 ram Exp $
X*
X* $Log: ptydrv.a_v $
X* Revision 1.2.1.1 89/09/04 13:14:11 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:34:39 ram
X* *** empty log message ***
X*
X*
X
XEdition equ 0
X
XTyp_Lang set (Drivr<<8)+Objct
XAttr_Rev set (ReEnt+SupStat)<<8+0
X
X psect ptydrv,Typ_Lang,Attr_Rev,Edition,0,Entry
X
X use defsfile
X
X page
X*******************
X* Einsprungstabelle
X* total dummy driver
XEntry
X dc.w Init
X dc.w Read
X dc.w Write
X dc.w GetStat
X dc.w PutStat
X dc.w TermNat
X dc.w 0,0,0,0
X
X align
X
XInit:
XRead:
XWrite:
XTermNat:
X move.w #0,d0
X rts
X
XGetStat:
XPutStat:
X move.w #E$UnkSvc,d1
X ori.w #Carry,ccr
X rts
X
END_OF_FILE
if test 2210 -ne `wc -c <'ptydrv.a'`; then
echo shar: \"'ptydrv.a'\" unpacked with wrong size!
fi
# end of 'ptydrv.a'
fi
if test -f 'ptyman.doc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ptyman.doc'\"
else
echo shar: Extracting \"'ptyman.doc'\" \(9667 characters\)
sed "s/^X//" >'ptyman.doc' <<'END_OF_FILE'
X Pseudo-Terminal (PTY) File-Manager
X ==================================
XOverview:
X
X Pseudo-Terminals (PTY's) are a kind of Interprocess
XCommunication (IPC), which are known on a wide variety of UN*X
Xcomputers, mostly BSD-like systems. They behave like any other SCF
Xdevices like terminals and printer but are in fact pseudo-devices i.e.
Xexists only in the memory the system.
X
X PTY's have two distinct end-points, namely server-pty and
Xclient-pty, which behaves by default differently. A server-pty
Xsymbolizes the terminal and a client-pty forms the connection to the
Xapplication programs. This implies, that the server-pty provides RAW
Xinput and output whereas the client-pty can handle line-editing, echoing
Xand so on.
X
X With this mechanism many programms can share one real device,
Xlike a real terminal, via one server which multiplexes all connected
Xserver-pty's. Something similar can be reached with the usage of pipes,
Xbut pipes have the disadvantage of being not a tty-device with echo,
Xline-editing, interrupt-chars etc.
X
XExamples:
X - virtual Terminals: one program multiplexes ptys and displays the
X outputs on a real Terminal (there exist a programm called 'screen'
X which does exactly this).
X - In a TCP/IP environment, the program 'rlogin' starts a
X login-process on a pty on the remote machine.
X
X___________________________________________________________________________
X
X /***********\ /**************\
X * * * *
X * Server- * ----------> * real Device *
X * Prg. * * *
X \***********/ \**************/
X ___+ + + +_______
X ___/ \ \ \_______
X ___/ \ \________ \________
X / \ \_______ \__________
X | | | |
X /***********\ /***********\ /***********\ /***********\
X * * * * * * * *
X * 1st Prg. * * 2nd Prg. * * 3rd Prg. * * 4th Prg. *
X * * * * * * * *
X \***********/ \***********/ \***********/ \***********/
X
X'|' meaning client-pty
X'+' meaning server-pty
X
XFig. 1: Typical Server-Client Application
X
X
XImplementation:
X
X With OS9-68000 (OSK) a own File-Manager was written, which
Xhandles both types of PTY's : the client-ptys, and the server-ptys while
Xusing only *one* descriptor (device) for each. Server-ptys must be
Xopened as "/pty/any_valid_name" , client-ttys must be opened (i.e.
Xconnected) with "/tty/any_valid_name". The Open-Call for the client-pty
Xwill block until a server-pty with the same name is opened. PTY's can
Xbe also implemented with the usage of a special device-driver for the
XSCF, but this has serveral draw-backs :
X
X - A System-Global Variable has to be introduced for the rendezvous
X of the PTY-pairs (not implementation independent).
X
X - For each pair of PTY's there must exist two Device-Descriptors
X (waste of memory and Device-Table-entries).
X
X - The number of PTY's pairs are limited !!
X
X - Block-writes in RAW modus has still to be done on a char-by-char
X basis with single calls to the driver, as required by the SCF
X
X When creating a server-PTY the Filemanager searches a list of
Xalready openend server-ptys for the same name. The name can be any
Xlegal OS-9/68000 Filename (no distinction between upper- and
Xlower-case). When a identical name is found, the Filemanager return a
XE_CEF-error (File already exists), otherwise the Pathdescriptor (PD) is
Xinserted into this list and some initialisation is done (allocating
XData-Buffers etc.).
X
X When opening a client-PTY the Filemanager looks thru the above
Xmentioned list for a already openend server-pty. If found, it sets a
Xspecial pointer pointing to the PD of the server-pty. (the Filemanager
Xbasicly distincts server-pty's and client-pty's by the value of this
Xpointer).
X
XRemark:
X There exist only *one* named server-pty but there can be many
X client-ptys listening (although its possibly to I$DUP a
X server-pty-fd).
X
X When closing a Server-Pty, the Filemanager searches for all
Xclient-pty's and sets the special pointer to NULL indicating a
XHANGUP-condition. He also tries to send a SIGHUP-Signal (value is
Xchangeable via the _ss_dcoff()-Call) to the last/current user of a
Xclient-pty. Any further I/O calls to a disconnected client-pty will
Xissue a E_HANGUP-Error and a SIGHUP signal !
X
X Closing a client-pty requires no special tasks but clearing all
Xpending Signals (e.g. pending _ss_signl() ), which is done automaticly.
X
X Although total compatibility to a SCF-Device was intended, the
XPTY-Filemanager does differ in some small aspects from the SCF. The
Xreason for that were some features of the SCF, which I do consider
Xfaulty e.g. with a ReadLn-count of one the only character you can read
Xis CR and nothing else (:-( ).
X
XDifferences:
X - a Readln-Call with a character count of 1 will return the next
X character available.
X
X - The Read-Call may behave differently: kbich and kbach will
X abort with the appropriate Error-codes. No Echo, but raw-byte-transfer.
X
X - The Pause-char, Xon-char and Xoff-char are not supported !
X
X - Any signal < 32 and > 1 (SIGWAKE) will abort a pending I/O with an
X error-code of the signal (this should be made standard).
X
X - A close of a server-pty will only generate a SIGHUP (see SS_DCOff)
X and will *not* abort the reading processes (the program 'com'
X seems to have problems with that !).
X
X
XDescriptions of operation:
X
X- Read-calls:
X absolute raw-read, ignores echo-parameter, but unterstands kbich and
X kbach.
X
X- Write-calls:
X absolute raw-write .... but sends QUIT and INT if set.
X
X- Writeln-calls:
X recognizes upc, tabch, tabs, alf, pause and returns on recognizing
X the eor-char (normaly CR). sends QUIT and INT if set.
X
X- Readln-calls:
X recognition of echo, upc, bso, bse, bspchar, eorchar, alf (when
X echoing), kbich, kbach, eof, delchar, rprchar, dupchar and pause.
XCAVEAT:
X - A final EOR in the input-stream is not necessary and this was
X deliberatly avoided !!!
X - The maximum readln-count is 256 Bytes (like in the SCF). You can
X specify more but the Filemanger will cut it to 256...
X
X- GetStat-calls:
X supported codes are: SS_Opt, SS_Ready, SS_EOF, SS_DevNm (returns the
X name of the pty), SS_BlkRd.
X
X- SetStat-calls:
X supported codes are: SS_Opt, SS_SSig, SS_Relea, SS_EnRTS, SS_DsRTS,
X SS_DCOn, SS_DCOff, SS_BlkWr.
XCAVEAT:
X - SS_DCOn, SS_EnRTS and SS_DsRTS are no-ops.
X
XNot supported are null (for padding), pausechar, xon and xoff.
X
X
XDescription of GetStat-Codes:
X
X - SS_Opt:
X copy the first 28 Bytes of the option part to the users
X (a0)-register.
X
X - SS_Ready:
X return number of chars available for reading in users d1
X register, or return E_NOTRDY if no input is available.
X
X - SS_EOF:
X always returns 0 in callers d1 register (like SCF).
X
X - SS_DevNm:
X return the null-terminated name of the pty into the callers
X (a0)-register.
X
X - SS_BlkRd:
X Read x (in users d2-register) Bytes into buffer, users
X (a0)-register is pointing to.
X
X
XDescription of SetStat-Codes:
X
X - SS_Opt:
X copy the first 28 Byte from users (a0)-register into the option
X part of the pathdescriptor.
X
X - SS_SSig:
X Send signal in users d2-register on receiving the next
X available character. If another Process is waiting for input,
X return an E_NOTRDY error.
X
X - SS_Relea:
X Clear a SS_SSig action...
X
X - SS_EnRTS:
X no-op
X
X - SS_DsRTS:
X no-op
X
X - SS_DCOn:
X no-op
X
X - SS_DCOff:
X Send Signal in users d2-register on closing the server-pty
X (Carrier-lost condition). The Default signal is SIGHUP (Value: 4).
X
X - SS_BlkWr:
X Write x ( in users d2-register ) Bytes from buffer users
X (a0)-register is pointing to.
X
X - SS_Screen (Subfunction ScrOut):
X Optional, like BlkWr. exists only on ST's (Cumana Implementation).
X
X
XFinal Thoughts:
X
X Some tests have shown, that this Filemanager is about 100%
Xfaster than an orthodox implementation with a special device Driver for
Xthe SCF when doing readln/writeln calls. By using only read/write calls
Xsome can expect even much more throughput (no line-editing stuff etc..).
X
XBUGS:
X
X This Filemanager seems to have problems in OSK-Versions lower
Xthan 2.0 (-> e.g. 1.2). I think the 'openend-Path'-list isnt supported
Xby the Kernel (IOMan); maybe the Filemanager should do it itself ??
X 'tmode normal' dont work, since it takes the name returned by
XDevNm as a Descriptor-module-name. This is easily changeable by returning
X'pty' or 'tty' on SS_DevNm.
X
XThings to do:
X - shrinking the code
X - treatment of dir-bit as in PipeMan, to see what ptys are open ?
X - more lineediting (emacs-style, history ?)
X - implementing the pausechar and maybe xon/xoff ?
X
XPlease send any suggestions/Bug-reports to:
X Reimer Mellin
X Sulenstr. 8
X D-8000 Muenchen 71
X
X UUCP: mellin@lan.informatik.tu-muenchen.dbp.de (preferred)
X mellin@altger.UUCP
X ....!pyramid!tmpmbx!doitcr!ramsys!ram (home)
END_OF_FILE
if test 9667 -ne `wc -c <'ptyman.doc'`; then
echo shar: \"'ptyman.doc'\" unpacked with wrong size!
fi
# end of 'ptyman.doc'
fi
if test -f 'ptyman.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ptyman.h'\"
else
echo shar: Extracting \"'ptyman.h'\" \(4793 characters\)
sed "s/^X//" >'ptyman.h' <<'END_OF_FILE'
X/* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* */
X/* */
X
X/*
X * $Id: ptyman.h_v 1.2.1.1 89/09/04 13:14:51 ram Exp $
X *
X * $Log: ptyman.h_v $
X * Revision 1.2.1.1 89/09/04 13:14:51 ram
X * added some comments
X *
X * Revision 1.2 89/08/31 12:35:20 ram
X * *** empty log message ***
X *
X *
X */
X
X#ifndef _sysio
X#include <sysio.h>
X#endif
X
X/*
X * PtyFilemanager PD definitions
X */
X
Xtypedef struct ptystatic {
X sysioStatic v_sysio; /* kernel static storage variables */
X} *Ptystatic;
X
Xstruct ptybuf {
X union pathdesc *lpd; /* pd of last active process */
X u_char *buf; /* buffer */
X u_char *wptr; /* write-ptr of buffer */
X u_char *rptr; /* read-ptr of buffer */
X u_long size; /* buffer-size */
X u_short rpid; /* pid to wake if read is pending */
X u_short rsig; /* signal to send */
X u_short wpid; /* pid to wake if write is pending */
X u_short wsig; /* signal to send */
X};
X
Xstruct pty_pvt {
X union pathdesc *pd_pty ; /* the server-pty .. */
X struct ptybuf pd_rbuf; /* input-buffer */
X struct ptybuf pd_wbuf; /* output-buffer */
X u_long pd_flags; /* Flags ... */
X u_short pd_esig; /* for SS_DCOn, SS_DCOff, SIGWAKE,SIGHUP */
X u_short pd_line; /* for page-pause */
X u_char pd_typ; /* pty or tty ? */
X};
X
Xstruct pty_opt {
X u_char pd_dtp; /* device type */
X u_char pd_upc; /* case (0=both, 1=upper only) */
X u_char pd_bso; /* backsp (0=bse, 1=bse,sp,bse) */
X u_char pd_dlo; /* delete (0=bse over line, 1=crlf) */
X u_char pd_eko; /* echo (0=no echo) */
X u_char pd_alf; /* autolf (0=no auto lf) */
X u_char pd_nul; /* end of line null count */
X u_char pd_pau; /* pause (0=no end of page pause) */
X u_char pd_pag; /* lines per page */
X u_char pd_bsp; /* backspace character */
X u_char pd_del; /* delete line character */
X u_char pd_eor; /* end of record char (read only) */
X u_char pd_eof; /* end of file char */
X u_char pd_rpr; /* reprint line char */
X u_char pd_dup; /* dup last line char */
X u_char pd_psc; /* pause char */
X u_char pd_int; /* kbd intr char (ctl c) */
X u_char pd_qut; /* kbd quit char (ctl q) */
X u_char pd_bse; /* backspace echo character */
X u_char pd_ovf; /* line overflow char (bell) */
X u_char pd_par; /* parity code */
X u_char pd_bau; /* acia baud rate (color computer) */
X short pd_d2p; /* dev2 output name offset */
X u_char pd_xon; /* x-on char */
X u_char pd_xoff; /* x-off char */
X u_char pd_Tab; /* Tab character (0=none) */
X u_char pd_Tabs; /* Tab field size */
X Devicetbl pd_tbl; /* Device table addr (copy) */
X u_short pd_Col; /* current column number */
X u_char pd_err; /* most recent I/O error status */
X u_char dummy[96-35]; /* reserved ... */
X u_char pd_name[28]; /* the name of the PTY */
X u_long pd_namlen; /* length of name */
X};
X
X#define PTYMAN 1
X#define ptypvt path.fm_pvt.pty
X#define ptyopt path.fm_opt.pty
X
X
END_OF_FILE
if test 4793 -ne `wc -c <'ptyman.h'`; then
echo shar: \"'ptyman.h'\" unpacked with wrong size!
fi
# end of 'ptyman.h'
fi
if test -f 'ptystat.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ptystat.a'\"
else
echo shar: Extracting \"'ptystat.a'\" \(1892 characters\)
sed "s/^X//" >'ptystat.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X*
X* $Id: ptystat.a_v 1.2.1.1 89/09/04 13:15:13 ram Exp $
X*
X* $Log: ptystat.a_v $
X* Revision 1.2.1.1 89/09/04 13:15:13 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:35:54 ram
X*
X*
X
X nam OS-9/68k Pty Static Storage
X
Xedition set 0
X
X use <iodev.a>
X use ptydev.a
X
X psect ptydev,0,0,0,0,0
X vsect
X ds.b V_PTY
X ends
X ends
END_OF_FILE
if test 1892 -ne `wc -c <'ptystat.a'`; then
echo shar: \"'ptystat.a'\" unpacked with wrong size!
fi
# end of 'ptystat.a'
fi
if test -f 'tty.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'tty.a'\"
else
echo shar: Extracting \"'tty.a'\" \(2927 characters\)
sed "s/^X//" >'tty.a' <<'END_OF_FILE'
X* This software is copyright (C) 1989 by Reimer Mellin *
X* *
X* Permission is granted to reproduce and distribute *
X* this package by any means so long as no fee is charged *
X* above a nominal handling fee and so long as this *
X* notice is always included in the copies. *
X* Commerical use or incorporation into commercial software *
X* is prohibited without the written permission of the *
X* author. *
X* *
X* Other rights are reserved except as explicitly granted *
X* by written permission of the author. *
X* Reimer Mellin *
X* *
X* Sulenstr.8 *
X* D-8000 Muenchen 71 (Federal Republic of Germany) *
X* *
X* EMAIL: *
X* mellin@lan.informatik.tu-muenchen.dbp.de *
X* ram@altger.UUCP *
X* ....!pyramid!tmpmbx!doitcr!ramsys!ram (home) *
X* *
X* $Id: tty.a_v 1.2.1.1 89/09/04 13:15:27 ram Exp $
X*
X* $Log: tty.a_v $
X* Revision 1.2.1.1 89/09/04 13:15:27 ram
X* added some comments
X*
X* Revision 1.2 89/08/31 12:36:21 ram
X* *** empty log message ***
X*
X*
X
X nam PtyMan device descriptor module
X
XEdition equ 0
X
X use defsfile
X
XTypeLang set (Devic<<8)+0
XAtt_Revs set (ReEnt)<<8)+0
X psect tty,TypeLang,Att_Revs,Edition,0,0
X
X dc.l 0 no port address
X dc.b 0 no trap assignment
X dc.b 0 no IRQ hardware interrupt level
X dc.b 0 0 no polling priority
X dc.b PUpdat_+Updat_ device mode capabilities
X dc.w PtyMgr file manager name offset
X dc.w PtyDrv device driver name offset
X dc.w 0 DevCon
X dc.w 0,0,0,0 reserved
X dc.w OptLen option byte count
X
XOptTbl
X dc.b 0 its a SCF-like device
X dc.b 0 PD_UPC
X dc.b 1 PD_BSO
X dc.b 1 PD_DLO
X dc.b 1 PD_EKO
X dc.b 1 PD_ALF
X dc.b 0 PD_NUL
X dc.b 0 PD_PAU
X dc.b 24 PD_PAG
X dc.b 8 PD_BSP
X dc.b $18 PD_DEL
X dc.b 13 PD_EOR
X dc.b $1b PD_EOF
X dc.b 4 PD_RPR
X dc.b 1 PD_DUP
X dc.b $17 PD_PSC
X dc.b 3 PD_INT
X dc.b 5 PD_QUT
X dc.b 8 PD_BSE
X dc.b 7 PD_OVF
X dc.b 0 PD_PAR
X dc.b 0 PD_BAU
X dc.w echodev
X dc.b 0 PD_XON
X dc.b 0 PD_XOFF
X dc.b 9 PD_TAB
X dc.b 8 PD_TABS
XOptLen equ *-OptTbl
X
XPtyMgr dc.b "PtyMan",0 file manager
XPtyDrv dc.b "PtyDrv",0 device driver
Xechodev dc.b "tty",0 correspondent device
X ends
X
END_OF_FILE
if test 2927 -ne `wc -c <'tty.a'`; then
echo shar: \"'tty.a'\" unpacked with wrong size!
fi
# end of 'tty.a'
fi
echo shar: End of archive 1 \(of 2\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked both archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
| Reimer Mellin | mellin@lan.informatik.tu-muenchen.dbp.de |
| Sulenstr. 8 | |
| D-8000 Muenchen 71 | Technische Universitaet Muenchen |