|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 2987 (0xbab) Types: TextFile Notes: UNIX file Names: »dshell.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦2d53db1df⟧ UNIX Filesystem └─ ⟦this⟧ »hr/src/desk/dshell.c«
#include <sgtty.h> #include <signal.h> #include <stdio.h> #include "desk.h" struct tchars tchars = { '\177', /* intrc is DEL */ '\034', /* quitc is FS */ '\021', /* start is ^Q */ '\023', /* stop is ^S */ -1, /* eof is OFF */ -1 /* break is OFF */ }; char * dwname(wid) register int wid; { static char *fn = "/dev/windowXX"; if ( wid == WINDOW+DNW ) { return; } if ( wid-WINDOW < 10 ) { fn[11] = '0'-WINDOW+wid; fn[12] = '\0'; } else { fn[11] = '1'; fn[12] = '0'-10-WINDOW+wid; } return fn; } fquit() { register struct dproc *p; extern int alexit; AL_Open(alexit); if ( dnLwait() ) { AL_Close(); unTrack(); p = &dproc[dskWin]; killit(p->pid); p->pid = -1; dp_remove(p); } else { upAwait(); AL_Close(); } } fshell() { register struct dproc *p; for ( p = dproc + SWBASE ; p < dproc + SWBASE + 4 ; p++ ) if ( p->pid == -1 ) break; if ( p == dproc+SWBASE+4 ) return; dshell(p - dproc); } fclock() { register struct dproc *p; p = dproc + CWBASE; if ( p->pid != -1 ) return; dshell(p - dproc); } fgshell() { register struct dproc *p; for ( p = dproc + GWBASE ; p < dproc + GWBASE + NGW ; p++ ) if ( p->pid == -1 ) break; if ( p == dproc+GWBASE+NGW ) return; dshell(p - dproc); } dshell(wid) register int wid; { extern RECT getRect(); register int fd; register struct dproc *p; int i; int pid; int pfd[2]; RECT rect = { 0, 0, 0, 0}; pipe(pfd); pid = fork(); if ( pid == -1 ) { printf("dmgr: couldn' fork\n"); return; } else if ( pid == 0 ) { ioctl(myfd, CIOUHOLD); ioctl(myfd, CIOMSEOFF); fd = open(dwname(wid), 2); ioctl(myfd, CIOMSEON); if ( fd < 0 ) { printf("dmgr: bad window open %d\n", wid); write(pfd[1], &rect, sizeof(rect)); close(pfd[1]); exit(0); } close(0); close(1); close(2); dup(fd); dup(fd); dup(fd); close(fd); dskWin = wid; rect = getRect(); write(pfd[1], &rect, sizeof(rect)); close(pfd[1]); close(pfd[0]); signal(SIGSEGV, SIG_DFL); signal(SIGINT, SIG_DFL); ioctl(0, TIOCSETC, &tchars); execl(shell[wid-WINDOW][0], shell[wid-WINDOW][1], NULL); exit(0); } else { p = dproc+wid; read(pfd[0], &p->prect, sizeof(p->prect)); if ( !R_null(p->prect) ) { p->pid = pid; dp_insert(p); } close(pfd[0]); close(pfd[1]); } } /* * remove a dproc structure from the list. */ dp_remove(p) register struct dproc *p; { if ( p->pprev ) { if ( p->pprev->pnext = p->pnext ) p->pnext->pprev = p->pprev; } else { if ( dskTop = p->pnext ) p->pnext->pprev = 0; } if ( dskTop == p ) dskTop = p->pnext; if ( dskBot == p ) dskBot = p->pprev; } dp_insert(p) register struct dproc *p; { p->pnext = dskTop; p->pprev = 0; if ( dskTop ) dskTop->pprev = p; dskTop = p; if ( not dskBot ) dskBot = p; } dp_append(p) register struct dproc *p; { p->pnext = 0; p->pprev = dskBot; if ( dskBot ) dskBot->pnext = p; dskBot = p; if ( not dskTop ) dskTop = p; }